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
3dca2276 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>
f6ccaed9 40#include <babeltrace/assert-internal.h>
fc25abce 41#include <inttypes.h>
273b65be 42
273b65be 43static
3dca2276 44struct bt_field_common *bt_field_integer_copy(struct bt_field_common *src);
273b65be
JG
45
46static
3dca2276
PP
47struct bt_field_common *bt_field_enumeration_copy_recursive(
48 struct bt_field_common *src);
273b65be
JG
49
50static
3dca2276
PP
51struct bt_field_common *bt_field_floating_point_copy(
52 struct bt_field_common *src);
273b65be 53
12c8a1a3 54static
3dca2276
PP
55struct bt_field_common *bt_field_structure_copy_recursive(
56 struct bt_field_common *src);
12c8a1a3 57
273b65be 58static
3dca2276
PP
59struct bt_field_common *bt_field_variant_copy_recursive(
60 struct bt_field_common *src);
273b65be 61
87d43dc1 62static
3dca2276
PP
63struct bt_field_common *bt_field_array_copy_recursive(
64 struct bt_field_common *src);
87d43dc1 65
918be005 66static
3dca2276
PP
67struct bt_field_common *bt_field_sequence_copy_recursive(
68 struct bt_field_common *src);
918be005 69
76f869ab 70static
3dca2276 71struct bt_field_common *bt_field_string_copy(struct bt_field_common *src);
76f869ab 72
3dca2276
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
3dca2276
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
3dca2276
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
3dca2276
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
3dca2276
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
3dca2276
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
3dca2276
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
3dca2276
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
3dca2276 138struct bt_field *bt_field_integer_create(struct bt_field_type *);
76f869ab 139
3dca2276
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 *);
f6ccaed9 154
3dca2276
PP
155static
156struct bt_field *bt_field_sequence_create(struct bt_field_type *);
f6ccaed9 157
3dca2276
PP
158static
159struct bt_field *bt_field_string_create(struct bt_field_type *);
f6ccaed9 160
3dca2276
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};
f6ccaed9 172
50842bdc 173struct bt_field *bt_field_create(struct bt_field_type *type)
273b65be 174{
50842bdc
PP
175 struct bt_field *field = NULL;
176 enum bt_field_type_id type_id;
273b65be 177
f6ccaed9 178 BT_ASSERT_PRE_NON_NULL(type, "Field type");
3dca2276
PP
179 BT_ASSERT(field_type_common_has_known_id((void *) type));
180 BT_ASSERT_PRE(bt_field_type_common_validate((void *) type) == 0,
f6ccaed9 181 "Field type is invalid: %!+F", type);
50842bdc 182 type_id = bt_field_type_get_type_id(type);
273b65be
JG
183 field = field_create_funcs[type_id](type);
184 if (!field) {
3dca2276 185 goto end;
273b65be
JG
186 }
187
50842bdc 188 bt_field_type_freeze(type);
273b65be 189
3dca2276
PP
190end:
191 return field;
273b65be
JG
192}
193
094ff7c0 194struct bt_field_type *bt_field_borrow_type(struct bt_field *field)
cd95e351 195{
094ff7c0 196 return (void *) bt_field_common_borrow_type((void *) field);
cd95e351
JG
197}
198
50842bdc 199enum bt_field_type_id bt_field_get_type_id(struct bt_field *field)
4ebcc695 200{
3dca2276
PP
201 struct bt_field_common *field_common = (void *) field;
202
f6ccaed9 203 BT_ASSERT_PRE_NON_NULL(field, "Field");
3dca2276 204 return field_common->type->id;
4ebcc695
PP
205}
206
50842bdc 207bt_bool bt_field_is_integer(struct bt_field *field)
8f3553be 208{
50842bdc 209 return bt_field_get_type_id(field) == BT_FIELD_TYPE_ID_INTEGER;
8f3553be
PP
210}
211
50842bdc 212bt_bool bt_field_is_floating_point(struct bt_field *field)
8f3553be 213{
50842bdc 214 return bt_field_get_type_id(field) == BT_FIELD_TYPE_ID_FLOAT;
8f3553be
PP
215}
216
50842bdc 217bt_bool bt_field_is_enumeration(struct bt_field *field)
8f3553be 218{
50842bdc 219 return bt_field_get_type_id(field) == BT_FIELD_TYPE_ID_ENUM;
8f3553be
PP
220}
221
50842bdc 222bt_bool bt_field_is_string(struct bt_field *field)
8f3553be 223{
50842bdc 224 return bt_field_get_type_id(field) == BT_FIELD_TYPE_ID_STRING;
8f3553be
PP
225}
226
50842bdc 227bt_bool bt_field_is_structure(struct bt_field *field)
8f3553be 228{
50842bdc 229 return bt_field_get_type_id(field) == BT_FIELD_TYPE_ID_STRUCT;
8f3553be
PP
230}
231
50842bdc 232bt_bool bt_field_is_array(struct bt_field *field)
8f3553be 233{
50842bdc 234 return bt_field_get_type_id(field) == BT_FIELD_TYPE_ID_ARRAY;
8f3553be
PP
235}
236
50842bdc 237bt_bool bt_field_is_sequence(struct bt_field *field)
8f3553be 238{
50842bdc 239 return bt_field_get_type_id(field) == BT_FIELD_TYPE_ID_SEQUENCE;
8f3553be
PP
240}
241
50842bdc 242bt_bool bt_field_is_variant(struct bt_field *field)
8f3553be 243{
50842bdc 244 return bt_field_get_type_id(field) == BT_FIELD_TYPE_ID_VARIANT;
8f3553be
PP
245}
246
2e8876d3
PP
247BT_HIDDEN
248int64_t bt_field_sequence_get_int_length(struct bt_field *field)
249{
3dca2276 250 return bt_field_common_sequence_get_int_length((void *) field);
2e8876d3
PP
251}
252
094ff7c0 253struct bt_field *bt_field_sequence_borrow_length(struct bt_field *field)
cd95e351 254{
094ff7c0 255 return (void *) bt_field_common_sequence_borrow_length((void *) field);
cd95e351
JG
256}
257
50842bdc
PP
258int bt_field_sequence_set_length(struct bt_field *field,
259 struct bt_field *length_field)
273b65be 260{
3dca2276
PP
261 return bt_field_common_sequence_set_length((void *) field,
262 (void *) length_field);
273b65be
JG
263}
264
094ff7c0 265struct bt_field *bt_field_structure_borrow_field_by_index(
50842bdc 266 struct bt_field *field, uint64_t index)
cd95e351 267{
094ff7c0 268 return (void *) bt_field_common_structure_borrow_field_by_index(
3dca2276 269 (void *) field, index);
f6ccaed9 270}
fc25abce 271
094ff7c0 272struct bt_field *bt_field_structure_borrow_field_by_name(
3dca2276 273 struct bt_field *field, const char *name)
f6ccaed9 274{
094ff7c0 275 return (void *) bt_field_common_structure_borrow_field_by_name(
3dca2276 276 (void *) field, name);
cd95e351
JG
277}
278
3dca2276
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{
3dca2276
PP
282 return bt_field_common_structure_set_field_by_name((void *) field,
283 name, (void *) value);
273b65be
JG
284}
285
094ff7c0 286struct bt_field *bt_field_array_borrow_field(
3dca2276 287 struct bt_field *field, uint64_t index)
273b65be 288{
094ff7c0
PP
289 return (void *) bt_field_common_array_borrow_field((void *) field,
290 index, (bt_field_common_create_func) bt_field_create);
3dca2276 291}
f6ccaed9 292
094ff7c0 293struct bt_field *bt_field_sequence_borrow_field(
3dca2276
PP
294 struct bt_field *field, uint64_t index)
295{
094ff7c0 296 return (void *) bt_field_common_sequence_borrow_field((void *) field,
3dca2276 297 index, (bt_field_common_create_func) bt_field_create);
273b65be
JG
298}
299
094ff7c0 300struct bt_field *bt_field_variant_borrow_field(struct bt_field *field,
50842bdc 301 struct bt_field *tag_field)
273b65be 302{
094ff7c0 303 return (void *) bt_field_common_variant_borrow_field((void *) field,
3dca2276
PP
304 (void *) tag_field,
305 (bt_field_common_create_func) bt_field_create);
273b65be
JG
306}
307
094ff7c0 308struct bt_field *bt_field_variant_borrow_current_field(
50842bdc 309 struct bt_field *variant_field)
3f4a108d 310{
094ff7c0 311 return (void *) bt_field_common_variant_borrow_current_field(
3dca2276 312 (void *) variant_field);
3f4a108d
PP
313}
314
094ff7c0 315struct bt_field_common *bt_field_variant_borrow_tag(
3dca2276 316 struct bt_field_common *variant_field)
f78d67fb 317{
094ff7c0
PP
318 return (void *) bt_field_common_variant_borrow_tag(
319 (void *) variant_field);
f78d67fb
JG
320}
321
094ff7c0 322struct bt_field *bt_field_enumeration_borrow_container(struct bt_field *field)
273b65be 323{
094ff7c0 324 return (void *) bt_field_common_enumeration_borrow_container(
3dca2276 325 (void *) field, (bt_field_common_create_func) bt_field_create);
273b65be
JG
326}
327
50842bdc
PP
328struct bt_field_type_enumeration_mapping_iterator *
329bt_field_enumeration_get_mappings(struct bt_field *field)
cd95e351 330{
3dca2276
PP
331 return bt_field_common_enumeration_get_mappings((void *) field,
332 (bt_field_common_create_func) bt_field_create);
cd95e351
JG
333}
334
3dca2276 335int bt_field_integer_signed_get_value(struct bt_field *field, int64_t *value)
cd95e351 336{
3dca2276 337 return bt_field_common_integer_signed_get_value((void *) field, value);
cd95e351
JG
338}
339
3dca2276
PP
340int bt_field_integer_signed_set_value(struct bt_field *field,
341 int64_t value)
273b65be 342{
3dca2276 343 return bt_field_common_integer_signed_set_value((void *) field, value);
273b65be
JG
344}
345
3dca2276
PP
346int bt_field_integer_unsigned_get_value(struct bt_field *field,
347 uint64_t *value)
cd95e351 348{
3dca2276
PP
349 return bt_field_common_integer_unsigned_get_value((void *) field,
350 value);
cd95e351
JG
351}
352
3dca2276 353int bt_field_integer_unsigned_set_value(struct bt_field *field, uint64_t value)
273b65be 354{
3dca2276 355 return bt_field_common_integer_unsigned_set_value((void *) field, value);
f6ccaed9
PP
356}
357
3dca2276
PP
358int bt_field_floating_point_get_value(struct bt_field *field,
359 double *value)
f6ccaed9 360{
3dca2276 361 return bt_field_common_floating_point_get_value((void *) field, value);
273b65be
JG
362}
363
3dca2276
PP
364int bt_field_floating_point_set_value(struct bt_field *field,
365 double value)
cd95e351 366{
3dca2276 367 return bt_field_common_floating_point_set_value((void *) field, value);
f6ccaed9 368}
fc25abce 369
3dca2276 370const char *bt_field_string_get_value(struct bt_field *field)
f6ccaed9 371{
3dca2276 372 return bt_field_common_string_get_value((void *) field);
cd95e351
JG
373}
374
3dca2276 375int bt_field_string_set_value(struct bt_field *field, const char *value)
273b65be 376{
3dca2276 377 return bt_field_common_string_set_value((void *) field, value);
273b65be
JG
378}
379
3dca2276 380int bt_field_string_append(struct bt_field *field, const char *value)
cd95e351 381{
3dca2276 382 return bt_field_common_string_append((void *) field, value);
cd95e351
JG
383}
384
3dca2276
PP
385int bt_field_string_append_len(struct bt_field *field,
386 const char *value, unsigned int length)
273b65be 387{
3dca2276 388 return bt_field_common_string_append_len((void *) field, value, length);
273b65be
JG
389}
390
3dca2276
PP
391BT_HIDDEN
392struct bt_field_common *bt_field_common_copy(struct bt_field_common *field)
c6f9c5a3 393{
3dca2276 394 struct bt_field_common *copy = NULL;
c6f9c5a3 395
3dca2276
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
3dca2276
PP
405 bt_field_common_set(copy, field->payload_set);
406
407end:
408 return copy;
c6f9c5a3
PP
409}
410
3dca2276 411struct bt_field *bt_field_copy(struct bt_field *field)
f98c6554 412{
3dca2276
PP
413 return (void *) bt_field_common_copy((void *) field);
414}
f98c6554 415
3dca2276
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
3dca2276
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
3dca2276
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
3dca2276 435void bt_field_common_enumeration_destroy_recursive(struct bt_object *obj)
273b65be 436{
3dca2276 437 struct bt_field_common_enumeration *enumeration = (void *) obj;
273b65be 438
3dca2276
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
3dca2276
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;
f6ccaed9 451
3dca2276
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
f6ccaed9 458BT_HIDDEN
3dca2276
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);
f6ccaed9 468}
12c8a1a3 469
f6ccaed9 470BT_HIDDEN
3dca2276 471void bt_field_common_variant_destroy_recursive(struct bt_object *obj)
f6ccaed9 472{
3dca2276
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
3dca2276 486void bt_field_common_array_destroy_recursive(struct bt_object *obj)
273b65be 487{
3dca2276 488 struct bt_field_common_array *array = (void *) obj;
273b65be 489
3dca2276
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
f6ccaed9 497BT_HIDDEN
3dca2276 498void bt_field_common_sequence_destroy_recursive(struct bt_object *obj)
76f869ab 499{
3dca2276 500 struct bt_field_common_sequence *sequence = (void *) obj;
76f869ab 501
3dca2276
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
3dca2276
PP
506 if (sequence->elements) {
507 g_ptr_array_free(sequence->elements, TRUE);
508 }
f6ccaed9 509
3dca2276
PP
510 BT_LOGD_STR("Putting length field.");
511 bt_put(sequence->length);
512 g_free(sequence);
76f869ab
JG
513}
514
3dca2276
PP
515BT_HIDDEN
516void bt_field_common_string_destroy(struct bt_object *obj)
87d43dc1 517{
3dca2276 518 struct bt_field_common_string *string = (void *) obj;
87d43dc1 519
3dca2276
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
3dca2276
PP
524 if (string->payload) {
525 g_string_free(string->payload, TRUE);
87d43dc1 526 }
f6ccaed9 527
3dca2276 528 g_free(string);
87d43dc1
JG
529}
530
273b65be 531static
50842bdc 532struct bt_field *bt_field_integer_create(struct bt_field_type *type)
273b65be 533{
3dca2276
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) {
3dca2276
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",
3dca2276 544 integer, type);
fc25abce
PP
545 } else {
546 BT_LOGE_STR("Failed to allocate one integer field.");
547 }
548
3dca2276 549 return (void *) integer;
273b65be
JG
550}
551
552static
3dca2276 553struct bt_field *bt_field_enumeration_create(struct bt_field_type *type)
273b65be 554{
3dca2276
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) {
3dca2276
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",
3dca2276 566 enumeration, type);
fc25abce
PP
567 } else {
568 BT_LOGE_STR("Failed to allocate one enumeration field.");
569 }
570
3dca2276 571 return (void *) enumeration;
273b65be
JG
572}
573
574static
3dca2276 575struct bt_field *bt_field_floating_point_create(struct bt_field_type *type)
273b65be 576{
3dca2276 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);
3dca2276 580 floating_point = g_new0(struct bt_field_common_floating_point, 1);
fc25abce
PP
581
582 if (floating_point) {
3dca2276
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",
3dca2276 588 floating_point, type);
fc25abce
PP
589 } else {
590 BT_LOGE_STR("Failed to allocate one floating point number field.");
591 }
592
3dca2276 593 return (void *) floating_point;
273b65be
JG
594}
595
3dca2276
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);
c58b9c62 607 size_t i;
273b65be 608
3dca2276
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(
50842bdc 612 (GDestroyNotify) bt_put);
3dca2276 613 g_ptr_array_set_size(structure->fields, structure_type->fields->len);
c58b9c62
JG
614
615 /* Create all fields contained by the structure field. */
616 for (i = 0; i < structure_type->fields->len; i++) {
3dca2276
PP
617 struct bt_field_common *field;
618 struct structure_field_common *struct_field =
c58b9c62
JG
619 g_ptr_array_index(structure_type->fields, i);
620
3dca2276 621 field = field_create_func(struct_field->type);
c58b9c62
JG
622 if (!field) {
623 BT_LOGE("Failed to create structure field's member: name=\"%s\", index=%zu",
3dca2276
PP
624 g_quark_to_string(struct_field->name), i);
625 ret = -1;
c58b9c62
JG
626 goto end;
627 }
628
629 g_ptr_array_index(structure->fields, i) = field;
630 }
631
3dca2276
PP
632 BT_LOGD("Initialized common structure field object: addr=%p, ft-addr=%p",
633 field, type);
634
273b65be 635end:
c58b9c62 636 return ret;
273b65be
JG
637}
638
3dca2276
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
50842bdc 670struct bt_field *bt_field_variant_create(struct bt_field_type *type)
273b65be 671{
3dca2276
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) {
3dca2276
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",
3dca2276 683 variant, type);
fc25abce
PP
684 } else {
685 BT_LOGE_STR("Failed to allocate one variant field.");
686 }
687
3dca2276 688 return (void *) variant;
273b65be
JG
689}
690
3dca2276
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{
3dca2276
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;
3dca2276 700 int ret = 0;
273b65be 701
3dca2276 702 BT_LOGD("Initializing common array field object: ft-addr=%p", type);
f6ccaed9 703 BT_ASSERT(type);
3dca2276 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) {
3dca2276
PP
708 ret = -1;
709 goto end;
273b65be
JG
710 }
711
3dca2276 712 g_ptr_array_set_free_func(array->elements, (GDestroyNotify) bt_put);
273b65be 713 g_ptr_array_set_size(array->elements, array_length);
3dca2276
PP
714 BT_LOGD("Initialized common array field object: addr=%p, ft-addr=%p",
715 field, type);
273b65be 716
3dca2276
PP
717end:
718 return ret;
273b65be
JG
719}
720
721static
3dca2276 722struct bt_field *bt_field_array_create(struct bt_field_type *type)
273b65be 723{
3dca2276
PP
724 struct bt_field_common_array *array =
725 g_new0(struct bt_field_common_array, 1);
726 int ret;
fc25abce 727
3dca2276
PP
728 BT_LOGD("Creating array field object: ft-addr=%p", type);
729 BT_ASSERT(type);
fc25abce 730
3dca2276
PP
731 if (!array) {
732 BT_LOGE_STR("Failed to allocate one array field.");
733 goto end;
fc25abce
PP
734 }
735
3dca2276
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
3dca2276
PP
745 BT_LOGD("Created array field object: addr=%p, ft-addr=%p",
746 array, type);
273b65be 747
3dca2276
PP
748end:
749 return (void *) array;
273b65be
JG
750}
751
752static
3dca2276 753struct bt_field *bt_field_sequence_create(struct bt_field_type *type)
273b65be 754{
3dca2276
PP
755 struct bt_field_common_sequence *sequence = g_new0(
756 struct bt_field_common_sequence, 1);
273b65be 757
3dca2276 758 BT_LOGD("Creating sequence field object: ft-addr=%p", type);
273b65be 759
3dca2276
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 }
3dca2276
PP
770
771 return (void *) sequence;
273b65be
JG
772}
773
774static
3dca2276 775struct bt_field *bt_field_string_create(struct bt_field_type *type)
273b65be 776{
3dca2276
PP
777 struct bt_field_common_string *string = g_new0(
778 struct bt_field_common_string, 1);
fc25abce 779
3dca2276
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 }
3dca2276
PP
792
793 return (void *) string;
273b65be
JG
794}
795
3dca2276
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
3dca2276
PP
802BT_HIDDEN
803int bt_field_common_enumeration_validate_recursive(
804 struct bt_field_common *field)
273b65be
JG
805{
806 int ret;
3dca2276 807 struct bt_field_common_enumeration *enumeration = BT_FROM_COMMON(field);
273b65be 808
f6ccaed9 809 BT_ASSERT(field);
3dca2276 810
273b65be 811 if (!enumeration->payload) {
f6ccaed9 812 BT_ASSERT_PRE_MSG("Invalid enumeration field: payload is not set: "
3dca2276 813 "%!+_f", field);
273b65be
JG
814 ret = -1;
815 goto end;
816 }
817
3dca2276 818 ret = bt_field_common_validate_recursive(enumeration->payload);
f6ccaed9 819
273b65be
JG
820end:
821 return ret;
822}
823
3dca2276
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;
3dca2276 829 struct bt_field_common_structure *structure = BT_FROM_COMMON(field);
273b65be 830
f6ccaed9 831 BT_ASSERT(field);
f6ccaed9 832
273b65be 833 for (i = 0; i < structure->fields->len; i++) {
3dca2276 834 ret = bt_field_common_validate_recursive(
f6ccaed9 835 (void *) structure->fields->pdata[i]);
fc25abce 836
273b65be 837 if (ret) {
fc25abce 838 int this_ret;
6ce12048 839 const char *name;
6ce12048 840
094ff7c0 841 this_ret = bt_field_type_common_structure_borrow_field_by_index(
f6ccaed9
PP
842 field->type, &name, NULL, i);
843 BT_ASSERT(this_ret == 0);
844 BT_ASSERT_PRE_MSG("Invalid structure field's field: "
3dca2276
PP
845 "%![struct-field-]+_f, field-name=\"%s\", "
846 "index=%" PRId64 ", %![field-]+_f",
f6ccaed9 847 field, name, i, structure->fields->pdata[i]);
273b65be
JG
848 goto end;
849 }
850 }
f6ccaed9 851
273b65be
JG
852end:
853 return ret;
854}
855
3dca2276
PP
856BT_HIDDEN
857int bt_field_common_variant_validate_recursive(struct bt_field_common *field)
273b65be
JG
858{
859 int ret = 0;
3dca2276 860 struct bt_field_common_variant *variant = BT_FROM_COMMON(field);
273b65be 861
f6ccaed9 862 BT_ASSERT(field);
3dca2276 863 ret = bt_field_common_validate_recursive(variant->payload);
fc25abce 864 if (ret) {
f6ccaed9 865 BT_ASSERT_PRE_MSG("Invalid variant field's payload field: "
3dca2276 866 "%![variant-field-]+_f, %![payload-field-]+_f",
fc25abce
PP
867 field, variant->payload);
868 }
f6ccaed9 869
273b65be
JG
870 return ret;
871}
872
3dca2276
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;
3dca2276 878 struct bt_field_common_array *array = BT_FROM_COMMON(field);
273b65be 879
f6ccaed9 880 BT_ASSERT(field);
3dca2276 881
273b65be 882 for (i = 0; i < array->elements->len; i++) {
3dca2276 883 ret = bt_field_common_validate_recursive((void *) array->elements->pdata[i]);
273b65be 884 if (ret) {
f6ccaed9 885 BT_ASSERT_PRE_MSG("Invalid array field's element field: "
3dca2276
PP
886 "%![array-field-]+_f, " PRId64 ", "
887 "%![elem-field-]+_f",
f6ccaed9 888 field, i, array->elements->pdata[i]);
273b65be
JG
889 goto end;
890 }
891 }
f6ccaed9 892
273b65be
JG
893end:
894 return ret;
895}
896
3dca2276
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;
3dca2276 902 struct bt_field_common_sequence *sequence = BT_FROM_COMMON(field);
273b65be 903
f6ccaed9 904 BT_ASSERT(field);
3dca2276 905
273b65be 906 for (i = 0; i < sequence->elements->len; i++) {
3dca2276 907 ret = bt_field_common_validate_recursive(
f6ccaed9 908 (void *) sequence->elements->pdata[i]);
273b65be 909 if (ret) {
f6ccaed9 910 BT_ASSERT_PRE_MSG("Invalid sequence field's element field: "
3dca2276
PP
911 "%![seq-field-]+_f, " PRId64 ", "
912 "%![elem-field-]+_f",
f6ccaed9 913 field, i, sequence->elements->pdata[i]);
273b65be
JG
914 goto end;
915 }
916 }
917end:
918 return ret;
919}
920
3dca2276
PP
921BT_HIDDEN
922void bt_field_common_generic_reset(struct bt_field_common *field)
12c8a1a3 923{
f6ccaed9 924 BT_ASSERT(field);
d990a4fb 925 field->payload_set = false;
12c8a1a3
JG
926}
927
3dca2276
PP
928BT_HIDDEN
929void bt_field_common_enumeration_reset_recursive(struct bt_field_common *field)
12c8a1a3 930{
3dca2276 931 struct bt_field_common_enumeration *enumeration = BT_FROM_COMMON(field);
12c8a1a3 932
f6ccaed9 933 BT_ASSERT(field);
3dca2276 934
12c8a1a3 935 if (!enumeration->payload) {
f6ccaed9 936 return;
12c8a1a3
JG
937 }
938
3dca2276 939 bt_field_common_reset_recursive(enumeration->payload);
12c8a1a3
JG
940}
941
3dca2276
PP
942BT_HIDDEN
943void bt_field_common_structure_reset_recursive(struct bt_field_common *field)
12c8a1a3 944{
fc25abce 945 int64_t i;
3dca2276 946 struct bt_field_common_structure *structure = BT_FROM_COMMON(field);
12c8a1a3 947
f6ccaed9 948 BT_ASSERT(field);
f6ccaed9 949
12c8a1a3 950 for (i = 0; i < structure->fields->len; i++) {
3dca2276 951 struct bt_field_common *member = structure->fields->pdata[i];
12c8a1a3
JG
952
953 if (!member) {
954 /*
f6ccaed9
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
3dca2276 962 bt_field_common_reset_recursive(member);
12c8a1a3 963 }
12c8a1a3
JG
964}
965
3dca2276
PP
966BT_HIDDEN
967void bt_field_common_variant_reset_recursive(struct bt_field_common *field)
12c8a1a3 968{
3dca2276 969 struct bt_field_common_variant *variant = BT_FROM_COMMON(field);
12c8a1a3 970
f6ccaed9 971 BT_ASSERT(field);
6ead1648
JG
972 BT_PUT(variant->tag);
973 BT_PUT(variant->payload);
12c8a1a3
JG
974}
975
3dca2276
PP
976BT_HIDDEN
977void bt_field_common_array_reset_recursive(struct bt_field_common *field)
12c8a1a3
JG
978{
979 size_t i;
3dca2276 980 struct bt_field_common_array *array = BT_FROM_COMMON(field);
12c8a1a3 981
f6ccaed9 982 BT_ASSERT(field);
f6ccaed9 983
12c8a1a3 984 for (i = 0; i < array->elements->len; i++) {
3dca2276 985 struct bt_field_common *member = array->elements->pdata[i];
12c8a1a3
JG
986
987 if (!member) {
988 /*
f6ccaed9
PP
989 * Array elements are lazily initialized; skip
990 * if this member has not been allocated yet.
12c8a1a3
JG
991 */
992 continue;
993 }
994
3dca2276 995 bt_field_common_reset_recursive(member);
12c8a1a3 996 }
12c8a1a3
JG
997}
998
3dca2276
PP
999BT_HIDDEN
1000void bt_field_common_sequence_reset_recursive(struct bt_field_common *field)
12c8a1a3 1001{
3dca2276 1002 struct bt_field_common_sequence *sequence = BT_FROM_COMMON(field);
12c8a1a3 1003
f6ccaed9 1004 BT_ASSERT(field);
f6ccaed9 1005
6ead1648
JG
1006 if (sequence->elements) {
1007 g_ptr_array_free(sequence->elements, TRUE);
1008 sequence->elements = NULL;
12c8a1a3 1009 }
f6ccaed9 1010
6ead1648 1011 BT_PUT(sequence->length);
12c8a1a3
JG
1012}
1013
3dca2276
PP
1014BT_HIDDEN
1015void bt_field_common_string_reset(struct bt_field_common *field)
12c8a1a3 1016{
3dca2276 1017 struct bt_field_common_string *string = BT_FROM_COMMON(field);
12c8a1a3 1018
f6ccaed9 1019 BT_ASSERT(field);
3dca2276
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
3dca2276 1028struct bt_field_common *bt_field_integer_copy(struct bt_field_common *src)
273b65be 1029{
3dca2276
PP
1030 struct bt_field_common_integer *integer_src = (void *) src;
1031 struct bt_field_common_integer *integer_dst;
273b65be 1032
3dca2276
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
3dca2276
PP
1039 integer_dst->payload = integer_src->payload;
1040 BT_LOGD_STR("Copied integer field.");
f6ccaed9 1041
273b65be 1042end:
3dca2276 1043 return BT_TO_COMMON(integer_dst);
273b65be
JG
1044}
1045
1046static
3dca2276
PP
1047struct bt_field_common *bt_field_enumeration_copy_recursive(
1048 struct bt_field_common *src)
273b65be 1049{
3dca2276
PP
1050 struct bt_field_common_enumeration *enum_src = BT_FROM_COMMON(src);
1051 struct bt_field_common_enumeration *enum_dst;
273b65be 1052
3dca2276
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 }
f6ccaed9 1058
87d43dc1 1059 if (enum_src->payload) {
fc25abce 1060 BT_LOGD_STR("Copying enumeration field's payload field.");
3dca2276
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.");
3dca2276 1065 goto error;
87d43dc1
JG
1066 }
1067 }
fc25abce
PP
1068
1069 BT_LOGD_STR("Copied enumeration field.");
3dca2276
PP
1070 goto end;
1071
1072error:
1073 BT_PUT(enum_dst);
1074
87d43dc1 1075end:
3dca2276 1076 return BT_TO_COMMON(enum_dst);
87d43dc1
JG
1077}
1078
1079static
3dca2276
PP
1080struct bt_field_common *bt_field_floating_point_copy(
1081 struct bt_field_common *src)
87d43dc1 1082{
3dca2276
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.");
3dca2276
PP
1094
1095end:
1096 return BT_TO_COMMON(float_dst);
87d43dc1
JG
1097}
1098
1099static
3dca2276
PP
1100struct bt_field_common *bt_field_structure_copy_recursive(
1101 struct bt_field_common *src)
87d43dc1 1102{
fc25abce 1103 int64_t i;
3dca2276
PP
1104 struct bt_field_common_structure *struct_src = BT_FROM_COMMON(src);
1105 struct bt_field_common_structure *struct_dst;
87d43dc1 1106
3dca2276
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++) {
3dca2276 1116 struct bt_field_common *field =
50fd95bf 1117 g_ptr_array_index(struct_src->fields, i);
3dca2276 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);
3dca2276 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);
3dca2276 1128 goto error;
50fd95bf 1129 }
87d43dc1 1130 }
50fd95bf 1131
c58b9c62 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.");
3dca2276
PP
1136 goto end;
1137
1138error:
1139 BT_PUT(struct_dst);
fc25abce 1140
87d43dc1 1141end:
3dca2276 1142 return BT_TO_COMMON(struct_dst);
87d43dc1
JG
1143}
1144
1145static
3dca2276
PP
1146struct bt_field_common *bt_field_variant_copy_recursive(
1147 struct bt_field_common *src)
87d43dc1 1148{
3dca2276
PP
1149 struct bt_field_common_variant *variant_src = BT_FROM_COMMON(src);
1150 struct bt_field_common_variant *variant_dst;
87d43dc1 1151
3dca2276
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.");
3dca2276
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.");
3dca2276 1164 goto error;
87d43dc1
JG
1165 }
1166 }
1167 if (variant_src->payload) {
fc25abce 1168 BT_LOGD_STR("Copying variant field's payload field.");
3dca2276
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.");
3dca2276 1173 goto error;
87d43dc1
JG
1174 }
1175 }
fc25abce
PP
1176
1177 BT_LOGD_STR("Copied variant field.");
3dca2276
PP
1178 goto end;
1179
1180error:
1181 BT_PUT(variant_dst);
fc25abce 1182
87d43dc1 1183end:
3dca2276 1184 return BT_TO_COMMON(variant_dst);
87d43dc1
JG
1185}
1186
1187static
3dca2276
PP
1188struct bt_field_common *bt_field_array_copy_recursive(
1189 struct bt_field_common *src)
87d43dc1 1190{
fc25abce 1191 int64_t i;
3dca2276
PP
1192 struct bt_field_common_array *array_src = BT_FROM_COMMON(src);
1193 struct bt_field_common_array *array_dst;
87d43dc1 1194
3dca2276
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++) {
3dca2276 1203 struct bt_field_common *field =
50fd95bf 1204 g_ptr_array_index(array_src->elements, i);
3dca2276 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);
3dca2276 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);
3dca2276 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.");
3dca2276
PP
1223 goto end;
1224
1225error:
1226 BT_PUT(array_dst);
fc25abce 1227
87d43dc1 1228end:
3dca2276 1229 return BT_TO_COMMON(array_dst);
87d43dc1
JG
1230}
1231
1232static
3dca2276
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;
3dca2276
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
094ff7c0 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.");
3dca2276 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.");
3dca2276 1260 goto error;
59ab494d
PP
1261 }
1262
1263 /* this will initialize the destination sequence's internal array */
3dca2276
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);
3dca2276 1270 goto error;
59ab494d
PP
1271 }
1272
f6ccaed9 1273 BT_ASSERT(sequence_dst->elements->len == sequence_src->elements->len);
59ab494d 1274
87d43dc1 1275 for (i = 0; i < sequence_src->elements->len; i++) {
3dca2276 1276 struct bt_field_common *field =
50fd95bf 1277 g_ptr_array_index(sequence_src->elements, i);
3dca2276 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);
3dca2276 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);
3dca2276 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.");
3dca2276
PP
1296 goto end;
1297
1298error:
1299 BT_PUT(sequence_dst);
fc25abce 1300
87d43dc1 1301end:
3dca2276 1302 return BT_TO_COMMON(sequence_dst);
87d43dc1
JG
1303}
1304
1305static
3dca2276 1306struct bt_field_common *bt_field_string_copy(struct bt_field_common *src)
87d43dc1 1307{
3dca2276
PP
1308 struct bt_field_common_string *string_src = BT_FROM_COMMON(src);
1309 struct bt_field_common_string *string_dst;
87d43dc1 1310
3dca2276
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.");
3dca2276 1321 goto error;
87d43dc1
JG
1322 }
1323 }
fc25abce
PP
1324
1325 BT_LOGD_STR("Copied string field.");
3dca2276 1326 goto end;
fc25abce 1327
3dca2276
PP
1328error:
1329 BT_PUT(string_dst);
b3376dd9 1330
273b65be 1331end:
3dca2276 1332 return BT_TO_COMMON(string_dst);
273b65be 1333}
918be005 1334
3dca2276
PP
1335BT_HIDDEN
1336void bt_field_common_generic_freeze(struct bt_field_common *field)
918be005 1337{
d990a4fb 1338 field->frozen = true;
918be005
PP
1339}
1340
3dca2276
PP
1341BT_HIDDEN
1342void bt_field_common_enumeration_freeze_recursive(struct bt_field_common *field)
918be005 1343{
3dca2276 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);
3dca2276
PP
1348 bt_field_common_freeze_recursive(enum_field->payload);
1349 bt_field_common_generic_freeze(field);
918be005
PP
1350}
1351
3dca2276
PP
1352BT_HIDDEN
1353void bt_field_common_structure_freeze_recursive(struct bt_field_common *field)
918be005 1354{
fc25abce 1355 int64_t i;
3dca2276
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++) {
3dca2276 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);
3dca2276 1367 bt_field_common_freeze_recursive(field);
918be005
PP
1368 }
1369
3dca2276 1370 bt_field_common_generic_freeze(field);
918be005
PP
1371}
1372
3dca2276
PP
1373BT_HIDDEN
1374void bt_field_common_variant_freeze_recursive(struct bt_field_common *field)
918be005 1375{
3dca2276 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);
3dca2276 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);
3dca2276
PP
1382 bt_field_common_freeze_recursive(variant_field->payload);
1383 bt_field_common_generic_freeze(field);
918be005
PP
1384}
1385
3dca2276
PP
1386BT_HIDDEN
1387void bt_field_common_array_freeze_recursive(struct bt_field_common *field)
918be005 1388{
fc25abce 1389 int64_t i;
3dca2276 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++) {
3dca2276 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);
3dca2276 1401 bt_field_common_freeze_recursive(elem_field);
918be005
PP
1402 }
1403
3dca2276 1404 bt_field_common_generic_freeze(field);
918be005
PP
1405}
1406
3dca2276
PP
1407BT_HIDDEN
1408void bt_field_common_sequence_freeze_recursive(struct bt_field_common *field)
918be005 1409{
fc25abce 1410 int64_t i;
3dca2276
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);
3dca2276 1417 bt_field_common_freeze_recursive(sequence_field->length);
918be005
PP
1418
1419 for (i = 0; i < sequence_field->elements->len; i++) {
3dca2276 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);
3dca2276 1426 bt_field_common_freeze_recursive(elem_field);
918be005
PP
1427 }
1428
3dca2276 1429 bt_field_common_generic_freeze(field);
918be005
PP
1430}
1431
1432BT_HIDDEN
3dca2276 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);
3dca2276
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
3dca2276
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
3dca2276
PP
1458BT_HIDDEN
1459bt_bool bt_field_common_enumeration_is_set_recursive(
1460 struct bt_field_common *field)
76f869ab 1461{
d4bf905a 1462 bt_bool is_set = BT_FALSE;
3dca2276 1463 struct bt_field_common_enumeration *enumeration = BT_FROM_COMMON(field);
76f869ab 1464
f6ccaed9 1465 BT_ASSERT(field);
3dca2276 1466
76f869ab
JG
1467 if (!enumeration->payload) {
1468 goto end;
1469 }
1470
3dca2276
PP
1471 is_set = bt_field_common_is_set_recursive(enumeration->payload);
1472
76f869ab 1473end:
d4bf905a 1474 return is_set;
76f869ab
JG
1475}
1476
3dca2276
PP
1477BT_HIDDEN
1478bt_bool bt_field_common_structure_is_set_recursive(
1479 struct bt_field_common *field)
76f869ab 1480{
d4bf905a 1481 bt_bool is_set = BT_FALSE;
76f869ab 1482 size_t i;
3dca2276 1483 struct bt_field_common_structure *structure = BT_FROM_COMMON(field);
76f869ab 1484
f6ccaed9 1485 BT_ASSERT(field);
3dca2276 1486
76f869ab 1487 for (i = 0; i < structure->fields->len; i++) {
3dca2276 1488 is_set = bt_field_common_is_set_recursive(
f1367c62 1489 structure->fields->pdata[i]);
d4bf905a 1490 if (!is_set) {
76f869ab
JG
1491 goto end;
1492 }
1493 }
3dca2276 1494
76f869ab 1495end:
d4bf905a 1496 return is_set;
76f869ab
JG
1497}
1498
3dca2276
PP
1499BT_HIDDEN
1500bt_bool bt_field_common_variant_is_set_recursive(struct bt_field_common *field)
76f869ab 1501{
3dca2276 1502 struct bt_field_common_variant *variant = BT_FROM_COMMON(field);
76f869ab 1503
f6ccaed9 1504 BT_ASSERT(field);
3dca2276 1505 return bt_field_common_is_set_recursive(variant->payload);
76f869ab
JG
1506}
1507
3dca2276
PP
1508BT_HIDDEN
1509bt_bool bt_field_common_array_is_set_recursive(struct bt_field_common *field)
76f869ab
JG
1510{
1511 size_t i;
d4bf905a 1512 bt_bool is_set = BT_FALSE;
3dca2276 1513 struct bt_field_common_array *array = BT_FROM_COMMON(field);
76f869ab 1514
f6ccaed9 1515 BT_ASSERT(field);
3dca2276 1516
76f869ab 1517 for (i = 0; i < array->elements->len; i++) {
3dca2276 1518 is_set = bt_field_common_is_set_recursive(array->elements->pdata[i]);
d4bf905a 1519 if (!is_set) {
76f869ab
JG
1520 goto end;
1521 }
1522 }
3dca2276 1523
76f869ab 1524end:
d4bf905a 1525 return is_set;
76f869ab
JG
1526}
1527
3dca2276
PP
1528BT_HIDDEN
1529bt_bool bt_field_common_sequence_is_set_recursive(struct bt_field_common *field)
76f869ab
JG
1530{
1531 size_t i;
d4bf905a 1532 bt_bool is_set = BT_FALSE;
3dca2276 1533 struct bt_field_common_sequence *sequence = BT_FROM_COMMON(field);
76f869ab 1534
f6ccaed9 1535 BT_ASSERT(field);
3dca2276 1536
6ead1648
JG
1537 if (!sequence->elements) {
1538 goto end;
1539 }
1540
76f869ab 1541 for (i = 0; i < sequence->elements->len; i++) {
3dca2276
PP
1542 is_set = bt_field_common_is_set_recursive(
1543 sequence->elements->pdata[i]);
d4bf905a 1544 if (!is_set) {
76f869ab
JG
1545 goto end;
1546 }
1547 }
3dca2276 1548
76f869ab 1549end:
d4bf905a 1550 return is_set;
76f869ab 1551}
This page took 0.143579 seconds and 4 git commands to generate.