static int msrp_frame_received(void *data) { tcp_event_info_t *tev; static msrp_frame_t mf; sip_msg_t *fmsg; struct run_act_ctx ctx; int rtb, rt; tev = (tcp_event_info_t*)data; if(tev==NULL || tev->buf==NULL || tev->len<=0) { LM_DBG("invalid parameters\n"); return -1; } memset(&mf, 0, sizeof(msrp_frame_t)); mf.buf.s = tev->buf; mf.buf.len = tev->len; mf.tcpinfo = tev; if(msrp_parse_frame(&mf)<0) { LM_ERR("error parsing msrp frame\n"); return -1; } msrp_reset_env(); msrp_set_current_frame(&mf); rt = route_get(&event_rt, "msrp:frame-in"); if(rt>=0 && event_rt.rlist[rt]!=NULL) { LM_DBG("executing event_route[msrp:frame-in] (%d)\n", rt); fmsg = msrp_fake_sipmsg(&mf); if(fmsg!=NULL) fmsg->rcv = *tev->rcv; rtb = get_route_type(); set_route_type(REQUEST_ROUTE); init_run_actions_ctx(&ctx); run_top_route(event_rt.rlist[rt], fmsg, &ctx); if(ctx.run_flags&DROP_R_F) { LM_DBG("exit due to 'drop' in event route\n"); } set_route_type(rtb); if(fmsg!=NULL) free_sip_msg(fmsg); } msrp_reset_env(); msrp_destroy_frame(&mf); return 0; }
static int msrp_frame_received(sr_event_param_t *evp) { tcp_event_info_t *tev; static msrp_frame_t mf; sip_msg_t *fmsg; struct run_act_ctx ctx; int rtb, rt; sr_kemi_eng_t *keng = NULL; str evname = str_init("msrp:frame-in"); tev = (tcp_event_info_t*)evp->data; if(tev==NULL || tev->buf==NULL || tev->len<=0) { LM_DBG("invalid parameters\n"); return -1; } memset(&mf, 0, sizeof(msrp_frame_t)); mf.buf.s = tev->buf; mf.buf.len = tev->len; mf.tcpinfo = tev; if(msrp_parse_frame(&mf)<0) { LM_ERR("error parsing msrp frame\n"); return -1; } msrp_reset_env(); msrp_set_current_frame(&mf); fmsg = msrp_fake_sipmsg(&mf); if(fmsg != NULL) fmsg->rcv = *tev->rcv; rtb = get_route_type(); set_route_type(EVENT_ROUTE); init_run_actions_ctx(&ctx); if(msrp_event_callback.s == NULL || msrp_event_callback.len <= 0) { /* native cfg script execution */ rt = route_get(&event_rt, evname.s); LM_DBG("executing event_route[msrp:frame-in] (%d)\n", rt); if(rt >= 0 && event_rt.rlist[rt] != NULL) { run_top_route(event_rt.rlist[rt], fmsg, &ctx); } else { LM_ERR("empty event route block for msrp handling\n"); } } else { /* kemi script execution */ keng = sr_kemi_eng_get(); if(keng==NULL) { LM_ERR("event callback (%s) set, but no cfg engine\n", msrp_event_callback.s); } else { if(sr_kemi_ctx_route(keng, &ctx, fmsg, EVENT_ROUTE, &msrp_event_callback, &evname)<0) { LM_ERR("error running event route kemi callback\n"); } } } if(ctx.run_flags & DROP_R_F) { LM_DBG("exit due to 'drop' in event route\n"); } set_route_type(rtb); if(fmsg != NULL) free_sip_msg(fmsg); msrp_reset_env(); msrp_destroy_frame(&mf); return 0; }