[svn-commits] kharwell: branch kharwell/pimp_sip_diversion r386451 - in /team/kharwell/pimp...
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Wed Apr 24 15:06:28 CDT 2013
Author: kharwell
Date: Wed Apr 24 15:06:25 2013
New Revision: 386451
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=386451
Log:
invite diversion header is now being progagated appropriately
Modified:
team/kharwell/pimp_sip_diversion/channels/chan_gulp.c
team/kharwell/pimp_sip_diversion/res/res_sip_diversion.c
Modified: team/kharwell/pimp_sip_diversion/channels/chan_gulp.c
URL: http://svnview.digium.com/svn/asterisk/team/kharwell/pimp_sip_diversion/channels/chan_gulp.c?view=diff&rev=386451&r1=386450&r2=386451
==============================================================================
--- team/kharwell/pimp_sip_diversion/channels/chan_gulp.c (original)
+++ team/kharwell/pimp_sip_diversion/channels/chan_gulp.c Wed Apr 24 15:06:25 2013
@@ -1293,7 +1293,6 @@
static int gulp_incoming_request(struct ast_sip_session *session, struct pjsip_rx_data *rdata)
{
pjsip_tx_data *packet = NULL;
- int res = AST_PBX_FAILED;
if (session->channel) {
return 0;
@@ -1307,6 +1306,14 @@
ast_log(LOG_ERROR, "Failed to allocate new GULP channel on incoming SIP INVITE\n");
return -1;
}
+ /* channel gets created on incoming request, but we wait to call start
+ so other supplements have a chance to run */
+ return 0;
+}
+
+static int pbx_start_incoming_request(struct ast_sip_session *session, pjsip_rx_data *rdata)
+{
+ int res;
ast_setstate(session->channel, AST_STATE_RING);
res = ast_pbx_start(session->channel);
@@ -1331,6 +1338,12 @@
return (res == AST_PBX_SUCCESS) ? 0 : -1;
}
+
+static struct ast_sip_session_supplement pbx_start_supplement = {
+ .method = "INVITE",
+ .priority = AST_SIP_SESSION_SUPPLEMENT_PRIORITY_LAST,
+ .incoming_request = pbx_start_incoming_request,
+};
/*! \brief Function called when a response is received on the session */
static void gulp_incoming_response(struct ast_sip_session *session, struct pjsip_rx_data *rdata)
@@ -1404,8 +1417,15 @@
goto end;
}
+ if (ast_sip_session_register_supplement(&pbx_start_supplement)) {
+ ast_log(LOG_ERROR, "Unable to register Gulp pbx start supplement\n");
+ ast_sip_session_unregister_supplement(&gulp_supplement);
+ goto end;
+ }
+
if (ast_sip_session_register_supplement(&gulp_ack_supplement)) {
ast_log(LOG_ERROR, "Unable to register Gulp ACK supplement\n");
+ ast_sip_session_unregister_supplement(&pbx_start_supplement);
ast_sip_session_unregister_supplement(&gulp_supplement);
goto end;
}
@@ -1430,6 +1450,7 @@
static int unload_module(void)
{
ast_sip_session_unregister_supplement(&gulp_supplement);
+ ast_sip_session_unregister_supplement(&pbx_start_supplement);
ast_custom_function_unregister(&gulp_dial_contacts_function);
ast_channel_unregister(&gulp_tech);
ast_rtp_glue_unregister(&gulp_rtp_glue);
Modified: team/kharwell/pimp_sip_diversion/res/res_sip_diversion.c
URL: http://svnview.digium.com/svn/asterisk/team/kharwell/pimp_sip_diversion/res/res_sip_diversion.c?view=diff&rev=386451&r1=386450&r2=386451
==============================================================================
--- team/kharwell/pimp_sip_diversion/res/res_sip_diversion.c (original)
+++ team/kharwell/pimp_sip_diversion/res/res_sip_diversion.c Wed Apr 24 15:06:25 2013
@@ -123,26 +123,21 @@
ast_copy_pj_str(*dst, src, pj_strlen(src) + 1);
}
-static void set_redirecting_id(pjsip_name_addr *uri, struct ast_party_id *data,
+static void set_redirecting_id(pjsip_name_addr *name_addr, struct ast_party_id *data,
struct ast_set_party_id *update)
{
- pjsip_fromto_hdr *hdr = (pjsip_fromto_hdr *)uri;
- pjsip_sip_uri *sip_uri = pjsip_uri_get_uri(uri->uri);
-
- if (pj_strlen(&sip_uri->user)) {
+ pjsip_sip_uri *uri = pjsip_uri_get_uri(name_addr->uri);
+
+ if (pj_strlen(&uri->user)) {
update->number = 1;
data->number.valid = 1;
- set_redirecting_value(&data->number.str, &sip_uri->user);
- }
-
- if (pj_strlen(&uri->display)) {
+ set_redirecting_value(&data->number.str, &uri->user);
+ }
+
+ if (pj_strlen(&name_addr->display)) {
update->name = 1;
data->name.valid = 1;
- set_redirecting_value(&data->name.str, &uri->display);
- }
-
- if (pj_strlen(&hdr->tag)) {
- set_redirecting_value(&data->tag, &hdr->tag);
+ set_redirecting_value(&data->name.str, &name_addr->display);
}
}
@@ -160,13 +155,11 @@
}
}
-static void set_redirecting_reason(pjsip_name_addr *uri,
+static void set_redirecting_reason(pjsip_fromto_hdr *hdr,
struct ast_party_redirecting_reason *data)
{
static const pj_str_t reason_name = { "reason", 6 };
-
- pjsip_sip_uri *sip_uri = pjsip_uri_get_uri(uri->uri);
- pjsip_param *reason = pjsip_param_find(&sip_uri->other_param, &reason_name);
+ pjsip_param *reason = pjsip_param_find(&hdr->other_param, &reason_name);
if (!reason) {
return;
@@ -177,8 +170,8 @@
}
static void set_redirecting(struct ast_sip_session *session,
- pjsip_name_addr *from_uri,
- pjsip_name_addr *to_uri)
+ pjsip_fromto_hdr *from_info,
+ pjsip_name_addr *to_info)
{
struct ast_party_redirecting data;
struct ast_set_party_redirecting update;
@@ -190,33 +183,32 @@
ast_party_redirecting_init(&data);
memset(&update, 0, sizeof(update));
- set_redirecting_id(from_uri, &data.from, &update.from);
-
- /* give priority to the session id */
- if (session->id.number.valid) {
- copy_redirecting_id(&data.to, &session->id, &update.to);
+ if (from_info) {
+ set_redirecting_id((pjsip_name_addr*)from_info->uri,
+ &data.from, &update.from);
+ set_redirecting_reason(from_info, &data.reason);
} else {
- set_redirecting_id(to_uri, &data.to, &update.to);
- }
-
- set_redirecting_reason(from_uri, &data.reason);
+ copy_redirecting_id(&data.from, &session->id, &update.from);
+ }
+
+ set_redirecting_id(to_info, &data.to, &update.to);
ast_set_party_id_all(&update.priv_orig);
ast_set_party_id_all(&update.priv_from);
ast_set_party_id_all(&update.priv_to);
++data.count;
- ast_channel_set_redirecting(session->channel, &data, &update); /* ast_channel_queue_redirecting_update */
+ ast_channel_set_redirecting(session->channel, &data, &update);
ast_party_redirecting_free(&data);
}
static int diversion_incoming_request(struct ast_sip_session *session, pjsip_rx_data *rdata)
{
- pjsip_fromto_hdr *div_hdr = get_diversion_header(rdata);
-
- if (div_hdr) {
- set_redirecting(session, (pjsip_name_addr*)div_hdr->uri,
- (pjsip_name_addr*)rdata->msg_info.msg->line.req.uri);
+ pjsip_fromto_hdr *hdr = get_diversion_header(rdata);
+
+ if (hdr) {
+ set_redirecting(session, hdr, (pjsip_name_addr*)
+ PJSIP_MSG_TO_HDR(rdata->msg_info.msg)->uri);
}
return 0;
@@ -224,20 +216,26 @@
static void diversion_incoming_response(struct ast_sip_session *session, pjsip_rx_data *rdata)
{
- struct pjsip_status_line status = rdata->msg_info.msg->line.status;
- pjsip_fromto_hdr *to_hdr;
+ static const pj_str_t contact_name = { "Contact", 7 };
+
+ pjsip_status_line status = rdata->msg_info.msg->line.status;
+ pjsip_fromto_hdr *div_hdr;
+ pjsip_contact_hdr *contact_hdr;
if ((status.code != 302) && (status.code != 181)) {
return;
}
- /* use the diversion header, if not then default to the 'To' header */
- if (!(to_hdr = get_diversion_header(rdata))) {
- to_hdr = PJSIP_MSG_TO_HDR(rdata->msg_info.msg);
- }
-
- set_redirecting(session, (pjsip_name_addr*)PJSIP_MSG_FROM_HDR(
- rdata->msg_info.msg)->uri, (pjsip_name_addr*)to_hdr->uri);
+ /* use the diversion header info if there is one. if not one then use the
+ session caller id info. if that doesn't exist use info from the To hdr*/
+ if (!(div_hdr = get_diversion_header(rdata)) && !session->id.number.valid) {
+ div_hdr = PJSIP_MSG_TO_HDR(rdata->msg_info.msg);
+ }
+
+ contact_hdr = pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, &contact_name, NULL);
+
+ set_redirecting(session, div_hdr, contact_hdr ? (pjsip_name_addr*)contact_hdr->uri :
+ (pjsip_name_addr*)PJSIP_MSG_FROM_HDR(rdata->msg_info.msg)->uri);
}
#define param_add(pool,list,pname,pvalue) \
@@ -258,19 +256,12 @@
*/
static void add_diversion_header(pjsip_tx_data *tdata, struct ast_party_redirecting *data)
{
- pjsip_uri *base;
pjsip_fromto_hdr *hdr;
pjsip_name_addr *name_addr;
pjsip_sip_uri *uri;
- struct ast_party_id *id;
-
- if (tdata->msg->type == PJSIP_REQUEST_MSG) {
- id = &data->to;
- base = PJSIP_MSG_FROM_HDR(tdata->msg)->uri;
- } else {
- id = &data->from;
- base = tdata->msg->line.req.uri;
- }
+
+ struct ast_party_id *id = &data->from;
+ pjsip_uri *base = PJSIP_MSG_FROM_HDR(tdata->msg)->uri;
hdr = pjsip_from_hdr_create(tdata->pool);
hdr->type = PJSIP_H_OTHER;
@@ -287,7 +278,7 @@
pj_strdup2(tdata->pool, &name_addr->display, id->name.str);
pj_strdup2(tdata->pool, &uri->user, id->number.str);
- param_add(tdata->pool, uri->other_param, "reason",
+ param_add(tdata->pool, hdr->other_param, "reason",
(char*)reason_code_to_str(&data->reason));
hdr->uri = (pjsip_uri *) name_addr;
@@ -336,8 +327,9 @@
static struct ast_sip_session_supplement diversion_supplement = {
.method = "INVITE",
- /* this supplement needs to be called after caller id */
- .priority = AST_SIP_SESSION_SUPPLEMENT_PRIORITY_CHANNEL - 800,
+ /* this supplement needs to be called after caller id
+ and after the channel has been created */
+ .priority = AST_SIP_SESSION_SUPPLEMENT_PRIORITY_CHANNEL + 100,
.incoming_request = diversion_incoming_request,
.incoming_response = diversion_incoming_response,
.outgoing_request = diversion_outgoing_request,
More information about the svn-commits
mailing list