From 6005d14e1a2bc35a2bf58ce7086edc625814ccd2 Mon Sep 17 00:00:00 2001 From: Camille Oudot Date: Tue, 29 Jul 2014 10:43:17 +0200 Subject: [PATCH] XMLRPC notifications: more formats the command line switch -x allows tho choose between several XMLRPC formats: * format 0 is the legacy SEMS di for the SBC application * format 1 only includes the call-id: teardown ${call-id} --- daemon/call.c | 33 ++++++++++++++++++++++++--------- daemon/call.h | 6 ++++++ daemon/main.c | 8 +++++++- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/daemon/call.c b/daemon/call.c index e65449d7f..9af77c645 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -43,6 +43,7 @@ struct iterator_helper { struct stream_fd *ports[0x10000]; }; struct xmlrpc_helper { + enum xmlrpc_format fmt; GStringChunk *c; char *url; GSList *tags; @@ -992,8 +993,16 @@ retry: goto fault; r = NULL; - xmlrpc_client_call2f(&e, c, xh->url, "di", &r, "(ssss)", - "sbc", "postControlCmd", tag->s, "teardown"); + switch (xh->fmt) { + case XF_SEMS: + xmlrpc_client_call2f(&e, c, xh->url, "di", &r, "(ssss)", + "sbc", "postControlCmd", tag->s, "teardown"); + break; + case XF_CALLID: + xmlrpc_client_call2f(&e, c, xh->url, "teardown", &r, "(s)", tag->s); + break; + } + if (r) xmlrpc_DECREF(r); if (e.fault_occurred) @@ -1032,6 +1041,7 @@ void kill_calls_timer(GSList *list, struct callmaster *m) { xh->c = g_string_chunk_new(64); xh->url = g_string_chunk_insert(xh->c, url); xh->tags = NULL; + xh->fmt = m->conf.fmt; } while (list) { @@ -1042,13 +1052,18 @@ void kill_calls_timer(GSList *list, struct callmaster *m) { rwlock_lock_r(&ca->master_lock); - for (csl = ca->monologues; csl; csl = csl->next) { - cm = csl->data; - if (!cm->tag.s || !cm->tag.len) - goto next; - xh->tags = g_slist_prepend(xh->tags, str_chunk_insert(xh->c, &cm->tag)); -next: - ; + switch (m->conf.fmt) { + case XF_SEMS: + for (csl = ca->monologues; csl; csl = csl->next) { + cm = csl->data; + if (cm->tag.s && cm->tag.len) { + xh->tags = g_slist_prepend(xh->tags, str_chunk_insert(xh->c, &cm->tag)); + } + } + break; + case XF_CALLID: + xh->tags = g_slist_prepend(xh->tags, str_chunk_insert(xh->c, &ca->callid)); + break; } rwlock_unlock_r(&ca->master_lock); diff --git a/daemon/call.h b/daemon/call.h index fe451b3bf..9103b2e7c 100644 --- a/daemon/call.h +++ b/daemon/call.h @@ -41,6 +41,11 @@ enum transport_protocol_index { PROTO_UDPTL, }; +enum xmlrpc_format { + XF_SEMS = 0, + XF_CALLID, +}; + struct call_monologue; @@ -316,6 +321,7 @@ struct callmaster_config { struct redis *redis; char *b2b_url; unsigned char default_tos; + enum xmlrpc_format fmt; }; struct callmaster { diff --git a/daemon/main.c b/daemon/main.c index 152be318e..639822c0e 100644 --- a/daemon/main.c +++ b/daemon/main.c @@ -93,7 +93,7 @@ static u_int32_t redis_ip; static u_int16_t redis_port; static int redis_db = -1; static char *b2b_url; - +static enum xmlrpc_format xmlrpc_fmt = XF_SEMS; static void sighandler(gpointer x) { @@ -262,6 +262,7 @@ static void options(int *argc, char ***argv) { { "redis-db", 'R', 0, G_OPTION_ARG_INT, &redis_db, "Which Redis DB to use", "INT" }, { "b2b-url", 'b', 0, G_OPTION_ARG_STRING, &b2b_url, "XMLRPC URL of B2B UA" , "STRING" }, { "log-level", 'L', 0, G_OPTION_ARG_INT, (void *)&log_level, "Mask log priorities above this level", "INT" }, + { "xmlrpc-format", 'x', 0, G_OPTION_ARG_INT, &xmlrpc_fmt, "XMLRPC timeout request format to use. 0: SEMS DI, 1: call-id only", "INT" }, { NULL, } }; @@ -328,6 +329,10 @@ static void options(int *argc, char ***argv) { die("Must specify Redis DB number (--redis-db) when using Redis\n"); } + if (xmlrpc_fmt < 0 || xmlrpc_fmt > 1) { + die("Invalid XMLRPC format\n"); + } + if ((log_level < LOG_EMERG) || (log_level > LOG_DEBUG)) die("Invalid log level (--log_level)\n"); setlogmask(LOG_UPTO(log_level)); @@ -478,6 +483,7 @@ no_kernel: mc.silent_timeout = silent_timeout; mc.default_tos = tos; mc.b2b_url = b2b_url; + mc.fmt = xmlrpc_fmt; ct = NULL; if (listenport) {