elem.c

Go to the documentation of this file.
00001 /*
00002  EasyDbus: DBUS Binding library. 
00003  Copyright (C) 2007  Daniele Rondina aka ge@@ru, geaaru@gmail.com 
00004 
00005  This program is free software; you can redistribute it and/or
00006  modify it under the terms of the GNU General Public License
00007  as published by the Free Software Foundation; either version 2
00008  of the License, or (at your option) any later version.
00009 
00010  This program is distributed in the hope that it will be useful,
00011  but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  GNU General Public License for more details.
00014 
00015  You should have received a copy of the GNU General Public License
00016  along with this program; if not, write to the Free Software
00017  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
00018 
00019   Filename:  elem.c
00020  
00021   Version:  0.1
00022   Created:  08/09/07 19:09:05 CEST
00023   Revision:  none
00024  
00025   Author:   Daniele Rondina aka Ge@@ru (geaaru@gmail.com) 
00026   License:  GPL 2.0
00027 */
00028 
00034 /* easydbus includes */
00035 #include "easydbus-core.h"
00036 #include "utils.h"
00037 #include "debug.h"
00038 #include "variant_internal.h"
00039 #include "struct_internal.h"
00040 #include "array_internal.h"
00041 #include "elem_internal.h"
00042 
00043 #include <string.h>
00044 #include <stdlib.h>
00045 #include <stdio.h>
00046 
00054 const char *
00055 easydbus_elem_get_string (const EasyDbus_elem * elem)
00056 {
00057    if (elem == NULL || (elem->type != EASYDBUS_ELTYPE_STRING))
00058       return NULL;
00059    return (const char *) elem->payload.string;
00060 }
00061 
00069 const char *
00070 easydbus_elem_get_obj_path (const EasyDbus_elem * elem)
00071 {
00072    if (elem == NULL || (elem->type != EASYDBUS_ELTYPE_OBJECT_PATH))
00073       return NULL;
00074    return (const char *) elem->payload.string;
00075 }
00076 
00084 const char *
00085 easydbus_elem_get_signature (const EasyDbus_elem * elem)
00086 {
00087    if (elem == NULL || (elem->type != EASYDBUS_ELTYPE_SIGNATURE))
00088       return NULL;
00089    return (const char *) elem->payload.string;
00090 }
00091 
00101 int
00102 easydbus_elem_get_byte (const EasyDbus_elem * elem, char *byte)
00103 {
00104    if (elem == NULL || byte == NULL ||
00105        (elem->type != EASYDBUS_ELTYPE_BYTE))
00106       return -1;
00107    *byte = elem->payload.byte;
00108    return 0;
00109 }
00110 
00119 char
00120 easydbus_elem_get_boolean (const EasyDbus_elem * elem)
00121 {
00122    if (elem == NULL || (elem->type != EASYDBUS_ELTYPE_BOOLEAN))
00123       return -1;
00124    return elem->payload.boolean;
00125 }
00126 
00136 int
00137 easydbus_elem_get_double (const EasyDbus_elem * elem, double *d)
00138 {
00139    if (elem == NULL || d == NULL ||
00140        (elem->type != EASYDBUS_ELTYPE_DOUBLE))
00141       return -1;
00142    *d = elem->payload.Double;
00143    return 0;
00144 }
00145 
00146 
00155 int
00156 easydbus_elem_get_i16 (const EasyDbus_elem * elem, short *i16)
00157 {
00158    if (elem == NULL || i16 == NULL ||
00159        (elem->type != EASYDBUS_ELTYPE_INT16))
00160       return -1;
00161    *i16 = elem->payload.i16;
00162    return 0;
00163 }
00164 
00173 int
00174 easydbus_elem_get_ui16 (const EasyDbus_elem * elem,
00175                         unsigned short *ui16)
00176 {
00177    if (elem == NULL || ui16 == NULL ||
00178        (elem->type != EASYDBUS_ELTYPE_UINT16))
00179       return -1;
00180    *ui16 = elem->payload.ui16;
00181    return 0;
00182 }
00183 
00192 int
00193 easydbus_elem_get_ui32 (const EasyDbus_elem * elem,
00194                         unsigned int *ui32)
00195 {
00196    if (elem == NULL || ui32 == NULL ||
00197        (elem->type != EASYDBUS_ELTYPE_UINT32))
00198       return -1;
00199    *ui32 = elem->payload.ui32;
00200    return 0;
00201 }
00202 
00211 int
00212 easydbus_elem_get_i32 (const EasyDbus_elem * elem, int *i32)
00213 {
00214    if (elem == NULL || i32 == NULL ||
00215        (elem->type != EASYDBUS_ELTYPE_INT32))
00216       return -1;
00217    *i32 = elem->payload.i32;
00218    return 0;
00219 }
00220 
00229 int
00230 easydbus_elem_get_ui64 (const EasyDbus_elem * elem,
00231                         unsigned long long *ui64)
00232 {
00233    if (elem == NULL || ui64 == NULL ||
00234        (elem->type != EASYDBUS_ELTYPE_UINT64))
00235       return -1;
00236    *ui64 = elem->payload.ui64;
00237    return 0;
00238 }
00239 
00251 const EasyDbus_container *
00252 easydbus_elem_get_container (const EasyDbus_elem * elem)
00253 {
00254    if (elem == NULL ||
00255        (elem->type != EASYDBUS_ELTYPE_ARRAY &&
00256         elem->type != EASYDBUS_ELTYPE_DICT_ENTRY &&
00257         elem->type != EASYDBUS_ELTYPE_VARIANT &&
00258         elem->type != EASYDBUS_ELTYPE_STRUCT))
00259       return NULL;
00260    return (const EasyDbus_container *) elem->payload.p_container;
00261 }
00262 
00271 int
00272 easydbus_elem_get_i64 (const EasyDbus_elem * elem, long long *i64)
00273 {
00274    if (elem == NULL || i64 == NULL ||
00275        (elem->type != EASYDBUS_ELTYPE_INT64))
00276       return -1;
00277    *i64 = elem->payload.i64;
00278    return 0;
00279 }
00280 
00287 inline enum el_type 
00288 easydbus_elem_get_type (const EasyDbus_elem * elem) 
00289 {
00290    if (elem == NULL)
00291       return EASYDBUS_ELTYPE_INVALID;
00292    return elem->type;
00293 }
00294 
00304 const EasyDbus_elem *
00305 easydbus_elem_get_element (const EasyDbus_elem * elem, 
00306                            unsigned int n)
00307 {
00308    unsigned int i;
00309    EasyDbus_elem *el = (EasyDbus_elem *) elem;
00310 
00311    if (elem == NULL || n == 0)
00312       return NULL;
00313 
00314    for (i = 1; i < n; i++) {
00315       el = el->next;
00316       if (el == NULL && i < n)
00317          break;
00318    }
00319    return (const EasyDbus_elem *) el;
00320 }
00321 
00328 inline const EasyDbus_elem *
00329 easydbus_elem_get_next (const EasyDbus_elem * el) 
00330 {
00331   return (el ? (const EasyDbus_elem *) el->next : NULL);
00332 }
00333 
00344 void
00345 easydbus_elem_free (EasyDbus_elem * el)
00346 {
00347    if (el == NULL)
00348       return;
00349    switch (el->type) {
00350       case EASYDBUS_ELTYPE_STRING:
00351       case EASYDBUS_ELTYPE_OBJECT_PATH:
00352       case EASYDBUS_ELTYPE_SIGNATURE:
00353          if (el->payload.string != NULL)
00354             free (el->payload.string);
00355          break;
00356       case EASYDBUS_ELTYPE_STRUCT:
00357       case EASYDBUS_ELTYPE_ARRAY:
00358       case EASYDBUS_ELTYPE_DICT_ENTRY:
00359       case EASYDBUS_ELTYPE_VARIANT:
00360          if (el->payload.p_container != NULL) {
00361             easydbus_container_free (el->payload.p_container);
00362          }
00363          break;
00364       default:
00365          break;
00366    }
00367    free (el);
00368 }
00369 
00378 inline EasyDbus_elem * 
00379 easydbus_elem_create (enum el_type type)
00380 {
00381    struct EasyDbus_elem *el = NULL;
00382 
00383    if (type == EASYDBUS_ELTYPE_INVALID)
00384       return NULL;
00385 
00386    el =
00387       (struct EasyDbus_elem *) malloc (sizeof (struct EasyDbus_elem));
00388 
00389    if (!el)
00390       return NULL;
00391 
00392    memset (el, 0, sizeof (struct EasyDbus_elem));
00393 
00394    el->type = type;
00395    switch (type) {
00396       case EASYDBUS_ELTYPE_STRING:
00397       case EASYDBUS_ELTYPE_OBJECT_PATH:
00398       case EASYDBUS_ELTYPE_SIGNATURE:
00399          el->payload.string = NULL;
00400          break;
00401       case EASYDBUS_ELTYPE_ARRAY:
00402       case EASYDBUS_ELTYPE_VARIANT:
00403       case EASYDBUS_ELTYPE_DICT_ENTRY:
00404       case EASYDBUS_ELTYPE_STRUCT:
00405          el->payload.p_container = NULL;
00406          break;
00407       default: /* do nothing because its are already initialize */
00408          //case EASYDBUS_ELTYPE_BYTE:
00409          //case EASYDBUS_ELTYPE_BOOLEAN:
00410          //case EASYDBUS_ELTYPE_INT16:
00411          //case EASYDBUS_ELTYPE_UINT16:
00412          //case EASYDBUS_ELTYPE_INT32,
00413          //case EASYDBUS_ELTYPE_UINT32,
00414          //case EASYDBUS_ELTYPE_INT64,
00415          //case EASYDBUS_ELTYPE_UINT64,
00416          //case EASYDBUS_ELTYPE_DOUBLE,
00417          break;
00418    }
00419    el->next = NULL;
00420    return el;
00421 }
00422 
00433 int
00434 add_elems_to_msg (DBusMessage * msg, struct EasyDbus_elem *first)
00435 {
00436    struct EasyDbus_elem *el = NULL;
00437 
00438    /* see if use directly first on insert steps */
00439    el = first;
00440    int ret_val = 1;
00441 
00442    if (msg == NULL || first == NULL)
00443       return -1;
00444 
00445    while (el != NULL) {
00446       switch (el->type) {
00447          case EASYDBUS_ELTYPE_STRING:
00448             if (!dbus_message_append_args (msg, DBUS_TYPE_STRING,
00449                                            &el->payload.string,
00450                                            DBUS_TYPE_INVALID))
00451                ret_val = 0;
00452             break;
00453          case EASYDBUS_ELTYPE_BYTE:
00454             if (!dbus_message_append_args (msg, DBUS_TYPE_BYTE,
00455                                            &el->payload.byte,
00456                                            DBUS_TYPE_INVALID))
00457                ret_val = 0;
00458             break;
00459          case EASYDBUS_ELTYPE_BOOLEAN:
00460             if (!dbus_message_append_args (msg, DBUS_TYPE_BOOLEAN,
00461                                            &el->payload.boolean,
00462                                            DBUS_TYPE_INVALID))
00463                ret_val = 0;
00464             break;
00465          case EASYDBUS_ELTYPE_DOUBLE:
00466             if (!dbus_message_append_args (msg, DBUS_TYPE_DOUBLE,
00467                                            &el->payload.Double,
00468                                            DBUS_TYPE_INVALID))
00469                ret_val = 0;
00470             break;
00471          case EASYDBUS_ELTYPE_INT16:
00472             if (!dbus_message_append_args (msg, DBUS_TYPE_INT16,
00473                                            &el->payload.i16,
00474                                            DBUS_TYPE_INVALID))
00475                ret_val = 0;
00476             break;
00477          case EASYDBUS_ELTYPE_UINT16:
00478             if (!dbus_message_append_args (msg, DBUS_TYPE_UINT16,
00479                                            &el->payload.ui16,
00480                                            DBUS_TYPE_INVALID))
00481                ret_val = 0;
00482             break;
00483          case EASYDBUS_ELTYPE_INT32:
00484             if (!dbus_message_append_args (msg, DBUS_TYPE_INT32,
00485                                            &el->payload.i32,
00486                                            DBUS_TYPE_INVALID))
00487                ret_val = 0;
00488             break;
00489          case EASYDBUS_ELTYPE_UINT32:
00490             if (!dbus_message_append_args (msg, DBUS_TYPE_UINT32,
00491                                            &el->payload.ui32,
00492                                            DBUS_TYPE_INVALID))
00493                ret_val = 0;
00494             break;
00495          case EASYDBUS_ELTYPE_INT64:
00496             if (!dbus_message_append_args (msg, DBUS_TYPE_INT64,
00497                                            &el->payload.i64,
00498                                            DBUS_TYPE_INVALID))
00499                ret_val = 0;
00500             break;
00501          case EASYDBUS_ELTYPE_UINT64:
00502             if (!dbus_message_append_args (msg, DBUS_TYPE_UINT64,
00503                                            &el->payload.ui64,
00504                                            DBUS_TYPE_INVALID))
00505                ret_val = 0;
00506             break;
00507          case EASYDBUS_ELTYPE_OBJECT_PATH:
00508             if (!dbus_message_append_args (msg, DBUS_TYPE_OBJECT_PATH,
00509                                            &el->payload.string,
00510                                            DBUS_TYPE_INVALID))
00511                ret_val = 0;
00512             break;
00513          case EASYDBUS_ELTYPE_SIGNATURE:
00514             if (!dbus_message_append_args (msg, DBUS_TYPE_SIGNATURE,
00515                                            &el->payload.string,
00516                                            DBUS_TYPE_INVALID))
00517                ret_val = 0;
00518             break;
00519          case EASYDBUS_ELTYPE_ARRAY:
00520             /* todo */
00521             if (!add_array_to_msg (msg, el))
00522                ret_val = 0;
00523             break;
00524          case EASYDBUS_ELTYPE_VARIANT:
00525             if (!add_variant_to_msg (msg, el))
00526                ret_val = 0;
00527             break;
00528          case EASYDBUS_ELTYPE_STRUCT:
00529             if (!easydbus_add_struct_to_msg (msg, el))
00530                ret_val = 0;
00531             break;
00534          case EASYDBUS_ELTYPE_DICT_ENTRY:
00535          case EASYDBUS_ELTYPE_INVALID:
00536             return -1;
00537             break;
00538       }
00539       el = el->next;
00540    }
00541    return ret_val;
00542 }
00543 // vim: ts=3 shiftwidth=3 expandtab

Generated on Thu Apr 10 10:00:18 2008 for EasyDbus-0.2 by  doxygen 1.5.4