1 /*
2 COLLECTION LIBRARY
3
4 Convenience wrapper functions are implemented here.
5 They take a lot of space but pretty simple so they
6 are separated from the core logic.
7
8 Copyright (C) Dmitri Pal <dpal@redhat.com> 2009
9
10 Collection Library is free software: you can redistribute it and/or modify
11 it under the terms of the GNU Lesser General Public License as published by
12 the Free Software Foundation, either version 3 of the License, or
13 (at your option) any later version.
14
15 Collection Library is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU Lesser General Public License for more details.
19
20 You should have received a copy of the GNU Lesser General Public License
21 along with Collection Library. If not, see <http://www.gnu.org/licenses/>.
22 */
23
24 #include "config.h"
25 #include <string.h>
26 #include <stdlib.h>
27 #include <ctype.h>
28 #include <time.h>
29 #include "trace.h"
30
31 /* The collection should use the teal structures */
32 #include "collection_priv.h"
33 #include "collection.h"
34
35 /* PROPERTIES */
36 /* Insert string property with positioning */
col_insert_str_property(struct collection_item * ci,const char * subcollection,int disposition,const char * refprop,int idx,unsigned flags,const char * property,const char * string,int length)37 int col_insert_str_property(struct collection_item *ci,
38 const char *subcollection,
39 int disposition,
40 const char *refprop,
41 int idx,
42 unsigned flags,
43 const char *property,
44 const char *string,
45 int length)
46 {
47 int error = EOK;
48
49 TRACE_FLOW_STRING("col_insert_string_property", "Entry.");
50
51 if (length == 0) length = strlen(string) + 1;
52
53 error = col_insert_property_with_ref(ci,
54 subcollection,
55 disposition,
56 refprop,
57 idx,
58 flags,
59 property,
60 COL_TYPE_STRING,
61 (const void *)string,
62 length,
63 NULL);
64
65 TRACE_FLOW_NUMBER("col_insert_string_property returning", error);
66 return error;
67 }
68
69 /* Insert binary property with positioning */
col_insert_binary_property(struct collection_item * ci,const char * subcollection,int disposition,const char * refprop,int idx,unsigned flags,const char * property,void * binary_data,int length)70 int col_insert_binary_property(struct collection_item *ci,
71 const char *subcollection,
72 int disposition,
73 const char *refprop,
74 int idx,
75 unsigned flags,
76 const char *property,
77 void *binary_data,
78 int length)
79 {
80 int error = EOK;
81
82 TRACE_FLOW_STRING("col_insert_binary_property", "Entry.");
83
84 error = col_insert_property_with_ref(ci,
85 subcollection,
86 disposition,
87 refprop,
88 idx,
89 flags,
90 property,
91 COL_TYPE_BINARY,
92 binary_data,
93 length,
94 NULL);
95
96 TRACE_FLOW_NUMBER("col_insert_binary_property returning", error);
97 return error;
98 }
99
100
101 /* Insert integer property with positioning */
col_insert_int_property(struct collection_item * ci,const char * subcollection,int disposition,const char * refprop,int idx,unsigned flags,const char * property,int32_t number)102 int col_insert_int_property(struct collection_item *ci,
103 const char *subcollection,
104 int disposition,
105 const char *refprop,
106 int idx,
107 unsigned flags,
108 const char *property,
109 int32_t number)
110 {
111 int error = EOK;
112
113 TRACE_FLOW_STRING("col_insert_int_property", "Entry.");
114
115 error = col_insert_property_with_ref(ci,
116 subcollection,
117 disposition,
118 refprop,
119 idx,
120 flags,
121 property,
122 COL_TYPE_INTEGER,
123 (void *)&number,
124 sizeof(int32_t),
125 NULL);
126
127 TRACE_FLOW_NUMBER("col_insert_int_property returning", error);
128 return error;
129 }
130
131
132 /* Insert unsigned property with positioning */
col_insert_unsigned_property(struct collection_item * ci,const char * subcollection,int disposition,const char * refprop,int idx,unsigned flags,const char * property,uint32_t number)133 int col_insert_unsigned_property(struct collection_item *ci,
134 const char *subcollection,
135 int disposition,
136 const char *refprop,
137 int idx,
138 unsigned flags,
139 const char *property,
140 uint32_t number)
141 {
142 int error = EOK;
143
144 TRACE_FLOW_STRING("col_insert_unsigned_property", "Entry.");
145
146 error = col_insert_property_with_ref(ci,
147 subcollection,
148 disposition,
149 refprop,
150 idx,
151 flags,
152 property,
153 COL_TYPE_UNSIGNED,
154 (void *)&number,
155 sizeof(uint32_t),
156 NULL);
157
158 TRACE_FLOW_NUMBER("col_insert_unsigned_property returning", error);
159 return error;
160 }
161
162
163 /* Insert long property with positioning */
col_insert_long_property(struct collection_item * ci,const char * subcollection,int disposition,const char * refprop,int idx,unsigned flags,const char * property,int64_t number)164 int col_insert_long_property(struct collection_item *ci,
165 const char *subcollection,
166 int disposition,
167 const char *refprop,
168 int idx,
169 unsigned flags,
170 const char *property,
171 int64_t number)
172 {
173 int error = EOK;
174
175 TRACE_FLOW_STRING("col_insert_long_property", "Entry.");
176
177 error = col_insert_property_with_ref(ci,
178 subcollection,
179 disposition,
180 refprop,
181 idx,
182 flags,
183 property,
184 COL_TYPE_LONG,
185 (void *)&number,
186 sizeof(int64_t),
187 NULL);
188
189 TRACE_FLOW_NUMBER("col_insert_long_property returning", error);
190 return error;
191 }
192
193 /* Insert unsigned long property with positioning */
col_insert_ulong_property(struct collection_item * ci,const char * subcollection,int disposition,const char * refprop,int idx,unsigned flags,const char * property,uint64_t number)194 int col_insert_ulong_property(struct collection_item *ci,
195 const char *subcollection,
196 int disposition,
197 const char *refprop,
198 int idx,
199 unsigned flags,
200 const char *property,
201 uint64_t number)
202 {
203 int error = EOK;
204
205 TRACE_FLOW_STRING("col_insert_ulong_property", "Entry.");
206
207 error = col_insert_property_with_ref(ci,
208 subcollection,
209 disposition,
210 refprop,
211 idx,
212 flags,
213 property,
214 COL_TYPE_ULONG,
215 (void *)&number,
216 sizeof(uint64_t),
217 NULL);
218
219 TRACE_FLOW_NUMBER("col_insert_ulong_property returning", error);
220 return error;
221 }
222
223 /* Insert double property with positioning */
col_insert_double_property(struct collection_item * ci,const char * subcollection,int disposition,const char * refprop,int idx,unsigned flags,const char * property,double number)224 int col_insert_double_property(struct collection_item *ci,
225 const char *subcollection,
226 int disposition,
227 const char *refprop,
228 int idx,
229 unsigned flags,
230 const char *property,
231 double number)
232 {
233 int error = EOK;
234
235 TRACE_FLOW_STRING("col_insert_double_property", "Entry.");
236
237 error = col_insert_property_with_ref(ci,
238 subcollection,
239 disposition,
240 refprop,
241 idx,
242 flags,
243 property,
244 COL_TYPE_DOUBLE,
245 (void *)&number,
246 sizeof(double),
247 NULL);
248
249 TRACE_FLOW_NUMBER("col_insert_double_property returning", error);
250 return error;
251 }
252
253 /* Insert bool property with positioning */
col_insert_bool_property(struct collection_item * ci,const char * subcollection,int disposition,const char * refprop,int idx,unsigned flags,const char * property,unsigned char logical)254 int col_insert_bool_property(struct collection_item *ci,
255 const char *subcollection,
256 int disposition,
257 const char *refprop,
258 int idx,
259 unsigned flags,
260 const char *property,
261 unsigned char logical)
262 {
263 int error = EOK;
264
265 TRACE_FLOW_STRING("col_insert_bool_property", "Entry.");
266
267 error = col_insert_property_with_ref(ci,
268 subcollection,
269 disposition,
270 refprop,
271 idx,
272 flags,
273 property,
274 COL_TYPE_BOOL,
275 (void *)&logical,
276 sizeof(unsigned char),
277 NULL);
278
279 TRACE_FLOW_NUMBER("col_insert_bool_property returning", error);
280 return error;
281 }
282
283
284 /* Insert string property with positioning and reference. */
col_insert_str_property_with_ref(struct collection_item * ci,const char * subcollection,int disposition,const char * refprop,int idx,unsigned flags,const char * property,const char * string,int length,struct collection_item ** ret_ref)285 int col_insert_str_property_with_ref(struct collection_item *ci,
286 const char *subcollection,
287 int disposition,
288 const char *refprop,
289 int idx,
290 unsigned flags,
291 const char *property,
292 const char *string,
293 int length,
294 struct collection_item **ret_ref)
295 {
296 int error = EOK;
297 void *ptr;
298
299 TRACE_FLOW_STRING("col_insert_string_property_with_ref", "Entry.");
300
301 if (length == 0) length = strlen(string) + 1;
302
303 /* Work around a compilation warning */
304 memcpy(&ptr, &string, sizeof(void *));
305
306 error = col_insert_property_with_ref(ci,
307 subcollection,
308 disposition,
309 refprop,
310 idx,
311 flags,
312 property,
313 COL_TYPE_STRING,
314 ptr,
315 length,
316 ret_ref);
317
318 TRACE_FLOW_NUMBER("col_insert_string_property_with_ref returning", error);
319 return error;
320 }
321
322 /* Insert binary property with positioning and reference. */
col_insert_binary_property_with_ref(struct collection_item * ci,const char * subcollection,int disposition,const char * refprop,int idx,unsigned flags,const char * property,void * binary_data,int length,struct collection_item ** ret_ref)323 int col_insert_binary_property_with_ref(struct collection_item *ci,
324 const char *subcollection,
325 int disposition,
326 const char *refprop,
327 int idx,
328 unsigned flags,
329 const char *property,
330 void *binary_data,
331 int length,
332 struct collection_item **ret_ref)
333 {
334 int error = EOK;
335
336 TRACE_FLOW_STRING("col_insert_binary_property_with_ref", "Entry.");
337
338 error = col_insert_property_with_ref(ci,
339 subcollection,
340 disposition,
341 refprop,
342 idx,
343 flags,
344 property,
345 COL_TYPE_BINARY,
346 (void *)binary_data,
347 length,
348 ret_ref);
349
350 TRACE_FLOW_NUMBER("col_insert_binary_property_with_ref returning", error);
351 return error;
352 }
353
354 /* Insert int property with positioning and reference. */
col_insert_int_property_with_ref(struct collection_item * ci,const char * subcollection,int disposition,const char * refprop,int idx,unsigned flags,const char * property,int32_t number,struct collection_item ** ret_ref)355 int col_insert_int_property_with_ref(struct collection_item *ci,
356 const char *subcollection,
357 int disposition,
358 const char *refprop,
359 int idx,
360 unsigned flags,
361 const char *property,
362 int32_t number,
363 struct collection_item **ret_ref)
364 {
365 int error = EOK;
366
367 TRACE_FLOW_STRING("col_insert_int_property_with_ref", "Entry.");
368
369 error = col_insert_property_with_ref(ci,
370 subcollection,
371 disposition,
372 refprop,
373 idx,
374 flags,
375 property,
376 COL_TYPE_INTEGER,
377 (void *)&number,
378 sizeof(int32_t),
379 ret_ref);
380
381 TRACE_FLOW_NUMBER("col_insert_int_property_with_ref returning", error);
382 return error;
383 }
384
385
386 /* Insert unsigned property with positioning and reference. */
col_insert_unsigned_property_with_ref(struct collection_item * ci,const char * subcollection,int disposition,const char * refprop,int idx,unsigned flags,const char * property,uint32_t number,struct collection_item ** ret_ref)387 int col_insert_unsigned_property_with_ref(struct collection_item *ci,
388 const char *subcollection,
389 int disposition,
390 const char *refprop,
391 int idx,
392 unsigned flags,
393 const char *property,
394 uint32_t number,
395 struct collection_item **ret_ref)
396 {
397 int error = EOK;
398
399 TRACE_FLOW_STRING("col_insert_unsigned_property_with_ref", "Entry.");
400
401 error = col_insert_property_with_ref(ci,
402 subcollection,
403 disposition,
404 refprop,
405 idx,
406 flags,
407 property,
408 COL_TYPE_UNSIGNED,
409 (void *)&number,
410 sizeof(uint32_t),
411 ret_ref);
412
413 TRACE_FLOW_NUMBER("col_insert_unsigned_property_with_ref returning", error);
414 return error;
415 }
416
417 /* Insert long property with positioning and reference. */
col_insert_long_property_with_ref(struct collection_item * ci,const char * subcollection,int disposition,const char * refprop,int idx,unsigned flags,const char * property,int64_t number,struct collection_item ** ret_ref)418 int col_insert_long_property_with_ref(struct collection_item *ci,
419 const char *subcollection,
420 int disposition,
421 const char *refprop,
422 int idx,
423 unsigned flags,
424 const char *property,
425 int64_t number,
426 struct collection_item **ret_ref)
427 {
428 int error = EOK;
429
430 TRACE_FLOW_STRING("col_insert_long_property_with_ref", "Entry.");
431
432 error = col_insert_property_with_ref(ci,
433 subcollection,
434 disposition,
435 refprop,
436 idx,
437 flags,
438 property,
439 COL_TYPE_LONG,
440 (void *)&number,
441 sizeof(int64_t),
442 ret_ref);
443
444 TRACE_FLOW_NUMBER("col_insert_long_property_with_ref returning", error);
445 return error;
446 }
447
448 /* Insert unsigned long property with positioning and reference. */
col_insert_ulong_property_with_ref(struct collection_item * ci,const char * subcollection,int disposition,const char * refprop,int idx,unsigned flags,const char * property,uint64_t number,struct collection_item ** ret_ref)449 int col_insert_ulong_property_with_ref(struct collection_item *ci,
450 const char *subcollection,
451 int disposition,
452 const char *refprop,
453 int idx,
454 unsigned flags,
455 const char *property,
456 uint64_t number,
457 struct collection_item **ret_ref)
458 {
459 int error = EOK;
460
461 TRACE_FLOW_STRING("col_insert_ulong_property_with_ref", "Entry.");
462
463 error = col_insert_property_with_ref(ci,
464 subcollection,
465 disposition,
466 refprop,
467 idx,
468 flags,
469 property,
470 COL_TYPE_ULONG,
471 (void *)&number,
472 sizeof(uint64_t),
473 ret_ref);
474
475 TRACE_FLOW_NUMBER("col_insert_ulong_property_with_ref returning", error);
476 return error;
477 }
478
479 /* Insert double property with positioning and reference. */
col_insert_double_property_with_ref(struct collection_item * ci,const char * subcollection,int disposition,const char * refprop,int idx,unsigned flags,const char * property,double number,struct collection_item ** ret_ref)480 int col_insert_double_property_with_ref(struct collection_item *ci,
481 const char *subcollection,
482 int disposition,
483 const char *refprop,
484 int idx,
485 unsigned flags,
486 const char *property,
487 double number,
488 struct collection_item **ret_ref)
489 {
490 int error = EOK;
491
492 TRACE_FLOW_STRING("col_insert_double_property_with_ref", "Entry.");
493
494 error = col_insert_property_with_ref(ci,
495 subcollection,
496 disposition,
497 refprop,
498 idx,
499 flags,
500 property,
501 COL_TYPE_DOUBLE,
502 (void *)&number,
503 sizeof(double),
504 ret_ref);
505
506 TRACE_FLOW_NUMBER("col_insert_double_property_with_ref returning", error);
507 return error;
508 }
509
510 /* Insert bool property with positioning and reference. */
col_insert_bool_property_with_ref(struct collection_item * ci,const char * subcollection,int disposition,const char * refprop,int idx,unsigned flags,const char * property,unsigned char logical,struct collection_item ** ret_ref)511 int col_insert_bool_property_with_ref(struct collection_item *ci,
512 const char *subcollection,
513 int disposition,
514 const char *refprop,
515 int idx,
516 unsigned flags,
517 const char *property,
518 unsigned char logical,
519 struct collection_item **ret_ref)
520 {
521 int error = EOK;
522
523 TRACE_FLOW_STRING("col_insert_bool_property_with_ref", "Entry.");
524
525 error = col_insert_property_with_ref(ci,
526 subcollection,
527 disposition,
528 refprop,
529 idx,
530 flags,
531 property,
532 COL_TYPE_BOOL,
533 (void *)&logical,
534 sizeof(unsigned char),
535 ret_ref);
536
537 TRACE_FLOW_NUMBER("col_insert_bool_property_with_ref returning", error);
538 return error;
539 }
540
541
542 /* Add a string property. */
col_add_str_property(struct collection_item * ci,const char * subcollection,const char * property,const char * string,int length)543 int col_add_str_property(struct collection_item *ci,
544 const char *subcollection,
545 const char *property,
546 const char *string,
547 int length)
548 {
549 int error = EOK;
550
551 TRACE_FLOW_STRING("col_add_str_property", "Entry.");
552
553 error = col_insert_str_property(ci,
554 subcollection,
555 COL_DSP_END,
556 NULL,
557 0,
558 0,
559 property,
560 string,
561 length);
562
563 TRACE_FLOW_NUMBER("col_add_str_property returning", error);
564 return error;
565 }
566
567 /* Add a binary property. */
col_add_binary_property(struct collection_item * ci,const char * subcollection,const char * property,void * binary_data,int length)568 int col_add_binary_property(struct collection_item *ci,
569 const char *subcollection,
570 const char *property,
571 void *binary_data,
572 int length)
573 {
574 int error = EOK;
575
576 TRACE_FLOW_STRING("col_add_binary_property", "Entry.");
577
578 error = col_insert_binary_property(ci,
579 subcollection,
580 COL_DSP_END,
581 NULL,
582 0,
583 0,
584 property,
585 binary_data,
586 length);
587
588 TRACE_FLOW_NUMBER("col_add_binary_property returning", error);
589 return error;
590 }
591
592 /* Add an int property. */
col_add_int_property(struct collection_item * ci,const char * subcollection,const char * property,int32_t number)593 int col_add_int_property(struct collection_item *ci,
594 const char *subcollection,
595 const char *property,
596 int32_t number)
597 {
598 int error = EOK;
599
600 TRACE_FLOW_STRING("col_add_int_property", "Entry.");
601
602 error = col_insert_int_property(ci,
603 subcollection,
604 COL_DSP_END,
605 NULL,
606 0,
607 0,
608 property,
609 number);
610
611 TRACE_FLOW_NUMBER("col_add_int_property returning", error);
612 return error;
613 }
614
615 /* Add an unsigned int property. */
col_add_unsigned_property(struct collection_item * ci,const char * subcollection,const char * property,uint32_t number)616 int col_add_unsigned_property(struct collection_item *ci,
617 const char *subcollection,
618 const char *property,
619 uint32_t number)
620 {
621 int error = EOK;
622
623 TRACE_FLOW_STRING("col_add_unsigned_property", "Entry.");
624
625 error = col_insert_unsigned_property(ci,
626 subcollection,
627 COL_DSP_END,
628 NULL,
629 0,
630 0,
631 property,
632 number);
633
634 TRACE_FLOW_NUMBER("col_add_unsigned_property returning", error);
635 return error;
636 }
637
638 /* Add an long property. */
col_add_long_property(struct collection_item * ci,const char * subcollection,const char * property,int64_t number)639 int col_add_long_property(struct collection_item *ci,
640 const char *subcollection,
641 const char *property,
642 int64_t number)
643 {
644 int error = EOK;
645
646 TRACE_FLOW_STRING("col_add_long_property", "Entry.");
647
648
649 error = col_insert_long_property(ci,
650 subcollection,
651 COL_DSP_END,
652 NULL,
653 0,
654 0,
655 property,
656 number);
657
658 TRACE_FLOW_NUMBER("col_add_long_property returning", error);
659 return error;
660 }
661
662 /* Add an unsigned long property. */
col_add_ulong_property(struct collection_item * ci,const char * subcollection,const char * property,uint64_t number)663 int col_add_ulong_property(struct collection_item *ci,
664 const char *subcollection,
665 const char *property,
666 uint64_t number)
667 {
668 int error = EOK;
669
670 TRACE_FLOW_STRING("col_add_ulong_property", "Entry.");
671
672 error = col_insert_ulong_property(ci,
673 subcollection,
674 COL_DSP_END,
675 NULL,
676 0,
677 0,
678 property,
679 number);
680
681 TRACE_FLOW_NUMBER("col_add_ulong_property returning", error);
682 return error;
683 }
684
685 /* Add a double property. */
col_add_double_property(struct collection_item * ci,const char * subcollection,const char * property,double number)686 int col_add_double_property(struct collection_item *ci,
687 const char *subcollection,
688 const char *property,
689 double number)
690 {
691 int error = EOK;
692
693 TRACE_FLOW_STRING("col_add_double_property", "Entry.");
694
695 error = col_insert_double_property(ci,
696 subcollection,
697 COL_DSP_END,
698 NULL,
699 0,
700 0,
701 property,
702 number);
703
704 TRACE_FLOW_NUMBER("col_add_double_property returning", error);
705 return error;
706 }
707
708 /* Add a bool property. */
col_add_bool_property(struct collection_item * ci,const char * subcollection,const char * property,unsigned char logical)709 int col_add_bool_property(struct collection_item *ci,
710 const char *subcollection,
711 const char *property,
712 unsigned char logical)
713 {
714 int error = EOK;
715
716 TRACE_FLOW_STRING("col_add_bool_property", "Entry.");
717
718 error = col_insert_bool_property(ci,
719 subcollection,
720 COL_DSP_END,
721 NULL,
722 0,
723 0,
724 property,
725 logical);
726
727 TRACE_FLOW_NUMBER("col_add_bool_property returning", error);
728 return error;
729 }
730
731 /* A function to add a property */
col_add_any_property(struct collection_item * ci,const char * subcollection,const char * property,int type,void * data,int length)732 int col_add_any_property(struct collection_item *ci,
733 const char *subcollection,
734 const char *property,
735 int type,
736 void *data,
737 int length)
738 {
739 int error = EOK;
740
741 TRACE_FLOW_STRING("col_add_any_property", "Entry.");
742
743 error = col_insert_property_with_ref(ci,
744 subcollection,
745 COL_DSP_END,
746 NULL,
747 0,
748 0,
749 property,
750 type,
751 data,
752 length,
753 NULL);
754
755 TRACE_FLOW_NUMBER("col_add_any_property returning", error);
756 return error;
757 }
758
759 /* Add a string property with reference */
col_add_str_property_with_ref(struct collection_item * ci,const char * subcollection,const char * property,char * string,int length,struct collection_item ** ref_ret)760 int col_add_str_property_with_ref(struct collection_item *ci,
761 const char *subcollection,
762 const char *property,
763 char *string, int length,
764 struct collection_item **ref_ret)
765 {
766 int error = EOK;
767
768 TRACE_FLOW_STRING("col_add_str_property_with_ref", "Entry.");
769
770 error = col_insert_str_property_with_ref(ci,
771 subcollection,
772 COL_DSP_END,
773 NULL,
774 0,
775 0,
776 property,
777 string,
778 length,
779 ref_ret);
780
781 TRACE_FLOW_NUMBER("col_add_str_property_with_ref returning", error);
782 return error;
783 }
784
785 /* Add a binary property with reference. */
col_add_binary_property_with_ref(struct collection_item * ci,const char * subcollection,const char * property,void * binary_data,int length,struct collection_item ** ref_ret)786 int col_add_binary_property_with_ref(struct collection_item *ci,
787 const char *subcollection,
788 const char *property,
789 void *binary_data, int length,
790 struct collection_item **ref_ret)
791 {
792 int error = EOK;
793
794 TRACE_FLOW_STRING("col_add_binary_property_with_ref", "Entry.");
795
796 error = col_insert_binary_property_with_ref(ci,
797 subcollection,
798 COL_DSP_END,
799 NULL,
800 0,
801 0,
802 property,
803 binary_data,
804 length,
805 ref_ret);
806
807 TRACE_FLOW_NUMBER("col_add_binary_property_with_ref returning", error);
808 return error;
809 }
810
811 /* Add an int property with reference. */
col_add_int_property_with_ref(struct collection_item * ci,const char * subcollection,const char * property,int32_t number,struct collection_item ** ref_ret)812 int col_add_int_property_with_ref(struct collection_item *ci,
813 const char *subcollection,
814 const char *property,
815 int32_t number,
816 struct collection_item **ref_ret)
817 {
818 int error = EOK;
819
820 TRACE_FLOW_STRING("col_add_int_property_with_ref", "Entry.");
821
822 error = col_insert_int_property_with_ref(ci,
823 subcollection,
824 COL_DSP_END,
825 NULL,
826 0,
827 0,
828 property,
829 number,
830 ref_ret);
831
832 TRACE_FLOW_NUMBER("col_add_int_property_with_ref returning", error);
833 return error;
834 }
835
836 /* Add an unsigned int property with reference. */
col_add_unsigned_property_with_ref(struct collection_item * ci,const char * subcollection,const char * property,uint32_t number,struct collection_item ** ref_ret)837 int col_add_unsigned_property_with_ref(struct collection_item *ci,
838 const char *subcollection,
839 const char *property,
840 uint32_t number,
841 struct collection_item **ref_ret)
842 {
843 int error = EOK;
844
845 TRACE_FLOW_STRING("col_add_unsigned_property_with_ref", "Entry.");
846
847 error = col_insert_unsigned_property_with_ref(ci,
848 subcollection,
849 COL_DSP_END,
850 NULL,
851 0,
852 0,
853 property,
854 number,
855 ref_ret);
856
857 TRACE_FLOW_NUMBER("col_add_unsigned_property_with_ref returning", error);
858 return error;
859 }
860
861 /* Add an long property with reference. */
col_add_long_property_with_ref(struct collection_item * ci,const char * subcollection,const char * property,int64_t number,struct collection_item ** ref_ret)862 int col_add_long_property_with_ref(struct collection_item *ci,
863 const char *subcollection,
864 const char *property,
865 int64_t number,
866 struct collection_item **ref_ret)
867 {
868 int error = EOK;
869
870 TRACE_FLOW_STRING("col_add_long_property_with_ref", "Entry.");
871
872 error = col_insert_long_property_with_ref(ci,
873 subcollection,
874 COL_DSP_END,
875 NULL,
876 0,
877 0,
878 property,
879 number,
880 ref_ret);
881
882 TRACE_FLOW_NUMBER("col_add_long_property_with_ref returning", error);
883 return error;
884 }
885
886 /* Add an unsigned long property with reference. */
col_add_ulong_property_with_ref(struct collection_item * ci,const char * subcollection,const char * property,uint64_t number,struct collection_item ** ref_ret)887 int col_add_ulong_property_with_ref(struct collection_item *ci,
888 const char *subcollection,
889 const char *property,
890 uint64_t number,
891 struct collection_item **ref_ret)
892 {
893 int error = EOK;
894
895 TRACE_FLOW_STRING("col_add_ulong_property_with_ref", "Entry.");
896
897 error = col_insert_ulong_property_with_ref(ci,
898 subcollection,
899 COL_DSP_END,
900 NULL,
901 0,
902 0,
903 property,
904 number,
905 ref_ret);
906
907 TRACE_FLOW_NUMBER("col_add_ulong_property_with_ref returning", error);
908 return error;
909 }
910
911 /* Add a double property with reference. */
col_add_double_property_with_ref(struct collection_item * ci,const char * subcollection,const char * property,double number,struct collection_item ** ref_ret)912 int col_add_double_property_with_ref(struct collection_item *ci,
913 const char *subcollection,
914 const char *property,
915 double number,
916 struct collection_item **ref_ret)
917 {
918 int error = EOK;
919
920 TRACE_FLOW_STRING("col_add_double_property_with_ref", "Entry.");
921
922 error = col_insert_double_property_with_ref(ci,
923 subcollection,
924 COL_DSP_END,
925 NULL,
926 0,
927 0,
928 property,
929 number,
930 ref_ret);
931
932 TRACE_FLOW_NUMBER("col_add_double_property_with_ref returning", error);
933 return error;
934 }
935
936 /* Add a bool property with reference. */
col_add_bool_property_with_ref(struct collection_item * ci,const char * subcollection,const char * property,unsigned char logical,struct collection_item ** ref_ret)937 int col_add_bool_property_with_ref(struct collection_item *ci,
938 const char *subcollection,
939 const char *property,
940 unsigned char logical,
941 struct collection_item **ref_ret)
942 {
943 int error = EOK;
944
945 TRACE_FLOW_STRING("col_add_bool_property_with_ref", "Entry.");
946
947 error = col_insert_bool_property_with_ref(ci,
948 subcollection,
949 COL_DSP_END,
950 NULL,
951 0,
952 0,
953 property,
954 logical,
955 ref_ret);
956
957 TRACE_FLOW_NUMBER("col_add_bool_property_with_ref returning", error);
958 return error;
959 }
960
961 /* A function to add a property with reference. */
col_add_any_property_with_ref(struct collection_item * ci,const char * subcollection,const char * property,int type,void * data,int length,struct collection_item ** ref_ret)962 int col_add_any_property_with_ref(struct collection_item *ci,
963 const char *subcollection,
964 const char *property,
965 int type,
966 void *data,
967 int length,
968 struct collection_item **ref_ret)
969 {
970 int error = EOK;
971
972 TRACE_FLOW_STRING("col_add_any_property_with_ref", "Entry.");
973
974 error = col_insert_property_with_ref(ci,
975 subcollection,
976 COL_DSP_END,
977 NULL,
978 0,
979 0,
980 property,
981 type,
982 data,
983 length,
984 ref_ret);
985
986 TRACE_FLOW_NUMBER("col_add_any_property_with_ref returning", error);
987 return error;
988 }
989
990
991 /* Update a string property in the collection.
992 * Length should include the terminating 0 */
col_update_str_property(struct collection_item * ci,const char * property,int mode_flags,char * string,int length)993 int col_update_str_property(struct collection_item *ci,
994 const char *property,
995 int mode_flags,
996 char *string,
997 int length)
998 {
999 int error = EOK;
1000 TRACE_FLOW_STRING("col_update_str_property", "Entry.");
1001
1002 if (length == 0) length = strlen(string) + 1;
1003 error = col_update_property(ci, property, COL_TYPE_STRING,
1004 (void *)string, length, mode_flags);
1005
1006 TRACE_FLOW_NUMBER("col_update_str_property Returning", error);
1007 return error;
1008 }
1009
1010 /* Update a binary property in the collection. */
col_update_binary_property(struct collection_item * ci,const char * property,int mode_flags,void * binary_data,int length)1011 int col_update_binary_property(struct collection_item *ci,
1012 const char *property,
1013 int mode_flags,
1014 void *binary_data,
1015 int length)
1016 {
1017 int error = EOK;
1018 TRACE_FLOW_STRING("col_update_binary_property", "Entry.");
1019
1020 error = col_update_property(ci, property, COL_TYPE_BINARY,
1021 binary_data, length, mode_flags);
1022
1023 TRACE_FLOW_NUMBER("col_update_binary_property Returning", error);
1024 return error;
1025 }
1026
1027 /* Update an int property in the collection. */
col_update_int_property(struct collection_item * ci,const char * property,int mode_flags,int32_t number)1028 int col_update_int_property(struct collection_item *ci,
1029 const char *property,
1030 int mode_flags,
1031 int32_t number)
1032 {
1033 int error = EOK;
1034 TRACE_FLOW_STRING("col_update_int_property", "Entry.");
1035
1036 error = col_update_property(ci, property, COL_TYPE_INTEGER,
1037 (void *)(&number), sizeof(int32_t), mode_flags);
1038
1039 TRACE_FLOW_NUMBER("col_update_int_property Returning", error);
1040 return error;
1041 }
1042
1043 /* Update an unsigned int property. */
col_update_unsigned_property(struct collection_item * ci,const char * property,int mode_flags,uint32_t number)1044 int col_update_unsigned_property(struct collection_item *ci,
1045 const char *property,
1046 int mode_flags,
1047 uint32_t number)
1048 {
1049 int error = EOK;
1050 TRACE_FLOW_STRING("col_update_unsigned_property", "Entry.");
1051
1052 error = col_update_property(ci, property, COL_TYPE_UNSIGNED,
1053 (void *)(&number), sizeof(uint32_t),
1054 mode_flags);
1055
1056 TRACE_FLOW_NUMBER("col_update_unsigned_property Returning", error);
1057 return error;
1058 }
1059
1060 /* Update a long property. */
col_update_long_property(struct collection_item * ci,const char * property,int mode_flags,int64_t number)1061 int col_update_long_property(struct collection_item *ci,
1062 const char *property,
1063 int mode_flags,
1064 int64_t number)
1065 {
1066 int error = EOK;
1067 TRACE_FLOW_STRING("col_update_long_property", "Entry.");
1068
1069 error = col_update_property(ci, property, COL_TYPE_LONG,
1070 (void *)(&number), sizeof(int64_t),
1071 mode_flags);
1072
1073 TRACE_FLOW_NUMBER("col_update_long_property Returning", error);
1074 return error;
1075
1076 }
1077
1078 /* Update an unsigned long property. */
col_update_ulong_property(struct collection_item * ci,const char * property,int mode_flags,uint64_t number)1079 int col_update_ulong_property(struct collection_item *ci,
1080 const char *property,
1081 int mode_flags,
1082 uint64_t number)
1083 {
1084 int error = EOK;
1085 TRACE_FLOW_STRING("col_update_ulong_property", "Entry.");
1086
1087 error = col_update_property(ci, property, COL_TYPE_ULONG,
1088 (void *)(&number), sizeof(uint64_t),
1089 mode_flags);
1090
1091 TRACE_FLOW_NUMBER("col_update_ulong_property Returning", error);
1092 return error;
1093 }
1094
1095 /* Update a double property. */
col_update_double_property(struct collection_item * ci,const char * property,int mode_flags,double number)1096 int col_update_double_property(struct collection_item *ci,
1097 const char *property,
1098 int mode_flags,
1099 double number)
1100 {
1101 int error = EOK;
1102 TRACE_FLOW_STRING("col_update_double_property", "Entry.");
1103
1104 error = col_update_property(ci, property, COL_TYPE_DOUBLE,
1105 (void *)(&number), sizeof(double),
1106 mode_flags);
1107
1108 TRACE_FLOW_NUMBER("col_update_double_property Returning", error);
1109 return error;
1110 }
1111
1112 /* Update a bool property. */
col_update_bool_property(struct collection_item * ci,const char * property,int mode_flags,unsigned char logical)1113 int col_update_bool_property(struct collection_item *ci,
1114 const char *property,
1115 int mode_flags,
1116 unsigned char logical)
1117 {
1118 int error = EOK;
1119 TRACE_FLOW_STRING("col_update_bool_property", "Entry.");
1120
1121 error = col_update_property(ci, property, COL_TYPE_BOOL,
1122 (void *)(&logical), sizeof(unsigned char),
1123 mode_flags);
1124
1125 TRACE_FLOW_NUMBER("col_update_bool_property Returning", error);
1126 return error;
1127 }
1128
1129 /* Rename item */
col_modify_item_property(struct collection_item * item,const char * property)1130 int col_modify_item_property(struct collection_item *item,
1131 const char *property)
1132 {
1133 int error;
1134
1135 TRACE_FLOW_STRING("col_modify_item_property", "Entry");
1136
1137 error = col_modify_item(item, property, 0, NULL, 0);
1138
1139 TRACE_FLOW_STRING("col_modify_item_property", "Exit");
1140 return error;
1141 }
1142
1143 /* Convenience functions that wrap modify_item(). */
1144 /* Modify item data to be str */
col_modify_str_item(struct collection_item * item,const char * property,const char * string,int length)1145 int col_modify_str_item(struct collection_item *item,
1146 const char *property,
1147 const char *string,
1148 int length)
1149 {
1150 int len;
1151 int error;
1152
1153 TRACE_FLOW_STRING("col_modify_str_item", "Entry");
1154
1155 if (length != 0) len = length;
1156 else len = strlen(string) + 1;
1157
1158 error = col_modify_item(item, property,
1159 COL_TYPE_STRING, (const void *)string, len);
1160
1161 TRACE_FLOW_STRING("col_modify_str_item", "Exit");
1162 return error;
1163 }
1164
1165 /* Modify item data to be binary */
col_modify_binary_item(struct collection_item * item,const char * property,void * binary_data,int length)1166 int col_modify_binary_item(struct collection_item *item,
1167 const char *property,
1168 void *binary_data,
1169 int length)
1170 {
1171 int error;
1172
1173 TRACE_FLOW_STRING("col_modify_binary_item", "Entry");
1174
1175 error = col_modify_item(item, property, COL_TYPE_BINARY, binary_data, length);
1176
1177 TRACE_FLOW_STRING("col_modify_binary_item", "Exit");
1178 return error;
1179 }
1180
1181 /* Modify item data to be bool */
col_modify_bool_item(struct collection_item * item,const char * property,unsigned char logical)1182 int col_modify_bool_item(struct collection_item *item,
1183 const char *property,
1184 unsigned char logical)
1185 {
1186 int error;
1187
1188 TRACE_FLOW_STRING("col_modify_bool_item", "Entry");
1189
1190 error = col_modify_item(item, property, COL_TYPE_BOOL, (void *)(&logical), 1);
1191
1192 TRACE_FLOW_STRING("col_modify_bool_item", "Exit");
1193 return error;
1194 }
1195
1196 /* Modify item data to be int */
col_modify_int_item(struct collection_item * item,const char * property,int32_t number)1197 int col_modify_int_item(struct collection_item *item,
1198 const char *property,
1199 int32_t number)
1200 {
1201 int error;
1202
1203 TRACE_FLOW_STRING("col_modify_int_item","Entry");
1204
1205 error = col_modify_item(item, property, COL_TYPE_INTEGER,
1206 (void *)(&number), sizeof(int32_t));
1207
1208 TRACE_FLOW_STRING("col_modify_int_item", "Exit");
1209 return error;
1210 }
1211
1212 /* Modify item data to be long */
col_modify_long_item(struct collection_item * item,const char * property,int64_t number)1213 int col_modify_long_item(struct collection_item *item,
1214 const char *property,
1215 int64_t number)
1216 {
1217 int error;
1218
1219 TRACE_FLOW_STRING("col_modify_long_item", "Entry");
1220
1221 error = col_modify_item(item, property, COL_TYPE_LONG,
1222 (void *)(&number), sizeof(int64_t));
1223
1224 TRACE_FLOW_STRING("col_modify_long_item", "Exit");
1225 return error;
1226 }
1227
1228 /* Modify item data to be unigned long */
col_modify_ulong_item(struct collection_item * item,const char * property,uint64_t number)1229 int col_modify_ulong_item(struct collection_item *item,
1230 const char *property,
1231 uint64_t number)
1232 {
1233 int error;
1234
1235 TRACE_FLOW_STRING("col_modify_ulong_item", "Entry");
1236
1237 error = col_modify_item(item, property, COL_TYPE_ULONG,
1238 (void *)(&number), sizeof(uint64_t));
1239
1240 TRACE_FLOW_STRING("col_modify_ulong_item", "Exit");
1241 return error;
1242 }
1243
col_modify_unsigned_item(struct collection_item * item,const char * property,uint32_t number)1244 int col_modify_unsigned_item(struct collection_item *item,
1245 const char *property,
1246 uint32_t number)
1247 {
1248 int error;
1249
1250 TRACE_FLOW_STRING("col_modify_unsigned_item", "Entry");
1251
1252 error = col_modify_item(item, property, COL_TYPE_UNSIGNED,
1253 (void *)(&number), sizeof(uint32_t));
1254
1255 TRACE_FLOW_STRING("col_modify_unsigned_item", "Exit");
1256 return error;
1257 }
1258
col_modify_double_item(struct collection_item * item,const char * property,double number)1259 int col_modify_double_item(struct collection_item *item,
1260 const char *property,
1261 double number)
1262 {
1263 int error;
1264
1265 TRACE_FLOW_STRING("col_modify_double_item", "Entry");
1266
1267 error = col_modify_item(item, property, COL_TYPE_DOUBLE,
1268 (void *)(&number), sizeof(double));
1269
1270 TRACE_FLOW_STRING("col_modify_double_item", "Exit");
1271 return error;
1272 }
1273