From 0aeb06f613ab9b1c9b42270586636e879f187af2 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Wed, 1 Aug 2018 10:39:06 -0400 Subject: [PATCH] TT#40900 store metadata in call struct instead of recording struct makes it possible to set the metadata before recording has been started closes #579 Change-Id: I885a39fbc53345a4e9f2459f3cd972cb1198c210 --- daemon/call_interfaces.c | 6 ------ daemon/recording.c | 30 ++++++++++++++++++++++-------- daemon/redis.c | 2 +- include/call.h | 1 + include/recording.h | 1 - utils/rtpengine-ng-client | 3 ++- 6 files changed, 26 insertions(+), 17 deletions(-) diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index 2741051d8..fd7ff4a62 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -913,12 +913,6 @@ static const char *call_offer_answer_ng(bencode_item_t *input, meta_write_sdp_after(recording, chopper->output, monologue, opmode); - //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); - } - recording_response(recording, output); } diff --git a/daemon/recording.c b/daemon/recording.c index f6b9e0540..fb1dde91f 100644 --- a/daemon/recording.c +++ b/daemon/recording.c @@ -20,6 +20,7 @@ #include "bencode.h" #include "rtplib.h" #include "cdr.h" +#include "log.h" @@ -211,8 +212,22 @@ static int pcap_create_spool_dir(const char *spoolpath) { return spool_good; } +// lock must be held +static void update_metadata(struct call *call, str *metadata) { + if (!metadata || !metadata->s) + return; + + if (str_cmp_str(metadata, &call->metadata)) { + call_str_cpy(call, &call->metadata, metadata); + if (call->recording) + recording_meta_chunk(call->recording, "METADATA", metadata); + } +} + // lock must be held void recording_start(struct call *call, const char *prefix, str *metadata) { + update_metadata(call, metadata); + if (call->recording) // already active return; @@ -234,9 +249,6 @@ void recording_start(struct call *call, const char *prefix, str *metadata) { } else recording->meta_prefix = strdup(prefix); - if (metadata->len) { - call_str_cpy(call, &recording->metadata, metadata); - } _rm(init_struct, call); @@ -275,11 +287,13 @@ 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, str *metadata) { + update_metadata(call, metadata); + if (!recordcall || !recordcall->s) return; if (!str_cmp(recordcall, "yes") || !str_cmp(recordcall, "on")) - recording_start(call, NULL, metadata); + recording_start(call, NULL, NULL); else if (!str_cmp(recordcall, "no") || !str_cmp(recordcall, "off")) recording_stop(call); else @@ -394,8 +408,8 @@ static int pcap_meta_finish_file(struct call *call) { fprintf(recording->u.pcap.meta_fp, "call end time: %s\n", timebuffer); // Print metadata - if (recording->metadata.len) - fprintf(recording->u.pcap.meta_fp, "\n\n"STR_FORMAT"\n", STR_FMT(&recording->metadata)); + if (call->metadata.len) + fprintf(recording->u.pcap.meta_fp, "\n\n"STR_FORMAT"\n", STR_FMT(&call->metadata)); fclose(recording->u.pcap.meta_fp); recording->u.pcap.meta_fp = NULL; @@ -653,8 +667,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); + if (call->metadata.len) + recording_meta_chunk(recording, "METADATA", &call->metadata); } static void sdp_before_proc(struct recording *recording, const str *sdp, struct call_monologue *ml, diff --git a/daemon/redis.c b/daemon/redis.c index 0d807a01c..027c0512b 100644 --- a/daemon/redis.c +++ b/daemon/redis.c @@ -1827,9 +1827,9 @@ char* redis_encode_json(struct call *c) { JSON_SET_SIMPLE_CSTR("created_from",c->created_from); JSON_SET_SIMPLE_CSTR("created_from_addr",sockaddr_print_buf(&c->created_from_addr)); JSON_SET_SIMPLE("redis_hosted_db","%u",c->redis_hosted_db); + JSON_SET_SIMPLE_STR("recording_metadata",&c->metadata); if ((rec = c->recording)) { - JSON_SET_SIMPLE_STR("recording_metadata",&rec->metadata); JSON_SET_SIMPLE_CSTR("recording_meta_prefix",rec->meta_prefix); } } diff --git a/include/call.h b/include/call.h index bab97eb3c..ad966d746 100644 --- a/include/call.h +++ b/include/call.h @@ -404,6 +404,7 @@ struct call { unsigned int foreign_call; // created_via_redis_notify call struct recording *recording; + str metadata; }; diff --git a/include/recording.h b/include/recording.h index a64cb98a7..45db5f38c 100644 --- a/include/recording.h +++ b/include/recording.h @@ -48,7 +48,6 @@ struct recording { struct recording_proc proc; } u; - str metadata; // from controlling daemon char *escaped_callid; // call-id with dangerous characters escaped char *meta_prefix; // escaped call-id plus random suffix char *meta_filepath; // full file path diff --git a/utils/rtpengine-ng-client b/utils/rtpengine-ng-client index 8cfd4ffa5..6fe0d8d6a 100755 --- a/utils/rtpengine-ng-client +++ b/utils/rtpengine-ng-client @@ -57,13 +57,14 @@ GetOptions( 'supports=s@' => \$options{'supports'}, 'xmlrpc-callback=s' => \$options{'xmlrpc-callback'}, 'always-transcode' => \$options{'always transcode'}, + 'metadata=s' => \$options{'metadata'}, ) or die; my $cmd = shift(@ARGV) or die; my %packet = (command => $cmd); -for my $x (split(/,/, 'from-tag,to-tag,call-id,transport protocol,media address,ICE,address family,DTLS,via-branch,media address,ptime,xmlrpc-callback')) { +for my $x (split(/,/, 'from-tag,to-tag,call-id,transport protocol,media address,ICE,address family,DTLS,via-branch,media address,ptime,xmlrpc-callback,metadata')) { defined($options{$x}) and $packet{$x} = \$options{$x}; } for my $x (split(/,/, 'TOS,delete-delay')) {