mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-04-16 08:49:01 +00:00
FS-5682 --resolve new syntax <action application="set" data="sip_multipart=application/pidf+xml:1234"/> use push instead of set to add more to the same channel
This commit is contained in:
parent
1b01e9f01a
commit
4eee5aee8c
@ -8436,16 +8436,8 @@ void sofia_handle_sip_i_invite(switch_core_session_t *session, nua_t *nua, sofia
|
|||||||
|
|
||||||
for (mp = sip->sip_multipart; mp; mp = mp->mp_next) {
|
for (mp = sip->sip_multipart; mp; mp = mp->mp_next) {
|
||||||
if (mp->mp_payload && mp->mp_payload->pl_data && mp->mp_content_type && mp->mp_content_type->c_type) {
|
if (mp->mp_payload && mp->mp_payload->pl_data && mp->mp_content_type && mp->mp_content_type->c_type) {
|
||||||
char *name = switch_core_session_strdup(session, mp->mp_content_type->c_type);
|
char *val = switch_core_session_sprintf(session, "%s:%s", mp->mp_content_type->c_type, mp->mp_payload->pl_data);
|
||||||
char *p;
|
switch_channel_add_variable_var_check(channel, "sip_multipart", val, SWITCH_FALSE, SWITCH_STACK_PUSH);
|
||||||
|
|
||||||
for (p = name; p && *p; p++) {
|
|
||||||
if (*p == '/') {
|
|
||||||
*p = '_';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch_channel_set_variable_name_printf(channel, mp->mp_payload->pl_data, SOFIA_MULTIPART_PREFIX "%s", name);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1205,7 +1205,7 @@ switch_status_t sofia_glue_do_invite(switch_core_session_t *session)
|
|||||||
tech_pvt->nh->nh_has_invite = 1;
|
tech_pvt->nh->nh_has_invite = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mp = sofia_media_get_multipart(session, SOFIA_MULTIPART_PREFIX, tech_pvt->mparams.local_sdp_str, &mp_type))) {
|
if ((mp = sofia_media_get_multipart(session, "sip_multipart", tech_pvt->mparams.local_sdp_str, &mp_type))) {
|
||||||
sofia_clear_flag(tech_pvt, TFLAG_ENABLE_SOA);
|
sofia_clear_flag(tech_pvt, TFLAG_ENABLE_SOA);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,6 +97,19 @@ switch_status_t sofia_media_tech_media(private_object_t *tech_pvt, const char *r
|
|||||||
return SWITCH_STATUS_FALSE;
|
return SWITCH_STATUS_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void process_mp(switch_core_session_t *session, switch_stream_handle_t *stream, const char *boundary, const char *str) {
|
||||||
|
char *dname = switch_core_session_strdup(session, str);
|
||||||
|
char *dval;
|
||||||
|
|
||||||
|
if ((dval = strchr(dname, ':'))) {
|
||||||
|
*dval++ = '\0';
|
||||||
|
if (*dval == '~') {
|
||||||
|
stream->write_function(stream, "--%s\nContent-Type: %s\nContent-Length: %d\n%s\n", boundary, dname, strlen(dval), dval + 1);
|
||||||
|
} else {
|
||||||
|
stream->write_function(stream, "--%s\nContent-Type: %s\nContent-Length: %d\n\n%s\n", boundary, dname, strlen(dval) + 1, dval);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
char *sofia_media_get_multipart(switch_core_session_t *session, const char *prefix, const char *sdp, char **mp_type)
|
char *sofia_media_get_multipart(switch_core_session_t *session, const char *prefix, const char *sdp, char **mp_type)
|
||||||
{
|
{
|
||||||
@ -113,14 +126,18 @@ char *sofia_media_get_multipart(switch_core_session_t *session, const char *pref
|
|||||||
const char *name = (char *) hi->name;
|
const char *name = (char *) hi->name;
|
||||||
char *value = (char *) hi->value;
|
char *value = (char *) hi->value;
|
||||||
|
|
||||||
if (!strncasecmp(name, prefix, strlen(prefix))) {
|
if (!strcasecmp(name, prefix)) {
|
||||||
const char *hname = name + strlen(prefix);
|
if (hi->idx > 0) {
|
||||||
if (*value == '~') {
|
int i = 0;
|
||||||
stream.write_function(&stream, "--%s\nContent-Type: %s\nContent-Length: %d\n%s\n", boundary, hname, strlen(value), value + 1);
|
|
||||||
|
for(i = 0; i < hi->idx; i++) {
|
||||||
|
process_mp(session, &stream, boundary, hi->array[i]);
|
||||||
|
x++;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
stream.write_function(&stream, "--%s\nContent-Type: %s\nContent-Length: %d\n\n%s\n", boundary, hname, strlen(value) + 1, value);
|
process_mp(session, &stream, boundary, value);
|
||||||
|
x++;
|
||||||
}
|
}
|
||||||
x++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
switch_channel_variable_last(channel);
|
switch_channel_variable_last(channel);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user