[svn-commits] phsultan: branch phsultan/jingle-support r231400 - in /team/phsultan/jingle-s...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Nov 26 09:39:28 CST 2009


Author: phsultan
Date: Thu Nov 26 09:39:26 2009
New Revision: 231400

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=231400
Log:
Advertize our Jingle capabilities, various fixes.

* Set the callerid (name) to the full JID of the caller for incoming Jingle
  calls.
* Fix the length of STUN packets we copy locally (thanks Vadim!).
* Advertize our Jingle capabilities in presence packets.
  This is needed if we want to be able to place calls from XMPP clients like
  Empathy and Pidgin.
* Use switch/case statements where appropriate. 

Modified:
    team/phsultan/jingle-support/channels/chan_jingle.c
    team/phsultan/jingle-support/main/stun.c
    team/phsultan/jingle-support/res/res_jabber.c

Modified: team/phsultan/jingle-support/channels/chan_jingle.c
URL: http://svnview.digium.com/svn/asterisk/team/phsultan/jingle-support/channels/chan_jingle.c?view=diff&rev=231400&r1=231399&r2=231400
==============================================================================
--- team/phsultan/jingle-support/channels/chan_jingle.c (original)
+++ team/phsultan/jingle-support/channels/chan_jingle.c Thu Nov 26 09:39:26 2009
@@ -735,6 +735,9 @@
 		tmp->initiator = 1;
 	}
 
+	/* Set CALLERID(name) to the full JID of the remote peer */
+	ast_copy_string(tmp->cid_name, tmp->them, sizeof(tmp->cid_name));
+
 	tmp->parent = client;
 	ast_copy_string(tmp->exten, "s", sizeof(tmp->exten));
 	ast_mutex_init(&tmp->lock);
@@ -993,7 +996,7 @@
 		}
 	}
 
