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
00029
00030
00043 #include <string.h>
00044 #include <stdlib.h>
00045
00046 #include "easydbus-core.h"
00047 #include "debug.h"
00048 #include "utils.h"
00049 #include "dict_entry_internal.h"
00050 #include "variant_internal.h"
00051 #include "array_internal.h"
00052 #include "struct_internal.h"
00053
00054
00055
00068 int
00069 add_array_to_msg (DBusMessage * msg, struct EasyDbus_elem *el)
00070 {
00071 struct EasyDbus_container *container = el->payload.p_container;
00072 int ret_val = -1;
00073 unsigned int i = 0;
00074 DBusMessageIter iter;
00075 DBusMessageIter iter2;
00076 short *p_i16 = NULL;
00077 int *p_i32 = NULL;
00078 long long *p_i64 = NULL;
00079 double *p_double = NULL;
00080 char *p_byte = NULL;
00081 char **p_string = NULL;
00082 struct EasyDbus_elem *internal_el = NULL;
00083 char *signature = NULL;
00084
00085 dbus_message_iter_init_append (msg, &iter);
00086
00087
00088
00089
00090
00091
00092
00093
00094 if (!container->nel) {
00095 if (!container->signature)
00096 EasyDbusDebug ("Error an empty array must have a"
00097 " signature");
00098 return ret_val;
00099 if (dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY,
00100 container->signature,
00101 &iter2))
00102 ret_val = 0;
00103 else
00104 EasyDbusDebug ("Error on open container container\n");
00105 goto end;
00106 }
00107
00108
00109 signature = prepare_signature (el, EASYDBUS_SIGNATURE_NORMAL);
00110 EasyDbusDebug ("Signature prepared for array = %s", signature);
00111
00112
00113
00114
00115 signature++;
00116 if (dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY,
00117 signature, &iter2))
00118 ret_val = 0;
00119 else
00120 EasyDbusDebug ("Error on open container container\n");
00121 switch (container->elem_type) {
00122 case EASYDBUS_ELTYPE_INT16:
00123 p_i16 = (short *) container->p_data;
00124 for (i = 0; i < container->nel; i++) {
00125 dbus_message_iter_append_basic (&iter2,
00126 DBUS_TYPE_INT16, p_i16);
00127 p_i16++;
00128 }
00129 break;
00130 case EASYDBUS_ELTYPE_UINT16:
00131 p_i16 = (short *) container->p_data;
00132 for (i = 0; i < container->nel; i++) {
00133 dbus_message_iter_append_basic (&iter2,
00134 DBUS_TYPE_UINT16, p_i16);
00135 p_i16++;
00136 }
00137 break;
00138 case EASYDBUS_ELTYPE_INT32:
00139 p_i32 = (int *) container->p_data;
00140 for (i = 0; i < container->nel; i++) {
00141 dbus_message_iter_append_basic (&iter2,
00142 DBUS_TYPE_INT32, p_i32);
00143 p_i32++;
00144 }
00145 break;
00146 case EASYDBUS_ELTYPE_UINT32:
00147 p_i32 = (int *) container->p_data;
00148 for (i = 0; i < container->nel; i++) {
00149 dbus_message_iter_append_basic (&iter2,
00150 DBUS_TYPE_UINT32, p_i32);
00151 p_i32++;
00152 }
00153 break;
00154 case EASYDBUS_ELTYPE_INT64:
00155 p_i64 = (long long *) container->p_data;
00156 for (i = 0; i < container->nel; i++) {
00157 dbus_message_iter_append_basic (&iter2,
00158 DBUS_TYPE_UINT32, p_i64);
00159 p_i64++;
00160 }
00161 break;
00162 case EASYDBUS_ELTYPE_UINT64:
00163 p_i64 = (long long *) container->p_data;
00164 for (i = 0; i < container->nel; i++) {
00165 dbus_message_iter_append_basic (&iter2,
00166 DBUS_TYPE_UINT64, p_i64);
00167 p_i64++;
00168 }
00169 break;
00170 case EASYDBUS_ELTYPE_BYTE:
00171 p_byte = (char *) container->p_data;
00172 for (i = 0; i < container->nel; i++) {
00173 dbus_message_iter_append_basic (&iter2,
00174 DBUS_TYPE_BYTE, p_byte);
00175 p_byte++;
00176 }
00177 break;
00178 case EASYDBUS_ELTYPE_DOUBLE:
00179 p_double = (double *) container->p_data;
00180 for (i = 0; i < container->nel; i++) {
00181 dbus_message_iter_append_basic (&iter2,
00182 DBUS_TYPE_DOUBLE,
00183 p_double);
00184 p_double++;
00185 }
00186 break;
00187 case EASYDBUS_ELTYPE_BOOLEAN:
00188 p_byte = (char *) container->p_data;
00189 for (i = 0; i < container->nel; i++) {
00190 dbus_message_iter_append_basic (&iter2,
00191 DBUS_TYPE_BOOLEAN,
00192 p_byte);
00193 p_byte++;
00194 }
00195 break;
00196 case EASYDBUS_ELTYPE_SIGNATURE:
00197 p_string = (char **) container->p_data;
00198 for (i = 0; i < container->nel; i++) {
00199
00200
00201 dbus_message_iter_append_basic (&iter2,
00202 DBUS_TYPE_SIGNATURE,
00203 &p_string[i]);
00204 }
00205 break;
00206 case EASYDBUS_ELTYPE_STRING:
00207 p_string = (char **) container->p_data;
00208 for (i = 0; i < container->nel; i++) {
00209
00210
00211 dbus_message_iter_append_basic (&iter2,
00212 DBUS_TYPE_STRING,
00213 &p_string[i]);
00214 }
00215 break;
00216 case EASYDBUS_ELTYPE_OBJECT_PATH:
00217 p_string = (char **) container->p_data;
00218 for (i = 0; i < container->nel; i++)
00219 dbus_message_iter_append_basic (&iter2,
00220 DBUS_TYPE_OBJECT_PATH,
00221 &p_string[i]);
00222 break;
00223 case EASYDBUS_ELTYPE_ARRAY:
00224 internal_el = (struct EasyDbus_elem *)
00225 container->p_data;
00226 for (i = 0; i < container->nel; i++) {
00227 easydbus_add_array_on_container_tomsg
00228 (msg, &iter2, internal_el);
00229 internal_el = internal_el->next;
00230 }
00231 break;
00232 case EASYDBUS_ELTYPE_DICT_ENTRY:
00233 internal_el = (struct EasyDbus_elem *)
00234 container->p_data;
00235 for (i = 0; i < container->nel; i++) {
00236 easydbus_add_dict_entry_tomsg (msg, &iter2, internal_el);
00237 internal_el = internal_el->next;
00238 }
00239 break;
00240 case EASYDBUS_ELTYPE_VARIANT:
00241 internal_el = (struct EasyDbus_elem *)
00242 container->p_data;
00243 for (i = 0; i < container->nel; i++) {
00244
00245
00246
00247 add_variant_to_container_on_msg (msg, internal_el,
00248 &iter2);
00249 internal_el = internal_el->next;
00250 }
00251 break;
00252 case EASYDBUS_ELTYPE_STRUCT:
00253 internal_el = (struct EasyDbus_elem *)
00254 container->p_data;
00255 while (internal_el != NULL) {
00256 easydbus_add_struct_on_container_msg
00257 (msg, &iter2, internal_el);
00258 internal_el = internal_el->next;
00259 }
00260 break;
00261 case EASYDBUS_ELTYPE_INVALID:
00262 EasyDbusDebug ("ERROR This type must not be used!\n");
00263 break;
00264 }
00265
00266
00267
00268 free (--signature);
00269
00270 end:
00271
00272 dbus_message_iter_close_container (&iter, &iter2);
00273
00274 return ret_val;
00275 }
00276
00287 struct EasyDbus_container *
00288 easydbus_get_marshal_data_from_array (enum event_type type,
00289 void *container,
00290 enum el_type type_marshal_data,
00291 DBusMessageIter * iter)
00292 {
00293 int i32 = 0;
00294 unsigned int ui32 = 0;
00295 short i16 = 0;
00296 char byte = 0;
00297 char *string = NULL;
00298 unsigned short ui16 = 0;
00299 long long i64 = 0;
00300 double d = 0;
00301 unsigned long long ui64 = 0;
00302 DBusMessageIter subiter;
00303 unsigned int len = 1;
00304 char *bytes = NULL;
00305 char **strings = NULL;
00306 int *int32_array = NULL;
00307 unsigned int *uint32_array = NULL;
00308 unsigned short *uint16_array = NULL;
00309 short *int16_array = NULL;
00310 long long *int64_array = NULL;
00311 unsigned long long *uint64_array = NULL;
00312 double *double_array = NULL;
00313 unsigned int i = 0;
00314 struct EasyDbus_container *array = NULL;
00315 struct EasyDbus_container *cont_marshal_data = NULL;
00316
00317 #ifdef EASYDBUS_DEBUG
00318 char *signature = NULL;
00319 #endif
00320
00321 dbus_message_iter_recurse (iter, &subiter);
00322
00323 if (type_marshal_data == DBUS_TYPE_INVALID) {
00324 EasyDbusDebug ("No element on array or error");
00325 return NULL;
00326 }
00327
00328 if (type_marshal_data != DBUS_TYPE_DICT_ENTRY) {
00329
00330 while (dbus_message_iter_has_next (&subiter)) {
00331 len++;
00332 dbus_message_iter_next (&subiter);
00333 }
00334
00335 dbus_message_iter_recurse (iter, &subiter);
00336 EasyDbusDebug ("Number of element on array = %d", len);
00337 }
00338
00339 array = easydbus_container_create_skeleton (EASYDBUS_ELTYPE_ARRAY);
00340 if (!array) {
00341 EasyDbusDebug ("Error on create container skeleton");
00342 return NULL;
00343 }
00344
00345
00346 switch (type_marshal_data) {
00347 case DBUS_TYPE_STRING:
00348 case DBUS_TYPE_OBJECT_PATH:
00349 case DBUS_TYPE_SIGNATURE:
00350 strings = (char **) malloc (sizeof (char *) * len);
00351 if (!strings)
00352 goto error;
00353 memset (strings, 0, len * sizeof (char *));
00354 break;
00355 case DBUS_TYPE_INT32:
00356 int32_array = (int *) malloc (sizeof (int) * len);
00357 if (!int32_array)
00358 goto error;
00359 memset (int32_array, 0, sizeof (int) * len);
00360 break;
00361 case DBUS_TYPE_UINT32:
00362 uint32_array = (unsigned int *) malloc (sizeof (int) * len);
00363 if (!uint32_array)
00364 goto error;
00365 memset (uint32_array, 0, sizeof (int) * len);
00366 break;
00367 case DBUS_TYPE_INT64:
00368 int64_array =
00369 (long long *) malloc (sizeof (long long) * len);
00370 if (!int64_array)
00371 goto error;
00372 memset (int64_array, 0, sizeof (long long) * len);
00373 break;
00374 case DBUS_TYPE_UINT64:
00375 uint64_array = (unsigned long long *) malloc
00376 (sizeof (unsigned long long) * len);
00377 if (!uint64_array)
00378 goto error;
00379 memset (uint64_array, 0, sizeof (unsigned long long) * len);
00380 break;
00381 case DBUS_TYPE_INT16:
00382 int16_array = (short *) malloc (sizeof (short) * len);
00383 if (!int16_array)
00384 goto error;
00385 memset (int16_array, 0, sizeof (short) * len);
00386 break;
00387 case DBUS_TYPE_UINT16:
00388 uint16_array = (unsigned short *) malloc
00389 (sizeof (unsigned short) * len);
00390 if (!uint16_array)
00391 goto error;
00392 memset (uint16_array, 0, sizeof (unsigned short) * len);
00393 break;
00394 case DBUS_TYPE_BYTE:
00395 case DBUS_TYPE_BOOLEAN:
00396 bytes = (char *) malloc (len);
00397 if (!bytes)
00398 goto error;
00399 memset (bytes, 0, len);
00400 case DBUS_TYPE_DOUBLE:
00401 double_array = (double *) malloc (sizeof (double) * len);
00402 if (!double_array)
00403 goto error;
00404 memset (double_array, 0, sizeof (double) * len);
00405 break;
00406 case DBUS_TYPE_VARIANT:
00407 case DBUS_TYPE_DICT_ENTRY:
00408 case DBUS_TYPE_ARRAY:
00409 case DBUS_TYPE_STRUCT:
00410
00411
00412 break;
00413 default:
00414 goto error;
00415 break;
00416 }
00417
00418 while (1) {
00419 #ifdef EASYDBUS_DEBUG
00420 signature = dbus_message_iter_get_signature (iter);
00421 EasyDbusDebug ("Current Signature = %s", signature);
00422 dbus_free (signature);
00423 #endif
00424 switch (dbus_message_iter_get_arg_type (&subiter)) {
00425 case DBUS_TYPE_STRING:
00426 dbus_message_iter_get_basic (&subiter, &string);
00427 EasyDbusDebug ("founded string = %s\n", string);
00428 strings[i] = (char *) malloc (strlen (string) + 1);
00429 EASYDBUS_MEMCOPY (strings[i], string,
00430 strlen (string) + 1);
00431
00432
00433
00434 i++;
00435 break;
00436 case DBUS_TYPE_INT32:
00437 dbus_message_iter_get_basic (&subiter, &i32);
00438 EasyDbusDebug ("founded int32 = %d", i32);
00439 int32_array[i] = i32;
00440 i++;
00441 break;
00442 case DBUS_TYPE_UINT32:
00443 dbus_message_iter_get_basic (&subiter, &ui32);
00444 EasyDbusDebug ("founded uint32 = %d", ui32);
00445 uint32_array[i] = ui32;
00446 i++;
00447 break;
00448 case DBUS_TYPE_INT16:
00449 dbus_message_iter_get_basic (&subiter, &i16);
00450 EasyDbusDebug ("founded int16 = %d", i16);
00451 int16_array[i] = i16;
00452 i++;
00453 break;
00454 case DBUS_TYPE_UINT16:
00455 dbus_message_iter_get_basic (&subiter, &ui16);
00456 EasyDbusDebug ("founded uint16 = %d", ui16);
00457 uint16_array[i] = ui16;
00458 i++;
00459 break;
00460 case DBUS_TYPE_INT64:
00461 dbus_message_iter_get_basic (&subiter, &i64);
00462 EasyDbusDebug ("founded int64 = %lld", i64);
00463 int64_array[i] = i64;
00464 i++;
00465 break;
00466 case DBUS_TYPE_UINT64:
00467 dbus_message_iter_get_basic (&subiter, &ui64);
00468 EasyDbusDebug ("founded uint64 = %lld", ui64);
00469 uint64_array[i] = ui64;
00470 i++;
00471 break;
00472 case DBUS_TYPE_BYTE:
00473 dbus_message_iter_get_basic (&subiter, &byte);
00474 EasyDbusDebug ("founded byte = %d", byte);
00475 bytes[i] = byte;
00476 i++;
00477 break;
00478 case DBUS_TYPE_BOOLEAN:
00479 dbus_message_iter_get_basic (&subiter, &byte);
00480 EasyDbusDebug ("founded boolean = %d", byte);
00481 bytes[i] = byte;
00482 i++;
00483 break;
00484 case DBUS_TYPE_DOUBLE:
00485 dbus_message_iter_get_basic (&subiter, &d);
00486 EasyDbusDebug ("founded double = %f", d);
00487 double_array[i] = d;
00488 i++;
00489 break;
00490 case DBUS_TYPE_OBJECT_PATH:
00491 dbus_message_iter_get_basic (&subiter, &string);
00492 EasyDbusDebug ("founded obj_path = %s\n", string);
00493 strings[i] = (char *) malloc (strlen (string) + 1);
00494 EASYDBUS_MEMCOPY (strings[i], string, strlen (string) + 1);
00495
00496
00497 i++;
00498 break;
00499 case DBUS_TYPE_SIGNATURE:
00500 dbus_message_iter_get_basic (&subiter, &string);
00501 EasyDbusDebug ("founded signature = %s\n", string);
00502 strings[i] = (char *) malloc (strlen (string) + 1);
00503 EASYDBUS_MEMCOPY (strings[i], string, strlen (string) + 1);
00504
00505
00506 i++;
00507 break;
00508 case DBUS_TYPE_ARRAY:
00509 cont_marshal_data =
00510 easydbus_get_marshal_data_from_array (type,
00511 container,
00512 dbus_message_iter_get_element_type
00513 (&subiter),
00514 &subiter);
00515 if (cont_marshal_data != NULL) {
00516 easydbus_array_add_array (cont_marshal_data, array);
00517 EasyDbusDebug ("Added array to container");
00518 }
00519 else
00520 EasyDbusDebug ("Error on manage array");
00521 break;
00522 case DBUS_TYPE_STRUCT:
00523 cont_marshal_data = easydbus_struct_build_elem
00524 (type, (void *) container, &subiter);
00525 if (cont_marshal_data != NULL) {
00526 easydbus_array_add_struct (cont_marshal_data, array);
00527 EasyDbusDebug ("Added struct to container");
00528 }
00529 else
00530 EasyDbusDebug ("Error on add struct to container");
00531 break;
00532 case DBUS_TYPE_VARIANT:
00533 cont_marshal_data = easydbus_variant_build_elem
00534 (type, (void *) container, &subiter);
00535 if (cont_marshal_data != NULL) {
00536 easydbus_array_add_variant (cont_marshal_data, array);
00537 EasyDbusDebug ("Added variant to container");
00538 }
00539 else
00540 EasyDbusDebug ("Error on add variant to container");
00541 i++;
00542 break;
00543 case DBUS_TYPE_DICT_ENTRY:
00544 cont_marshal_data = easydbus_dict_entry_build_container
00545 (type, container, &subiter);
00546 if (cont_marshal_data != NULL) {
00547 easydbus_array_add_dict_entry
00548 (cont_marshal_data, array);
00549 EasyDbusDebug ("Added dict entry to array");
00550 }
00551 else
00552 EasyDbusDebug ("Error on add dict entry to array");
00553 i++;
00554 break;
00555 case DBUS_TYPE_INVALID:
00556 EasyDbusDebug ("Empty array or field wrong");
00557 break;
00558 default:
00559 EasyDbusDebug ("Not managed or error");
00560 break;
00561 }
00562 if (!dbus_message_iter_has_next (&subiter))
00563 goto exit;
00564 else
00565 dbus_message_iter_next (&subiter);
00566 }
00567
00568 exit:
00569
00570 if (i == 0) {
00571 EasyDbusDebug ("Add signature %d (easydbus %d) to empty array",
00572 type_marshal_data,
00573 get_easydbus_type_from_dbus_type
00574 (type_marshal_data));
00576 easydbus_container_add_signature_to_empty_container (array,
00577 get_easydbus_type_from_dbus_type
00578 (type_marshal_data),
00579 EASYDBUS_ELTYPE_INVALID);
00580 }
00581 switch (type_marshal_data) {
00582 case DBUS_TYPE_STRING:
00583 if (i)
00584 easydbus_array_add_string_array (array, len, strings);
00585 for (i = 0; i < len; i++)
00586 free (strings[i]);
00587 free (strings);
00588 break;
00589 case DBUS_TYPE_INT32:
00590 if (i)
00591 easydbus_array_add_i32_array (array, len, int32_array);
00592 free (int32_array);
00593 break;
00594 case DBUS_TYPE_UINT32:
00595 if (i)
00596 easydbus_array_add_ui32_array (array, len, uint32_array);
00597 free (uint32_array);
00598 case DBUS_TYPE_BYTE:
00599 if (i)
00600 easydbus_array_add_byte_array (array, len, bytes);
00601 free (bytes);
00602 break;
00603 case DBUS_TYPE_INT64:
00604 if (i)
00605 easydbus_array_add_i64_array (array, len, int64_array);
00606 free (int64_array);
00607 break;
00608 case DBUS_TYPE_UINT64:
00609 if (i)
00610 easydbus_array_add_ui64_array (array, len, uint64_array);
00611 free (uint64_array);
00612 break;
00613 case DBUS_TYPE_INT16:
00614 if (i)
00615 easydbus_array_add_i16_array (array, len, int16_array);
00616 free (int16_array);
00617 break;
00618 case DBUS_TYPE_UINT16:
00619 if (i)
00620 easydbus_array_add_ui16_array (array, len, uint16_array);
00621 free (uint16_array);
00622 break;
00623 case DBUS_TYPE_BOOLEAN:
00624 if (i)
00625 easydbus_array_add_boolean_array (array, len, bytes);
00626 free (bytes);
00627 break;
00628 case DBUS_TYPE_DOUBLE:
00629 if (i)
00630 easydbus_array_add_double_array (array, len,
00631 double_array);
00632 free (double_array);
00633 break;
00634 case DBUS_TYPE_OBJECT_PATH:
00635 if (i)
00636 easydbus_array_add_obj_path_array (array, len, strings);
00637 for (i = 0; i < len; i++)
00638 free (strings[i]);
00639 free (strings);
00640 break;
00641 case DBUS_TYPE_SIGNATURE:
00642 if (i)
00643 easydbus_array_add_signature_array (array, len, strings);
00644 for (i = 0; i < len; i++)
00645 free (strings[i]);
00646 free (strings);
00647 break;
00648 case DBUS_TYPE_DICT_ENTRY:
00649 case DBUS_TYPE_VARIANT:
00650 case DBUS_TYPE_ARRAY:
00651 case DBUS_TYPE_STRUCT:
00652 EasyDbusDebug ("Data already inserted on array");
00653 break;
00654 default:
00655 break;
00656 }
00657
00658 EasyDbusDebug ("End of get recurse marshal data");
00659 return array;
00660
00661 error:
00662 if (array != NULL)
00663 easydbus_container_free (array);
00664 return NULL;
00665 }
00666
00677 int
00678 easydbus_add_array_on_container_tomsg (DBusMessage * msg,
00679 DBusMessageIter * iter,
00680 struct EasyDbus_elem *el)
00681 {
00682 DBusMessageIter iter2;
00683 short *p_i16 = NULL;
00684 int *p_i32 = NULL;
00685 long long *p_i64 = NULL;
00686 double *p_double = NULL;
00687 char *p_byte = NULL;
00688 char **p_string = NULL;
00689 struct EasyDbus_elem *internal_el = NULL;
00690 struct EasyDbus_container *container = el->payload.p_container;
00691 int ret_val = -1;
00692 unsigned int i;
00693 char *signature = NULL;
00694
00695 if (!container->nel) {
00696 if (!container->signature) {
00697 EasyDbusDebug ("Error an empty array must have a"
00698 " signature");
00699 return ret_val;
00700 }
00701
00702 if (dbus_message_iter_open_container (iter, DBUS_TYPE_ARRAY,
00703 container->signature,
00704 &iter2))
00705 ret_val = 0;
00706 else
00707 EasyDbusDebug ("Error on open array container");
00708 goto end;
00709 }
00710
00711
00712
00713 signature = prepare_signature (el, EASYDBUS_SIGNATURE_NORMAL);
00714 EasyDbusDebug ("Signature prepared for container on array "
00715 "= %s\n", signature);
00716
00717
00718
00719
00720 signature++;
00721 if (dbus_message_iter_open_container (iter, DBUS_TYPE_ARRAY,
00722 signature, &iter2))
00723 ret_val = 0;
00724 else
00725 EasyDbusDebug ("Error on open array container\n");
00726 switch (container->elem_type) {
00727 case EASYDBUS_ELTYPE_INT16:
00728 p_i16 = (short *) container->p_data;
00729 for (i = 0; i < container->nel; i++) {
00730 dbus_message_iter_append_basic (&iter2,
00731 DBUS_TYPE_INT16, p_i16);
00732 p_i16++;
00733 }
00734 break;
00735 case EASYDBUS_ELTYPE_UINT16:
00736 p_i16 = (short *) container->p_data;
00737 for (i = 0; i < container->nel; i++) {
00738 dbus_message_iter_append_basic (&iter2,
00739 DBUS_TYPE_UINT16, p_i16);
00740 p_i16++;
00741 }
00742 break;
00743 case EASYDBUS_ELTYPE_INT32:
00744 p_i32 = (int *) container->p_data;
00745 for (i = 0; i < container->nel; i++) {
00746 dbus_message_iter_append_basic (&iter2,
00747 DBUS_TYPE_INT32, p_i32);
00748 p_i32++;
00749 }
00750 break;
00751 case EASYDBUS_ELTYPE_UINT32:
00752 p_i32 = (int *) container->p_data;
00753 for (i = 0; i < container->nel; i++) {
00754 dbus_message_iter_append_basic (&iter2,
00755 DBUS_TYPE_UINT32, p_i32);
00756 p_i32++;
00757 }
00758 break;
00759 case EASYDBUS_ELTYPE_INT64:
00760 p_i64 = (long long *) container->p_data;
00761 for (i = 0; i < container->nel; i++) {
00762 dbus_message_iter_append_basic (&iter2,
00763 DBUS_TYPE_UINT32, p_i64);
00764 p_i64++;
00765 }
00766 break;
00767 case EASYDBUS_ELTYPE_UINT64:
00768 p_i64 = (long long *) container->p_data;
00769 for (i = 0; i < container->nel; i++) {
00770 dbus_message_iter_append_basic (&iter2,
00771 DBUS_TYPE_UINT64, p_i64);
00772 p_i64++;
00773 }
00774 break;
00775 case EASYDBUS_ELTYPE_BYTE:
00776 p_byte = (char *) container->p_data;
00777 for (i = 0; i < container->nel; i++) {
00778 dbus_message_iter_append_basic (&iter2,
00779 DBUS_TYPE_BYTE, p_byte);
00780 p_byte++;
00781 }
00782 break;
00783 case EASYDBUS_ELTYPE_DOUBLE:
00784 p_double = (double *) container->p_data;
00785 for (i = 0; i < container->nel; i++) {
00786 dbus_message_iter_append_basic (&iter2,
00787 DBUS_TYPE_DOUBLE,
00788 p_double);
00789 p_double++;
00790 }
00791 break;
00792 case EASYDBUS_ELTYPE_BOOLEAN:
00793 p_byte = (char *) container->p_data;
00794 for (i = 0; i < container->nel; i++) {
00795 dbus_message_iter_append_basic (&iter2,
00796 DBUS_TYPE_BOOLEAN,
00797 p_byte);
00798 p_byte++;
00799 }
00800 break;
00801 case EASYDBUS_ELTYPE_STRING:
00802 p_string = (char **) container->p_data;
00803 for (i = 0; i < container->nel; i++) {
00804
00805
00806 dbus_message_iter_append_basic (&iter2,
00807 DBUS_TYPE_STRING,
00808 &p_string[i]);
00809 }
00810 break;
00811 case EASYDBUS_ELTYPE_OBJECT_PATH:
00812 p_string = (char **) container->p_data;
00813 for (i = 0; i < container->nel; i++)
00814 dbus_message_iter_append_basic (&iter2,
00815 DBUS_TYPE_OBJECT_PATH,
00816 &p_string[i]);
00817 break;
00818 case EASYDBUS_ELTYPE_SIGNATURE:
00819 p_string = (char **) container->p_data;
00820 for (i = 0; i < container->nel; i++)
00821 dbus_message_iter_append_basic (&iter2,
00822 DBUS_TYPE_SIGNATURE,
00823 &p_string[i]);
00824 break;
00825 case EASYDBUS_ELTYPE_ARRAY:
00826 internal_el = (struct EasyDbus_elem *) container->p_data;
00827 for (i = 0; i < container->nel; i++) {
00828 easydbus_add_array_on_container_tomsg
00829 (msg, &iter2, internal_el);
00830 internal_el = internal_el->next;
00831 }
00832 break;
00833 case EASYDBUS_ELTYPE_VARIANT:
00834 internal_el = (struct EasyDbus_elem *)
00835 container->p_data;
00836 for (i = 0; i < container->nel; i++) {
00837 add_variant_to_container_on_msg (msg, internal_el,
00838 &iter2);
00839 internal_el = internal_el->next;
00840 }
00841 break;
00842 case EASYDBUS_ELTYPE_DICT_ENTRY:
00843 internal_el = (struct EasyDbus_elem *)
00844 container->p_data;
00845 for (i = 0; i < container->nel; i++) {
00846 easydbus_add_dict_entry_tomsg (msg, &iter2, internal_el);
00847 internal_el = internal_el->next;
00848 }
00849 break;
00850 case EASYDBUS_ELTYPE_STRUCT:
00851 internal_el = (struct EasyDbus_elem *)
00852 container->p_data;
00853 while (internal_el != NULL) {
00854 easydbus_add_struct_on_container_msg
00855 (msg, &iter2, internal_el);
00856 internal_el = internal_el->next;
00857 }
00858 break;
00859 case EASYDBUS_ELTYPE_INVALID:
00860 EasyDbusDebug ("ERROR This type must not be used!");
00861 break;
00862 }
00863
00864
00865
00866 free (--signature);
00867
00868 end:
00869 dbus_message_iter_close_container (iter, &iter2);
00870
00871 return ret_val;
00872 }
00873
00874
00875
00878
00879
00880
00881
00898 struct easydbus_signature_elem_stack *
00899 easydbus_add_elem_to_stack (enum el_type el,
00900 struct easydbus_signature_elem_stack
00901 *stack)
00902 {
00903 struct easydbus_signature_elem_stack *new_el = NULL;
00904 struct easydbus_signature_elem_stack *tmp_el = NULL;
00905
00906 new_el = (struct easydbus_signature_elem_stack *)
00907 malloc (sizeof (struct easydbus_signature_elem_stack));
00908
00909 if (!new_el)
00910 return NULL;
00911
00912 memset (new_el, 0, sizeof (struct easydbus_signature_elem_stack));
00913 new_el->next = new_el->prev = NULL;
00914 new_el->type = el;
00915
00916 if (!stack)
00917 return new_el;
00918
00919 tmp_el = stack;
00920 while (tmp_el->next)
00921 tmp_el = tmp_el->next;
00922
00923 tmp_el->next = new_el;
00924 new_el->prev = tmp_el;
00925 return stack;
00926 }
00927
00932 void
00933 easydbus_free_elem_from_stack
00934 (struct easydbus_signature_elem_stack *el)
00935 {
00936 if (!el)
00937 return;
00938
00939 if (el->next)
00940 el->next->prev = el->prev;
00941 if (el->prev)
00942 el->prev->next = el->next;
00943 free (el);
00944 }
00945
00950 inline void
00951 easydbus_free_elem_from_stack_list
00952 (struct easydbus_signature_elem_stack *list)
00953 {
00954 struct easydbus_signature_elem_stack *tmp_elem = NULL;
00955
00956 while (list) {
00957 tmp_elem = list;
00958 list = list->next;
00959 easydbus_free_elem_from_stack (tmp_elem);
00960 }
00961 }
00962
00964