[asterisk-commits] kharwell: branch kharwell/pimp_sip_diversion r386451 - in /team/kharwell/pimp...

SVN commits to the Asterisk project asterisk-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 asterisk-commits mailing list