static int dp_translate_f(struct sip_msg* msg, char* str1, char* str2) { int dpid; str input, output; dpl_id_p idp; dp_param_p id_par, repl_par; str attrs, * attrs_par; if(!msg) return -1; /*verify first param's value*/ id_par = (dp_param_p) str1; if (dp_get_ivalue(msg, id_par, &dpid) != 0){ LM_ERR("no dpid value\n"); return -1; } if ((idp = select_dpid(dpid)) ==0 ){ LM_DBG("no information available for dpid %i\n", dpid); return -1; } repl_par = (str2!=NULL)? ((dp_param_p)str2):default_par2; if (dp_get_svalue(msg, repl_par->v.sp[0], &input)!=0){ LM_ERR("invalid param 2\n"); return -1; } LM_DBG("input is %.*s\n", input.len, input.s); attrs_par = (!attr_pvar)?NULL:&attrs; if (translate(msg, input, &output, idp, attrs_par)!=0){ LM_DBG("could not translate %.*s " "with dpid %i\n", input.len, input.s, idp->dp_id); return -1; } LM_DBG("input %.*s with dpid %i => output %.*s\n", input.len, input.s, idp->dp_id, output.len, output.s); /*set the output*/ if (dp_update(msg, &repl_par->v.sp[0], &repl_par->v.sp[1], &output, attrs_par) !=0){ LM_ERR("cannot set the output\n"); return -1; } return 1; }
static int dp_translate_f(struct sip_msg *msg, char *str1, char *str2, char *attr_spec) { int dpid; str input, output; dpl_id_p idp; dp_param_p id_par, repl_par; str attrs, *attrs_par; dp_connection_list_p connection; pv_value_t pval; str partition_name; if (!msg) return -1; /* verify first param's value */ id_par = (dp_param_p) str1; if (dp_get_ivalue(msg, id_par, &dpid) != 0){ LM_ERR("no dpid value\n"); return -1; } switch( id_par->type ) { case DP_VAL_INT : if (dp_get_svalue(msg, id_par->v.pv_id.partition, &partition_name)) { LM_ERR("invalid partition\n"); return -1; } goto GET_CONN; case DP_VAL_SPEC : if (dp_get_svalue(msg, id_par->v.sp[1], &partition_name)) { LM_ERR("invalid partition\n"); return -1; } GET_CONN: if (!(id_par->hash = dp_get_connection(&partition_name))) { LM_ERR("invalid partition\n"); return -1; } break; default : break; } LM_DBG("dpid is %i partition is %.*s\n", dpid, id_par->hash->partition.len, id_par->hash->partition.s); repl_par = (str2!=NULL) ? ((dp_param_p)str2) : default_par2; if (dp_get_svalue(msg, repl_par->v.sp[0], &input)!=0){ LM_ERR("invalid param 2\n"); return -1; } LM_DBG("input is %.*s\n", input.len, input.s); connection = id_par->hash; /* ref the data for reading */ lock_start_read( connection->ref_lock ); if ((idp = select_dpid(connection, dpid, connection->crt_index)) == 0) { LM_DBG("no information available for dpid %i\n", dpid); goto error; } LM_DBG("Checking with dpid %i\n", idp->dp_id); attrs_par = attr_spec ? &attrs : NULL; if (translate(msg, input, &output, idp, attrs_par) != 0) { LM_DBG("could not translate %.*s " "with dpid %i\n", input.len, input.s, idp->dp_id); goto error; } LM_DBG("input %.*s with dpid %i => output %.*s\n", input.len, input.s, idp->dp_id, output.len, output.s); /* set the output */ if (dp_update(msg, &repl_par->v.sp[0], &repl_par->v.sp[1], &output) != 0) { LM_ERR("cannot set the output\n"); goto error; } /* we are done reading -> unref the data */ lock_stop_read( connection->ref_lock ); if (attr_spec) { pval.flags = PV_VAL_STR; pval.rs = attrs; if (pv_set_value(msg, (pv_spec_p)attr_spec, 0, &pval) != 0) { LM_ERR("failed to set value '%.*s' for the attr pvar!\n", attrs.len, attrs.s); goto error; } } return 1; error: /* we are done reading -> unref the data */ lock_stop_read( connection->ref_lock ); return -1; }
void dp_process_msg (uint32_t cmd, void *msg) { static const char fname[] = "dp_process_msg"; dp_int_t *dp_int_msg = (dp_int_t *) msg; DPINT_DEBUG(DEB_F_PREFIX"cmd= %s\n", DEB_F_PREFIX_ARGS(DIALPLAN, fname), dp_get_msg_string(cmd)); switch (cmd) { case DP_MSG_INIT_DIALING: dp_init_dialing_data(dp_int_msg->line, dp_int_msg->call_id); break; case DP_MSG_DIGIT_TIMER: dp_dial_timeout_event(dp_int_msg->tmr_ptr); break; case DP_MSG_DIGIT_STR: dp_update_key_string(dp_int_msg->line, dp_int_msg->call_id, &(dp_int_msg->digit_str[0])); break; case DP_MSG_STORE_DIGIT: dp_store_digit_string(dp_int_msg->line, dp_int_msg->call_id, &(dp_int_msg->digit_str[0])); break; case DP_MSG_DIGIT: dp_update_keypress(dp_int_msg->line, dp_int_msg->call_id, dp_int_msg->digit); break; case DP_MSG_DIAL_IMMEDIATE: dp_dial_immediate(dp_int_msg->line, dp_int_msg->call_id, dp_int_msg->collect_more, &(dp_int_msg->digit_str[0]), &(dp_int_msg->global_call_id[0]), dp_int_msg->monitor_mode); break; case DP_MSG_REDIAL: dp_do_redial(dp_int_msg->line, dp_int_msg->call_id); break; case DP_MSG_ONHOOK: dp_onhook(dp_int_msg->line, dp_int_msg->call_id); break; case DP_MSG_OFFHOOK: (void) dp_offhook(dp_int_msg->line, dp_int_msg->call_id); break; case DP_MSG_CANCEL_OFFHOOK_TIMER: dp_cancel_offhook_timer(); break; case DP_MSG_UPDATE: dp_update(dp_int_msg->line, dp_int_msg->call_id, &(dp_int_msg->digit_str[0])); break; default: break; } }