00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00034
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:
00408
00409
00410
00411
00412
00413
00414
00415
00416
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
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
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