Пример #1
0
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;
		
}
Пример #2
0
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;
}
Пример #3
0
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;
    }
}