pidgin: 815271fc: Use Entity Caps for determining file tra...

darkrain42 at pidgin.im darkrain42 at pidgin.im
Wed Jul 15 22:26:05 EDT 2009


-----------------------------------------------------------------
Revision: 815271fc2711a7da97c54f6d049c6f434632fe38
Ancestor: 026ccc0ef6d947f94ee74ac372e89e13d787e9e5
Author: darkrain42 at pidgin.im
Date: 2009-07-15T17:57:08
Branch: im.pidgin.pidgin
URL: http://d.pidgin.im/viewmtn/revision/info/815271fc2711a7da97c54f6d049c6f434632fe38

Modified files:
        libpurple/protocols/jabber/si.c

ChangeLog: 

Use Entity Caps for determining file transfer abilities, if possible.

Also, fix a leak of the PurpleXfer.

-------------- next part --------------
============================================================
--- libpurple/protocols/jabber/si.c	439ed38edcc5e128fc7deaadbf0e6139d7614020
+++ libpurple/protocols/jabber/si.c	636a46ac9b0bd11397007a979e14d842ed3dfaee
@@ -51,9 +51,9 @@ typedef struct _JabberSIXfer {
 	char *iq_id;
 
 	enum {
-		STREAM_METHOD_UNKNOWN = 0,
+		STREAM_METHOD_UNKNOWN     = 0,
 		STREAM_METHOD_BYTESTREAMS = 2 << 1,
-		STREAM_METHOD_IBB = 2 << 2,
+		STREAM_METHOD_IBB         = 2 << 2,
 		STREAM_METHOD_UNSUPPORTED = 2 << 31
 	} stream_method;
 
@@ -1421,6 +1421,7 @@ static void jabber_si_xfer_send_disco_cb
 		purple_notify_error(js->gc, _("File Send Failed"),
 				_("File Send Failed"), msg);
 		g_free(msg);
+		purple_xfer_cancel_local(xfer);
 	}
 }
 
@@ -1434,13 +1435,38 @@ static void do_transfer_send(PurpleXfer 
 	JabberSIXfer *jsx = xfer->data;
 	char **who_v = g_strsplit(xfer->who, "/", 2);
 	char *who;
+	JabberBuddy *jb;
+	JabberBuddyResource *jbr = NULL;
 
+	jb = jabber_buddy_find(jsx->js, who_v[0], FALSE);
+	if (jb) {
+		jbr = jabber_buddy_find_resource(jb, resource);
+	}
+
 	who = g_strdup_printf("%s/%s", who_v[0], resource);
 	g_strfreev(who_v);
 	g_free(xfer->who);
 	xfer->who = who;
-	jabber_disco_info_do(jsx->js, who,
-			jabber_si_xfer_send_disco_cb, xfer);
+
+	if (jbr) {
+		char *msg;
+
+		if (jabber_resource_has_capability(jbr, XEP_0047_NAMESPACE))
+			jsx->stream_method |= STREAM_METHOD_IBB;
+		if (jabber_resource_has_capability(jbr, "http://jabber.org/protocol/si/profile/file-transfer")) {
+			jabber_si_xfer_send_request(xfer);
+			return;
+		}
+
+		msg = g_strdup_printf(_("Unable to send file to %s, user does not support file transfers"), who);
+		purple_notify_error(jsx->js->gc, _("File Send Failed"),
+				_("File Send Failed"), msg);
+		g_free(msg);
+		purple_xfer_cancel_local(xfer);
+	} else {
+		jabber_disco_info_do(jsx->js, who,
+				jabber_si_xfer_send_disco_cb, xfer);
+	}
 }
 
 static void resource_select_ok_cb(PurpleXfer *xfer, PurpleRequestFields *fields)


More information about the Commits mailing list