diff --git a/daemon/bencode.c b/daemon/bencode.c index ac220e603..d8137a50e 100644 --- a/daemon/bencode.c +++ b/daemon/bencode.c @@ -7,6 +7,7 @@ #include #include #include +#include "aux.h" /* set to 0 for alloc debugging, e.g. through valgrind */ #define BENCODE_MIN_BUFFER_PIECE_LEN 512 @@ -964,19 +965,10 @@ str *bencode_collapse_str_json(bencode_item_t *root, str *out) { JsonBuilder *builder = json_builder_new(); if (!bencode_collapse_json_item(root, builder)) goto err; - JsonGenerator *gen = json_generator_new(); - JsonNode *json = json_builder_get_root(builder); - json_generator_set_root(gen, json); - char *result = json_generator_to_data(gen, NULL); - json_node_free(json); - g_object_unref(gen); - if (!result) - goto err; - + char *result = glib_json_print(builder); out->s = result; out->len = strlen(result); bencode_buffer_destroy_add(root->buffer, free, result); - g_object_unref(builder); return out; err: diff --git a/daemon/janus.c b/daemon/janus.c index fa17af725..a03ddf86a 100644 --- a/daemon/janus.c +++ b/daemon/janus.c @@ -102,25 +102,10 @@ static struct call_monologue *janus_get_monologue(uint64_t handle_id, struct cal } -// frees 'builder', returns g_malloc'd string -static char *janus_json_print(JsonBuilder *builder) { - JsonGenerator *gen = json_generator_new(); - JsonNode *root = json_builder_get_root(builder); - json_generator_set_root(gen, root); - char *result = json_generator_to_data(gen, NULL); - - json_node_free(root); - g_object_unref(gen); - g_object_unref(builder); - - return result; -} - - // frees 'builder' // sends a single final response message to a received websocket message. requires a response code static void janus_send_json_sync_response(struct websocket_message *wm, JsonBuilder *builder, int code) { - char *result = janus_json_print(builder); + char *result = glib_json_print(builder); if (wm->method == M_WEBSOCKET) websocket_write_text(wm->wc, result, true); @@ -137,7 +122,7 @@ static void janus_send_json_sync_response(struct websocket_message *wm, JsonBuil // sends an asynchronous notification to all websockets connected to a session // session must be locked already static void janus_send_json_async(struct janus_session *session, JsonBuilder *builder) { - char *result = janus_json_print(builder); + char *result = glib_json_print(builder); GHashTableIter iter; gpointer value; diff --git a/daemon/mqtt.c b/daemon/mqtt.c index 8fe218280..37c428564 100644 --- a/daemon/mqtt.c +++ b/daemon/mqtt.c @@ -522,17 +522,7 @@ INLINE JsonBuilder *__mqtt_timer_intro(void) { } INLINE void __mqtt_timer_outro(JsonBuilder *json) { json_builder_end_object(json); - - JsonGenerator *gen = json_generator_new(); - JsonNode *root = json_builder_get_root(json); - json_generator_set_root(gen, root); - char *result = json_generator_to_data(gen, NULL); - - mqtt_publish(result); - - json_node_free(root); - g_object_unref(gen); - g_object_unref(json); + mqtt_publish(glib_json_print(json)); } void mqtt_timer_run_media(struct call *call, struct call_media *media) { JsonBuilder *json = __mqtt_timer_intro(); diff --git a/daemon/redis.c b/daemon/redis.c index 017f363fb..477506058 100644 --- a/daemon/redis.c +++ b/daemon/redis.c @@ -2656,16 +2656,7 @@ char* redis_encode_json(struct call *c) { } json_builder_end_object(builder); - JsonGenerator *gen = json_generator_new(); - JsonNode *root = json_builder_get_root(builder); - json_generator_set_root(gen, root); - char* result = json_generator_to_data(gen, NULL); - - json_node_free(root); - g_object_unref(gen); - g_object_unref(builder); - - return result; + return glib_json_print(builder); } diff --git a/include/aux.h b/include/aux.h index dd3bc5365..d4f4244b6 100644 --- a/include/aux.h +++ b/include/aux.h @@ -18,6 +18,7 @@ #include #include #include +#include #include "compat.h" #include "auxlib.h" @@ -133,6 +134,22 @@ g_list_insert_before_link (GList *list, #endif +/* GLIB-JSON */ + +// frees 'builder', returns g_malloc'd string +INLINE char *glib_json_print(JsonBuilder *builder) { + JsonGenerator *gen = json_generator_new(); + JsonNode *root = json_builder_get_root(builder); + json_generator_set_root(gen, root); + char *result = json_generator_to_data(gen, NULL); + + json_node_free(root); + g_object_unref(gen); + g_object_unref(builder); + + return result; +} + /* GQUEUE */