From 27679b188e56630c071a815ff94b26bd831c6c66 Mon Sep 17 00:00:00 2001 From: Frederic-Philippe Metz Date: Tue, 21 Mar 2017 06:57:19 +0100 Subject: [PATCH] Moved the json reader locally and removed it from call struct --- daemon/call.h | 2 -- daemon/redis.c | 86 ++++++++++++++++++++++++-------------------------- 2 files changed, 42 insertions(+), 46 deletions(-) diff --git a/daemon/call.h b/daemon/call.h index 150b2e129..576082062 100644 --- a/daemon/call.h +++ b/daemon/call.h @@ -6,7 +6,6 @@ /* XXX split everything into call_signalling.[ch] and call_packets.[ch] or w/e */ #include -#include #include #include @@ -391,7 +390,6 @@ struct call { unsigned int foreign_call; // created_via_redis_notify call struct recording *recording; - JsonReader *root_reader; }; struct callmaster_config { diff --git a/daemon/redis.c b/daemon/redis.c index f6f431384..a281e2b8e 100644 --- a/daemon/redis.c +++ b/daemon/redis.c @@ -700,7 +700,7 @@ INLINE str *json_reader_get_string_value_uri_enc(JsonReader *root_reader) { } static int json_get_hash(struct redis_hash *out, struct call* c, - const char *key, unsigned int id) + const char *key, unsigned int id, JsonReader *root_reader) { static unsigned int MAXKEYLENGTH = 512; char key_concatted[MAXKEYLENGTH]; @@ -717,7 +717,7 @@ static int json_get_hash(struct redis_hash *out, struct call* c, if (rc>=MAXKEYLENGTH) rlog(LOG_ERROR,"Json key too long."); - if (!json_reader_read_member(c->root_reader, key_concatted)) { + if (!json_reader_read_member(root_reader, key_concatted)) { rlog(LOG_ERROR, "Could not read json member: %s",key_concatted); goto err; } @@ -726,16 +726,16 @@ static int json_get_hash(struct redis_hash *out, struct call* c, if (!out->ht) goto err; - gchar **members = json_reader_list_members(c->root_reader); + gchar **members = json_reader_list_members(root_reader); gchar **orig_members = members; - for (int i=0; i < json_reader_count_members (c->root_reader); ++i) { + for (int i=0; i < json_reader_count_members (root_reader); ++i) { - if (!json_reader_read_member(c->root_reader, *members)) { + if (!json_reader_read_member(root_reader, *members)) { rlog(LOG_ERROR, "Could not read json member: %s",*members); goto err3; } - str *val = json_reader_get_string_value_uri_enc(c->root_reader); + str *val = json_reader_get_string_value_uri_enc(root_reader); char* tmp = strdup(*members); if (g_hash_table_insert_check(out->ht, tmp, val) != TRUE) { @@ -743,12 +743,12 @@ static int json_get_hash(struct redis_hash *out, struct call* c, goto err3; } - json_reader_end_member(c->root_reader); + json_reader_end_member(root_reader); ++members; } // for g_strfreev(orig_members); - json_reader_end_member (c->root_reader); + json_reader_end_member (root_reader); return 0; @@ -876,18 +876,18 @@ static void *redis_list_get_ptr(struct redis_list *list, struct redis_hash *rh, static int json_build_list_cb(GQueue *q, struct call *c, const char *key, unsigned int idx, struct redis_list *list, - int (*cb)(str *, GQueue *, struct redis_list *, void *), void *ptr) + int (*cb)(str *, GQueue *, struct redis_list *, void *), void *ptr, JsonReader *root_reader) { char key_concatted[256]; snprintf(key_concatted, 256, "%s-%u", key, idx); - if (!json_reader_read_member(c->root_reader, key_concatted)) + if (!json_reader_read_member(root_reader, key_concatted)) rlog(LOG_ERROR,"Key in json not found:%s",key_concatted); - for (int jidx=0; jidx < json_reader_count_elements(c->root_reader); ++jidx) { - if (!json_reader_read_element(c->root_reader,jidx)) + for (int jidx=0; jidx < json_reader_count_elements(root_reader); ++jidx) { + if (!json_reader_read_element(root_reader,jidx)) rlog(LOG_ERROR,"Element in array not found."); - str *s = json_reader_get_string_value_uri_enc(c->root_reader); + str *s = json_reader_get_string_value_uri_enc(root_reader); if (!s) rlog(LOG_ERROR,"String in json not found."); if (cb(s, q, list, ptr)) { @@ -895,9 +895,9 @@ static int json_build_list_cb(GQueue *q, struct call *c, const char *key, return -1; } free(s); - json_reader_end_element(c->root_reader); + json_reader_end_element(root_reader); } - json_reader_end_member (c->root_reader); + json_reader_end_member (root_reader); return 0; } @@ -910,14 +910,14 @@ static int rbl_cb_simple(str *s, GQueue *q, struct redis_list *list, void *ptr) } static int json_build_list(GQueue *q, struct call *c, const char *key, const str *callid, - unsigned int idx, struct redis_list *list) + unsigned int idx, struct redis_list *list, JsonReader *root_reader) { - return json_build_list_cb(q, c, key, idx, list, rbl_cb_simple, NULL); + return json_build_list_cb(q, c, key, idx, list, rbl_cb_simple, NULL, root_reader); } static int json_get_list_hash(struct redis_list *out, struct call* c, const char *key, - const struct redis_hash *rh, const char *rh_num_key) + const struct redis_hash *rh, const char *rh_num_key, JsonReader *root_reader) { unsigned int i; @@ -931,7 +931,7 @@ static int json_get_list_hash(struct redis_list *out, struct call* c, goto err1; for (i = 0; i < out->len; i++) { - if (json_get_hash(&out->rh[i], c, key, i)) + if (json_get_hash(&out->rh[i], c, key, i, root_reader)) goto err2; } @@ -1155,7 +1155,7 @@ static int rbl_cb_plts(str *s, GQueue *q, struct redis_list *list, void *ptr) { g_hash_table_replace(med->rtp_payload_types, &pt->payload_type, pt); return 0; } -static int json_medias(struct redis *r, struct call *c, struct redis_list *medias) { +static int json_medias(struct redis *r, struct call *c, struct redis_list *medias, JsonReader *root_reader) { unsigned int i; struct redis_hash *rh; struct call_media *med; @@ -1203,7 +1203,7 @@ static int json_medias(struct redis *r, struct call *c, struct redis_list *media if (redis_hash_get_crypto_params(&med->sdes_out.params, rh, "sdes_out") < 0) return -1; - json_build_list_cb(NULL, c, "payload_types", i, NULL, rbl_cb_plts, med); + json_build_list_cb(NULL, c, "payload_types", i, NULL, rbl_cb_plts, med, root_reader); /* XXX dtls */ medias->ptrs[i] = med; @@ -1264,7 +1264,7 @@ static int redis_link_sfds(struct redis_list *sfds, struct redis_list *streams) return 0; } -static int json_link_tags(struct call *c, struct redis_list *tags, struct redis_list *medias) +static int json_link_tags(struct call *c, struct redis_list *tags, struct redis_list *medias, JsonReader *root_reader) { unsigned int i; struct call_monologue *ml, *other_ml; @@ -1276,7 +1276,7 @@ static int json_link_tags(struct call *c, struct redis_list *tags, struct redis_ ml->active_dialogue = redis_list_get_ptr(tags, &tags->rh[i], "active"); - if (json_build_list(&q, c, "other_tags", &c->callid, i, tags)) + if (json_build_list(&q, c, "other_tags", &c->callid, i, tags, root_reader)) return -1; for (l = q.head; l; l = l->next) { other_ml = l->data; @@ -1286,7 +1286,7 @@ static int json_link_tags(struct call *c, struct redis_list *tags, struct redis_ } g_queue_clear(&q); - if (json_build_list(&ml->medias, c, "medias", &c->callid, i, medias)) + if (json_build_list(&ml->medias, c, "medias", &c->callid, i, medias, root_reader)) return -1; } @@ -1294,7 +1294,7 @@ static int json_link_tags(struct call *c, struct redis_list *tags, struct redis_ } static int json_link_streams(struct call *c, struct redis_list *streams, - struct redis_list *sfds, struct redis_list *medias) + struct redis_list *sfds, struct redis_list *medias, JsonReader *root_reader) { unsigned int i; struct packet_stream *ps; @@ -1308,7 +1308,7 @@ static int json_link_streams(struct call *c, struct redis_list *streams, ps->rtcp_sink = redis_list_get_ptr(streams, &streams->rh[i], "rtcp_sink"); ps->rtcp_sibling = redis_list_get_ptr(streams, &streams->rh[i], "rtcp_sibling"); - if (json_build_list(&ps->sfds, c, "stream_sfds", &c->callid, i, sfds)) + if (json_build_list(&ps->sfds, c, "stream_sfds", &c->callid, i, sfds, root_reader)) return -1; if (ps->media) @@ -1319,7 +1319,7 @@ static int json_link_streams(struct call *c, struct redis_list *streams, } static int json_link_medias(struct redis *r, struct call *c, struct redis_list *medias, - struct redis_list *streams, struct redis_list *maps, struct redis_list *tags) + struct redis_list *streams, struct redis_list *maps, struct redis_list *tags, JsonReader *root_reader) { unsigned int i; struct call_media *med; @@ -1330,9 +1330,9 @@ static int json_link_medias(struct redis *r, struct call *c, struct redis_list * med->monologue = redis_list_get_ptr(tags, &medias->rh[i], "tag"); if (!med->monologue) return -1; - if (json_build_list(&med->streams, c, "streams", &c->callid, i, streams)) + if (json_build_list(&med->streams, c, "streams", &c->callid, i, streams, root_reader)) return -1; - if (json_build_list(&med->endpoint_maps, c, "maps", &c->callid, i, maps)) + if (json_build_list(&med->endpoint_maps, c, "maps", &c->callid, i, maps, root_reader)) return -1; } return 0; @@ -1368,7 +1368,7 @@ static int rbl_cb_intf_sfds(str *s, GQueue *q, struct redis_list *list, void *pt } static int json_link_maps(struct redis *r, struct call *c, struct redis_list *maps, - struct redis_list *sfds) + struct redis_list *sfds, JsonReader *root_reader) { unsigned int i; struct endpoint_map *em; @@ -1377,7 +1377,7 @@ static int json_link_maps(struct redis *r, struct call *c, struct redis_list *ma em = maps->ptrs[i]; if (json_build_list_cb(&em->intf_sfds, c, "map_sfds", em->unique_id, sfds, - rbl_cb_intf_sfds, em)) + rbl_cb_intf_sfds, em, root_reader)) return -1; } return 0; @@ -1414,29 +1414,27 @@ static void json_restore_call(struct redis *r, struct callmaster *m, const str * if (!c) goto err1; - c->root_reader = root_reader; // attach the json to the call in order to restore data from there - err = "call already exists"; if (c->last_signal) goto err2; err = "'call' data incomplete"; - if (json_get_hash(&call, c, "json", -1)) + if (json_get_hash(&call, c, "json", -1, root_reader)) goto err2; err = "'tags' incomplete"; - if (json_get_list_hash(&tags, c, "tag", &call, "num_tags")) + if (json_get_list_hash(&tags, c, "tag", &call, "num_tags", root_reader)) goto err3; err = "'sfds' incomplete"; - if (json_get_list_hash(&sfds, c, "sfd", &call, "num_sfds")) + if (json_get_list_hash(&sfds, c, "sfd", &call, "num_sfds", root_reader)) goto err4; err = "'streams' incomplete"; - if (json_get_list_hash(&streams, c, "stream", &call, "num_streams")) + if (json_get_list_hash(&streams, c, "stream", &call, "num_streams", root_reader)) goto err5; err = "'medias' incomplete"; - if (json_get_list_hash(&medias, c, "media", &call, "num_medias")) + if (json_get_list_hash(&medias, c, "media", &call, "num_medias", root_reader)) goto err6; err = "'maps' incomplete"; - if (json_get_list_hash(&maps, c, "map", &call, "num_maps")) + if (json_get_list_hash(&maps, c, "map", &call, "num_maps", root_reader)) goto err7; err = "missing 'created' timestamp"; @@ -1470,7 +1468,7 @@ static void json_restore_call(struct redis *r, struct callmaster *m, const str * if (redis_tags(c, &tags)) goto err8; err = "failed to create medias"; - if (json_medias(r, c, &medias)) + if (json_medias(r, c, &medias, root_reader)) goto err8; err = "failed to create maps"; if (redis_maps(c, &maps)) @@ -1480,16 +1478,16 @@ static void json_restore_call(struct redis *r, struct callmaster *m, const str * if (redis_link_sfds(&sfds, &streams)) goto err8; err = "failed to link streams"; - if (json_link_streams(c, &streams, &sfds, &medias)) + if (json_link_streams(c, &streams, &sfds, &medias, root_reader)) goto err8; err = "failed to link tags"; - if (json_link_tags(c, &tags, &medias)) + if (json_link_tags(c, &tags, &medias, root_reader)) goto err8; err = "failed to link medias"; - if (json_link_medias(r, c, &medias, &streams, &maps, &tags)) + if (json_link_medias(r, c, &medias, &streams, &maps, &tags, root_reader)) goto err8; err = "failed to link maps"; - if (json_link_maps(r, c, &maps, &sfds)) + if (json_link_maps(r, c, &maps, &sfds, root_reader)) goto err8; // presence of this key determines whether we were recording at all