Skip to content

Commit

Permalink
dialog: enable execution of dialog event routes via kemi
Browse files Browse the repository at this point in the history
- requires to set the event_callback parameters
  • Loading branch information
miconda committed Apr 4, 2017
1 parent 9b72c40 commit 5b7838c
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 15 deletions.
2 changes: 2 additions & 0 deletions src/modules/dialog/dialog.c
Expand Up @@ -110,6 +110,7 @@ int dlg_ka_failed_limit = 1;
int dlg_enable_dmq = 0;

int dlg_event_rt[DLG_EVENTRT_MAX];
str dlg_event_callback = STR_NULL;

str dlg_bridge_controller = str_init("sip:controller@kamailio.org");

Expand Down Expand Up @@ -299,6 +300,7 @@ static param_export_t mod_params[]={
{ "db_skip_load", INT_PARAM, &db_skip_load },
{ "ka_failed_limit", INT_PARAM, &dlg_ka_failed_limit },
{ "enable_dmq", INT_PARAM, &dlg_enable_dmq },
{"event_callback", PARAM_STR, &dlg_event_callback },
{ 0,0,0 }
};

Expand Down
78 changes: 63 additions & 15 deletions src/modules/dialog/dlg_handlers.c
Expand Up @@ -37,6 +37,7 @@
#include "../../core/action.h"
#include "../../core/script_cb.h"
#include "../../core/pt.h"
#include "../../core/kemi.h"
#include "../../core/fmsg.h"
#include "../../core/parser/parse_from.h"
#include "../../core/parser/parse_cseq.h"
Expand Down Expand Up @@ -76,6 +77,8 @@ extern struct rr_binds d_rrb; /*!< binding to record-routing module */

extern pv_elem_t *ruri_param_model; /*!< pv-string to get r-uri */

extern str dlg_event_callback;

static unsigned int CURR_DLG_LIFETIME = 0; /*!< current dialog lifetime */
static unsigned int CURR_DLG_STATUS = 0; /*!< current dialog state */
static unsigned int CURR_DLG_ID = 0xffffffff; /*!< current dialog id */
Expand Down Expand Up @@ -1509,6 +1512,8 @@ void dlg_ontimeout(struct dlg_tl *tl)
int new_state, old_state, unref;
sip_msg_t *fmsg;
void* timeout_cb = 0;
sr_kemi_eng_t *keng = NULL;
str evname;

/* get the dialog tl payload */
dlg = ((struct dlg_cell*)((char *)(tl) -
Expand All @@ -1520,8 +1525,10 @@ void dlg_ontimeout(struct dlg_tl *tl)
if(dlg->state==DLG_STATE_CONFIRMED_NA
|| dlg->state==DLG_STATE_CONFIRMED)
{
if(dlg->toroute>0 && dlg->toroute<main_rt.entries
&& main_rt.rlist[dlg->toroute]!=NULL)
if((dlg->toroute>0 && dlg->toroute<main_rt.entries
&& main_rt.rlist[dlg->toroute]!=NULL)
|| (dlg->toroute_name.len>0
&& dlg_event_callback.s!=NULL && dlg_event_callback.len>0))
{
fmsg = faked_msg_next();
if (exec_pre_script_cb(fmsg, REQUEST_CB_TYPE)>0)
Expand All @@ -1530,7 +1537,18 @@ void dlg_ontimeout(struct dlg_tl *tl)
dlg_set_ctx_iuid(dlg);
LM_DBG("executing route %d on timeout\n", dlg->toroute);
set_route_type(REQUEST_ROUTE);
run_top_route(main_rt.rlist[dlg->toroute], fmsg, 0);
if(dlg->toroute>0) {
run_top_route(main_rt.rlist[dlg->toroute], fmsg, 0);
} else {
if(keng!=NULL) {
evname.s = "dialog:timeout";
evname.len = sizeof("dialog:timeout") - 1;
if(keng->froute(fmsg, EVENT_ROUTE,
&dlg_event_callback, &evname)<0) {
LM_ERR("error running event route kemi callback\n");
}
}
}
dlg_reset_ctx_iuid();
exec_post_script_cb(fmsg, REQUEST_CB_TYPE);
dlg_unref(dlg, 1);
Expand Down Expand Up @@ -1656,38 +1674,68 @@ void dlg_run_event_route(dlg_cell_t *dlg, sip_msg_t *msg, int ostate, int nstate
sip_msg_t *fmsg;
int rt;
int bkroute;
sr_kemi_eng_t *keng = NULL;
str evname;

if(dlg==NULL)
return;
if(ostate==nstate)
return;

rt = -1;
if(nstate==DLG_STATE_CONFIRMED_NA) {
rt = dlg_event_rt[DLG_EVENTRT_START];
} else if(nstate==DLG_STATE_DELETED) {
if(ostate==DLG_STATE_CONFIRMED || ostate==DLG_STATE_CONFIRMED_NA)
rt = dlg_event_rt[DLG_EVENTRT_END];
else if(ostate==DLG_STATE_UNCONFIRMED || ostate==DLG_STATE_EARLY)
rt = dlg_event_rt[DLG_EVENTRT_FAILED];
if(dlg_event_callback.s==NULL || dlg_event_callback.len<=0) {
if(nstate==DLG_STATE_CONFIRMED_NA) {
rt = dlg_event_rt[DLG_EVENTRT_START];
evname.s = "dialog:start";
evname.len = sizeof("dialog:start") - 1;
} else if(nstate==DLG_STATE_DELETED) {
if(ostate==DLG_STATE_CONFIRMED || ostate==DLG_STATE_CONFIRMED_NA) {
rt = dlg_event_rt[DLG_EVENTRT_END];
evname.s = "dialog:end";
evname.len = sizeof("dialog:end") - 1;
} else if(ostate==DLG_STATE_UNCONFIRMED || ostate==DLG_STATE_EARLY) {
evname.s = "dialog:failed";
evname.len = sizeof("dialog:failed") - 1;
rt = dlg_event_rt[DLG_EVENTRT_FAILED];
}
}
if(rt==-1 || event_rt.rlist[rt]==NULL)
return;
} else {
keng = sr_kemi_eng_get();
if(keng==NULL) {
LM_DBG("event callback (%s) set, but no cfg engine\n",
dlg_event_callback.s);
return;
}
}

if(rt==-1 || event_rt.rlist[rt]==NULL)
return;

if(msg==NULL)
fmsg = faked_msg_next();
else
fmsg = msg;

if (exec_pre_script_cb(fmsg, LOCAL_CB_TYPE)>0)
{
if (exec_pre_script_cb(fmsg, LOCAL_CB_TYPE)<=0)
return;

if(rt>=0 || dlg_event_callback.len>0) {
dlg_ref(dlg, 1);
dlg_set_ctx_iuid(dlg);
LM_DBG("executing event_route %d on state %d\n", rt, nstate);
bkroute = get_route_type();
set_route_type(LOCAL_ROUTE);
run_top_route(event_rt.rlist[rt], fmsg, 0);
if(rt>=0) {
run_top_route(event_rt.rlist[rt], fmsg, 0);
} else {
if(keng!=NULL) {
if(keng->froute(fmsg, EVENT_ROUTE,
&dlg_event_callback, &evname)<0) {
LM_ERR("error running event route kemi callback (%d %d)\n",
ostate, nstate);
}
}
}
dlg_reset_ctx_iuid();
exec_post_script_cb(fmsg, LOCAL_CB_TYPE);
dlg_unref(dlg, 1);
Expand Down

0 comments on commit 5b7838c

Please sign in to comment.