ctf plugin: notif iter: use "borrow" functions for metadata where possible
[babeltrace.git] / lib / ctf-ir / fields.c
CommitLineData
273b65be 1/*
2e33ac5a 2 * fields.c
273b65be 3 *
d2dc44b6 4 * Babeltrace CTF IR - Event Fields
273b65be 5 *
de9dd397 6 * Copyright 2013, 2014 Jérémie Galarneau <jeremie.galarneau@efficios.com>
273b65be
JG
7 *
8 * Author: Jérémie Galarneau <jeremie.galarneau@efficios.com>
9 *
10 * Permission is hereby granted, free of charge, to any person obtaining a copy
11 * of this software and associated documentation files (the "Software"), to deal
12 * in the Software without restriction, including without limitation the rights
13 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 * copies of the Software, and to permit persons to whom the Software is
15 * furnished to do so, subject to the following conditions:
16 *
17 * The above copyright notice and this permission notice shall be included in
18 * all copies or substantial portions of the Software.
19 *
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26 * SOFTWARE.
27 */
28
fc25abce
PP
29#define BT_LOG_TAG "FIELDS"
30#include <babeltrace/lib-logging-internal.h>
31
8deee039 32#include <babeltrace/assert-pre-internal.h>
2e33ac5a
PP
33#include <babeltrace/ctf-ir/fields-internal.h>
34#include <babeltrace/ctf-ir/field-types-internal.h>
83509119
JG
35#include <babeltrace/object-internal.h>
36#include <babeltrace/ref.h>
3d9990ac
PP
37#include <babeltrace/compiler-internal.h>
38#include <babeltrace/compat/fcntl-internal.h>
39#include <babeltrace/align-internal.h>
8b45963b 40#include <babeltrace/assert-internal.h>
fc25abce 41#include <inttypes.h>
273b65be 42
273b65be 43static
8deee039 44struct bt_field_common *bt_field_integer_copy(struct bt_field_common *src);
273b65be
JG
45
46static
8deee039
PP
47struct bt_field_common *bt_field_enumeration_copy_recursive(
48 struct bt_field_common *src);
273b65be
JG
49
50static
8deee039
PP
51struct bt_field_common *bt_field_floating_point_copy(
52 struct bt_field_common *src);
273b65be 53
12c8a1a3 54static
8deee039
PP
55struct bt_field_common *bt_field_structure_copy_recursive(
56 struct bt_field_common *src);
12c8a1a3 57
273b65be 58static
8deee039
PP
59struct bt_field_common *bt_field_variant_copy_recursive(
60 struct bt_field_common *src);
273b65be 61
87d43dc1 62static
8deee039
PP
63struct bt_field_common *bt_field_array_copy_recursive(
64 struct bt_field_common *src);
87d43dc1 65
918be005 66static
8deee039
PP
67struct bt_field_common *bt_field_sequence_copy_recursive(
68 struct bt_field_common *src);
918be005 69
76f869ab 70static
8deee039 71struct bt_field_common *bt_field_string_copy(struct bt_field_common *src);
76f869ab 72
8deee039
PP
73static struct bt_field_common_methods bt_field_integer_methods = {
74 .freeze = bt_field_common_generic_freeze,
75 .validate = bt_field_common_generic_validate,
76 .copy = bt_field_integer_copy,
77 .is_set = bt_field_common_generic_is_set,
78 .reset = bt_field_common_generic_reset,
79};
273b65be 80
8deee039
PP
81static struct bt_field_common_methods bt_field_floating_point_methods = {
82 .freeze = bt_field_common_generic_freeze,
83 .validate = bt_field_common_generic_validate,
84 .copy = bt_field_floating_point_copy,
85 .is_set = bt_field_common_generic_is_set,
86 .reset = bt_field_common_generic_reset,
273b65be
JG
87};
88
8deee039
PP
89static struct bt_field_common_methods bt_field_enumeration_methods = {
90 .freeze = bt_field_common_enumeration_freeze_recursive,
91 .validate = bt_field_common_enumeration_validate_recursive,
92 .copy = bt_field_enumeration_copy_recursive,
93 .is_set = bt_field_common_enumeration_is_set_recursive,
94 .reset = bt_field_common_enumeration_reset_recursive,
273b65be
JG
95};
96
8deee039
PP
97static struct bt_field_common_methods bt_field_string_methods = {
98 .freeze = bt_field_common_generic_freeze,
99 .validate = bt_field_common_generic_validate,
100 .copy = bt_field_string_copy,
101 .is_set = bt_field_common_generic_is_set,
102 .reset = bt_field_common_string_reset,
273b65be
JG
103};
104
8deee039
PP
105static struct bt_field_common_methods bt_field_structure_methods = {
106 .freeze = bt_field_common_structure_freeze_recursive,
107 .validate = bt_field_common_structure_validate_recursive,
108 .copy = bt_field_structure_copy_recursive,
109 .is_set = bt_field_common_structure_is_set_recursive,
110 .reset = bt_field_common_structure_reset_recursive,
12c8a1a3
JG
111};
112
8deee039
PP
113static struct bt_field_common_methods bt_field_sequence_methods = {
114 .freeze = bt_field_common_sequence_freeze_recursive,
115 .validate = bt_field_common_sequence_validate_recursive,
116 .copy = bt_field_sequence_copy_recursive,
117 .is_set = bt_field_common_sequence_is_set_recursive,
118 .reset = bt_field_common_sequence_reset_recursive,
273b65be
JG
119};
120
8deee039
PP
121static struct bt_field_common_methods bt_field_array_methods = {
122 .freeze = bt_field_common_array_freeze_recursive,
123 .validate = bt_field_common_array_validate_recursive,
124 .copy = bt_field_array_copy_recursive,
125 .is_set = bt_field_common_array_is_set_recursive,
126 .reset = bt_field_common_array_reset_recursive,
87d43dc1
JG
127};
128
8deee039
PP
129static struct bt_field_common_methods bt_field_variant_methods = {
130 .freeze = bt_field_common_variant_freeze_recursive,
131 .validate = bt_field_common_variant_validate_recursive,
132 .copy = bt_field_variant_copy_recursive,
133 .is_set = bt_field_common_variant_is_set_recursive,
134 .reset = bt_field_common_variant_reset_recursive,
918be005
PP
135};
136
76f869ab 137static
8deee039 138struct bt_field *bt_field_integer_create(struct bt_field_type *);
76f869ab 139
8deee039
PP
140static
141struct bt_field *bt_field_enumeration_create(struct bt_field_type *);
142
143static
144struct bt_field *bt_field_floating_point_create(struct bt_field_type *);
145
146static
147struct bt_field *bt_field_structure_create(struct bt_field_type *);
148
149static
150struct bt_field *bt_field_variant_create(struct bt_field_type *);
151
152static
153struct bt_field *bt_field_array_create(struct bt_field_type *);
8b45963b 154
8deee039
PP
155static
156struct bt_field *bt_field_sequence_create(struct bt_field_type *);
8b45963b 157
8deee039
PP
158static
159struct bt_field *bt_field_string_create(struct bt_field_type *);
8b45963b 160
8deee039
PP
161static
162struct bt_field *(* const field_create_funcs[])(struct bt_field_type *) = {
163 [BT_FIELD_TYPE_ID_INTEGER] = bt_field_integer_create,
164 [BT_FIELD_TYPE_ID_ENUM] = bt_field_enumeration_create,
165 [BT_FIELD_TYPE_ID_FLOAT] = bt_field_floating_point_create,
166 [BT_FIELD_TYPE_ID_STRUCT] = bt_field_structure_create,
167 [BT_FIELD_TYPE_ID_VARIANT] = bt_field_variant_create,
168 [BT_FIELD_TYPE_ID_ARRAY] = bt_field_array_create,
169 [BT_FIELD_TYPE_ID_SEQUENCE] = bt_field_sequence_create,
170 [BT_FIELD_TYPE_ID_STRING] = bt_field_string_create,
171};
8b45963b 172
839d52a5 173struct bt_field *bt_field_create(struct bt_field_type *type)
273b65be 174{
839d52a5
PP
175 struct bt_field *field = NULL;
176 enum bt_field_type_id type_id;
273b65be 177
8b45963b 178 BT_ASSERT_PRE_NON_NULL(type, "Field type");
8deee039
PP
179 BT_ASSERT(field_type_common_has_known_id((void *) type));
180 BT_ASSERT_PRE(bt_field_type_common_validate((void *) type) == 0,
8b45963b 181 "Field type is invalid: %!+F", type);
839d52a5 182 type_id = bt_field_type_get_type_id(type);
273b65be
JG
183 field = field_create_funcs[type_id](type);
184 if (!field) {
8deee039 185 goto end;
273b65be
JG
186 }
187
839d52a5 188 bt_field_type_freeze(type);
273b65be 189
8deee039
PP
190end:
191 return field;
273b65be
JG
192}
193
5fe68922 194struct bt_field_type *bt_field_borrow_type(struct bt_field *field)
cd95e351 195{
5fe68922 196 return (void *) bt_field_common_borrow_type((void *) field);
cd95e351
JG
197}
198
839d52a5 199enum bt_field_type_id bt_field_get_type_id(struct bt_field *field)
4ebcc695 200{
8deee039
PP
201 struct bt_field_common *field_common = (void *) field;
202
8b45963b 203 BT_ASSERT_PRE_NON_NULL(field, "Field");
8deee039 204 return field_common->type->id;
4ebcc695
PP
205}
206
839d52a5 207bt_bool bt_field_is_integer(struct bt_field *field)
8f3553be 208{
839d52a5 209 return bt_field_get_type_id(field) == BT_FIELD_TYPE_ID_INTEGER;
8f3553be
PP
210}
211
839d52a5 212bt_bool bt_field_is_floating_point(struct bt_field *field)
8f3553be 213{
839d52a5 214 return bt_field_get_type_id(field) == BT_FIELD_TYPE_ID_FLOAT;
8f3553be
PP
215}
216
839d52a5 217bt_bool bt_field_is_enumeration(struct bt_field *field)
8f3553be 218{
839d52a5 219 return bt_field_get_type_id(field) == BT_FIELD_TYPE_ID_ENUM;
8f3553be
PP
220}
221
839d52a5 222bt_bool bt_field_is_string(struct bt_field *field)
8f3553be 223{
839d52a5 224 return bt_field_get_type_id(field) == BT_FIELD_TYPE_ID_STRING;
8f3553be
PP
225}
226
839d52a5 227bt_bool bt_field_is_structure(struct bt_field *field)
8f3553be 228{
839d52a5 229 return bt_field_get_type_id(field) == BT_FIELD_TYPE_ID_STRUCT;
8f3553be
PP
230}
231
839d52a5 232bt_bool bt_field_is_array(struct bt_field *field)
8f3553be 233{
839d52a5 234 return bt_field_get_type_id(field) == BT_FIELD_TYPE_ID_ARRAY;
8f3553be
PP
235}
236
839d52a5 237bt_bool bt_field_is_sequence(struct bt_field *field)
8f3553be 238{
839d52a5 239 return bt_field_get_type_id(field) == BT_FIELD_TYPE_ID_SEQUENCE;
8f3553be
PP
240}
241
839d52a5 242bt_bool bt_field_is_variant(struct bt_field *field)
8f3553be 243{
839d52a5 244 return bt_field_get_type_id(field) == BT_FIELD_TYPE_ID_VARIANT;
8f3553be
PP
245}
246
fea75608
PP
247BT_HIDDEN
248int64_t bt_field_sequence_get_int_length(struct bt_field *field)
249{
8deee039 250 return bt_field_common_sequence_get_int_length((void *) field);
fea75608
PP
251}
252
5fe68922 253struct bt_field *bt_field_sequence_borrow_length(struct bt_field *field)
cd95e351 254{
5fe68922 255 return (void *) bt_field_common_sequence_borrow_length((void *) field);
cd95e351
JG
256}
257
839d52a5
PP
258int bt_field_sequence_set_length(struct bt_field *field,
259 struct bt_field *length_field)
273b65be 260{
8deee039
PP
261 return bt_field_common_sequence_set_length((void *) field,
262 (void *) length_field);
273b65be
JG
263}
264
5fe68922 265struct bt_field *bt_field_structure_borrow_field_by_index(
839d52a5 266 struct bt_field *field, uint64_t index)
cd95e351 267{
5fe68922 268 return (void *) bt_field_common_structure_borrow_field_by_index(
8deee039 269 (void *) field, index);
8b45963b 270}
fc25abce 271
5fe68922 272struct bt_field *bt_field_structure_borrow_field_by_name(
8deee039 273 struct bt_field *field, const char *name)
8b45963b 274{
5fe68922 275 return (void *) bt_field_common_structure_borrow_field_by_name(
8deee039 276 (void *) field, name);
cd95e351
JG
277}
278
8deee039
PP
279int bt_field_structure_set_field_by_name(struct bt_field_common *field,
280 const char *name, struct bt_field_common *value)
273b65be 281{
8deee039
PP
282 return bt_field_common_structure_set_field_by_name((void *) field,
283 name, (void *) value);
273b65be
JG
284}
285
5fe68922 286struct bt_field *bt_field_array_borrow_field(
8deee039 287 struct bt_field *field, uint64_t index)
273b65be 288{
5fe68922
PP
289 return (void *) bt_field_common_array_borrow_field((void *) field,
290 index, (bt_field_common_create_func) bt_field_create);
8deee039 291}
8b45963b 292
5fe68922 293struct bt_field *bt_field_sequence_borrow_field(
8deee039
PP
294 struct bt_field *field, uint64_t index)
295{
5fe68922 296 return (void *) bt_field_common_sequence_borrow_field((void *) field,
8deee039 297 index, (bt_field_common_create_func) bt_field_create);
273b65be
JG
298}
299
5fe68922 300struct bt_field *bt_field_variant_borrow_field(struct bt_field *field,
839d52a5 301 struct bt_field *tag_field)
273b65be 302{
5fe68922 303 return (void *) bt_field_common_variant_borrow_field((void *) field,
8deee039
PP
304 (void *) tag_field,
305 (bt_field_common_create_func) bt_field_create);
273b65be
JG
306}
307
5fe68922 308struct bt_field *bt_field_variant_borrow_current_field(
839d52a5 309 struct bt_field *variant_field)
3f4a108d 310{
5fe68922 311 return (void *) bt_field_common_variant_borrow_current_field(
8deee039 312 (void *) variant_field);
3f4a108d
PP
313}
314
5fe68922 315struct bt_field_common *bt_field_variant_borrow_tag(
8deee039 316 struct bt_field_common *variant_field)
f78d67fb 317{
5fe68922
PP
318 return (void *) bt_field_common_variant_borrow_tag(
319 (void *) variant_field);
f78d67fb
JG
320}
321
5fe68922 322struct bt_field *bt_field_enumeration_borrow_container(struct bt_field *field)
273b65be 323{
5fe68922 324 return (void *) bt_field_common_enumeration_borrow_container(
8deee039 325 (void *) field, (bt_field_common_create_func) bt_field_create);
273b65be
JG
326}
327
839d52a5
PP
328struct bt_field_type_enumeration_mapping_iterator *
329bt_field_enumeration_get_mappings(struct bt_field *field)
cd95e351 330{
8deee039
PP
331 return bt_field_common_enumeration_get_mappings((void *) field,
332 (bt_field_common_create_func) bt_field_create);
cd95e351
JG
333}
334
8deee039 335int bt_field_integer_signed_get_value(struct bt_field *field, int64_t *value)
cd95e351 336{
8deee039 337 return bt_field_common_integer_signed_get_value((void *) field, value);
cd95e351
JG
338}
339
8deee039
PP
340int bt_field_integer_signed_set_value(struct bt_field *field,
341 int64_t value)
273b65be 342{
8deee039 343 return bt_field_common_integer_signed_set_value((void *) field, value);
273b65be
JG
344}
345
8deee039
PP
346int bt_field_integer_unsigned_get_value(struct bt_field *field,
347 uint64_t *value)
cd95e351 348{
8deee039
PP
349 return bt_field_common_integer_unsigned_get_value((void *) field,
350 value);
cd95e351
JG
351}
352
8deee039 353int bt_field_integer_unsigned_set_value(struct bt_field *field, uint64_t value)
273b65be 354{
8deee039 355 return bt_field_common_integer_unsigned_set_value((void *) field, value);
8b45963b
PP
356}
357
8deee039
PP
358int bt_field_floating_point_get_value(struct bt_field *field,
359 double *value)
8b45963b 360{
8deee039 361 return bt_field_common_floating_point_get_value((void *) field, value);
273b65be
JG
362}
363
8deee039
PP
364int bt_field_floating_point_set_value(struct bt_field *field,
365 double value)
cd95e351 366{
8deee039 367 return bt_field_common_floating_point_set_value((void *) field, value);
8b45963b 368}
fc25abce 369
8deee039 370const char *bt_field_string_get_value(struct bt_field *field)
8b45963b 371{
8deee039 372 return bt_field_common_string_get_value((void *) field);
cd95e351
JG
373}
374
8deee039 375int bt_field_string_set_value(struct bt_field *field, const char *value)
273b65be 376{
8deee039 377 return bt_field_common_string_set_value((void *) field, value);
273b65be
JG
378}
379
8deee039 380int bt_field_string_append(struct bt_field *field, const char *value)
cd95e351 381{
8deee039 382 return bt_field_common_string_append((void *) field, value);
cd95e351
JG
383}
384
8deee039
PP
385int bt_field_string_append_len(struct bt_field *field,
386 const char *value, unsigned int length)
273b65be 387{
8deee039 388 return bt_field_common_string_append_len((void *) field, value, length);
273b65be
JG
389}
390
8deee039
PP
391BT_HIDDEN
392struct bt_field_common *bt_field_common_copy(struct bt_field_common *field)
c6f9c5a3 393{
8deee039 394 struct bt_field_common *copy = NULL;
c6f9c5a3 395
8deee039
PP
396 BT_ASSERT_PRE_NON_NULL(field, "Field");
397 BT_ASSERT(field_type_common_has_known_id(field->type));
398 BT_ASSERT(field->methods->copy);
399 copy = field->methods->copy(field);
400 if (!copy) {
401 BT_LOGW("Cannot create field: ft-addr=%p", field->type);
402 goto end;
c6f9c5a3
PP
403 }
404
8deee039
PP
405 bt_field_common_set(copy, field->payload_set);
406
407end:
408 return copy;
c6f9c5a3
PP
409}
410
8deee039 411struct bt_field *bt_field_copy(struct bt_field *field)
f98c6554 412{
8deee039
PP
413 return (void *) bt_field_common_copy((void *) field);
414}
f98c6554 415
8deee039
PP
416static void bt_field_common_finalize(struct bt_field_common *field)
417{
418 BT_ASSERT(field);
419 BT_LOGD_STR("Putting field's type.");
420 bt_put(field->type);
421}
f98c6554 422
8deee039
PP
423BT_HIDDEN
424void bt_field_common_integer_destroy(struct bt_object *obj)
425{
426 struct bt_field_common_integer *integer = (void *) obj;
f98c6554 427
8deee039
PP
428 BT_ASSERT(obj);
429 bt_field_common_finalize(BT_TO_COMMON(integer));
430 BT_LOGD("Destroying integer field object: addr=%p", obj);
431 g_free(obj);
f98c6554
PP
432}
433
273b65be 434BT_HIDDEN
8deee039 435void bt_field_common_enumeration_destroy_recursive(struct bt_object *obj)
273b65be 436{
8deee039 437 struct bt_field_common_enumeration *enumeration = (void *) obj;
273b65be 438
8deee039
PP
439 BT_ASSERT(enumeration);
440 bt_field_common_finalize(BT_TO_COMMON(enumeration));
441 BT_LOGD("Destroying enumeration field object: addr=%p", obj);
442 BT_LOGD_STR("Putting payload field.");
443 bt_put(enumeration->payload);
444 g_free(enumeration);
445}
273b65be 446
8deee039
PP
447BT_HIDDEN
448void bt_field_common_floating_point_destroy(struct bt_object *obj)
449{
450 struct bt_field_common_floating_point *floating_point = (void *) obj;
8b45963b 451
8deee039
PP
452 BT_ASSERT(obj);
453 bt_field_common_finalize(BT_TO_COMMON(floating_point));
454 BT_LOGD("Destroying floating point number field object: addr=%p", obj);
455 g_free(obj);
273b65be
JG
456}
457
8b45963b 458BT_HIDDEN
8deee039
PP
459void bt_field_common_structure_destroy_recursive(struct bt_object *obj)
460{
461 struct bt_field_common_structure *structure = (void *) obj;
462
463 BT_ASSERT(obj);
464 bt_field_common_finalize(BT_TO_COMMON(structure));
465 BT_LOGD("Destroying structure field object: addr=%p", obj);
466 g_ptr_array_free(structure->fields, TRUE);
467 g_free(structure);
8b45963b 468}
12c8a1a3 469
8b45963b 470BT_HIDDEN
8deee039 471void bt_field_common_variant_destroy_recursive(struct bt_object *obj)
8b45963b 472{
8deee039
PP
473 struct bt_field_common_variant *variant = (void *) obj;
474
475 BT_ASSERT(obj);
476 bt_field_common_finalize(BT_TO_COMMON(variant));
477 BT_LOGD("Destroying variant field object: addr=%p", obj);
478 BT_LOGD_STR("Putting tag field.");
479 bt_put(variant->tag);
480 BT_LOGD_STR("Putting payload field.");
481 bt_put(variant->payload);
482 g_free(variant);
12c8a1a3
JG
483}
484
273b65be 485BT_HIDDEN
8deee039 486void bt_field_common_array_destroy_recursive(struct bt_object *obj)
273b65be 487{
8deee039 488 struct bt_field_common_array *array = (void *) obj;
273b65be 489
8deee039
PP
490 BT_ASSERT(obj);
491 bt_field_common_finalize(BT_TO_COMMON(array));
492 BT_LOGD("Destroying array field object: addr=%p", obj);
493 g_ptr_array_free(array->elements, TRUE);
494 g_free(array);
273b65be
JG
495}
496
8b45963b 497BT_HIDDEN
8deee039 498void bt_field_common_sequence_destroy_recursive(struct bt_object *obj)
76f869ab 499{
8deee039 500 struct bt_field_common_sequence *sequence = (void *) obj;
76f869ab 501
8deee039
PP
502 BT_ASSERT(obj);
503 bt_field_common_finalize(BT_TO_COMMON(sequence));
504 BT_LOGD("Destroying sequence field object: addr=%p", obj);
76f869ab 505
8deee039
PP
506 if (sequence->elements) {
507 g_ptr_array_free(sequence->elements, TRUE);
508 }
8b45963b 509
8deee039
PP
510 BT_LOGD_STR("Putting length field.");
511 bt_put(sequence->length);
512 g_free(sequence);
76f869ab
JG
513}
514
8deee039
PP
515BT_HIDDEN
516void bt_field_common_string_destroy(struct bt_object *obj)
87d43dc1 517{
8deee039 518 struct bt_field_common_string *string = (void *) obj;
87d43dc1 519
8deee039
PP
520 BT_ASSERT(obj);
521 bt_field_common_finalize(BT_TO_COMMON(string));
522 BT_LOGD("Destroying string field object: addr=%p", obj);
87d43dc1 523
8deee039
PP
524 if (string->payload) {
525 g_string_free(string->payload, TRUE);
87d43dc1 526 }
8b45963b 527
8deee039 528 g_free(string);
87d43dc1
JG
529}
530
273b65be 531static
839d52a5 532struct bt_field *bt_field_integer_create(struct bt_field_type *type)
273b65be 533{
8deee039
PP
534 struct bt_field_common_integer *integer =
535 g_new0(struct bt_field_common_integer, 1);
273b65be 536
fc25abce
PP
537 BT_LOGD("Creating integer field object: ft-addr=%p", type);
538
539 if (integer) {
8deee039
PP
540 bt_field_common_initialize(BT_TO_COMMON(integer), (void *) type,
541 bt_field_common_integer_destroy,
542 &bt_field_integer_methods);
fc25abce 543 BT_LOGD("Created integer field object: addr=%p, ft-addr=%p",
8deee039 544 integer, type);
fc25abce
PP
545 } else {
546 BT_LOGE_STR("Failed to allocate one integer field.");
547 }
548
8deee039 549 return (void *) integer;
273b65be
JG
550}
551
552static
8deee039 553struct bt_field *bt_field_enumeration_create(struct bt_field_type *type)
273b65be 554{
8deee039
PP
555 struct bt_field_common_enumeration *enumeration = g_new0(
556 struct bt_field_common_enumeration, 1);
273b65be 557
fc25abce
PP
558 BT_LOGD("Creating enumeration field object: ft-addr=%p", type);
559
560 if (enumeration) {
8deee039
PP
561 bt_field_common_initialize(BT_TO_COMMON(enumeration),
562 (void *) type,
563 bt_field_common_enumeration_destroy_recursive,
564 &bt_field_enumeration_methods);
fc25abce 565 BT_LOGD("Created enumeration field object: addr=%p, ft-addr=%p",
8deee039 566 enumeration, type);
fc25abce
PP
567 } else {
568 BT_LOGE_STR("Failed to allocate one enumeration field.");
569 }
570
8deee039 571 return (void *) enumeration;
273b65be
JG
572}
573
574static
8deee039 575struct bt_field *bt_field_floating_point_create(struct bt_field_type *type)
273b65be 576{
8deee039 577 struct bt_field_common_floating_point *floating_point;
273b65be 578
fc25abce 579 BT_LOGD("Creating floating point number field object: ft-addr=%p", type);
8deee039 580 floating_point = g_new0(struct bt_field_common_floating_point, 1);
fc25abce
PP
581
582 if (floating_point) {
8deee039
PP
583 bt_field_common_initialize(BT_TO_COMMON(floating_point),
584 (void *) type,
585 bt_field_common_floating_point_destroy,
586 &bt_field_floating_point_methods);
fc25abce 587 BT_LOGD("Created floating point number field object: addr=%p, ft-addr=%p",
8deee039 588 floating_point, type);
fc25abce
PP
589 } else {
590 BT_LOGE_STR("Failed to allocate one floating point number field.");
591 }
592
8deee039 593 return (void *) floating_point;
273b65be
JG
594}
595
8deee039
PP
596BT_HIDDEN
597int bt_field_common_structure_initialize(struct bt_field_common *field,
598 struct bt_field_type_common *type,
599 bt_object_release_func release_func,
600 struct bt_field_common_methods *methods,
601 bt_field_common_create_func field_create_func)
602{
603 int ret = 0;
604 struct bt_field_type_common_structure *structure_type =
605 BT_FROM_COMMON(type);
606 struct bt_field_common_structure *structure = BT_FROM_COMMON(field);
9be89173 607 size_t i;
273b65be 608
8deee039
PP
609 BT_LOGD("Initializing common structure field object: ft-addr=%p", type);
610 bt_field_common_initialize(field, type, release_func, methods);
273b65be 611 structure->fields = g_ptr_array_new_with_free_func(
839d52a5 612 (GDestroyNotify) bt_put);
8deee039 613 g_ptr_array_set_size(structure->fields, structure_type->fields->len);
9be89173
JG
614
615 /* Create all fields contained by the structure field. */
616 for (i = 0; i < structure_type->fields->len; i++) {
8deee039
PP
617 struct bt_field_common *field;
618 struct structure_field_common *struct_field =
9be89173
JG
619 g_ptr_array_index(structure_type->fields, i);
620
8deee039 621 field = field_create_func(struct_field->type);
9be89173
JG
622 if (!field) {
623 BT_LOGE("Failed to create structure field's member: name=\"%s\", index=%zu",
8deee039
PP
624 g_quark_to_string(struct_field->name), i);
625 ret = -1;
9be89173
JG
626 goto end;
627 }
628
629 g_ptr_array_index(structure->fields, i) = field;
630 }
631
8deee039
PP
632 BT_LOGD("Initialized common structure field object: addr=%p, ft-addr=%p",
633 field, type);
634
273b65be 635end:
9be89173 636 return ret;
273b65be
JG
637}
638
8deee039
PP
639static
640struct bt_field *bt_field_structure_create(struct bt_field_type *type)
641{
642 struct bt_field_common_structure *structure = g_new0(
643 struct bt_field_common_structure, 1);
644 int iret;
645
646 BT_LOGD("Creating structure field object: ft-addr=%p", type);
647
648 if (!structure) {
649 BT_LOGE_STR("Failed to allocate one structure field.");
650 goto end;
651 }
652
653 iret = bt_field_common_structure_initialize(BT_TO_COMMON(structure),
654 (void *) type, bt_field_common_structure_destroy_recursive,
655 &bt_field_structure_methods,
656 (bt_field_common_create_func) bt_field_create);
657 if (iret) {
658 BT_PUT(structure);
659 goto end;
660 }
661
662 BT_LOGD("Created structure field object: addr=%p, ft-addr=%p",
663 structure, type);
664
665end:
666 return (void *) structure;
667}
668
273b65be 669static
839d52a5 670struct bt_field *bt_field_variant_create(struct bt_field_type *type)
273b65be 671{
8deee039
PP
672 struct bt_field_common_variant *variant = g_new0(
673 struct bt_field_common_variant, 1);
fc25abce
PP
674
675 BT_LOGD("Creating variant field object: ft-addr=%p", type);
676
677 if (variant) {
8deee039
PP
678 bt_field_common_initialize(BT_TO_COMMON(variant),
679 (void *) type,
680 bt_field_common_variant_destroy_recursive,
681 &bt_field_variant_methods);
fc25abce 682 BT_LOGD("Created variant field object: addr=%p, ft-addr=%p",
8deee039 683 variant, type);
fc25abce
PP
684 } else {
685 BT_LOGE_STR("Failed to allocate one variant field.");
686 }
687
8deee039 688 return (void *) variant;
273b65be
JG
689}
690
8deee039
PP
691BT_HIDDEN
692int bt_field_common_array_initialize(struct bt_field_common *field,
693 struct bt_field_type_common *type,
694 bt_object_release_func release_func,
695 struct bt_field_common_methods *methods)
273b65be 696{
8deee039
PP
697 struct bt_field_type_common_array *array_type = BT_FROM_COMMON(type);
698 struct bt_field_common_array *array = BT_FROM_COMMON(field);
273b65be 699 unsigned int array_length;
8deee039 700 int ret = 0;
273b65be 701
8deee039 702 BT_LOGD("Initializing common array field object: ft-addr=%p", type);
8b45963b 703 BT_ASSERT(type);
8deee039 704 bt_field_common_initialize(field, type, release_func, methods);
273b65be 705 array_length = array_type->length;
fe0fe95c 706 array->elements = g_ptr_array_sized_new(array_length);
273b65be 707 if (!array->elements) {
8deee039
PP
708 ret = -1;
709 goto end;
273b65be
JG
710 }
711
8deee039 712 g_ptr_array_set_free_func(array->elements, (GDestroyNotify) bt_put);
273b65be 713 g_ptr_array_set_size(array->elements, array_length);
8deee039
PP
714 BT_LOGD("Initialized common array field object: addr=%p, ft-addr=%p",
715 field, type);
273b65be 716
8deee039
PP
717end:
718 return ret;
273b65be
JG
719}
720
721static
8deee039 722struct bt_field *bt_field_array_create(struct bt_field_type *type)
273b65be 723{
8deee039
PP
724 struct bt_field_common_array *array =
725 g_new0(struct bt_field_common_array, 1);
726 int ret;
fc25abce 727
8deee039
PP
728 BT_LOGD("Creating array field object: ft-addr=%p", type);
729 BT_ASSERT(type);
fc25abce 730
8deee039
PP
731 if (!array) {
732 BT_LOGE_STR("Failed to allocate one array field.");
733 goto end;
fc25abce
PP
734 }
735
8deee039
PP
736 ret = bt_field_common_array_initialize(BT_TO_COMMON(array),
737 (void *) type,
738 bt_field_common_array_destroy_recursive,
739 &bt_field_array_methods);
740 if (ret) {
741 BT_PUT(array);
742 goto end;
743 }
273b65be 744
8deee039
PP
745 BT_LOGD("Created array field object: addr=%p, ft-addr=%p",
746 array, type);
273b65be 747
8deee039
PP
748end:
749 return (void *) array;
273b65be
JG
750}
751
752static
8deee039 753struct bt_field *bt_field_sequence_create(struct bt_field_type *type)
273b65be 754{
8deee039
PP
755 struct bt_field_common_sequence *sequence = g_new0(
756 struct bt_field_common_sequence, 1);
273b65be 757
8deee039 758 BT_LOGD("Creating sequence field object: ft-addr=%p", type);
273b65be 759
8deee039
PP
760 if (sequence) {
761 bt_field_common_initialize(BT_TO_COMMON(sequence),
762 (void *) type,
763 bt_field_common_sequence_destroy_recursive,
764 &bt_field_sequence_methods);
765 BT_LOGD("Created sequence field object: addr=%p, ft-addr=%p",
766 sequence, type);
767 } else {
768 BT_LOGE_STR("Failed to allocate one sequence field.");
4fef87ab 769 }
8deee039
PP
770
771 return (void *) sequence;
273b65be
JG
772}
773
774static
8deee039 775struct bt_field *bt_field_string_create(struct bt_field_type *type)
273b65be 776{
8deee039
PP
777 struct bt_field_common_string *string = g_new0(
778 struct bt_field_common_string, 1);
fc25abce 779
8deee039
PP
780 BT_LOGD("Creating string field object: ft-addr=%p", type);
781
782 if (string) {
783 bt_field_common_initialize(BT_TO_COMMON(string),
784 (void *) type,
785 bt_field_common_string_destroy,
786 &bt_field_string_methods);
787 BT_LOGD("Created string field object: addr=%p, ft-addr=%p",
788 string, type);
789 } else {
790 BT_LOGE_STR("Failed to allocate one string field.");
9b2b7163 791 }
8deee039
PP
792
793 return (void *) string;
273b65be
JG
794}
795
8deee039
PP
796BT_HIDDEN
797int bt_field_common_generic_validate(struct bt_field_common *field)
273b65be 798{
da2f6971 799 return (field && field->payload_set) ? 0 : -1;
273b65be
JG
800}
801
8deee039
PP
802BT_HIDDEN
803int bt_field_common_enumeration_validate_recursive(
804 struct bt_field_common *field)
273b65be
JG
805{
806 int ret;
8deee039 807 struct bt_field_common_enumeration *enumeration = BT_FROM_COMMON(field);
273b65be 808
8b45963b 809 BT_ASSERT(field);
8deee039 810
273b65be 811 if (!enumeration->payload) {
8b45963b 812 BT_ASSERT_PRE_MSG("Invalid enumeration field: payload is not set: "
8deee039 813 "%!+_f", field);
273b65be
JG
814 ret = -1;
815 goto end;
816 }
817
8deee039 818 ret = bt_field_common_validate_recursive(enumeration->payload);
8b45963b 819
273b65be
JG
820end:
821 return ret;
822}
823
8deee039
PP
824BT_HIDDEN
825int bt_field_common_structure_validate_recursive(struct bt_field_common *field)
273b65be 826{
fc25abce 827 int64_t i;
273b65be 828 int ret = 0;
8deee039 829 struct bt_field_common_structure *structure = BT_FROM_COMMON(field);
273b65be 830
8b45963b 831 BT_ASSERT(field);
8b45963b 832
273b65be 833 for (i = 0; i < structure->fields->len; i++) {
8deee039 834 ret = bt_field_common_validate_recursive(
8b45963b 835 (void *) structure->fields->pdata[i]);
fc25abce 836
273b65be 837 if (ret) {
fc25abce 838 int this_ret;
6ce12048 839 const char *name;
6ce12048 840
5fe68922 841 this_ret = bt_field_type_common_structure_borrow_field_by_index(
8b45963b
PP
842 field->type, &name, NULL, i);
843 BT_ASSERT(this_ret == 0);
844 BT_ASSERT_PRE_MSG("Invalid structure field's field: "
8deee039
PP
845 "%![struct-field-]+_f, field-name=\"%s\", "
846 "index=%" PRId64 ", %![field-]+_f",
8b45963b 847 field, name, i, structure->fields->pdata[i]);
273b65be
JG
848 goto end;
849 }
850 }
8b45963b 851
273b65be
JG
852end:
853 return ret;
854}
855
8deee039
PP
856BT_HIDDEN
857int bt_field_common_variant_validate_recursive(struct bt_field_common *field)
273b65be
JG
858{
859 int ret = 0;
8deee039 860 struct bt_field_common_variant *variant = BT_FROM_COMMON(field);
273b65be 861
8b45963b 862 BT_ASSERT(field);
8deee039 863 ret = bt_field_common_validate_recursive(variant->payload);
fc25abce 864 if (ret) {
8b45963b 865 BT_ASSERT_PRE_MSG("Invalid variant field's payload field: "
8deee039 866 "%![variant-field-]+_f, %![payload-field-]+_f",
fc25abce
PP
867 field, variant->payload);
868 }
8b45963b 869
273b65be
JG
870 return ret;
871}
872
8deee039
PP
873BT_HIDDEN
874int bt_field_common_array_validate_recursive(struct bt_field_common *field)
273b65be 875{
fc25abce 876 int64_t i;
273b65be 877 int ret = 0;
8deee039 878 struct bt_field_common_array *array = BT_FROM_COMMON(field);
273b65be 879
8b45963b 880 BT_ASSERT(field);
8deee039 881
273b65be 882 for (i = 0; i < array->elements->len; i++) {
8deee039 883 ret = bt_field_common_validate_recursive((void *) array->elements->pdata[i]);
273b65be 884 if (ret) {
8b45963b 885 BT_ASSERT_PRE_MSG("Invalid array field's element field: "
8deee039
PP
886 "%![array-field-]+_f, " PRId64 ", "
887 "%![elem-field-]+_f",
8b45963b 888 field, i, array->elements->pdata[i]);
273b65be
JG
889 goto end;
890 }
891 }
8b45963b 892
273b65be
JG
893end:
894 return ret;
895}
896
8deee039
PP
897BT_HIDDEN
898int bt_field_common_sequence_validate_recursive(struct bt_field_common *field)
273b65be
JG
899{
900 size_t i;
901 int ret = 0;
8deee039 902 struct bt_field_common_sequence *sequence = BT_FROM_COMMON(field);
273b65be 903
8b45963b 904 BT_ASSERT(field);
8deee039 905
273b65be 906 for (i = 0; i < sequence->elements->len; i++) {
8deee039 907 ret = bt_field_common_validate_recursive(
8b45963b 908 (void *) sequence->elements->pdata[i]);
273b65be 909 if (ret) {
8b45963b 910 BT_ASSERT_PRE_MSG("Invalid sequence field's element field: "
8deee039
PP
911 "%![seq-field-]+_f, " PRId64 ", "
912 "%![elem-field-]+_f",
8b45963b 913 field, i, sequence->elements->pdata[i]);
273b65be
JG
914 goto end;
915 }
916 }
917end:
918 return ret;
919}
920
8deee039
PP
921BT_HIDDEN
922void bt_field_common_generic_reset(struct bt_field_common *field)
12c8a1a3 923{
8b45963b 924 BT_ASSERT(field);
a745c331 925 field->payload_set = false;
12c8a1a3
JG
926}
927
8deee039
PP
928BT_HIDDEN
929void bt_field_common_enumeration_reset_recursive(struct bt_field_common *field)
12c8a1a3 930{
8deee039 931 struct bt_field_common_enumeration *enumeration = BT_FROM_COMMON(field);
12c8a1a3 932
8b45963b 933 BT_ASSERT(field);
8deee039 934
12c8a1a3 935 if (!enumeration->payload) {
8b45963b 936 return;
12c8a1a3
JG
937 }
938
8deee039 939 bt_field_common_reset_recursive(enumeration->payload);
12c8a1a3
JG
940}
941
8deee039
PP
942BT_HIDDEN
943void bt_field_common_structure_reset_recursive(struct bt_field_common *field)
12c8a1a3 944{
fc25abce 945 int64_t i;
8deee039 946 struct bt_field_common_structure *structure = BT_FROM_COMMON(field);
12c8a1a3 947
8b45963b 948 BT_ASSERT(field);
8b45963b 949
12c8a1a3 950 for (i = 0; i < structure->fields->len; i++) {
8deee039 951 struct bt_field_common *member = structure->fields->pdata[i];
12c8a1a3
JG
952
953 if (!member) {
954 /*
8b45963b
PP
955 * Structure members are lazily initialized;
956 * skip if this member has not been allocated
957 * yet.
12c8a1a3
JG
958 */
959 continue;
960 }
961
8deee039 962 bt_field_common_reset_recursive(member);
12c8a1a3 963 }
12c8a1a3
JG
964}
965
8deee039
PP
966BT_HIDDEN
967void bt_field_common_variant_reset_recursive(struct bt_field_common *field)
12c8a1a3 968{
8deee039 969 struct bt_field_common_variant *variant = BT_FROM_COMMON(field);
12c8a1a3 970
8b45963b 971 BT_ASSERT(field);
7d7fae6d
JG
972 BT_PUT(variant->tag);
973 BT_PUT(variant->payload);
12c8a1a3
JG
974}
975
8deee039
PP
976BT_HIDDEN
977void bt_field_common_array_reset_recursive(struct bt_field_common *field)
12c8a1a3
JG
978{
979 size_t i;
8deee039 980 struct bt_field_common_array *array = BT_FROM_COMMON(field);
12c8a1a3 981
8b45963b 982 BT_ASSERT(field);
8b45963b 983
12c8a1a3 984 for (i = 0; i < array->elements->len; i++) {
8deee039 985 struct bt_field_common *member = array->elements->pdata[i];
12c8a1a3
JG
986
987 if (!member) {
988 /*
8b45963b
PP
989 * Array elements are lazily initialized; skip
990 * if this member has not been allocated yet.
12c8a1a3
JG
991 */
992 continue;
993 }
994
8deee039 995 bt_field_common_reset_recursive(member);
12c8a1a3 996 }
12c8a1a3
JG
997}
998
8deee039
PP
999BT_HIDDEN
1000void bt_field_common_sequence_reset_recursive(struct bt_field_common *field)
12c8a1a3 1001{
8deee039 1002 struct bt_field_common_sequence *sequence = BT_FROM_COMMON(field);
12c8a1a3 1003
8b45963b 1004 BT_ASSERT(field);
8b45963b 1005
7d7fae6d
JG
1006 if (sequence->elements) {
1007 g_ptr_array_free(sequence->elements, TRUE);
1008 sequence->elements = NULL;
12c8a1a3 1009 }
8b45963b 1010
7d7fae6d 1011 BT_PUT(sequence->length);
12c8a1a3
JG
1012}
1013
8deee039
PP
1014BT_HIDDEN
1015void bt_field_common_string_reset(struct bt_field_common *field)
12c8a1a3 1016{
8deee039 1017 struct bt_field_common_string *string = BT_FROM_COMMON(field);
12c8a1a3 1018
8b45963b 1019 BT_ASSERT(field);
8deee039
PP
1020 bt_field_common_generic_reset(field);
1021
12c8a1a3
JG
1022 if (string->payload) {
1023 g_string_truncate(string->payload, 0);
1024 }
12c8a1a3
JG
1025}
1026
273b65be 1027static
8deee039 1028struct bt_field_common *bt_field_integer_copy(struct bt_field_common *src)
273b65be 1029{
8deee039
PP
1030 struct bt_field_common_integer *integer_src = (void *) src;
1031 struct bt_field_common_integer *integer_dst;
273b65be 1032
8deee039
PP
1033 BT_LOGD("Copying integer field: src-field-addr=%p", src);
1034 integer_dst = (void *) bt_field_create((void *) src->type);
1035 if (!integer_dst) {
70fd5a51
MD
1036 goto end;
1037 }
273b65be 1038
8deee039
PP
1039 integer_dst->payload = integer_src->payload;
1040 BT_LOGD_STR("Copied integer field.");
8b45963b 1041
273b65be 1042end:
8deee039 1043 return BT_TO_COMMON(integer_dst);
273b65be
JG
1044}
1045
1046static
8deee039
PP
1047struct bt_field_common *bt_field_enumeration_copy_recursive(
1048 struct bt_field_common *src)
273b65be 1049{
8deee039
PP
1050 struct bt_field_common_enumeration *enum_src = BT_FROM_COMMON(src);
1051 struct bt_field_common_enumeration *enum_dst;
273b65be 1052
8deee039
PP
1053 BT_LOGD("Copying enumeration field: src-field-addr=%p", src);
1054 enum_dst = (void *) bt_field_create((void *) src->type);
1055 if (!enum_dst) {
1056 goto error;
273b65be 1057 }
8b45963b 1058
87d43dc1 1059 if (enum_src->payload) {
fc25abce 1060 BT_LOGD_STR("Copying enumeration field's payload field.");
8deee039
PP
1061 enum_dst->payload = (void *)
1062 bt_field_copy((void *) enum_src->payload);
87d43dc1 1063 if (!enum_dst->payload) {
fc25abce 1064 BT_LOGE_STR("Cannot copy enumeration field's payload field.");
8deee039 1065 goto error;
87d43dc1
JG
1066 }
1067 }
fc25abce
PP
1068
1069 BT_LOGD_STR("Copied enumeration field.");
8deee039
PP
1070 goto end;
1071
1072error:
1073 BT_PUT(enum_dst);
1074
87d43dc1 1075end:
8deee039 1076 return BT_TO_COMMON(enum_dst);
87d43dc1
JG
1077}
1078
1079static
8deee039
PP
1080struct bt_field_common *bt_field_floating_point_copy(
1081 struct bt_field_common *src)
87d43dc1 1082{
8deee039
PP
1083 struct bt_field_common_floating_point *float_src = BT_FROM_COMMON(src);
1084 struct bt_field_common_floating_point *float_dst;
1085
1086 BT_LOGD("Copying floating point number field: src-field-addr=%p", src);
1087 float_dst = (void *) bt_field_create((void *) src->type);
1088 if (!float_dst) {
1089 goto end;
1090 }
87d43dc1 1091
dc3fffef 1092 float_dst->payload = float_src->payload;
fc25abce 1093 BT_LOGD_STR("Copied floating point number field.");
8deee039
PP
1094
1095end:
1096 return BT_TO_COMMON(float_dst);
87d43dc1
JG
1097}
1098
1099static
8deee039
PP
1100struct bt_field_common *bt_field_structure_copy_recursive(
1101 struct bt_field_common *src)
87d43dc1 1102{
fc25abce 1103 int64_t i;
8deee039
PP
1104 struct bt_field_common_structure *struct_src = BT_FROM_COMMON(src);
1105 struct bt_field_common_structure *struct_dst;
87d43dc1 1106
8deee039
PP
1107 BT_LOGD("Copying structure field: src-field-addr=%p", src);
1108 struct_dst = (void *) bt_field_create((void *) src->type);
1109 if (!struct_dst) {
1110 goto error;
1111 }
87d43dc1 1112
8bfa3f9c 1113 g_ptr_array_set_size(struct_dst->fields, struct_src->fields->len);
87d43dc1
JG
1114
1115 for (i = 0; i < struct_src->fields->len; i++) {
8deee039 1116 struct bt_field_common *field =
50fd95bf 1117 g_ptr_array_index(struct_src->fields, i);
8deee039 1118 struct bt_field_common *field_copy = NULL;
87d43dc1 1119
50fd95bf 1120 if (field) {
32e87ceb 1121 BT_LOGD("Copying structure field's field: src-field-addr=%p"
fc25abce 1122 "index=%" PRId64, field, i);
8deee039 1123 field_copy = (void *) bt_field_copy((void *) field);
50fd95bf 1124 if (!field_copy) {
fc25abce
PP
1125 BT_LOGE("Cannot copy structure field's field: "
1126 "src-field-addr=%p, index=%" PRId64,
1127 field, i);
8deee039 1128 goto error;
50fd95bf 1129 }
87d43dc1 1130 }
50fd95bf 1131
9be89173 1132 BT_MOVE(g_ptr_array_index(struct_dst->fields, i), field_copy);
87d43dc1 1133 }
fc25abce
PP
1134
1135 BT_LOGD_STR("Copied structure field.");
8deee039
PP
1136 goto end;
1137
1138error:
1139 BT_PUT(struct_dst);
fc25abce 1140
87d43dc1 1141end:
8deee039 1142 return BT_TO_COMMON(struct_dst);
87d43dc1
JG
1143}
1144
1145static
8deee039
PP
1146struct bt_field_common *bt_field_variant_copy_recursive(
1147 struct bt_field_common *src)
87d43dc1 1148{
8deee039
PP
1149 struct bt_field_common_variant *variant_src = BT_FROM_COMMON(src);
1150 struct bt_field_common_variant *variant_dst;
87d43dc1 1151
8deee039
PP
1152 BT_LOGD("Copying variant field: src-field-addr=%p", src);
1153 variant_dst = (void *) bt_field_create((void *) src->type);
1154 if (!variant_dst) {
1155 goto end;
1156 }
87d43dc1
JG
1157
1158 if (variant_src->tag) {
fc25abce 1159 BT_LOGD_STR("Copying variant field's tag field.");
8deee039
PP
1160 variant_dst->tag = (void *) bt_field_copy(
1161 (void *) variant_src->tag);
87d43dc1 1162 if (!variant_dst->tag) {
fc25abce 1163 BT_LOGE_STR("Cannot copy variant field's tag field.");
8deee039 1164 goto error;
87d43dc1
JG
1165 }
1166 }
1167 if (variant_src->payload) {
fc25abce 1168 BT_LOGD_STR("Copying variant field's payload field.");
8deee039
PP
1169 variant_dst->payload = (void *) bt_field_copy(
1170 (void *) variant_src->payload);
87d43dc1 1171 if (!variant_dst->payload) {
fc25abce 1172 BT_LOGE_STR("Cannot copy variant field's payload field.");
8deee039 1173 goto error;
87d43dc1
JG
1174 }
1175 }
fc25abce
PP
1176
1177 BT_LOGD_STR("Copied variant field.");
8deee039
PP
1178 goto end;
1179
1180error:
1181 BT_PUT(variant_dst);
fc25abce 1182
87d43dc1 1183end:
8deee039 1184 return BT_TO_COMMON(variant_dst);
87d43dc1
JG
1185}
1186
1187static
8deee039
PP
1188struct bt_field_common *bt_field_array_copy_recursive(
1189 struct bt_field_common *src)
87d43dc1 1190{
fc25abce 1191 int64_t i;
8deee039
PP
1192 struct bt_field_common_array *array_src = BT_FROM_COMMON(src);
1193 struct bt_field_common_array *array_dst;
87d43dc1 1194
8deee039
PP
1195 BT_LOGD("Copying array field: src-field-addr=%p", src);
1196 array_dst = (void *) bt_field_create((void *) src->type);
1197 if (!array_dst) {
1198 goto error;
1199 }
87d43dc1 1200
8bfa3f9c 1201 g_ptr_array_set_size(array_dst->elements, array_src->elements->len);
87d43dc1 1202 for (i = 0; i < array_src->elements->len; i++) {
8deee039 1203 struct bt_field_common *field =
50fd95bf 1204 g_ptr_array_index(array_src->elements, i);
8deee039 1205 struct bt_field_common *field_copy = NULL;
87d43dc1 1206
50fd95bf 1207 if (field) {
fc25abce
PP
1208 BT_LOGD("Copying array field's element field: field-addr=%p, "
1209 "index=%" PRId64, field, i);
8deee039 1210 field_copy = (void *) bt_field_copy((void *) field);
50fd95bf 1211 if (!field_copy) {
fc25abce
PP
1212 BT_LOGE("Cannot copy array field's element field: "
1213 "src-field-addr=%p, index=%" PRId64,
1214 field, i);
8deee039 1215 goto error;
50fd95bf 1216 }
87d43dc1 1217 }
50fd95bf 1218
8bfa3f9c 1219 g_ptr_array_index(array_dst->elements, i) = field_copy;
87d43dc1 1220 }
fc25abce
PP
1221
1222 BT_LOGD_STR("Copied array field.");
8deee039
PP
1223 goto end;
1224
1225error:
1226 BT_PUT(array_dst);
fc25abce 1227
87d43dc1 1228end:
8deee039 1229 return BT_TO_COMMON(array_dst);
87d43dc1
JG
1230}
1231
1232static
8deee039
PP
1233struct bt_field_common *bt_field_sequence_copy_recursive(
1234 struct bt_field_common *src)
87d43dc1 1235{
fc25abce
PP
1236 int ret = 0;
1237 int64_t i;
8deee039
PP
1238 struct bt_field_common_sequence *sequence_src = BT_FROM_COMMON(src);
1239 struct bt_field_common_sequence *sequence_dst;
1240 struct bt_field_common *src_length;
1241 struct bt_field_common *dst_length;
1242
1243 BT_LOGD("Copying sequence field: src-field-addr=%p", src);
1244 sequence_dst = (void *) bt_field_create((void *) src->type);
1245 if (!sequence_dst) {
1246 goto error;
1247 }
87d43dc1 1248
5fe68922 1249 src_length = bt_field_common_sequence_borrow_length(src);
59ab494d
PP
1250 if (!src_length) {
1251 /* no length set yet: keep destination sequence empty */
1252 goto end;
1253 }
1254
1255 /* copy source length */
fc25abce 1256 BT_LOGD_STR("Copying sequence field's length field.");
8deee039 1257 dst_length = (void *) bt_field_copy((void *) src_length);
59ab494d 1258 if (!dst_length) {
fc25abce 1259 BT_LOGE_STR("Cannot copy sequence field's length field.");
8deee039 1260 goto error;
59ab494d
PP
1261 }
1262
1263 /* this will initialize the destination sequence's internal array */
8deee039
PP
1264 ret = bt_field_common_sequence_set_length(
1265 BT_TO_COMMON(sequence_dst), dst_length);
83509119 1266 bt_put(dst_length);
59ab494d 1267 if (ret) {
fc25abce
PP
1268 BT_LOGE("Cannot set sequence field copy's length field: "
1269 "dst-length-field-addr=%p", dst_length);
8deee039 1270 goto error;
59ab494d
PP
1271 }
1272
8b45963b 1273 BT_ASSERT(sequence_dst->elements->len == sequence_src->elements->len);
59ab494d 1274
87d43dc1 1275 for (i = 0; i < sequence_src->elements->len; i++) {
8deee039 1276 struct bt_field_common *field =
50fd95bf 1277 g_ptr_array_index(sequence_src->elements, i);
8deee039 1278 struct bt_field_common *field_copy = NULL;
87d43dc1 1279
50fd95bf 1280 if (field) {
fc25abce
PP
1281 BT_LOGD("Copying sequence field's element field: field-addr=%p, "
1282 "index=%" PRId64, field, i);
8deee039 1283 field_copy = (void *) bt_field_copy((void *) field);
50fd95bf 1284 if (!field_copy) {
fc25abce
PP
1285 BT_LOGE("Cannot copy sequence field's element field: "
1286 "src-field-addr=%p, index=%" PRId64,
1287 field, i);
8deee039 1288 goto error;
50fd95bf 1289 }
87d43dc1 1290 }
59ab494d 1291
8bfa3f9c 1292 g_ptr_array_index(sequence_dst->elements, i) = field_copy;
87d43dc1 1293 }
fc25abce
PP
1294
1295 BT_LOGD_STR("Copied sequence field.");
8deee039
PP
1296 goto end;
1297
1298error:
1299 BT_PUT(sequence_dst);
fc25abce 1300
87d43dc1 1301end:
8deee039 1302 return BT_TO_COMMON(sequence_dst);
87d43dc1
JG
1303}
1304
1305static
8deee039 1306struct bt_field_common *bt_field_string_copy(struct bt_field_common *src)
87d43dc1 1307{
8deee039
PP
1308 struct bt_field_common_string *string_src = BT_FROM_COMMON(src);
1309 struct bt_field_common_string *string_dst;
87d43dc1 1310
8deee039
PP
1311 BT_LOGD("Copying string field: src-field-addr=%p", src);
1312 string_dst = (void *) bt_field_create((void *) src->type);
1313 if (!string_dst) {
1314 goto error;
1315 }
87d43dc1
JG
1316
1317 if (string_src->payload) {
1318 string_dst->payload = g_string_new(string_src->payload->str);
1319 if (!string_dst->payload) {
fc25abce 1320 BT_LOGE_STR("Failed to allocate a GString.");
8deee039 1321 goto error;
87d43dc1
JG
1322 }
1323 }
fc25abce
PP
1324
1325 BT_LOGD_STR("Copied string field.");
8deee039 1326 goto end;
fc25abce 1327
8deee039
PP
1328error:
1329 BT_PUT(string_dst);
b3376dd9 1330
273b65be 1331end:
8deee039 1332 return BT_TO_COMMON(string_dst);
273b65be 1333}
918be005 1334
8deee039
PP
1335BT_HIDDEN
1336void bt_field_common_generic_freeze(struct bt_field_common *field)
918be005 1337{
a745c331 1338 field->frozen = true;
918be005
PP
1339}
1340
8deee039
PP
1341BT_HIDDEN
1342void bt_field_common_enumeration_freeze_recursive(struct bt_field_common *field)
918be005 1343{
8deee039 1344 struct bt_field_common_enumeration *enum_field = BT_FROM_COMMON(field);
918be005 1345
fc25abce
PP
1346 BT_LOGD("Freezing enumeration field object: addr=%p", field);
1347 BT_LOGD("Freezing enumeration field object's contained payload field: payload-field-addr=%p", enum_field->payload);
8deee039
PP
1348 bt_field_common_freeze_recursive(enum_field->payload);
1349 bt_field_common_generic_freeze(field);
918be005
PP
1350}
1351
8deee039
PP
1352BT_HIDDEN
1353void bt_field_common_structure_freeze_recursive(struct bt_field_common *field)
918be005 1354{
fc25abce 1355 int64_t i;
8deee039
PP
1356 struct bt_field_common_structure *structure_field =
1357 BT_FROM_COMMON(field);
918be005 1358
fc25abce
PP
1359 BT_LOGD("Freezing structure field object: addr=%p", field);
1360
918be005 1361 for (i = 0; i < structure_field->fields->len; i++) {
8deee039 1362 struct bt_field_common *field =
918be005
PP
1363 g_ptr_array_index(structure_field->fields, i);
1364
fc25abce
PP
1365 BT_LOGD("Freezing structure field's field: field-addr=%p, index=%" PRId64,
1366 field, i);
8deee039 1367 bt_field_common_freeze_recursive(field);
918be005
PP
1368 }
1369
8deee039 1370 bt_field_common_generic_freeze(field);
918be005
PP
1371}
1372
8deee039
PP
1373BT_HIDDEN
1374void bt_field_common_variant_freeze_recursive(struct bt_field_common *field)
918be005 1375{
8deee039 1376 struct bt_field_common_variant *variant_field = BT_FROM_COMMON(field);
918be005 1377
fc25abce
PP
1378 BT_LOGD("Freezing variant field object: addr=%p", field);
1379 BT_LOGD("Freezing variant field object's tag field: tag-field-addr=%p", variant_field->tag);
8deee039 1380 bt_field_common_freeze_recursive(variant_field->tag);
fc25abce 1381 BT_LOGD("Freezing variant field object's payload field: payload-field-addr=%p", variant_field->payload);
8deee039
PP
1382 bt_field_common_freeze_recursive(variant_field->payload);
1383 bt_field_common_generic_freeze(field);
918be005
PP
1384}
1385
8deee039
PP
1386BT_HIDDEN
1387void bt_field_common_array_freeze_recursive(struct bt_field_common *field)
918be005 1388{
fc25abce 1389 int64_t i;
8deee039 1390 struct bt_field_common_array *array_field = BT_FROM_COMMON(field);
918be005 1391
fc25abce
PP
1392 BT_LOGD("Freezing array field object: addr=%p", field);
1393
918be005 1394 for (i = 0; i < array_field->elements->len; i++) {
8deee039 1395 struct bt_field_common *elem_field =
918be005
PP
1396 g_ptr_array_index(array_field->elements, i);
1397
fc25abce
PP
1398 BT_LOGD("Freezing array field object's element field: "
1399 "element-field-addr=%p, index=%" PRId64,
1400 elem_field, i);
8deee039 1401 bt_field_common_freeze_recursive(elem_field);
918be005
PP
1402 }
1403
8deee039 1404 bt_field_common_generic_freeze(field);
918be005
PP
1405}
1406
8deee039
PP
1407BT_HIDDEN
1408void bt_field_common_sequence_freeze_recursive(struct bt_field_common *field)
918be005 1409{
fc25abce 1410 int64_t i;
8deee039
PP
1411 struct bt_field_common_sequence *sequence_field =
1412 BT_FROM_COMMON(field);
918be005 1413
fc25abce
PP
1414 BT_LOGD("Freezing sequence field object: addr=%p", field);
1415 BT_LOGD("Freezing sequence field object's length field: length-field-addr=%p",
1416 sequence_field->length);
8deee039 1417 bt_field_common_freeze_recursive(sequence_field->length);
918be005
PP
1418
1419 for (i = 0; i < sequence_field->elements->len; i++) {
8deee039 1420 struct bt_field_common *elem_field =
918be005
PP
1421 g_ptr_array_index(sequence_field->elements, i);
1422
fc25abce
PP
1423 BT_LOGD("Freezing sequence field object's element field: "
1424 "element-field-addr=%p, index=%" PRId64,
1425 elem_field, i);
8deee039 1426 bt_field_common_freeze_recursive(elem_field);
918be005
PP
1427 }
1428
8deee039 1429 bt_field_common_generic_freeze(field);
918be005
PP
1430}
1431
1432BT_HIDDEN
8deee039 1433void _bt_field_common_freeze_recursive(struct bt_field_common *field)
918be005
PP
1434{
1435 if (!field) {
1436 goto end;
1437 }
1438
fc25abce 1439 if (field->frozen) {
35f77de4
JG
1440 goto end;
1441 }
918be005 1442
fc25abce 1443 BT_LOGD("Freezing field object: addr=%p", field);
8deee039
PP
1444 BT_ASSERT(field_type_common_has_known_id(field->type));
1445 BT_ASSERT(field->methods->freeze);
1446 field->methods->freeze(field);
1447
918be005
PP
1448end:
1449 return;
1450}
76f869ab 1451
8deee039
PP
1452BT_HIDDEN
1453bt_bool bt_field_common_generic_is_set(struct bt_field_common *field)
76f869ab
JG
1454{
1455 return field && field->payload_set;
1456}
1457
8deee039
PP
1458BT_HIDDEN
1459bt_bool bt_field_common_enumeration_is_set_recursive(
1460 struct bt_field_common *field)
76f869ab 1461{
53d65c1d 1462 bt_bool is_set = BT_FALSE;
8deee039 1463 struct bt_field_common_enumeration *enumeration = BT_FROM_COMMON(field);
76f869ab 1464
8b45963b 1465 BT_ASSERT(field);
8deee039 1466
76f869ab
JG
1467 if (!enumeration->payload) {
1468 goto end;
1469 }
1470
8deee039
PP
1471 is_set = bt_field_common_is_set_recursive(enumeration->payload);
1472
76f869ab 1473end:
53d65c1d 1474 return is_set;
76f869ab
JG
1475}
1476
8deee039
PP
1477BT_HIDDEN
1478bt_bool bt_field_common_structure_is_set_recursive(
1479 struct bt_field_common *field)
76f869ab 1480{
53d65c1d 1481 bt_bool is_set = BT_FALSE;
76f869ab 1482 size_t i;
8deee039 1483 struct bt_field_common_structure *structure = BT_FROM_COMMON(field);
76f869ab 1484
8b45963b 1485 BT_ASSERT(field);
8deee039 1486
76f869ab 1487 for (i = 0; i < structure->fields->len; i++) {
8deee039 1488 is_set = bt_field_common_is_set_recursive(
ab706977 1489 structure->fields->pdata[i]);
53d65c1d 1490 if (!is_set) {
76f869ab
JG
1491 goto end;
1492 }
1493 }
8deee039 1494
76f869ab 1495end:
53d65c1d 1496 return is_set;
76f869ab
JG
1497}
1498
8deee039
PP
1499BT_HIDDEN
1500bt_bool bt_field_common_variant_is_set_recursive(struct bt_field_common *field)
76f869ab 1501{
8deee039 1502 struct bt_field_common_variant *variant = BT_FROM_COMMON(field);
76f869ab 1503
8b45963b 1504 BT_ASSERT(field);
8deee039 1505 return bt_field_common_is_set_recursive(variant->payload);
76f869ab
JG
1506}
1507
8deee039
PP
1508BT_HIDDEN
1509bt_bool bt_field_common_array_is_set_recursive(struct bt_field_common *field)
76f869ab
JG
1510{
1511 size_t i;
53d65c1d 1512 bt_bool is_set = BT_FALSE;
8deee039 1513 struct bt_field_common_array *array = BT_FROM_COMMON(field);
76f869ab 1514
8b45963b 1515 BT_ASSERT(field);
8deee039 1516
76f869ab 1517 for (i = 0; i < array->elements->len; i++) {
8deee039 1518 is_set = bt_field_common_is_set_recursive(array->elements->pdata[i]);
53d65c1d 1519 if (!is_set) {
76f869ab
JG
1520 goto end;
1521 }
1522 }
8deee039 1523
76f869ab 1524end:
53d65c1d 1525 return is_set;
76f869ab
JG
1526}
1527
8deee039
PP
1528BT_HIDDEN
1529bt_bool bt_field_common_sequence_is_set_recursive(struct bt_field_common *field)
76f869ab
JG
1530{
1531 size_t i;
53d65c1d 1532 bt_bool is_set = BT_FALSE;
8deee039 1533 struct bt_field_common_sequence *sequence = BT_FROM_COMMON(field);
76f869ab 1534
8b45963b 1535 BT_ASSERT(field);
8deee039 1536
7d7fae6d
JG
1537 if (!sequence->elements) {
1538 goto end;
1539 }
1540
76f869ab 1541 for (i = 0; i < sequence->elements->len; i++) {
8deee039
PP
1542 is_set = bt_field_common_is_set_recursive(
1543 sequence->elements->pdata[i]);
53d65c1d 1544 if (!is_set) {
76f869ab
JG
1545 goto end;
1546 }
1547 }
8deee039 1548
76f869ab 1549end:
53d65c1d 1550 return is_set;
76f869ab 1551}
This page took 0.140607 seconds and 4 git commands to generate.