2 * Copyright (c) 2000 - 2016 Samsung Electronics Co., Ltd. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
26 #include "bundle_internal.h"
28 #include "keyval_array.h"
29 #include "keyval_type.h"
30 #include "bundle_log.h"
32 #define CHECKSUM_LENGTH 32
33 #define TAG_IMPORT_EXPORT_CHECK "`zaybxcwdveuftgsh`"
41 * Find a kv from bundle
43 static keyval_t *_bundle_find_kv(bundle *b, const char *key)
48 set_last_result(BUNDLE_ERROR_INVALID_PARAMETER);
53 set_last_result(BUNDLE_ERROR_INVALID_PARAMETER);
59 if (strcmp(key, kv->key) == 0) {
60 set_last_result(BUNDLE_ERROR_NONE);
66 set_last_result(BUNDLE_ERROR_KEY_NOT_AVAILABLE);
71 * Append kv into bundle
73 static int _bundle_append_kv(bundle *b, keyval_t *new_kv)
77 if (b->kv_head == NULL) {
86 return BUNDLE_ERROR_NONE;
89 static int _bundle_add_kv(bundle *b, const char *key, const void *val,
90 const size_t size, const int type, const unsigned int len)
96 /* basic value check */
98 return BUNDLE_ERROR_INVALID_PARAMETER;
100 return BUNDLE_ERROR_INVALID_PARAMETER;
101 if (strlen(key) == 0)
102 return BUNDLE_ERROR_INVALID_PARAMETER;
104 kv = _bundle_find_kv(b, key);
105 if (kv) /* Key already exists */
106 return BUNDLE_ERROR_KEY_EXISTS;
108 if (keyval_type_is_array(type)) {
110 kva = keyval_array_new(NULL, key, type,
111 (const void **) val, len);
112 new_kv = (keyval_t *)kva;
115 new_kv = keyval_new(NULL, key, type, val, size);
119 return BUNDLE_ERROR_OUT_OF_MEMORY;
121 _bundle_append_kv(b, new_kv);
123 return BUNDLE_ERROR_NONE;
126 static int _bundle_get_val(bundle *b, const char *key, const int type,
127 void **val, size_t *size, unsigned int *len,
128 size_t **array_element_size)
133 kv = _bundle_find_kv(b, key);
134 if (!kv) /* Key doesn't exist */
135 return get_last_result();
137 if (BUNDLE_TYPE_ANY != type && type != kv->type)
138 return BUNDLE_ERROR_INVALID_PARAMETER;
140 if (keyval_type_is_array(type)) {
141 kva = (keyval_array_t *)kv;
142 keyval_array_get_data(kva, NULL, (void ***)val,
143 len, array_element_size);
145 keyval_get_data(kv, NULL, val, size);
148 return BUNDLE_ERROR_NONE;
152 * global initialization
155 static void _bundle_global_init(void)
162 /* Run init functions */
170 bundle *bundle_create(void)
174 _bundle_global_init();
176 b = calloc(1, sizeof(bundle)); /* fill mem with NULL */
178 BUNDLE_EXCEPTION_PRINT(
179 "Unable to allocate memory for bundle\n");
180 set_last_result(BUNDLE_ERROR_OUT_OF_MEMORY);
184 set_last_result(BUNDLE_ERROR_NONE);
191 int bundle_free(bundle *b)
197 BUNDLE_EXCEPTION_PRINT("Bundle is already freed\n");
198 return BUNDLE_ERROR_INVALID_PARAMETER;
201 /* Free keyval list */
206 tmp_kv->method->free(tmp_kv, 1);
212 return BUNDLE_ERROR_NONE;
215 int bundle_add_str(bundle *b, const char *key, const char *str)
218 return BUNDLE_ERROR_INVALID_PARAMETER;
219 return _bundle_add_kv(b, key, str, strlen(str) + 1, BUNDLE_TYPE_STR, 1);
222 int bundle_get_str(bundle *b, const char *key, char **str)
224 return _bundle_get_val(b, key, BUNDLE_TYPE_STR, (void **)str,
228 int bundle_add(bundle *b, const char *key, const char *val)
230 return bundle_add_str(b, key, val);
233 int bundle_del(bundle *b, const char *key)
236 keyval_t *prev_kv = NULL;
238 /* basic value check */
240 return BUNDLE_ERROR_INVALID_PARAMETER;
242 return BUNDLE_ERROR_INVALID_PARAMETER;
243 if (strlen(key) == 0)
244 return BUNDLE_ERROR_INVALID_PARAMETER;
248 if (strcmp(key, kv->key) == 0)
255 return BUNDLE_ERROR_KEY_NOT_AVAILABLE;
258 prev_kv->next = kv->next;
259 if (kv == b->kv_head)
260 b->kv_head = kv->next;
261 kv->method->free(kv, 1);
264 return BUNDLE_ERROR_NONE;
267 const char *bundle_get_val(bundle *b, const char *key)
270 int ret = BUNDLE_ERROR_NONE;
272 ret = bundle_get_str(b, key, &val);
273 set_last_result(ret);
279 * @brief used by bundle_get_count() API, to count number of items in a bundle
281 static void _bundle_get_count_iter(const char *k, const int type,
282 const bundle_keyval_t *kv, void *user_data)
284 int *count = (int *)user_data;
288 int bundle_get_count(bundle *b)
294 bundle_foreach(b, _bundle_get_count_iter, &count);
298 void bundle_iterate(bundle *b, bundle_iterate_cb_t callback, void *data)
302 if (b == NULL || callback == NULL) {
303 set_last_result(BUNDLE_ERROR_INVALID_PARAMETER);
309 callback(kv->key, kv->val, data);
313 set_last_result(BUNDLE_ERROR_NONE);
316 void bundle_foreach(bundle *b, bundle_iterator_t iter, void *user_data)
320 if (b == NULL || iter == NULL) {
321 set_last_result(BUNDLE_ERROR_INVALID_PARAMETER);
322 return; /* TC_FIX if b = NULL- error handling */
327 iter(kv->key, kv->type, kv, user_data);
331 set_last_result(BUNDLE_ERROR_NONE);
334 /* keyval functions */
335 int bundle_keyval_get_type(bundle_keyval_t *kv)
338 set_last_result(BUNDLE_ERROR_INVALID_PARAMETER);
341 set_last_result(BUNDLE_ERROR_NONE);
345 int bundle_keyval_type_is_array(bundle_keyval_t *kv)
348 set_last_result(BUNDLE_ERROR_INVALID_PARAMETER);
351 set_last_result(BUNDLE_ERROR_NONE);
352 return keyval_type_is_array(kv->type);
355 int bundle_keyval_type_is_measurable(bundle_keyval_t *kv)
358 set_last_result(BUNDLE_ERROR_INVALID_PARAMETER);
361 set_last_result(BUNDLE_ERROR_NONE);
362 return keyval_type_is_measurable(kv->type);
365 int bundle_keyval_get_basic_val(bundle_keyval_t *kv, void **val, size_t *size)
367 return keyval_get_data(kv, NULL, val, size);
370 int bundle_keyval_get_array_val(bundle_keyval_t *kv, void ***array_val,
371 unsigned int *array_len, size_t **array_item_size)
373 return keyval_array_get_data((keyval_array_t *)kv, NULL,
374 array_val, array_len, array_item_size);
377 bundle_keyval_t *bundle_keyval_dup(const bundle_keyval_t *kv)
379 bundle_keyval_t *ret_kv = NULL;
387 if (keyval_type_is_array(kv->type)) {
388 len = keyval_array_encode(
389 (keyval_array_t *)kv, &byte, &byte_len);
392 len = keyval_array_decode(byte,
393 (keyval_array_t **)&ret_kv, byte_len);
398 len = keyval_encode((keyval_t *)kv,
399 (unsigned char **)&byte, &byte_len);
403 (unsigned char *)byte, (keyval_t **)&ret_kv, byte_len);
411 bundle *bundle_dup(bundle *b_from)
416 keyval_array_t *kva_from;
419 if (b_from == NULL) {
420 set_last_result(BUNDLE_ERROR_INVALID_PARAMETER);
424 b_to = bundle_create();
428 kv_from = b_from->kv_head;
429 while (kv_from != NULL) {
430 if (keyval_type_is_array(kv_from->type)) {
431 kva_from = (keyval_array_t *)kv_from;
432 kv_to = (keyval_t *)keyval_array_new(NULL, kv_from->key,
433 kv_from->type, NULL, kva_from->len);
437 for (i = 0; i < kva_from->len; i++) {
438 if (((keyval_array_t *)kv_from)->array_val[i]) {
439 keyval_array_set_element(
440 (keyval_array_t *)kv_to, i,
441 ((keyval_array_t *)kv_from)->array_val[i],
442 ((keyval_array_t *)kv_from)->array_element_size[i]);
446 _bundle_append_kv(b_to, kv_to);
448 if (_bundle_add_kv(b_to, kv_from->key,
449 kv_from->val, kv_from->size, kv_from->type, 0))
453 kv_from = kv_from->next;
463 int bundle_encode(bundle *b, bundle_raw **r, int *len)
473 if (b == NULL || r == NULL || len == NULL)
474 return BUNDLE_ERROR_INVALID_PARAMETER;
476 /* calculate memory size */
479 msize += kv->method->get_encoded_size(kv);
483 m = calloc(msize + CHECKSUM_LENGTH, sizeof(unsigned char));
484 if (unlikely(m == NULL))
485 return BUNDLE_ERROR_OUT_OF_MEMORY;
487 p_m = m + CHECKSUM_LENGTH; /* temporary pointer */
494 kv->method->encode(kv, &byte, &byte_len);
495 memcpy(p_m, byte, byte_len);
503 /* compute checksum from the data */
504 chksum_val = g_compute_checksum_for_string(G_CHECKSUM_MD5,
505 (const char *)(m + CHECKSUM_LENGTH), msize);
506 /* prefix checksum to the data */
507 memcpy(m, chksum_val, CHECKSUM_LENGTH);
509 /* base64 encode for whole string checksum and data */
510 *r = (unsigned char *)g_base64_encode(m, msize + CHECKSUM_LENGTH);
512 *len = strlen((char *)*r);
515 g_free(chksum_val); /* free checksum string */
517 return BUNDLE_ERROR_NONE;
520 int bundle_free_encoded_rawdata(bundle_raw **r)
523 return BUNDLE_ERROR_INVALID_PARAMETER; /* TC_FIX - double free sigabrt handling */
527 return BUNDLE_ERROR_NONE;
530 bundle *bundle_decode(const bundle_raw *r, const int data_size)
534 unsigned char *d_str;
537 unsigned int d_len_raw;
541 gchar *compute_cksum;
548 set_last_result(BUNDLE_ERROR_INVALID_PARAMETER);
552 extract_cksum = calloc(CHECKSUM_LENGTH + 1, sizeof(char));
553 if (unlikely(extract_cksum == NULL)) {
554 set_last_result(BUNDLE_ERROR_INVALID_PARAMETER);
559 * base 64 decode of input string
560 * Since base64 encodes 3 bytes in 4 chars (+3 may be needed in case of non-zero state)
561 * refer to: https://developer.gnome.org/glib/stable/glib-Base64-Encoding.html#g-base64-decode-step
563 d_str = malloc((data_size / 4) * 3 + 3);
564 if (unlikely(d_str == NULL)) {
565 set_last_result(BUNDLE_ERROR_OUT_OF_MEMORY);
570 d_len_raw = g_base64_decode_step((char *)r, data_size, d_str, &state, &save);
571 if (d_len_raw < CHECKSUM_LENGTH) {
572 set_last_result(BUNDLE_ERROR_INVALID_PARAMETER);
578 /* extract checksum from the received string */
579 strncpy(extract_cksum, (const char *)d_str, CHECKSUM_LENGTH);
580 /* compute checksum for the data */
581 compute_cksum = g_compute_checksum_for_string(G_CHECKSUM_MD5,
582 (const char *)(d_str + CHECKSUM_LENGTH),
583 d_len_raw - CHECKSUM_LENGTH);
585 * compare checksum values- extracted from the received
586 * string and computed from the data
588 if (strcmp(extract_cksum, compute_cksum) != 0) {
591 g_free(compute_cksum);
594 d_r = d_str + CHECKSUM_LENGTH;
595 d_len = d_len_raw - CHECKSUM_LENGTH;
597 /* re-construct bundle */
602 g_free(compute_cksum);
606 p_r = (bundle_raw *)d_r;
607 while (p_r < d_r + d_len - 1) {
608 kv = NULL; /* To get a new kv */
610 byte_size = d_r + d_len - 1 - p_r;
611 if (byte_size < sizeof(size_t))
614 /* Find type, and use decode function according to type */
615 type = keyval_get_type_from_encoded_byte(p_r);
616 if (keyval_type_is_array(type)) {
617 bytes_read = keyval_array_decode(p_r,
618 (keyval_array_t **)&kv, byte_size + 1);
620 bytes_read = keyval_decode(p_r, &kv, byte_size + 1);
624 _bundle_append_kv(b, kv);
631 g_free(compute_cksum);
634 set_last_result(BUNDLE_ERROR_NONE);
644 int bundle_encode_raw(bundle *b, bundle_raw **r, int *len)
647 unsigned char *m = NULL;
648 unsigned char *p_m = NULL;
649 unsigned char *byte = NULL;
651 gchar *chksum_val = NULL;
654 if (b == NULL || r == NULL)
655 return BUNDLE_ERROR_INVALID_PARAMETER;
657 /* calculate memory size */
660 msize += kv->method->get_encoded_size(kv);
664 m = calloc(msize+CHECKSUM_LENGTH, sizeof(unsigned char));
665 if (unlikely(m == NULL))
666 return BUNDLE_ERROR_OUT_OF_MEMORY;
668 p_m = m + CHECKSUM_LENGTH; /* temporary pointer */
675 kv->method->encode(kv, &byte, &byte_len);
676 memcpy(p_m, byte, byte_len);
684 /* compute checksum from the data */
685 chksum_val = g_compute_checksum_for_string(G_CHECKSUM_MD5,
686 (const char *)(m + CHECKSUM_LENGTH), msize);
687 /* prefix checksum to the data */
688 memcpy(m, chksum_val, CHECKSUM_LENGTH);
691 *len = msize + CHECKSUM_LENGTH;
692 g_free(chksum_val); /* free checksum string */
694 return BUNDLE_ERROR_NONE;
697 bundle *bundle_decode_raw(const bundle_raw *r, const int data_size)
700 bundle_raw *p_r = NULL;
701 unsigned char *d_str = NULL;
702 unsigned int d_len_raw;
703 unsigned char *d_r = NULL;
706 gchar *compute_cksum = NULL;
713 set_last_result(BUNDLE_ERROR_INVALID_PARAMETER);
717 extract_cksum = calloc(CHECKSUM_LENGTH + 1, sizeof(char));
718 if (unlikely(extract_cksum == NULL)) {
719 set_last_result(BUNDLE_ERROR_OUT_OF_MEMORY);
723 /* base 64 decode of input string*/
724 /* d_str = g_base64_decode((char*)r, &d_len_raw); */
725 d_str = (unsigned char *)r;
726 d_len_raw = data_size;
727 /* extract checksum from the received string */
728 strncpy(extract_cksum, (const char *)d_str, CHECKSUM_LENGTH);
729 /* compute checksum for the data */
730 compute_cksum = g_compute_checksum_for_string(G_CHECKSUM_MD5,
731 (const char *)(d_str + CHECKSUM_LENGTH),
732 d_len_raw - CHECKSUM_LENGTH);
734 * compare checksum values- extracted from the received
735 * string and computed from the data
737 if (strcmp(extract_cksum, compute_cksum) != 0) {
739 g_free(compute_cksum);
740 set_last_result(BUNDLE_ERROR_INVALID_PARAMETER);
743 d_r = d_str + CHECKSUM_LENGTH;
744 d_len = d_len_raw - CHECKSUM_LENGTH;
746 /* re-construct bundle */
750 g_free(compute_cksum);
754 p_r = (bundle_raw *)d_r;
755 while (p_r < d_r + d_len - 1) {
756 kv = NULL; /* To get a new kv */
758 byte_size = d_r + d_len - 1 - p_r;
759 if (byte_size < sizeof(size_t))
762 /* Find type, and use decode function according to type */
763 type = keyval_get_type_from_encoded_byte(p_r);
764 if (keyval_type_is_array(type)) {
765 bytes_read = keyval_array_decode(p_r,
766 (keyval_array_t **)&kv, byte_size + 1);
768 bytes_read = keyval_decode(p_r, &kv, byte_size + 1);
772 _bundle_append_kv(b, kv);
779 g_free(compute_cksum);
780 set_last_result(BUNDLE_ERROR_NONE);
785 void _iter_export_to_argv(const char *key, const int type, const keyval_t *kv,
788 struct _argv_idx *vi = (struct _argv_idx *)user_data;
789 unsigned char *byte = NULL;
790 unsigned char *encoded_byte = NULL;
793 vi->argv[vi->idx] = strdup(key);
794 if (kv->method->encode((struct keyval_t *)kv, &byte, &byte_len) == 0) {
795 /* TODO: encode FAILED! */
796 BUNDLE_EXCEPTION_PRINT("bundle: FAILED to encode keyval: %s\n",
801 encoded_byte = (unsigned char *)g_base64_encode(byte, byte_len);
802 if (encoded_byte == NULL) {
803 BUNDLE_EXCEPTION_PRINT("bundle: failed to encode byte\n");
807 vi->argv[vi->idx + 1] = (char *)encoded_byte;
813 int bundle_export_to_argv(bundle *b, char ***argv)
819 if (b == NULL || argv == NULL) {
820 set_last_result(BUNDLE_ERROR_INVALID_PARAMETER);
824 item_count = bundle_get_count(b);
825 argc = 2 * item_count + 2;
826 /* 2 more count for argv[0] and arv[1] = encoded */
827 *argv = calloc(argc + 1, sizeof(char *));
829 set_last_result(BUNDLE_ERROR_OUT_OF_MEMORY);
835 vi.idx = 2; /* start from index 2*/
836 vi.argv[1] = TAG_IMPORT_EXPORT_CHECK; /* set argv[1] as encoded*/
837 /* BUNDLE_LOG_PRINT("\nargument 1 is %s",vi.argv[1]); */
839 bundle_foreach(b, _iter_export_to_argv, &vi);
841 set_last_result(BUNDLE_ERROR_NONE);
845 int bundle_free_exported_argv(int argc, char ***argv)
850 return BUNDLE_ERROR_INVALID_PARAMETER;
852 if (!*argv || argc < 2)
853 return BUNDLE_ERROR_INVALID_PARAMETER;
855 for (i = 2; i < argc; i++)
860 return BUNDLE_ERROR_NONE;
863 bundle *bundle_import_from_argv(int argc, char **argv)
871 unsigned int byte_size;
875 set_last_result(BUNDLE_ERROR_INVALID_PARAMETER);
876 return NULL; /* TC_FIX error handling for argv =NULL*/
881 set_last_result(BUNDLE_ERROR_OUT_OF_MEMORY);
886 set_last_result(BUNDLE_ERROR_NONE);
890 if (!argv[1] || strcmp(argv[1], TAG_IMPORT_EXPORT_CHECK)) {
891 /* start idx from one as argv[1] is user given argument */
892 for (idx = 1; idx + 1 < argc; idx = idx + 2)
893 bundle_add(b, argv[idx], argv[idx + 1]);
898 /* start idx from 2 as argv[1] is encoded */
899 for (idx = 2; idx + 1 < argc; idx = idx + 2) {
903 encoded_byte = argv[idx+1];
906 byte = g_base64_decode(encoded_byte, (gsize *)&byte_size);
909 set_last_result(bundle_free(b));
913 if (byte_size < sizeof(size_t)) {
920 type = keyval_get_type_from_encoded_byte(byte);
921 if (keyval_type_is_array(type)) {
922 if (keyval_array_decode(byte, &kva, byte_size + 1) == 0) /* TODO: error! */
923 BUNDLE_EXCEPTION_PRINT("Unable to Decode array\n");
924 kv = (keyval_t *)kva;
926 if (keyval_decode(byte, &kv, byte_size + 1) == 0) /* TODO: error! */
927 BUNDLE_EXCEPTION_PRINT("Unable to Decode\n");
929 _bundle_append_kv(b, kv);
936 set_last_result(BUNDLE_ERROR_NONE);
940 int bundle_get_type(bundle *b, const char *key)
942 keyval_t *kv = _bundle_find_kv(b, key);
947 set_last_result(BUNDLE_ERROR_KEY_NOT_AVAILABLE);
948 return BUNDLE_TYPE_NONE;
953 * Get length of an array
955 /* LCOV_EXCL_START */
956 unsigned int bundle_get_array_len(bundle *b, const char *key)
958 return BUNDLE_ERROR_NONE;
963 * Get size of an item in byte, of given pointer
965 /* LCOV_EXCL_START */
966 size_t bundle_get_array_val_size(bundle *b, const char *key,
969 return BUNDLE_ERROR_NONE;
973 static int bundle_set_array_val(bundle *b, const char *key, const int type,
974 const unsigned int idx, const void *val, const size_t size)
979 kv = _bundle_find_kv(b, key);
981 return get_last_result();
983 if (type != kv->type)
984 return BUNDLE_ERROR_INVALID_PARAMETER;
986 /* TODO: Is this needed? */
987 if (!keyval_type_is_array(kv->type))
988 return BUNDLE_ERROR_INVALID_PARAMETER;
990 kva = (keyval_array_t *)kv;
991 if (!keyval_array_is_idx_valid(kva, idx))
992 return BUNDLE_ERROR_INVALID_PARAMETER;
994 /* NULL value test (TODO: is this needed?) */
996 return BUNDLE_ERROR_INVALID_PARAMETER;
998 return keyval_array_set_element(kva, idx, (void *)val, size);
1001 int bundle_add_str_array(bundle *b, const char *key, const char **str_array,
1004 return _bundle_add_kv(b, key, str_array, 0, BUNDLE_TYPE_STR_ARRAY, len);
1007 /* LCOV_EXCL_START */
1008 int bundle_get_val_array(bundle *b, const char *key, char ***str_array,
1011 return _bundle_get_val(b, key, BUNDLE_TYPE_STR_ARRAY,
1012 (void **)str_array, NULL, (unsigned int *)len, NULL);
1014 /* LCOV_EXCL_STOP */
1016 const char **bundle_get_str_array(bundle *b, const char *key, int *len)
1018 int ret = BUNDLE_ERROR_NONE;
1019 const char **arr_val = NULL;
1021 ret = bundle_get_val_array(b, key, (char ***)&arr_val, len);
1022 set_last_result(ret);
1027 /* LCOV_EXCL_START */
1028 int bundle_compare(bundle *b1, bundle *b2)
1036 if (bundle_get_count(b1) != bundle_get_count(b2))
1039 for (kv1 = b1->kv_head; kv1 != NULL; kv1 = kv1->next) {
1040 kv2 = _bundle_find_kv(b2, kv1->key);
1043 if (kv1->method->compare(kv1, kv2))
1049 /* LCOV_EXCL_STOP */
1051 int bundle_set_str_array_element(bundle *b, const char *key,
1052 const unsigned int idx, const char *val)
1055 return BUNDLE_ERROR_INVALID_PARAMETER;
1057 return bundle_set_array_val(b, key, BUNDLE_TYPE_STR_ARRAY,
1058 idx, val, strlen(val) + 1);
1061 int bundle_add_byte(bundle *b, const char *key, const void *byte,
1064 return _bundle_add_kv(b, key, byte, size, BUNDLE_TYPE_BYTE, 1);
1067 int bundle_get_byte(bundle *b, const char *key, void **byte, size_t *size)
1069 return _bundle_get_val(b, key, BUNDLE_TYPE_BYTE, (void **)byte,
1073 int bundle_add_byte_array(bundle *b, const char *key, void **byte_array,
1074 const unsigned int len)
1076 return _bundle_add_kv(b, key, byte_array, 0,
1077 BUNDLE_TYPE_BYTE_ARRAY, len);
1080 int bundle_get_byte_array(bundle *b, const char *key, void ***byte_array,
1081 unsigned int *len, unsigned int **array_element_size)
1083 return _bundle_get_val(b, key, BUNDLE_TYPE_BYTE_ARRAY,
1084 (void **)byte_array, NULL, len, (size_t **)array_element_size);
1087 int bundle_set_byte_array_element(bundle *b, const char *key,
1088 const unsigned int idx, const void *val, const size_t size)
1090 return bundle_set_array_val(b, key, BUNDLE_TYPE_BYTE_ARRAY,