diff src/protocols/jabber/iq.c @ 8043:9a6df4d567e0

[gaim-migrate @ 8727] I think I can sneak this stuff in here before we release committer: Tailor Script <tailor@pidgin.im>
author Nathan Walp <nwalp@pidgin.im>
date Sat, 10 Jan 2004 01:48:24 +0000
parents 45f37d7a20dc
children 8f4ce853e685
line wrap: on
line diff
--- a/src/protocols/jabber/iq.c	Fri Jan 09 16:58:33 2004 +0000
+++ b/src/protocols/jabber/iq.c	Sat Jan 10 01:48:24 2004 +0000
@@ -278,6 +278,7 @@
 		SUPPORT_FEATURE("http://jabber.org/protocol/si")
 		SUPPORT_FEATURE("http://jabber.org/protocol/si/profile/file-transfer")
 		*/
+		SUPPORT_FEATURE("http://jabber.org/protocol/xhtml-im")
 
 		jabber_iq_send(iq);
 	} else if(!strcmp(type, "result")) {
@@ -294,24 +295,32 @@
 			jbr = jabber_buddy_find_resource(jb, jid->resource);
 		jabber_id_free(jid);
 
-		if(!jbr)
-			return;
-
 		for(child = query->child; child; child = child->next) {
 			if(child->type != NODE_TYPE_TAG)
 				continue;
 
-			if(!strcmp(child->name, "feature")) {
+			if(!strcmp(child->name, "identity")) {
+				const char *category = xmlnode_get_attrib(child, "category");
+				const char *type = xmlnode_get_attrib(child, "type");
+				if(!category || !type)
+					continue;
+
+				/* we found a groupchat or MUC server, add it to the list */
+				/* XXX: actually check for protocol/muc or gc-1.0 support */
+				if(!strcmp(category, "conference") && !strcmp(type, "text"))
+					js->chat_servers = g_list_append(js->chat_servers, g_strdup(from));
+
+			} else if(!strcmp(child->name, "feature")) {
 				const char *var = xmlnode_get_attrib(child, "var");
 				if(!var)
 					continue;
 
-				if(!strcmp(var, "http://jabber.org/protocol/si"))
+				if(jbr && !strcmp(var, "http://jabber.org/protocol/si"))
 					jbr->capabilities |= JABBER_CAP_SI;
-				else if(!strcmp(var,
+				else if(jbr && !strcmp(var,
 							"http://jabber.org/protocol/si/profile/file-transfer"))
 					jbr->capabilities |= JABBER_CAP_SI_FILE_XFER;
-				else if(!strcmp(var, "http://jabber.org/protocol/bytestreams"))
+				else if(jbr && !strcmp(var, "http://jabber.org/protocol/bytestreams"))
 					jbr->capabilities |= JABBER_CAP_BYTESTREAMS;
 			}
 		}
@@ -333,6 +342,58 @@
 	}
 }
 
+static void
+jabber_iq_disco_server_result_cb(JabberStream *js, xmlnode *packet, gpointer data)
+{
+	xmlnode *query, *child;
+	const char *from = xmlnode_get_attrib(packet, "from");
+	const char *type = xmlnode_get_attrib(packet, "type");
+
+	if(!from || !type)
+		return;
+
+	if(strcmp(from, js->user->domain))
+		return;
+
+	if(strcmp(type, "result"))
+		return;
+
+	while(js->chat_servers) {
+		g_free(js->chat_servers->data);
+		js->chat_servers = g_list_delete_link(js->chat_servers, js->chat_servers);
+	}
+
+	query = xmlnode_get_child(packet, "query");
+
+	for(child = query->child; child; child = child->next) {
+		JabberIq *iq;
+		const char *jid;
+
+		if(child->type != NODE_TYPE_TAG)
+			continue;
+		if(strcmp(child->name, "item"))
+			continue;
+		if(!(jid = xmlnode_get_attrib(child, "jid")))
+			continue;
+
+		iq = jabber_iq_new_query(js, JABBER_IQ_GET, "http://jabber.org/protocol/disco#info");
+		xmlnode_set_attrib(iq->node, "to", jid);
+		jabber_iq_send(iq);
+	}
+}
+
+void jabber_iq_disco_server(JabberStream *js)
+{
+	JabberIq *iq = jabber_iq_new_query(js, JABBER_IQ_GET,
+			"http://jabber.org/protocol/disco#items");
+
+	xmlnode_set_attrib(iq->node, "to", js->user->domain);
+
+	jabber_iq_set_callback(iq, jabber_iq_disco_server_result_cb, NULL);
+	jabber_iq_send(iq);
+}
+
+
 void jabber_iq_parse(JabberStream *js, xmlnode *packet)
 {
 	JabberCallbackData *jcd;
@@ -341,50 +402,51 @@
 	const char *type, *id;
 
 	query = xmlnode_get_child(packet, "query");
-
-	if(query) {
-
-		xmlns = xmlnode_get_attrib(query, "xmlns");
-
-		if(!xmlns)
-			return;
+	type = xmlnode_get_attrib(packet, "type");
 
-		if(!strcmp(xmlns, "jabber:iq:roster")) {
-			jabber_roster_parse(js, packet);
-			return;
-		} else if(!strcmp(xmlns, "jabber:iq:last")) {
-			jabber_iq_handle_last(js, packet);
-			return;
-		} else if(!strcmp(xmlns, "jabber:iq:time")) {
-			jabber_iq_handle_time(js, packet);
-			return;
-		} else if(!strcmp(xmlns, "jabber:iq:version")) {
-			jabber_iq_handle_version(js, packet);
-			return;
-		} else if(!strcmp(xmlns, "jabber:iq:register")) {
-			jabber_register_parse(js, packet);
-			return;
-		} else if(!strcmp(xmlns, "jabber:iq:oob")) {
-			jabber_oob_parse(js, packet);
-			return;
-		} else if(!strcmp(xmlns, "http://jabber.org/protocol/disco#info")) {
-			jabber_disco_info_parse(js, packet);
-			return;
-		} else if(!strcmp(xmlns, "http://jabber.org/protocol/disco#items")) {
-			jabber_disco_items_parse(js, packet);
-			return;
+	if(type && query && (xmlns = xmlnode_get_attrib(query, "xmlns"))) {
+		if(!strcmp(type, "set")) {
+			if(!strcmp(xmlns, "jabber:iq:roster")) {
+				jabber_roster_parse(js, packet);
+				return;
+			} else if(!strcmp(xmlns, "jabber:iq:oob")) {
+				jabber_oob_parse(js, packet);
+				return;
+			}
+		} else if(!strcmp(type, "get")) {
+			if(!strcmp(xmlns, "jabber:iq:last")) {
+				jabber_iq_handle_last(js, packet);
+				return;
+			} else if(!strcmp(xmlns, "jabber:iq:time")) {
+				jabber_iq_handle_time(js, packet);
+				return;
+			} else if(!strcmp(xmlns, "jabber:iq:version")) {
+				jabber_iq_handle_version(js, packet);
+				return;
+			} else if(!strcmp(xmlns, "http://jabber.org/protocol/disco#info")) {
+				jabber_disco_info_parse(js, packet);
+				return;
+			} else if(!strcmp(xmlns, "http://jabber.org/protocol/disco#items")) {
+				jabber_disco_items_parse(js, packet);
+				return;
+			}
+		} else if(!strcmp(type, "result")) {
+			if(!strcmp(xmlns, "jabber:iq:roster")) {
+				jabber_roster_parse(js, packet);
+				return;
+			} else if(!strcmp(xmlns, "jabber:iq:register")) {
+				jabber_register_parse(js, packet);
+				return;
+			} else if(!strcmp(xmlns, "http://jabber.org/protocol/disco#info")) {
+				jabber_disco_info_parse(js, packet);
+				return;
+			}
 		}
-	/*
-	} else if(xmlnode_get_child(packet, "si")) {
-		jabber_si_parse(js, packet);
-		return;
-	*/
 	}
 
 	/* If we got here, no pre-defined handlers got it, lets see if a special
 	 * callback got registered */
 
-	type = xmlnode_get_attrib(packet, "type");
 	id = xmlnode_get_attrib(packet, "id");
 
 	if(type && (!strcmp(type, "result") || !strcmp(type, "error")) && id