Browse Source

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
changes/48/22748/1
Richard Fuchs 7 years ago
parent
commit
0aeb06f613
6 changed files with 26 additions and 17 deletions
  1. +0
    -6
      daemon/call_interfaces.c
  2. +22
    -8
      daemon/recording.c
  3. +1
    -1
      daemon/redis.c
  4. +1
    -0
      include/call.h
  5. +0
    -1
      include/recording.h
  6. +2
    -1
      utils/rtpengine-ng-client

+ 0
- 6
daemon/call_interfaces.c View File

@ -913,12 +913,6 @@ static const char *call_offer_answer_ng(bencode_item_t *input,
meta_write_sdp_after(recording, chopper->output, meta_write_sdp_after(recording, chopper->output,
monologue, opmode); 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); recording_response(recording, output);
} }


+ 22
- 8
daemon/recording.c View File

@ -20,6 +20,7 @@
#include "bencode.h" #include "bencode.h"
#include "rtplib.h" #include "rtplib.h"
#include "cdr.h" #include "cdr.h"
#include "log.h"
@ -211,8 +212,22 @@ static int pcap_create_spool_dir(const char *spoolpath) {
return spool_good; 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 // lock must be held
void recording_start(struct call *call, const char *prefix, str *metadata) { void recording_start(struct call *call, const char *prefix, str *metadata) {
update_metadata(call, metadata);
if (call->recording) // already active if (call->recording) // already active
return; return;
@ -234,9 +249,6 @@ void recording_start(struct call *call, const char *prefix, str *metadata) {
} }
else else
recording->meta_prefix = strdup(prefix); recording->meta_prefix = strdup(prefix);
if (metadata->len) {
call_str_cpy(call, &recording->metadata, metadata);
}
_rm(init_struct, call); _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. * Returns a boolean for whether or not the call is being recorded.
*/ */
void detect_setup_recording(struct call *call, const str *recordcall, str *metadata) { void detect_setup_recording(struct call *call, const str *recordcall, str *metadata) {
update_metadata(call, metadata);
if (!recordcall || !recordcall->s) if (!recordcall || !recordcall->s)
return; return;
if (!str_cmp(recordcall, "yes") || !str_cmp(recordcall, "on")) 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")) else if (!str_cmp(recordcall, "no") || !str_cmp(recordcall, "off"))
recording_stop(call); recording_stop(call);
else 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); fprintf(recording->u.pcap.meta_fp, "call end time: %s\n", timebuffer);
// Print metadata // 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); fclose(recording->u.pcap.meta_fp);
recording->u.pcap.meta_fp = NULL; 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_str(recording, &call->callid, "CALL-ID");
append_meta_chunk_s(recording, recording->meta_prefix, "PARENT"); 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, static void sdp_before_proc(struct recording *recording, const str *sdp, struct call_monologue *ml,


+ 1
- 1
daemon/redis.c View File

@ -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",c->created_from);
JSON_SET_SIMPLE_CSTR("created_from_addr",sockaddr_print_buf(&c->created_from_addr)); 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("redis_hosted_db","%u",c->redis_hosted_db);
JSON_SET_SIMPLE_STR("recording_metadata",&c->metadata);
if ((rec = c->recording)) { if ((rec = c->recording)) {
JSON_SET_SIMPLE_STR("recording_metadata",&rec->metadata);
JSON_SET_SIMPLE_CSTR("recording_meta_prefix",rec->meta_prefix); JSON_SET_SIMPLE_CSTR("recording_meta_prefix",rec->meta_prefix);
} }
} }


+ 1
- 0
include/call.h View File

@ -404,6 +404,7 @@ struct call {
unsigned int foreign_call; // created_via_redis_notify call unsigned int foreign_call; // created_via_redis_notify call
struct recording *recording; struct recording *recording;
str metadata;
}; };


+ 0
- 1
include/recording.h View File

@ -48,7 +48,6 @@ struct recording {
struct recording_proc proc; struct recording_proc proc;
} u; } u;
str metadata; // from controlling daemon
char *escaped_callid; // call-id with dangerous characters escaped char *escaped_callid; // call-id with dangerous characters escaped
char *meta_prefix; // escaped call-id plus random suffix char *meta_prefix; // escaped call-id plus random suffix
char *meta_filepath; // full file path char *meta_filepath; // full file path


+ 2
- 1
utils/rtpengine-ng-client View File

@ -57,13 +57,14 @@ GetOptions(
'supports=s@' => \$options{'supports'}, 'supports=s@' => \$options{'supports'},
'xmlrpc-callback=s' => \$options{'xmlrpc-callback'}, 'xmlrpc-callback=s' => \$options{'xmlrpc-callback'},
'always-transcode' => \$options{'always transcode'}, 'always-transcode' => \$options{'always transcode'},
'metadata=s' => \$options{'metadata'},
) or die; ) or die;
my $cmd = shift(@ARGV) or die; my $cmd = shift(@ARGV) or die;
my %packet = (command => $cmd); 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}; defined($options{$x}) and $packet{$x} = \$options{$x};
} }
for my $x (split(/,/, 'TOS,delete-delay')) { for my $x (split(/,/, 'TOS,delete-delay')) {


Loading…
Cancel
Save