-	p = jingle_alloc(client, pak->from->partial, iks_find_attrib(pak->query, JINGLE_SID));
+	p = jingle_alloc(client, pak->from->full, iks_find_attrib(pak->query, JINGLE_SID));
 	if (!p) {
 		ast_log(LOG_WARNING, "Unable to allocate jingle structure!\n");
 		jingle_response(client, pak, "resource-constraint", NULL);

Modified: team/phsultan/jingle-support/main/stun.c
URL: http://svnview.digium.com/svn/asterisk/team/phsultan/jingle-support/main/stun.c?view=diff&rev=231400&r1=231399&r2=231400
==============================================================================
--- team/phsultan/jingle-support/main/stun.c (original)
+++ team/phsultan/jingle-support/main/stun.c Thu Nov 26 09:39:26 2009
@@ -321,7 +321,7 @@
 	struct stun_header *hdr = (struct stun_header *)data;
 	struct stun_attr *attr;
 	struct stun_state st;
-	unsigned char stun_pkt[len - sizeof(struct stun_header)];
+	unsigned char stun_pkt[len];
 	int ret = AST_STUN_IGNORE;
 	int x;
 	unsigned char respdata[1024];

Modified: team/phsultan/jingle-support/res/res_jabber.c
URL: http://svnview.digium.com/svn/asterisk/team/phsultan/jingle-support/res/res_jabber.c?view=diff&rev=231400&r1=231399&r2=231400
==============================================================================
--- team/phsultan/jingle-support/res/res_jabber.c (original)
+++ team/phsultan/jingle-support/res/res_jabber.c Thu Nov 26 09:39:26 2009
@@ -1535,28 +1535,29 @@
 	iq = iks_new("iq");
 	presence = iks_new("presence");
 	x = iks_new("x");
-	if (client && iq && presence && x) {
-		if (!iks_find(pak->query, "remove")) {
-			iks_insert_attrib(iq, "from", client->jid->full);
-			iks_insert_attrib(iq, "to", pak->from->full);
-			iks_insert_attrib(iq, "id", pak->id);
-			iks_insert_attrib(iq, "type", "result");
-			ast_aji_send(client, iq);
-
-			iks_insert_attrib(presence, "from", client->jid->full);
-			iks_insert_attrib(presence, "to", pak->from->partial);
-			iks_insert_attrib(presence, "id", client->mid);
-			ast_aji_increment_mid(client->mid);
-			iks_insert_attrib(presence, "type", "subscribe");
-			iks_insert_attrib(x, "xmlns", "vcard-temp:x:update");
-			iks_insert_node(presence, x);
-			ast_aji_send(client, presence); 
-		}
-	} else {
+	if (client || !iq || !presence  || !x) {
 		ast_log(LOG_ERROR, "Out of memory.\n");
-	}
-
-
+		goto safeout;
+	}
+
+	if (!iks_find(pak->query, "remove")) {
+		iks_insert_attrib(iq, "from", client->jid->full);
+		iks_insert_attrib(iq, "to", pak->from->full);
+		iks_insert_attrib(iq, "id", pak->id);
+		iks_insert_attrib(iq, "type", "result");
+		ast_aji_send(client, iq);
+
+		iks_insert_attrib(presence, "from", client->jid->full);
+		iks_insert_attrib(presence, "to", pak->from->partial);
+		iks_insert_attrib(presence, "id", client->mid);
+		ast_aji_increment_mid(client->mid);
+		iks_insert_attrib(presence, "type", "subscribe");
+		iks_insert_attrib(x, "xmlns", "vcard-temp:x:update");
+		iks_insert_node(presence, x);
+		ast_aji_send(client, presence); 
+	}
+
+safeout:
 	iks_delete(iq);
 	iks_delete(presence);
 	iks_delete(x);
@@ -1735,7 +1736,7 @@
 
 /*!
  * \internal
- * \brief Handle add extra info
+ * \brief Handle discovery features in client mode
  * \param data void
  * \param pak ikspak
  * \return IKS_FILTER_EAT
@@ -1745,29 +1746,40 @@
 	struct aji_client *client = ASTOBJ_REF((struct aji_client *) data);
 	struct aji_resource *resource = NULL;
 	struct aji_buddy *buddy = ASTOBJ_CONTAINER_FIND(&client->buddies, pak->from->partial);
+	iks *iq, *ident, *google, *query, *jingle, *jingletransport, *jingleappsrtp, *jingleappsrtpaudio;
+
+	iq = iks_new("iq");
+	query = iks_new("query");
+	ident = iks_new("identity");
+	google = iks_new("feature");
+	jingle = iks_new("feature");
+	jingletransport = iks_new("feature");
+	jingleappsrtp = iks_new("feature");
+	jingleappsrtpaudio = iks_new("feature");
 
 	resource = aji_find_resource(buddy, pak->from->resource);
-	if (pak->subtype == IKS_TYPE_RESULT) {
-		if (!resource) {
-			ast_log(LOG_NOTICE, "JABBER: Received client info from %s when not requested.\n", pak->from->full);
-			ASTOBJ_UNREF(client, aji_client_destroy);
-			return IKS_FILTER_EAT;
-		}
-		if (iks_find_with_attrib(pak->query, "feature", "var", "http://www.google.com/xmpp/protocol/voice/v1")) {
-			resource->cap->jingle = 1;
-		} else
-			resource->cap->jingle = 0;
-	} else if (pak->subtype == IKS_TYPE_GET) {
-		iks *iq, *ident, *google, *query, *jingle, *jingletransport, *jingleappsrtp, *jingleappsrtpaudio;
-		iq = iks_new("iq");
-		query = iks_new("query");
-		ident = iks_new("identity");
-		google = iks_new("feature");
-		jingle = iks_new("feature");
-		jingletransport = iks_new("feature");
-		jingleappsrtp = iks_new("feature");
-		jingleappsrtpaudio = iks_new("feature");
-		if (iq && ident && google && jingle && jingletransport && jingleappsrtp && jingleappsrtpaudio) {
+
+	switch(pak->subtype) {
+		case IKS_TYPE_RESULT:
+			/* Process the response we received from the remote
+			 * client */
+			if (!resource) {
+				ast_log(LOG_NOTICE, "JABBER: Received client info from %s when not requested.\n", pak->from->full);
+				ASTOBJ_UNREF(client, aji_client_destroy);
+				goto safeout;
+			}
+			if (iks_find_with_attrib(pak->query, "feature", "var", "http://www.google.com/xmpp/protocol/voice/v1") || iks_find_with_attrib(pak->query, "feature", "var", "urn:xmpp:jingle:1")) {
+				resource->cap->jingle = 1;
+			} else {
+				resource->cap->jingle = 0;
+			}
+			break;
+		case IKS_TYPE_GET:
+			/* Respond to a disco request we received */
+			if (!iq || !ident || !google || !jingle || !jingletransport || !jingleappsrtp || !jingleappsrtpaudio) {
+				ast_log(LOG_ERROR, "Out of Memory.\n");
+				goto safeout;
+			}
 			iks_insert_attrib(iq, "from", client->jid->full);
 			iks_insert_attrib(iq, "to", pak->from->full);
 			iks_insert_attrib(iq, "type", "result");
@@ -1781,6 +1793,7 @@
 			iks_insert_attrib(jingletransport, "var", "urn:xmpp:jingle:transports:ice-udp:1");
 			iks_insert_attrib(jingleappsrtp, "var", "urn:xmpp:jingle:apps:rtp:1");
 			iks_insert_attrib(jingleappsrtpaudio, "var", "urn:xmpp:jingle:apps:rtp:audio");
+
 			iks_insert_node(iq, query);
 			iks_insert_node(query, ident);
 			iks_insert_node(query, google);
@@ -1789,23 +1802,33 @@
 			iks_insert_node(query, jingleappsrtp);
 			iks_insert_node(query, jingleappsrtpaudio);
 			ast_aji_send(client, iq);
-		} else
-			ast_log(LOG_ERROR, "Out of Memory.\n");
-
-		iks_delete(iq);
-		iks_delete(query);
-		iks_delete(ident);
-		iks_delete(google);
-	} else if (pak->subtype == IKS_TYPE_ERROR) {
-		ast_log(LOG_NOTICE, "User %s does not support discovery.\n", pak->from->full);
-	}
+
+			break;
+		case IKS_TYPE_ERROR:
+			ast_log(LOG_NOTICE, "User %s does not support discovery.\n", pak->from->full);
+			break;
+		default :
+			/* Discard packet silently */
+			break;
+	}
+
+safeout:
+	iks_delete(iq);
+	iks_delete(query);
+	iks_delete(ident);
+	iks_delete(google);
+	iks_delete(jingle);
+	iks_delete(jingletransport);
+	iks_delete(jingleappsrtp);
+	iks_delete(jingleappsrtpaudio);
+
 	ASTOBJ_UNREF(client, aji_client_destroy);
 	return IKS_FILTER_EAT;
 }
 
 /*!
  * \internal
- * \brief Handler of the return info packet
+ * \brief Handle discovery features in component mode
  * \param data aji_client
  * \param pak ikspak
  * \return IKS_FILTER_EAT
@@ -1816,130 +1839,131 @@
 	char *node = NULL;
 	struct aji_resource *resource = NULL;
 	struct aji_buddy *buddy = ASTOBJ_CONTAINER_FIND(&client->buddies, pak->from->partial);
+	iks *iq, *query, *identity, *disco, *reg, *commands, *gateway, *version, *vcard, *search;
+
+	iq = iks_new("iq");
+	query = iks_new("query");
+	identity = iks_new("identity");
+	disco = iks_new("feature");
+	reg = iks_new("feature");
+	commands = iks_new("feature");
+	gateway = iks_new("feature");
+	version = iks_new("feature");
+	vcard = iks_new("feature");
+	search = iks_new("feature");
 
 	resource = aji_find_resource(buddy, pak->from->resource);
-	if (pak->subtype == IKS_TYPE_ERROR) {
-		ast_log(LOG_WARNING, "Received error from a client, turn on jabber debug!\n");
-		return IKS_FILTER_EAT;
-	}
-	if (pak->subtype == IKS_TYPE_RESULT) {
-		if (!resource) {
-			ast_log(LOG_NOTICE,"JABBER: Received client info from %s when not requested.\n", pak->from->full);
-			ASTOBJ_UNREF(client, aji_client_destroy);
-			return IKS_FILTER_EAT;
-		}
-		if (iks_find_with_attrib(pak->query, "feature", "var", "http://www.google.com/xmpp/protocol/voice/v1")) {
-			resource->cap->jingle = 1;
-		} else
-			resource->cap->jingle = 0;
-	} else if (pak->subtype == IKS_TYPE_GET && !(node = iks_find_attrib(pak->query, "node"))) {
-		iks *iq, *query, *identity, *disco, *reg, *commands, *gateway, *version, *vcard, *search;
-
-		iq = iks_new("iq");
-		query = iks_new("query");
-		identity = iks_new("identity");
-		disco = iks_new("feature");
-		reg = iks_new("feature");
-		commands = iks_new("feature");
-		gateway = iks_new("feature");
-		version = iks_new("feature");
-		vcard = iks_new("feature");
-		search = iks_new("feature");
-
-		if (iq && query && identity && disco && reg && commands && gateway && version && vcard && search && client) {
-			iks_insert_attrib(iq, "from", client->user);
-			iks_insert_attrib(iq, "to", pak->from->full);
-			iks_insert_attrib(iq, "id", pak->id);
-			iks_insert_attrib(iq, "type", "result");
-			iks_insert_attrib(query, "xmlns", "http://jabber.org/protocol/disco#info");
-			iks_insert_attrib(identity, "category", "gateway");
-			iks_insert_attrib(identity, "type", "pstn");
-			iks_insert_attrib(identity, "name", "Asterisk The Open Source PBX");
-			iks_insert_attrib(disco, "var", "http://jabber.org/protocol/disco");
-			iks_insert_attrib(reg, "var", "jabber:iq:register");
-			iks_insert_attrib(commands, "var", "http://jabber.org/protocol/commands");
-			iks_insert_attrib(gateway, "var", "jabber:iq:gateway");
-			iks_insert_attrib(version, "var", "jabber:iq:version");
-			iks_insert_attrib(vcard, "var", "vcard-temp");
-			iks_insert_attrib(search, "var", "jabber:iq:search");
-
-			iks_insert_node(iq, query);
-			iks_insert_node(query, identity);
-			iks_insert_node(query, disco);
-			iks_insert_node(query, reg);
-			iks_insert_node(query, commands);
-			iks_insert_node(query, gateway);
-			iks_insert_node(query, version);
-			iks_insert_node(query, vcard);
-			iks_insert_node(query, search);
-			ast_aji_send(client, iq);
-		} else {
-			ast_log(LOG_ERROR, "Out of memory.\n");
-		}
-
-		iks_delete(iq);
-		iks_delete(query);
-		iks_delete(identity);
-		iks_delete(disco);
-		iks_delete(reg);
-		iks_delete(commands);
-		iks_delete(gateway);
-		iks_delete(version);
-		iks_delete(vcard);
-		iks_delete(search);
-
-	} else if (pak->subtype == IKS_TYPE_GET && !strcasecmp(node, "http://jabber.org/protocol/commands")) {
-		iks *iq, *query, *confirm;
-		iq = iks_new("iq");
-		query = iks_new("query");
-		confirm = iks_new("item");
-
-		if (iq && query && confirm && client) {
-			iks_insert_attrib(iq, "from", client->user);
-			iks_insert_attrib(iq, "to", pak->from->full);
-			iks_insert_attrib(iq, "id", pak->id);
-			iks_insert_attrib(iq, "type", "result");
-			iks_insert_attrib(query, "xmlns", "http://jabber.org/protocol/disco#items");
-			iks_insert_attrib(query, "node", "http://jabber.org/protocol/commands");
-			iks_insert_attrib(confirm, "node", "confirmaccount");
-			iks_insert_attrib(confirm, "name", "Confirm AIM account");
-			iks_insert_attrib(confirm, "jid", client->user);
-			iks_insert_node(iq, query);
-			iks_insert_node(query, confirm);
-			ast_aji_send(client, iq);
-		} else {
-			ast_log(LOG_ERROR, "Out of memory.\n");
-		}
-
-		iks_delete(iq);
-		iks_delete(query);
-		iks_delete(confirm);
-
-	} else if (pak->subtype == IKS_TYPE_GET && !strcasecmp(node, "confirmaccount")) {
-		iks *iq, *query, *feature;
-
-		iq = iks_new("iq");
-		query = iks_new("query");
-		feature = iks_new("feature");
-
-		if (iq && query && feature && client) {
-			iks_insert_attrib(iq, "from", client->user);
-			iks_insert_attrib(iq, "to", pak->from->full);
-			iks_insert_attrib(iq, "id", pak->id);
-			iks_insert_attrib(iq, "type", "result");
-			iks_insert_attrib(query, "xmlns", "http://jabber.org/protocol/disco#info");
-			iks_insert_attrib(feature, "var", "http://jabber.org/protocol/commands");
-			iks_insert_node(iq, query);
-			iks_insert_node(query, feature);
-			ast_aji_send(client, iq);
-		} else {
-			ast_log(LOG_ERROR, "Out of memory.\n");
-		}
-
-		iks_delete(iq);
-		iks_delete(query);
-		iks_delete(feature);
-	}
+
+	switch (pak->subtype) {
+		case IKS_TYPE_RESULT:
+			/* Process the response we received from the remote
+			 * client */
+			if (!resource) {
+				ast_log(LOG_NOTICE,"JABBER: Received client info from %s when not requested.\n", pak->from->full);
+				ASTOBJ_UNREF(client, aji_client_destroy);
+				goto safeout;
+			}
+			if (iks_find_with_attrib(pak->query, "feature", "var", "http://www.google.com/xmpp/protocol/voice/v1")) {
+				resource->cap->jingle = 1;
+			} else {
+				resource->cap->jingle = 0;
+			}
+			break;
+		case IKS_TYPE_GET:
+			/* Respond to a disco request we received */
+			if (!iq || !query || !identity || !disco || !reg || !commands || !gateway || !version || !vcard || !search || !client) {
+				ast_log(LOG_ERROR, "Out of memory.\n");
+				goto safeout;	
+			}
+			if (!(node = iks_find_attrib(pak->query, "node"))) {
+				iks_insert_attrib(iq, "from", client->user);
+				iks_insert_attrib(iq, "to", pak->from->full);
+				iks_insert_attrib(iq, "id", pak->id);
+				iks_insert_attrib(iq, "type", "result");
+				iks_insert_attrib(query, "xmlns", "http://jabber.org/protocol/disco#info");
+				iks_insert_attrib(identity, "category", "gateway");
+				iks_insert_attrib(identity, "type", "pstn");
+				iks_insert_attrib(identity, "name", "Asterisk The Open Source PBX");
+				iks_insert_attrib(disco, "var", "http://jabber.org/protocol/disco");
+				iks_insert_attrib(reg, "var", "jabber:iq:register");
+				iks_insert_attrib(commands, "var", "http://jabber.org/protocol/commands");
+				iks_insert_attrib(gateway, "var", "jabber:iq:gateway");
+				iks_insert_attrib(version, "var", "jabber:iq:version");
+				iks_insert_attrib(vcard, "var", "vcard-temp");
+				iks_insert_attrib(search, "var", "jabber:iq:search");
+
+				iks_insert_node(iq, query);
+				iks_insert_node(query, identity);
+				iks_insert_node(query, disco);
+				iks_insert_node(query, reg);
+				iks_insert_node(query, commands);
+				iks_insert_node(query, gateway);
+				iks_insert_node(query, version);
+				iks_insert_node(query, vcard);
+				iks_insert_node(query, search);
+				ast_aji_send(client, iq);
+
+			} else if (!strcasecmp(node, "http://jabber.org/protocol/commands")) {
+				iks *confirm = iks_new("item");
+				if (!confirm) {
+					ast_log(LOG_ERROR, "Out of memory.\n");
+					goto safeout;
+				}
+
+				iks_insert_attrib(iq, "from", client->user);
+				iks_insert_attrib(iq, "to", pak->from->full);
+				iks_insert_attrib(iq, "id", pak->id);
+				iks_insert_attrib(iq, "type", "result");
+				iks_insert_attrib(query, "xmlns", "http://jabber.org/protocol/disco#items");
+				iks_insert_attrib(query, "node", "http://jabber.org/protocol/commands");
+				iks_insert_attrib(confirm, "node", "confirmaccount");
+				iks_insert_attrib(confirm, "name", "Confirm AIM account");
+				iks_insert_attrib(confirm, "jid", client->user);
+				iks_insert_node(iq, query);
+				iks_insert_node(query, confirm);
+				ast_aji_send(client, iq);
+				iks_delete(confirm);
+
+			} else if (!strcasecmp(node, "confirmaccount")) {
+				iks *feature = iks_new("feature");
+				if (!feature) {
+					ast_log(LOG_ERROR, "Out of memory.\n");
+					goto safeout;
+				}
+				
+				iks_insert_attrib(iq, "from", client->user);
+				iks_insert_attrib(iq, "to", pak->from->full);
+				iks_insert_attrib(iq, "id", pak->id);
+				iks_insert_attrib(iq, "type", "result");
+				iks_insert_attrib(query, "xmlns", "http://jabber.org/protocol/disco#info");
+				iks_insert_attrib(feature, "var", "http://jabber.org/protocol/commands");
+				iks_insert_node(iq, query);
+				iks_insert_node(query, feature);
+				ast_aji_send(client, iq);
+				iks_delete(feature);
+			}
+
+			break;
+		case IKS_TYPE_ERROR:
+			ast_log(LOG_WARNING, "Received error from a client, turn on jabber debug!\n");
+			goto safeout;
+			break;
+		default :
+			/* Discard packet silently */
+			break;
+	}
+
+safeout:
+	iks_delete(iq);
+	iks_delete(query);
+	iks_delete(identity);
+	iks_delete(disco);
+	iks_delete(reg);
+	iks_delete(commands);
+	iks_delete(gateway);
+	iks_delete(version);
+	iks_delete(vcard);
+	iks_delete(search);
 
 	ASTOBJ_UNREF(client, aji_client_destroy);
 	return IKS_FILTER_EAT;




More information about the svn-commits mailing list