move param gen func to the core
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@6310 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
parent
640d3fad14
commit
4d311a0fb7
|
@ -456,6 +456,7 @@ SWITCH_DECLARE(void) switch_channel_event_set_data(switch_channel_t *channel, sw
|
||||||
\note it's necessary to test if the return val is the same as the input and free the string if it is not.
|
\note it's necessary to test if the return val is the same as the input and free the string if it is not.
|
||||||
*/
|
*/
|
||||||
SWITCH_DECLARE(char *) switch_channel_expand_variables(switch_channel_t *channel, char *in);
|
SWITCH_DECLARE(char *) switch_channel_expand_variables(switch_channel_t *channel, char *in);
|
||||||
|
SWITCH_DECLARE(char *) switch_channel_build_param_string(switch_channel_t *channel, switch_caller_profile_t *caller_profile);
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
|
|
|
@ -181,102 +181,15 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t *
|
||||||
static switch_status_t dialplan_xml_locate(switch_core_session_t *session, switch_caller_profile_t *caller_profile, switch_xml_t * root,
|
static switch_status_t dialplan_xml_locate(switch_core_session_t *session, switch_caller_profile_t *caller_profile, switch_xml_t * root,
|
||||||
switch_xml_t * node)
|
switch_xml_t * node)
|
||||||
{
|
{
|
||||||
switch_status_t status = SWITCH_STATUS_GENERR;
|
char *data;
|
||||||
switch_channel_t *channel;
|
switch_channel_t *channel;
|
||||||
switch_stream_handle_t stream = { 0 };
|
switch_status_t status = SWITCH_STATUS_GENERR;
|
||||||
switch_size_t encode_len = 1024, new_len = 0;
|
|
||||||
char *encode_buf = NULL;
|
|
||||||
const char *prof[12] = { 0 }, *prof_names[12] = {0};
|
|
||||||
char *e = NULL;
|
|
||||||
switch_event_header_t *hi;
|
|
||||||
uint32_t x = 0;
|
|
||||||
|
|
||||||
channel = switch_core_session_get_channel(session);
|
channel = switch_core_session_get_channel(session);
|
||||||
|
data = switch_channel_build_param_string(channel, caller_profile);
|
||||||
|
|
||||||
SWITCH_STANDARD_STREAM(stream);
|
status = switch_xml_locate("dialplan", NULL, NULL, NULL, root, node, data);
|
||||||
|
switch_safe_free(data);
|
||||||
if (!(encode_buf = malloc(encode_len))) {
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
prof[0] = caller_profile->context;
|
|
||||||
prof[1] = caller_profile->destination_number;
|
|
||||||
prof[2] = caller_profile->caller_id_name;
|
|
||||||
prof[3] = caller_profile->caller_id_number;
|
|
||||||
prof[4] = caller_profile->network_addr;
|
|
||||||
prof[5] = caller_profile->ani;
|
|
||||||
prof[6] = caller_profile->aniii;
|
|
||||||
prof[7] = caller_profile->rdnis;
|
|
||||||
prof[8] = caller_profile->source;
|
|
||||||
prof[9] = caller_profile->chan_name;
|
|
||||||
prof[10] = caller_profile->uuid;
|
|
||||||
|
|
||||||
prof_names[0] = "context";
|
|
||||||
prof_names[1] = "destination_number";
|
|
||||||
prof_names[2] = "caller_id_name";
|
|
||||||
prof_names[3] = "caller_id_number";
|
|
||||||
prof_names[4] = "network_addr";
|
|
||||||
prof_names[5] = "ani";
|
|
||||||
prof_names[6] = "aniii";
|
|
||||||
prof_names[7] = "rdnis";
|
|
||||||
prof_names[8] = "source";
|
|
||||||
prof_names[9] = "chan_name";
|
|
||||||
prof_names[10] = "uuid";
|
|
||||||
|
|
||||||
for (x = 0; prof[x]; x++) {
|
|
||||||
if (switch_strlen_zero(prof[x])) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
new_len = (strlen(prof[x]) * 3) + 1;
|
|
||||||
if (encode_len < new_len) {
|
|
||||||
char *tmp;
|
|
||||||
|
|
||||||
encode_len = new_len;
|
|
||||||
|
|
||||||
if (!(tmp = realloc(encode_buf, encode_len))) {
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
encode_buf = tmp;
|
|
||||||
}
|
|
||||||
switch_url_encode(prof[x], encode_buf, encode_len - 1);
|
|
||||||
stream.write_function(&stream, "%s=%s&", prof_names[x], encode_buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((hi = switch_channel_variable_first(channel))) {
|
|
||||||
for (; hi; hi = hi->next) {
|
|
||||||
char *var = hi->name;
|
|
||||||
char *val = hi->value;
|
|
||||||
|
|
||||||
new_len = (strlen((char *) var) * 3) + 1;
|
|
||||||
if (encode_len < new_len) {
|
|
||||||
char *tmp;
|
|
||||||
|
|
||||||
encode_len = new_len;
|
|
||||||
|
|
||||||
tmp = realloc(encode_buf, encode_len);
|
|
||||||
assert(tmp);
|
|
||||||
encode_buf = tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch_url_encode((char *) val, encode_buf, encode_len - 1);
|
|
||||||
stream.write_function(&stream, "%s=%s&", (char *) var, encode_buf);
|
|
||||||
|
|
||||||
}
|
|
||||||
switch_channel_variable_last(channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
e = (char *) stream.data + (strlen((char *) stream.data) - 1);
|
|
||||||
|
|
||||||
if (e && *e == '&') {
|
|
||||||
*e = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
status = switch_xml_locate("dialplan", NULL, NULL, NULL, root, node, stream.data);
|
|
||||||
|
|
||||||
done:
|
|
||||||
switch_safe_free(stream.data);
|
|
||||||
switch_safe_free(encode_buf);
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1510,6 +1510,106 @@ SWITCH_DECLARE(char *) switch_channel_expand_variables(switch_channel_t *channel
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SWITCH_DECLARE(char *) switch_channel_build_param_string(switch_channel_t *channel, switch_caller_profile_t *caller_profile)
|
||||||
|
{
|
||||||
|
switch_stream_handle_t stream = { 0 };
|
||||||
|
switch_size_t encode_len = 1024, new_len = 0;
|
||||||
|
char *encode_buf = NULL;
|
||||||
|
const char *prof[12] = { 0 }, *prof_names[12] = {0};
|
||||||
|
char *e = NULL;
|
||||||
|
switch_event_header_t *hi;
|
||||||
|
uint32_t x = 0;
|
||||||
|
|
||||||
|
SWITCH_STANDARD_STREAM(stream);
|
||||||
|
|
||||||
|
encode_buf = malloc(encode_len);
|
||||||
|
assert(encode_buf);
|
||||||
|
|
||||||
|
if (!caller_profile) {
|
||||||
|
caller_profile = switch_channel_get_caller_profile(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(caller_profile != NULL);
|
||||||
|
|
||||||
|
prof[0] = caller_profile->context;
|
||||||
|
prof[1] = caller_profile->destination_number;
|
||||||
|
prof[2] = caller_profile->caller_id_name;
|
||||||
|
prof[3] = caller_profile->caller_id_number;
|
||||||
|
prof[4] = caller_profile->network_addr;
|
||||||
|
prof[5] = caller_profile->ani;
|
||||||
|
prof[6] = caller_profile->aniii;
|
||||||
|
prof[7] = caller_profile->rdnis;
|
||||||
|
prof[8] = caller_profile->source;
|
||||||
|
prof[9] = caller_profile->chan_name;
|
||||||
|
prof[10] = caller_profile->uuid;
|
||||||
|
|
||||||
|
prof_names[0] = "context";
|
||||||
|
prof_names[1] = "destination_number";
|
||||||
|
prof_names[2] = "caller_id_name";
|
||||||
|
prof_names[3] = "caller_id_number";
|
||||||
|
prof_names[4] = "network_addr";
|
||||||
|
prof_names[5] = "ani";
|
||||||
|
prof_names[6] = "aniii";
|
||||||
|
prof_names[7] = "rdnis";
|
||||||
|
prof_names[8] = "source";
|
||||||
|
prof_names[9] = "chan_name";
|
||||||
|
prof_names[10] = "uuid";
|
||||||
|
|
||||||
|
for (x = 0; prof[x]; x++) {
|
||||||
|
if (switch_strlen_zero(prof[x])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
new_len = (strlen(prof[x]) * 3) + 1;
|
||||||
|
if (encode_len < new_len) {
|
||||||
|
char *tmp;
|
||||||
|
|
||||||
|
encode_len = new_len;
|
||||||
|
|
||||||
|
if (!(tmp = realloc(encode_buf, encode_len))) {
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
encode_buf = tmp;
|
||||||
|
}
|
||||||
|
switch_url_encode(prof[x], encode_buf, encode_len - 1);
|
||||||
|
stream.write_function(&stream, "%s=%s&", prof_names[x], encode_buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((hi = switch_channel_variable_first(channel))) {
|
||||||
|
for (; hi; hi = hi->next) {
|
||||||
|
char *var = hi->name;
|
||||||
|
char *val = hi->value;
|
||||||
|
|
||||||
|
new_len = (strlen((char *) var) * 3) + 1;
|
||||||
|
if (encode_len < new_len) {
|
||||||
|
char *tmp;
|
||||||
|
|
||||||
|
encode_len = new_len;
|
||||||
|
|
||||||
|
tmp = realloc(encode_buf, encode_len);
|
||||||
|
assert(tmp);
|
||||||
|
encode_buf = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_url_encode((char *) val, encode_buf, encode_len - 1);
|
||||||
|
stream.write_function(&stream, "%s=%s&", (char *) var, encode_buf);
|
||||||
|
|
||||||
|
}
|
||||||
|
switch_channel_variable_last(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
e = (char *) stream.data + (strlen((char *) stream.data) - 1);
|
||||||
|
|
||||||
|
if (e && *e == '&') {
|
||||||
|
*e = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_safe_free(encode_buf);
|
||||||
|
|
||||||
|
return stream.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* For Emacs:
|
/* For Emacs:
|
||||||
* Local Variables:
|
* Local Variables:
|
||||||
* mode:c
|
* mode:c
|
||||||
|
|
Loading…
Reference in New Issue