From 2250ab11fd8152bde8344b061911f4cfcf7a5327 Mon Sep 17 00:00:00 2001 From: Claudiu Boriga Date: Thu, 3 Aug 2017 12:57:57 +0200 Subject: [PATCH] make METADATA section appear in the metafile at intialization when recording using the proc method add new METADATA sections only if they differ from the previous ones --- daemon/call_interfaces.c | 11 +++++++---- daemon/recording.c | 11 ++++++++--- daemon/recording.h | 4 ++-- daemon/redis.c | 8 +++----- 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index 1f7aba8f6..af3191c82 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -747,9 +747,9 @@ static const char *call_offer_answer_ng(bencode_item_t *input, struct callmaster chopper = sdp_chopper_new(&sdp); bencode_buffer_destroy_add(output->buffer, (free_func_t) sdp_chopper_destroy, chopper); - detect_setup_recording(call, &flags.record_call_str); + detect_setup_recording(call, &flags.record_call_str, &flags.metadata); if (flags.record_call) - recording_start(call, NULL); + recording_start(call, NULL, &flags.metadata); ret = monologue_offer_answer(monologue, &streams, &flags); if (!ret) @@ -763,7 +763,8 @@ static const char *call_offer_answer_ng(bencode_item_t *input, struct callmaster meta_write_sdp_after(recording, sdp_iov, chopper->iov_num, chopper->str_len, monologue, opmode); - if (flags.metadata.len) { + //only add METADATA chunk if value is changed + if (flags.metadata.len && str_cmp_str(&flags.metadata, &recording->metadata)) { call_str_cpy(call, &recording->metadata, &flags.metadata); recording_meta_chunk(recording, "METADATA", &flags.metadata); } @@ -1192,14 +1193,16 @@ const char *call_list_ng(bencode_item_t *input, struct callmaster *m, bencode_it const char *call_start_recording_ng(bencode_item_t *input, struct callmaster *m, bencode_item_t *output) { str callid; struct call *call; + str metadata; if (!bencode_dictionary_get_str(input, "call-id", &callid)) return "No call-id in message"; + bencode_dictionary_get_str(input, "metadata", &metadata); call = call_get_opmode(&callid, m, OP_OTHER); if (!call) return "Unknown call-id"; - recording_start(call, NULL); + recording_start(call, NULL, &metadata); rwlock_unlock_w(&call->master_lock); obj_put(call); diff --git a/daemon/recording.c b/daemon/recording.c index 391fbe661..464f4a241 100644 --- a/daemon/recording.c +++ b/daemon/recording.c @@ -214,7 +214,7 @@ static int pcap_create_spool_dir(const char *spoolpath) { } // lock must be held -void recording_start(struct call *call, const char *prefix) { +void recording_start(struct call *call, const char *prefix, str *metadata) { if (call->recording) // already active return; @@ -236,6 +236,9 @@ void recording_start(struct call *call, const char *prefix) { } else recording->meta_prefix = strdup(prefix); + if (metadata->len) { + call_str_cpy(call, &recording->metadata, metadata); + } _rm(init_struct, call); @@ -269,12 +272,12 @@ void recording_stop(struct call *call) { * * Returns a boolean for whether or not the call is being recorded. */ -void detect_setup_recording(struct call *call, const str *recordcall) { +void detect_setup_recording(struct call *call, const str *recordcall, str *metadata) { if (!recordcall || !recordcall->s) return; if (!str_cmp(recordcall, "yes") || !str_cmp(recordcall, "on")) - recording_start(call, NULL); + recording_start(call, NULL, metadata); else if (!str_cmp(recordcall, "no") || !str_cmp(recordcall, "off")) recording_stop(call); else @@ -655,6 +658,8 @@ static void proc_init(struct call *call) { append_meta_chunk_str(recording, &call->callid, "CALL-ID"); append_meta_chunk_s(recording, recording->meta_prefix, "PARENT"); + if (recording->metadata.len) + recording_meta_chunk(recording, "METADATA", &recording->metadata); } static void sdp_before_proc(struct recording *recording, const str *sdp, struct call_monologue *ml, diff --git a/daemon/recording.h b/daemon/recording.h index 078e4aa7c..a0edca1a2 100644 --- a/daemon/recording.h +++ b/daemon/recording.h @@ -113,9 +113,9 @@ void recording_fs_init(const char *spooldir, const char *method, const char *for * * Returns a boolean for whether or not the call is being recorded. */ -void detect_setup_recording(struct call *call, const str *recordcall); +void detect_setup_recording(struct call *call, const str *recordcall, str *metadata); -void recording_start(struct call *call, const char *); +void recording_start(struct call *call, const char *prefix, str *metadata); void recording_stop(struct call *call); diff --git a/daemon/redis.c b/daemon/redis.c index 92401c0bf..26b4ff5b7 100644 --- a/daemon/redis.c +++ b/daemon/redis.c @@ -1440,7 +1440,7 @@ static void json_restore_call(struct redis *r, struct callmaster *m, const str * struct redis_hash call; struct redis_list tags, sfds, streams, medias, maps; struct call *c = NULL; - str s, id; + str s, id, meta; const char *err = 0; int i; @@ -1547,10 +1547,8 @@ static void json_restore_call(struct redis *r, struct callmaster *m, const str * // presence of this key determines whether we were recording at all if (!redis_hash_get_str(&s, &call, "recording_meta_prefix")) { - recording_start(c, s.s); - - if ((c->recording) && (!redis_hash_get_str(&s, &call, "recording_metadata"))) - call_str_cpy(c, &c->recording->metadata, &s); + redis_hash_get_str(&meta, &call, "recording_metadata"); + recording_start(c, s.s, &meta); } err = NULL;