[Freeswitch-svn] [commit] r7190 - freeswitch/trunk/src/mod/endpoints/mod_sofia

Freeswitch SVN mikej at freeswitch.org
Sat Jan 12 14:53:13 EST 2008


Author: mikej
Date: Sat Jan 12 14:53:12 2008
New Revision: 7190

Modified:
   freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c

Log:
Parse "tag" and "generic_param" of From and To headers, Parse referred by header to vars (MODENDP-72)

Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c	(original)
+++ freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c	Sat Jan 12 14:53:12 2008
@@ -28,6 +28,7 @@
  * Paul D. Tinsley <pdt at jackhammer.org>
  * Bret McDanel <trixter AT 0xdecafbad.com>
  * Marcel Barbulescu <marcelbarbulescu at gmail.com>
+ * Norman Brandinger
  *
  *
  * sofia.c -- SOFIA SIP Endpoint (sofia code)
@@ -49,6 +50,7 @@
 extern su_log_t sresolv_log[];
 extern su_log_t stun_log[];
 
+static void set_variable_sip_param(switch_channel_t *channel, char *header_type, sip_param_t const *params);
 
 static void sofia_info_send_sipfrag(switch_core_session_t *aleg, switch_core_session_t *bleg);
 
@@ -2256,6 +2258,7 @@
 	const char *displayname = NULL;
 	const char *destination_number = NULL;
 	const char *from_user = NULL, *from_host = NULL;
+	const char *referred_by_user = NULL, *referred_by_host = NULL;
 	const char *context = NULL;
 	const char *dialplan = NULL;
 	char network_ip[80];
@@ -2349,6 +2352,11 @@
 			}
 		}
 
+		switch_channel_set_variable(channel, "sip_from_comment", sip->sip_from->a_comment);
+
+		if (sip->sip_from->a_params)
+			set_variable_sip_param(channel, "from", sip->sip_from->a_params);
+
 		switch_channel_set_variable(channel, "sofia_profile_name", profile->name);
 
 		if (!switch_strlen_zero(sip->sip_from->a_display)) {
@@ -2409,6 +2417,11 @@
 
 			host = switch_channel_get_variable(channel, "sip_to_host");
 			user = switch_channel_get_variable(channel, "sip_to_user");
+		
+			switch_channel_set_variable(channel, "sip_to_comment", sip->sip_to->a_comment);
+
+			if (sip->sip_to->a_params)
+				set_variable_sip_param(channel, "to", sip->sip_to->a_params);
 
 			if (sip->sip_contact->m_url->url_port) {
 				port = atoi(sip->sip_contact->m_url->url_port);
@@ -2452,6 +2465,29 @@
 		}
 	}
 
+	if (sip->sip_referred_by) {
+
+		referred_by_user = sip->sip_referred_by->b_url->url_user;
+		referred_by_host = sip->sip_referred_by->b_url->url_host;
+		channel_name = url_set_chanvars(session, sip->sip_referred_by->b_url, sip_referred_by);
+
+		check_decode(referred_by_user, session);
+
+		if (!switch_strlen_zero(referred_by_user)) {
+			if (*referred_by_user == '+') {
+				switch_channel_set_variable(channel, "sip_referred_by_user_stripped", (const char *) (referred_by_user + 1));
+			} else {
+				switch_channel_set_variable(channel, "sip_referred_by_user_stripped", referred_by_user);
+			}
+		}
+
+		switch_channel_set_variable(channel, "sip_referred_by_cid", sip->sip_referred_by->b_cid);
+
+		if (sip->sip_referred_by->b_params)
+			set_variable_sip_param(channel, "referred_by", sip->sip_referred_by->b_params);
+
+	}
+
 	sofia_glue_attach_private(session, profile, tech_pvt, channel_name);
 	sofia_glue_tech_prepare_codecs(tech_pvt);
 
@@ -2724,3 +2760,82 @@
 		}
 	}
 }
+
+/*
+ * This subroutine will take the a_params of a sip_addr_s structure and spin through them.
+ * Each param will be used to create a channel variable.
+ * In the SIP RFC's, this data is called generic-param.
+ * Note that the tag-param is also included in the a_params list.
+ *
+ * From: "John Doe" <sip:5551212 at 1.2.3.4>;tag=ed23266b52cbb17eo2;ref=101;mbid=201
+ *
+ * For example, the header above will produce an a_params list with three entries
+ *    tag=ed23266b52cbb17eo2
+ *    ref=101
+ *    mbid=201
+ *
+ * The a_params list is parsed and the lvalue is used to create the channel variable name while the
+ * rvalue is used to create the channel variable value. 
+ *
+ * If no equal (=) sign is found during parsing, a channel variable name is created with the param and
+ * the value is set to NULL.
+ *
+ * Pointers are used for copying the sip_header_name for performance reasons.  There are no calls to
+ * any string functions and no memory is allocated/dealocated.  The only limiter is the size of the
+ * sip_header_name array. 
+*/
+static void set_variable_sip_param(switch_channel_t *channel, char *header_type, sip_param_t const *params)
+{
+	char sip_header_name[128] = "";
+	char var1[] = "sip_";
+	char *cp, *sh, *sh_end, *sh_save;
+
+	/* Build the static part of the sip_header_name variable from	*/
+	/* the header_type. If the header type is "referred_by" then	*/
+	/* sip_header_name = "sip_referred_by_".			*/
+	sh = sip_header_name;
+	sh_end = sh + sizeof(sip_header_name) - 1;
+	for (cp=var1; *cp; cp++, sh++) {
+		*sh = *cp;
+	}
+	*sh = '\0';
+
+	/* Copy the header_type to the sip_header_name. Before copying 	*/
+	/* each character, check that we aren't going to overflow the   */
+	/* the sip_header_name buffer.  We have to account for the 	*/
+	/* trailing underscore and NULL that will be added to the end.	*/
+	for (cp=header_type; (*cp && (sh < (sh_end-1))); cp++, sh++) {
+		*sh = *cp;
+	}
+	*sh++ = '_';
+	*sh = '\0';
+
+	/* sh now points to the NULL at the end of the partially built	*/
+	/* sip_header_name variable.  This is also the start of the     */
+	/* variable part of the sip_header_name built from the lvalue   */
+	/* of the parms data.                                           */
+	sh_save = sh;
+
+	while (params && params[0]) {
+
+		/* Copy the params data to the sip_header_name variable until	*/
+		/* the end of the params string is reached, an '=' is detected	*/
+		/* or until the sip_header_name buffer has been exhausted.	*/
+		for (cp=(char *)(*params); ((*cp != '=') && *cp && (sh < sh_end)); cp++, sh++) {
+			*sh = *cp;
+		}
+
+		/* cp now points to either the end of the parms data or the	*/
+		/* equal (=) sign spearating the lvalue and rvalue.		*/
+		if (*cp == '=')
+			cp++;	
+		*sh = '\0';
+		switch_channel_set_variable(channel, sip_header_name, cp);
+
+		/* Bump pointer to next param in the list.  Also reset the	*/
+		/* sip_header_name pointer to the beginning of the dynamic area */
+		params++;
+		sh = sh_save;
+	}
+
+}



More information about the Freeswitch-svn mailing list