static int json_transform_one(sd_bus_message *m, JsonVariant **ret);
-static int json_transform_array_or_struct(sd_bus_message *m, JsonVariant **ret) {
- JsonVariant **elements = NULL;
- size_t n_elements = 0;
+static int json_transform_and_append(sd_bus_message *m, JsonVariant **ret) {
+ _cleanup_(json_variant_unrefp) JsonVariant *element = NULL;
int r;
assert(m);
assert(ret);
- CLEANUP_ARRAY(elements, n_elements, json_variant_unref_many);
+ r = json_transform_one(m, &element);
+ if (r < 0)
+ return r;
+
+ return json_variant_append_array(ret, element);
+}
+
+static int json_transform_array_or_struct(sd_bus_message *m, JsonVariant **ret) {
+ _cleanup_(json_variant_unrefp) JsonVariant *array = NULL;
+ int r;
+
+ assert(m);
+ assert(ret);
for (;;) {
r = sd_bus_message_at_end(m, false);
if (r > 0)
break;
- if (!GREEDY_REALLOC(elements, n_elements + 1))
- return log_oom();
-
- r = json_transform_one(m, elements + n_elements);
+ r = json_transform_and_append(m, &array);
if (r < 0)
return r;
-
- n_elements++;
}
- return json_variant_new_array(ret, elements, n_elements);
+ if (!array)
+ return json_variant_new_array(ret, NULL, 0);
+
+ *ret = TAKE_PTR(array);
+ return 0;
}
static int json_transform_variant(sd_bus_message *m, const char *contents, JsonVariant **ret) {
}
static int json_transform_dict_array(sd_bus_message *m, JsonVariant **ret) {
- JsonVariant **elements = NULL;
- size_t n_elements = 0;
+ _cleanup_(json_variant_unrefp) JsonVariant *array = NULL;
int r;
assert(m);
assert(ret);
- CLEANUP_ARRAY(elements, n_elements, json_variant_unref_many);
-
for (;;) {
const char *contents;
char type;
assert(type == 'e');
- if (!GREEDY_REALLOC(elements, n_elements + 2))
- return log_oom();
-
r = sd_bus_message_enter_container(m, type, contents);
if (r < 0)
return bus_log_parse_error(r);
- r = json_transform_one(m, elements + n_elements);
+ r = json_transform_and_append(m, &array);
if (r < 0)
return r;
- n_elements++;
-
- r = json_transform_one(m, elements + n_elements);
+ r = json_transform_and_append(m, &array);
if (r < 0)
return r;
- n_elements++;
-
r = sd_bus_message_exit_container(m);
if (r < 0)
return bus_log_parse_error(r);
}
- return json_variant_new_object(ret, elements, n_elements);
+ if (!array)
+ return json_variant_new_array(ret, NULL, 0);
+
+ *ret = TAKE_PTR(array);
+ return 0;
}
static int json_transform_one(sd_bus_message *m, JsonVariant **ret) {