diff src/protocols/jabber/chat.c @ 7955:119a22025818

[gaim-migrate @ 8630] fun jabber stuff, which isn't done yet. mostly harmless, and committing this now makes the next commit that much easier for a lazy person such as myself to type. committer: Tailor Script <tailor@pidgin.im>
author Nathan Walp <nwalp@pidgin.im>
date Mon, 29 Dec 2003 08:59:22 +0000
parents 68900f9cb540
children 6fca0d9cc98b
line wrap: on
line diff
--- a/src/protocols/jabber/chat.c	Mon Dec 29 07:19:55 2003 +0000
+++ b/src/protocols/jabber/chat.c	Mon Dec 29 08:59:22 2003 +0000
@@ -367,6 +367,12 @@
 	if(!chat)
 		return;
 
+	if(!chat->muc) {
+		gaim_notify_error(chat->js->gc, _("Room Configuration Error"), _("Room Configuration Error"),
+				_("This room is not capable of being configured"));
+		return;
+	}
+
 	iq = jabber_iq_new_query(chat->js, JABBER_IQ_SET,
 			"http://jabber.org/protocol/muc#owner");
 	query = xmlnode_get_child(iq->node, "query");
@@ -403,3 +409,126 @@
 
 	g_free(room_jid);
 }
+
+static void jabber_chat_register_x_data_result_cb(JabberStream *js, xmlnode *packet, gpointer data)
+{
+	const char *type = xmlnode_get_attrib(packet, "type");
+
+	if(type && !strcmp(type, "error")) {
+		/* XXX: handle an error (you'll get a 409 if the nick is already registered) */
+	}
+}
+
+static void jabber_chat_register_x_data_cb(JabberStream *js, xmlnode *result, gpointer data)
+{
+	JabberChat *chat = data;
+	xmlnode *query;
+	JabberIq *iq;
+	char *to = g_strdup_printf("%s@%s", chat->room, chat->server);
+
+	iq = jabber_iq_new_query(js, JABBER_IQ_SET, "jabber:iq:register");
+	xmlnode_set_attrib(iq->node, "to", to);
+	g_free(to);
+
+	query = xmlnode_get_child(iq->node, "query");
+
+	xmlnode_insert_child(query, result);
+
+	jabber_iq_set_callback(iq, jabber_chat_register_x_data_result_cb, NULL);
+
+	jabber_iq_send(iq);
+}
+
+static void jabber_chat_register_cb(JabberStream *js, xmlnode *packet, gpointer data)
+{
+	xmlnode *query, *x;
+	const char *type = xmlnode_get_attrib(packet, "type");
+	const char *from = xmlnode_get_attrib(packet, "from");
+	char *msg;
+	JabberChat *chat;
+	JabberID *jid;
+
+	if(!type || !from)
+		return;
+
+	if(!strcmp(type, "result")) {
+		jid = jabber_id_new(from);
+
+		if(!jid)
+			return;
+
+		chat = jabber_chat_find(js, jid->node, jid->domain);
+		jabber_id_free(jid);
+
+		if(!chat)
+			return;
+
+		if(!(query = xmlnode_get_child(packet, "query")))
+			return;
+
+		for(x = query->child; x; x = x->next) {
+			const char *xmlns;
+			if(strcmp(x->name, "x"))
+				continue;
+
+			if(!(xmlns = xmlnode_get_attrib(x, "xmlns")))
+				continue;
+
+			if(!strcmp(xmlns, "jabber:x:data")) {
+				jabber_x_data_request(js, x, jabber_chat_register_x_data_cb, chat);
+				return;
+			}
+		}
+	} else if(!strcmp(type, "error")) {
+		/* XXX: how many places is this code duplicated?  Fix it, immediately */
+		xmlnode *errnode = xmlnode_get_child(packet, "error");
+		const char *code = NULL;
+		char *code_txt = NULL;
+		char *msg;
+		char *text = NULL;
+
+		if(errnode) {
+			code = xmlnode_get_attrib(errnode, "code");
+			text = xmlnode_get_data(errnode);
+		}
+
+		if(code)
+			code_txt = g_strdup_printf(_(" (Code %s)"), code);
+
+		msg = g_strdup_printf("%s%s", text ? text : "", code_txt ? code_txt : "");
+		gaim_notify_error(js->gc, _("Registration error"), _("Registration error"), msg);
+
+		g_free(msg);
+		if(code_txt)
+			g_free(code_txt);
+
+		return;
+	}
+
+	msg = g_strdup_printf("Unable to configure room %s", from);
+
+	gaim_notify_info(js->gc, _("Unable to configure"), _("Unable to configure"), msg);
+	g_free(msg);
+
+}
+
+void jabber_chat_register(JabberChat *chat)
+{
+	JabberIq *iq;
+	char *room_jid;
+
+	if(!chat)
+		return;
+
+	room_jid = g_strdup_printf("%s@%s", chat->room, chat->server);
+
+	iq = jabber_iq_new_query(chat->js, JABBER_IQ_GET, "jabber:iq:register");
+	xmlnode_set_attrib(iq->node, "to", room_jid);
+	g_free(room_jid);
+
+	jabber_iq_set_callback(iq, jabber_chat_register_cb, NULL);
+
+	jabber_iq_send(iq);
+}
+
+