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
00031
00037 #include <stdlib.h>
00038 #include <string.h>
00039
00040 #include "easydbus-core.h"
00041 #include "array_internal.h"
00042 #include "elem_internal.h"
00043 #include "utils.h"
00044 #include "debug.h"
00045
00053 int
00054 easydbus_array_add_array (EasyDbus_container * array_src,
00055 EasyDbus_container * array_dst)
00056 {
00057
00058 struct EasyDbus_elem *el = NULL;
00059 struct EasyDbus_elem *elms = NULL;
00060
00061 if (!array_src || !array_dst ||
00062 array_src->container_type != EASYDBUS_ELTYPE_ARRAY ||
00063 array_dst->container_type != EASYDBUS_ELTYPE_ARRAY)
00064 return -1;
00065
00066
00067 el = easydbus_elem_create (EASYDBUS_ELTYPE_ARRAY);
00068 if (!el)
00069 return -1;
00070
00071 el->payload.p_container = array_src;
00072
00073 if (array_dst->nel) {
00074
00075 elms = (struct EasyDbus_elem *) array_dst->p_data;
00076 while (elms->next)
00077 elms = elms->next;
00078 elms->next = el;
00079 }
00080 else {
00081
00082 array_dst->elem_type = EASYDBUS_ELTYPE_ARRAY;
00083 array_dst->p_data = el;
00084 }
00085
00086 array_dst->nel++;
00087 return 0;
00088 }
00089
00101 int
00102 easydbus_array_add_dict_entry (EasyDbus_container * dict_entry,
00103 EasyDbus_container * array)
00104 {
00105
00106 struct EasyDbus_elem *el = NULL;
00107 struct EasyDbus_elem *elms = NULL;
00108
00109 if (!array || !dict_entry ||
00110 dict_entry->container_type != EASYDBUS_ELTYPE_DICT_ENTRY ||
00111 array->container_type != EASYDBUS_ELTYPE_ARRAY)
00112 return -1;
00113
00114
00115 el = easydbus_elem_create (EASYDBUS_ELTYPE_DICT_ENTRY);
00116 if (!el)
00117 return -1;
00118
00119 el->payload.p_container = dict_entry;
00120
00121 if (array->nel) {
00122
00123 elms = (struct EasyDbus_elem *) array->p_data;
00124 while (elms->next)
00125 elms = elms->next;
00126 elms->next = el;
00127 }
00128 else {
00129
00130 array->elem_type = EASYDBUS_ELTYPE_DICT_ENTRY;
00131 array->p_data = el;
00132 }
00133
00134 array->nel++;
00135 return 0;
00136 }
00137
00145 int
00146 easydbus_array_add_variant (EasyDbus_container * variant,
00147 EasyDbus_container * array)
00148 {
00149
00150 struct EasyDbus_elem *el = NULL;
00151 struct EasyDbus_elem *elms = NULL;
00152
00153 if (!array || !variant ||
00154 variant->container_type != EASYDBUS_ELTYPE_VARIANT ||
00155 array->container_type != EASYDBUS_ELTYPE_ARRAY)
00156 return -1;
00157
00158
00159 el = easydbus_elem_create (EASYDBUS_ELTYPE_VARIANT);
00160 if (!el)
00161 return -1;
00162
00163 el->payload.p_container = variant;
00164
00165 if (array->nel) {
00166
00167 elms = (struct EasyDbus_elem *) array->p_data;
00168 while (elms->next)
00169 elms = elms->next;
00170 elms->next = el;
00171 }
00172 else {
00173
00174 array->elem_type = EASYDBUS_ELTYPE_VARIANT;
00175 array->p_data = el;
00176 }
00177
00178 array->nel++;
00179 return 0;
00180 }
00181
00189 int
00190 easydbus_array_add_struct (EasyDbus_container * struct_internal,
00191 EasyDbus_container * array)
00192 {
00193
00194 struct EasyDbus_elem *el = NULL;
00195 struct EasyDbus_elem *elms = NULL;
00196
00197 if (!array || !struct_internal ||
00198 struct_internal->container_type != EASYDBUS_ELTYPE_STRUCT ||
00199 array->container_type != EASYDBUS_ELTYPE_ARRAY)
00200 return -1;
00201
00202
00203 el = easydbus_elem_create (EASYDBUS_ELTYPE_STRUCT);
00204 if (!el)
00205 return -1;
00206
00207 el->payload.p_container = struct_internal;
00208
00209 if (array->nel) {
00210
00211 elms = (struct EasyDbus_elem *) array->p_data;
00212 while (elms->next)
00213 elms = elms->next;
00214 elms->next = el;
00215 }
00216 else {
00217
00218 array->elem_type = EASYDBUS_ELTYPE_STRUCT;
00219 array->p_data = el;
00220 }
00221
00222 array->nel++;
00223 return 0;
00224 }
00225
00237 int
00238 easydbus_array_add_byte_array (EasyDbus_container * container,
00239 unsigned int nel, char *bytes)
00240 {
00241 if (nel == 0 || !bytes || !container)
00242 return -1;
00243
00244 if (container->container_type != EASYDBUS_ELTYPE_ARRAY)
00245 return -1;
00246
00247 if (container->nel)
00248 return -1;
00249
00250
00251 container->p_data = malloc (nel);
00252 if (!container->p_data)
00253 return -1;
00254
00255 EASYDBUS_MEMCOPY (container->p_data, bytes, nel);
00256
00257 container->nel = nel;
00258 container->elem_type = EASYDBUS_ELTYPE_BYTE;
00259 return 0;
00260 }
00261
00273 int
00274 easydbus_array_add_boolean_array (EasyDbus_container * container,
00275 unsigned int nel,
00276 char *boolean_array)
00277 {
00278 if (nel == 0 || !boolean_array || !container ||
00279 container->container_type != EASYDBUS_ELTYPE_ARRAY)
00280 return -1;
00281
00282 if (container->nel)
00283 return -1;
00284
00285 container->p_data = malloc (nel);
00286 if (!container->p_data)
00287 return -1;
00288
00289 EASYDBUS_MEMCOPY (container->p_data, boolean_array, nel);
00290
00291 container->nel = nel;
00292 container->elem_type = EASYDBUS_ELTYPE_BOOLEAN;
00293
00294 return 0;
00295 }
00296
00308 int
00309 easydbus_array_add_i16_array (EasyDbus_container * container,
00310 unsigned int nel, short *i16_array)
00311 {
00312 size_t size_array = 0;
00313
00314 if (nel == 0 || !i16_array || !container ||
00315 container->container_type != EASYDBUS_ELTYPE_ARRAY)
00316 return -1;
00317
00318 if (container->nel)
00319 return -1;
00320
00321 size_array = sizeof (short[nel]);
00322
00323 container->p_data = malloc (size_array);
00324 if (!container->p_data)
00325 return -1;
00326
00327 EASYDBUS_MEMCOPY (container->p_data, i16_array, size_array);
00328
00329 container->nel = nel;
00330 container->elem_type = EASYDBUS_ELTYPE_INT16;
00331
00332 return 0;
00333 }
00334
00346 int
00347 easydbus_array_add_ui16_array (EasyDbus_container * container,
00348 unsigned int nel,
00349 unsigned short *ui16_array)
00350 {
00351 size_t size_array = 0;
00352
00353 if (nel == 0 || !ui16_array || !container ||
00354 container->container_type != EASYDBUS_ELTYPE_ARRAY)
00355 return -1;
00356
00357 if (container->nel)
00358 return -1;
00359
00360 size_array = sizeof (short[nel]);
00361
00362 container->p_data = malloc (size_array);
00363 if (!container->p_data)
00364 return -1;
00365
00366 EASYDBUS_MEMCOPY (container->p_data, ui16_array, size_array);
00367
00368 container->nel = nel;
00369 container->elem_type = EASYDBUS_ELTYPE_UINT16;
00370
00371 return 0;
00372 }
00373
00385 int
00386 easydbus_array_add_i32_array (EasyDbus_container * container,
00387 unsigned int nel, int *i32_array)
00388 {
00389 size_t size_array = 0;
00390
00391 if (nel == 0 || !i32_array || !container ||
00392 container->container_type != EASYDBUS_ELTYPE_ARRAY)
00393 return -1;
00394
00395 if (container->nel)
00396 return -1;
00397
00398 size_array = sizeof (int[nel]);
00399
00400 container->p_data = malloc (size_array);
00401 if (!container->p_data)
00402 return -1;
00403
00404 EASYDBUS_MEMCOPY (container->p_data, i32_array, size_array);
00405
00406 container->nel = nel;
00407 container->elem_type = EASYDBUS_ELTYPE_INT32;
00408
00409 return 0;
00410 }
00411
00423 int
00424 easydbus_array_add_ui32_array (EasyDbus_container * container,
00425 unsigned int nel,
00426 unsigned int *ui32_array)
00427 {
00428 size_t size_array = 0;
00429
00430 if (nel == 0 || !ui32_array || !container ||
00431 container->container_type != EASYDBUS_ELTYPE_ARRAY)
00432 return -1;
00433
00434 if (container->nel)
00435 return -1;
00436
00437 size_array = sizeof (int[nel]);
00438
00439 container->p_data = malloc (size_array);
00440 if (!container->p_data)
00441 return -1;
00442
00443 EASYDBUS_MEMCOPY (container->p_data, ui32_array, size_array);
00444
00445 container->nel = nel;
00446 container->elem_type = EASYDBUS_ELTYPE_UINT32;
00447
00448 return 0;
00449 }
00450
00462 int
00463 easydbus_array_add_i64_array (EasyDbus_container * container,
00464 unsigned int nel, long long *i64_array)
00465 {
00466 size_t size_array = 0;
00467
00468 if (nel == 0 || !i64_array || !container ||
00469 container->container_type != EASYDBUS_ELTYPE_ARRAY)
00470 return -1;
00471
00472 if (container->nel)
00473 return -1;
00474
00475 size_array = sizeof (long long[nel]);
00476
00477 container->p_data = malloc (size_array);
00478 if (!container->p_data)
00479 return -1;
00480
00481 EASYDBUS_MEMCOPY (container->p_data, i64_array, size_array);
00482 container->nel = nel;
00483 container->elem_type = EASYDBUS_ELTYPE_INT64;
00484
00485 return 0;
00486 }
00487
00499 int
00500 easydbus_array_add_ui64_array (EasyDbus_container * container,
00501 unsigned int nel,
00502 unsigned long long *ui64_array)
00503 {
00504 size_t size_array = 0;
00505
00506 if (nel == 0 || !ui64_array || !container ||
00507 container->container_type != EASYDBUS_ELTYPE_ARRAY)
00508 return -1;
00509
00510 if (container->nel)
00511 return -1;
00512
00513 size_array = sizeof (long long[nel]);
00514
00515 container->p_data = malloc (size_array);
00516 if (!container->p_data)
00517 return -1;
00518
00519 EASYDBUS_MEMCOPY (container->p_data, ui64_array, size_array);
00520 container->nel = nel;
00521 container->elem_type = EASYDBUS_ELTYPE_UINT64;
00522
00523 return 0;
00524 }
00525
00537 int
00538 easydbus_array_add_double_array (EasyDbus_container * container,
00539 unsigned int nel,
00540 double *double_array)
00541 {
00542 size_t size_array = 0;
00543
00544 if (nel == 0 || !double_array || !container ||
00545 container->container_type != EASYDBUS_ELTYPE_ARRAY)
00546 return -1;
00547
00548 if (container->nel)
00549 return -1;
00550
00551 size_array = sizeof (double[nel]);
00552
00553 container->p_data = malloc (size_array);
00554 if (!container->p_data)
00555 return -1;
00556
00557 EASYDBUS_MEMCOPY (container->p_data, double_array, size_array);
00558 container->nel = nel;
00559 container->elem_type = EASYDBUS_ELTYPE_DOUBLE;
00560
00561 return 0;
00562 }
00563
00576 int
00577 easydbus_array_add_string_array (EasyDbus_container * container,
00578 unsigned int nel,
00579 char **string_array)
00580 {
00581 char **iterator, **iterator2 = NULL;
00582 int i = 0;
00583
00584 if (nel == 0 || !string_array || !container ||
00585 container->container_type != EASYDBUS_ELTYPE_ARRAY)
00586 return -1;
00587
00588 if (container->nel)
00589 return -1;
00590
00591 container->p_data = malloc (sizeof (char *[nel]));
00592 if (!container->p_data)
00593 return -1;
00594
00595 memset (container->p_data, 0, nel);
00596
00597 iterator = string_array;
00598 iterator2 = (char **) container->p_data;
00599
00600 for (i = 0; i < (int) nel; i++) {
00601 if (!iterator[i])
00602 goto error;
00603 iterator2[i] = (char *) malloc (strlen (iterator[i]) + 1);
00604 if (!iterator2[i])
00605 goto error;
00606
00607 EASYDBUS_MEMCOPY (iterator2[i], iterator[i],
00608 strlen (iterator[i]) + 1);
00609
00610
00611 }
00612
00613 container->nel = nel;
00614 container->elem_type = EASYDBUS_ELTYPE_STRING;
00615
00616 return 0;
00617
00618 error:
00619 i--;
00620 for (; i > 0; i--) {
00621
00622 if (iterator2[i])
00623 free (iterator2[i]);
00624 }
00625 free (container->p_data);
00626 return -1;
00627 }
00628
00641 int
00642 easydbus_array_add_obj_path_array (EasyDbus_container * container,
00643 unsigned int nel,
00644 char **obj_path_array)
00645 {
00646 char **iterator, **iterator2 = NULL;
00647 int i = 0;
00648
00649 if (nel == 0 || !obj_path_array || !container ||
00650 container->container_type != EASYDBUS_ELTYPE_ARRAY)
00651 return -1;
00652
00653 if (container->nel)
00654 return -1;
00655
00656 container->p_data = malloc (sizeof (char *[nel]));
00657 if (!container->p_data)
00658 return -1;
00659
00660 memset (container->p_data, 0, nel);
00661
00662 iterator = obj_path_array;
00663 iterator2 = (char **) container->p_data;
00664
00665 for (i = 0; i < (int) nel; i++) {
00666 if (!iterator[i])
00667 goto error;
00668 iterator2[i] = (char *) malloc (strlen (iterator[i]) + 1);
00669 if (!iterator2[i])
00670 goto error;
00671 EASYDBUS_MEMCOPY (iterator2[i], iterator[i],
00672 strlen (iterator[i]) + 1);
00673
00674
00675 }
00676
00677 container->nel = nel;
00678 container->elem_type = EASYDBUS_ELTYPE_OBJECT_PATH;
00679
00680 return 0;
00681
00682 error:
00683 i--;
00684 for (; i > 0; i--) {
00685
00686 if (iterator2[i])
00687 free (iterator2[i]);
00688 }
00689 free (container->p_data);
00690 return -1;
00691 }
00692
00705 int
00706 easydbus_array_add_signature_array (EasyDbus_container * container,
00707 unsigned int nel,
00708 char **signature_array)
00709 {
00710 char **iterator, **iterator2 = NULL;
00711 int i = 0;
00712
00713 if (nel == 0 || !signature_array || !container ||
00714 container->container_type != EASYDBUS_ELTYPE_ARRAY)
00715 return -1;
00716
00717 if (container->nel)
00718 return -1;
00719
00720 container->p_data = malloc (sizeof (char *[nel]));
00721 if (!container->p_data)
00722 return -1;
00723
00724 memset (container->p_data, 0, nel);
00725
00726 iterator = signature_array;
00727 iterator2 = (char **) container->p_data;
00728
00729 for (i = 0; i < (int) nel; i++) {
00730 if (!iterator[i])
00731 goto error;
00732 iterator2[i] = (char *) malloc (strlen (iterator[i]) + 1);
00733 if (!iterator2[i])
00734 goto error;
00735 EASYDBUS_MEMCOPY (iterator2[i], iterator[i],
00736 strlen (iterator[i]) + 1);
00737
00738
00739 }
00740
00741 container->nel = nel;
00742 container->elem_type = EASYDBUS_ELTYPE_SIGNATURE;
00743
00744 return 0;
00745
00746 error:
00747 i--;
00748 for (; i > 0; i--) {
00749
00750 if (iterator2[i])
00751 free (iterator2[i]);
00752 }
00753 free (container->p_data);
00754 return -1;
00755 }
00756
00767 const EasyDbus_container *
00768 easydbus_array_get_array (EasyDbus_container * array, unsigned int n)
00769 {
00770 EasyDbus_elem *el = NULL;
00771 unsigned int i;
00772
00773 if (!array || n == 0 || n > array->nel ||
00774 array->container_type != EASYDBUS_ELTYPE_ARRAY ||
00775 array->elem_type != EASYDBUS_ELTYPE_ARRAY)
00776 return NULL;
00777
00778
00779 for (i = 1, el = (struct EasyDbus_elem *) array->p_data;
00780 i < n; i++, el = el->next);
00781
00782 return (el ? (const EasyDbus_container *) el->payload.p_container :
00783 NULL);
00784 }
00785
00796 const EasyDbus_container *
00797 easydbus_array_get_dict_entry (EasyDbus_container * array,
00798 unsigned int n)
00799 {
00800 EasyDbus_elem *el = NULL;
00801 unsigned int i;
00802
00803 if (!array || n == 0 || n > array->nel ||
00804 array->container_type != EASYDBUS_ELTYPE_ARRAY ||
00805 array->elem_type != EASYDBUS_ELTYPE_DICT_ENTRY)
00806 return NULL;
00807
00808
00809 for (i = 1, el = (struct EasyDbus_elem *) array->p_data;
00810 i < n; i++, el = el->next);
00811
00812 return (el ? (const EasyDbus_container *) el->payload.p_container :
00813 NULL);
00814 }
00815
00816
00827 const EasyDbus_container *
00828 easydbus_array_get_variant (EasyDbus_container * array,
00829 unsigned int n)
00830 {
00831 EasyDbus_elem *el = NULL;
00832 unsigned int i;
00833
00834 if (!array || n == 0 || n > array->nel ||
00835 array->container_type != EASYDBUS_ELTYPE_ARRAY ||
00836 array->elem_type != EASYDBUS_ELTYPE_VARIANT)
00837 return NULL;
00838
00839
00840 for (i = 1, el = (struct EasyDbus_elem *) array->p_data;
00841 i < n; i++, el = el->next);
00842
00843 return (el ? (const EasyDbus_container *) el->payload.p_container :
00844 NULL);
00845 }
00846
00857 const EasyDbus_container *
00858 easydbus_array_get_struct (EasyDbus_container * array, unsigned int n)
00859 {
00860 EasyDbus_elem *el = NULL;
00861 unsigned int i;
00862
00863 if (!array || n == 0 || n > array->nel ||
00864 array->container_type != EASYDBUS_ELTYPE_ARRAY ||
00865 array->elem_type != EASYDBUS_ELTYPE_STRUCT)
00866 return NULL;
00867
00868
00869 for (i = 1, el = (struct EasyDbus_elem *) array->p_data;
00870 i < n; i++, el = el->next);
00871
00872 return (el ?
00873 (const EasyDbus_container *) el->payload.p_container :
00874 NULL);
00875 }
00876
00885 const char *
00886 easydbus_array_get_byte_array (EasyDbus_container * array)
00887 {
00888 if (!array ||
00889 array->container_type != EASYDBUS_ELTYPE_ARRAY ||
00890 array->elem_type != EASYDBUS_ELTYPE_BYTE)
00891 return NULL;
00892
00893 return (const char *) array->p_data;
00894 }
00895
00904 const char *
00905 easydbus_array_get_boolean_array (EasyDbus_container * array)
00906 {
00907 if (!array ||
00908 array->container_type != EASYDBUS_ELTYPE_ARRAY ||
00909 array->elem_type != EASYDBUS_ELTYPE_BOOLEAN)
00910 return NULL;
00911
00912 return (const char *) array->p_data;
00913 }
00914
00923 const short *
00924 easydbus_array_get_i16_array (EasyDbus_container * array)
00925 {
00926 if (!array ||
00927 array->container_type != EASYDBUS_ELTYPE_ARRAY ||
00928 array->elem_type != EASYDBUS_ELTYPE_INT16)
00929 return NULL;
00930
00931 return (const short *) array->p_data;
00932 }
00933
00942 const unsigned short *
00943 easydbus_array_get_ui16_array (EasyDbus_container * array)
00944 {
00945 if (!array ||
00946 array->container_type != EASYDBUS_ELTYPE_ARRAY ||
00947 array->elem_type != EASYDBUS_ELTYPE_UINT16)
00948 return NULL;
00949
00950 return (const unsigned short *) array->p_data;
00951 }
00952
00953
00962 const int *
00963 easydbus_array_get_i32_array (EasyDbus_container * array)
00964 {
00965 if (!array ||
00966 array->container_type != EASYDBUS_ELTYPE_ARRAY ||
00967 array->elem_type != EASYDBUS_ELTYPE_INT32)
00968 return NULL;
00969
00970 return (const int *) array->p_data;
00971 }
00972
00981 const unsigned int *
00982 easydbus_array_get_ui32_array (EasyDbus_container * array)
00983 {
00984 if (!array ||
00985 array->container_type != EASYDBUS_ELTYPE_ARRAY ||
00986 array->elem_type != EASYDBUS_ELTYPE_UINT32)
00987 return NULL;
00988
00989 return (const unsigned int *) array->p_data;
00990 }
00991
01000 const long long *
01001 easydbus_array_get_i64_array (EasyDbus_container * array)
01002 {
01003 if (!array ||
01004 array->container_type != EASYDBUS_ELTYPE_ARRAY ||
01005 array->elem_type != EASYDBUS_ELTYPE_INT64)
01006 return NULL;
01007
01008 return (const long long *) array->p_data;
01009 }
01010
01019 const unsigned long long *
01020 easydbus_array_get_ui64_array (EasyDbus_container * array)
01021 {
01022 if (!array ||
01023 array->container_type != EASYDBUS_ELTYPE_ARRAY ||
01024 array->elem_type != EASYDBUS_ELTYPE_UINT64)
01025 return NULL;
01026
01027 return (const unsigned long long *) array->p_data;
01028 }
01029
01038 const double *
01039 easydbus_array_get_double_array (EasyDbus_container * array)
01040 {
01041 if (!array ||
01042 array->container_type != EASYDBUS_ELTYPE_ARRAY ||
01043 array->elem_type != EASYDBUS_ELTYPE_DOUBLE)
01044 return NULL;
01045
01046 return (const double *) array->p_data;
01047 }
01048
01057 const char **
01058 easydbus_array_get_string_array (EasyDbus_container * array)
01059 {
01060 if (!array ||
01061 array->container_type != EASYDBUS_ELTYPE_ARRAY ||
01062 array->elem_type != EASYDBUS_ELTYPE_STRING)
01063 return NULL;
01064
01065 return (const char **) array->p_data;
01066 }
01067
01076 const char **
01077 easydbus_array_get_obj_path_array (EasyDbus_container * array)
01078 {
01079 if (!array ||
01080 array->container_type != EASYDBUS_ELTYPE_ARRAY ||
01081 array->elem_type != EASYDBUS_ELTYPE_OBJECT_PATH)
01082 return NULL;
01083
01084 return (const char **) array->p_data;
01085 }
01086
01095 const char **
01096 easydbus_array_get_signature_array (EasyDbus_container * array)
01097 {
01098 if (!array ||
01099 array->container_type != EASYDBUS_ELTYPE_ARRAY ||
01100 array->elem_type != EASYDBUS_ELTYPE_SIGNATURE)
01101 return NULL;
01102
01103 return (const char **) array->p_data;
01104 }
01105
01106