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:

<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>teardown</methodName>
<params>
<param><value><string>${call-id}</string></value></param>
</params>
</methodCall>
pull/13/head
Camille Oudot 12 years ago
parent 77829f92de
commit 6005d14e1a

@ -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);

@ -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 {

@ -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) {

Loading…
Cancel
Save