diff --git a/src/modules/topoh/topoh_mod.c b/src/modules/topoh/topoh_mod.c index b2ee263957e..b8f7e3a852c 100644 --- a/src/modules/topoh/topoh_mod.c +++ b/src/modules/topoh/topoh_mod.c @@ -84,14 +84,20 @@ sanity_api_t scb; int th_msg_received(sr_event_param_t *evp); int th_msg_sent(sr_event_param_t *evp); -int th_execute_event_route(sip_msg_t *msg, sr_event_param_t *evp); +int th_execute_event_route(sip_msg_t *msg, sr_event_param_t *evp, + int evtype, int evidx, str *evname); /** module functions */ static int mod_init(void); +#define TH_EVENTRT_OUTGOING 1 +#define TH_EVENTRT_SENDING 2 +static int _th_eventrt_mode = TH_EVENTRT_OUTGOING | TH_EVENTRT_SENDING; static int _th_eventrt_outgoing = -1; static str _th_eventrt_callback = STR_NULL; -static str _th_eventrt_name = str_init("topoh:msg-outgoing"); +static str _th_eventrt_outgoing_name = str_init("topoh:msg-outgoing"); +static int _th_eventrt_sending = -1; +static str _th_eventrt_sending_name = str_init("topoh:msg-sending"); static param_export_t params[]={ {"mask_key", PARAM_STR, &_th_key}, @@ -105,6 +111,7 @@ static param_export_t params[]={ {"sanity_checks", PARAM_INT, &th_sanity_checks}, {"uri_prefix_checks", PARAM_INT, &th_uri_prefix_checks}, {"event_callback", PARAM_STR, &_th_eventrt_callback}, + {"event_mode", PARAM_INT, &_th_eventrt_mode}, {0,0,0} }; @@ -136,11 +143,16 @@ static int mod_init(void) sip_uri_t puri; char buri[MAX_URI_SIZE]; - _th_eventrt_outgoing = route_lookup(&event_rt, _th_eventrt_name.s); + _th_eventrt_outgoing = route_lookup(&event_rt, _th_eventrt_outgoing_name.s); if(_th_eventrt_outgoing<0 || event_rt.rlist[_th_eventrt_outgoing]==NULL) { _th_eventrt_outgoing = -1; } + _th_eventrt_sending = route_lookup(&event_rt, _th_eventrt_sending_name.s); + if(_th_eventrt_sending<0 + || event_rt.rlist[_th_eventrt_sending]==NULL) { + _th_eventrt_sending = -1; + } if(faked_msg_init()<0) { LM_ERR("failed to init fmsg\n"); @@ -421,6 +433,11 @@ int th_msg_sent(sr_event_param_t *evp) obuf = (str*)evp->data; + if(th_execute_event_route(NULL, evp, TH_EVENTRT_OUTGOING, + _th_eventrt_outgoing, &_th_eventrt_outgoing_name)==1) { + return 0; + } + memset(&msg, 0, sizeof(sip_msg_t)); msg.buf = obuf->s; msg.len = obuf->len; @@ -439,7 +456,8 @@ int th_msg_sent(sr_event_param_t *evp) th_del_cookie(&msg); } - if(th_execute_event_route(&msg, evp)==1) { + if(th_execute_event_route(&msg, evp, TH_EVENTRT_SENDING, + _th_eventrt_sending, &_th_eventrt_sending_name)==1) { goto done; } @@ -523,7 +541,8 @@ int th_msg_sent(sr_event_param_t *evp) /** * */ -int th_execute_event_route(sip_msg_t *msg, sr_event_param_t *evp) +int th_execute_event_route(sip_msg_t *msg, sr_event_param_t *evp, + int evtype, int evidx, str *evname) { struct sip_msg *fmsg; struct run_act_ctx ctx; @@ -531,7 +550,11 @@ int th_execute_event_route(sip_msg_t *msg, sr_event_param_t *evp) sr_kemi_eng_t *keng = NULL; struct onsend_info onsnd_info = {0}; - if(_th_eventrt_outgoing<0) { + if(!(_th_eventrt_mode & evtype)) { + return 0; + } + + if(evidx<0) { if(_th_eventrt_callback.s!=NULL || _th_eventrt_callback.len>0) { keng = sr_kemi_eng_get(); if(keng==NULL) { @@ -542,7 +565,7 @@ int th_execute_event_route(sip_msg_t *msg, sr_event_param_t *evp) } } - if(_th_eventrt_outgoing<0 && keng==NULL) { + if(evidx<0 && keng==NULL) { return 0; } @@ -566,12 +589,12 @@ int th_execute_event_route(sip_msg_t *msg, sr_event_param_t *evp) rtb = get_route_type(); set_route_type(REQUEST_ROUTE); init_run_actions_ctx(&ctx); - if(_th_eventrt_outgoing>=0) { - run_top_route(event_rt.rlist[_th_eventrt_outgoing], fmsg, &ctx); + if(evidx>=0) { + run_top_route(event_rt.rlist[evidx], (msg)?msg:fmsg, &ctx); } else { if(keng!=NULL) { - if(sr_kemi_ctx_route(keng, &ctx, fmsg, EVENT_ROUTE, - &_th_eventrt_callback, &_th_eventrt_name)<0) { + if(sr_kemi_ctx_route(keng, &ctx, (msg)?msg:fmsg, EVENT_ROUTE, + &_th_eventrt_callback, evname)<0) { LM_ERR("error running event route kemi callback\n"); p_onsend=NULL; return -1;