comparison libpurple/protocols/jabber/si.c @ 27634:636c3b6c9cc7

Use Entity Caps for determining file transfer abilities, if possible. Also, fix a leak of the PurpleXfer.
author Paul Aurich <paul@darkrain42.org>
date Wed, 15 Jul 2009 17:57:08 +0000
parents 73c8e1964eef
children 97eb110550ad
comparison
equal deleted inserted replaced
27633:d5018f25d7a2 27634:636c3b6c9cc7
49 49
50 char *stream_id; 50 char *stream_id;
51 char *iq_id; 51 char *iq_id;
52 52
53 enum { 53 enum {
54 STREAM_METHOD_UNKNOWN = 0, 54 STREAM_METHOD_UNKNOWN = 0,
55 STREAM_METHOD_BYTESTREAMS = 2 << 1, 55 STREAM_METHOD_BYTESTREAMS = 2 << 1,
56 STREAM_METHOD_IBB = 2 << 2, 56 STREAM_METHOD_IBB = 2 << 2,
57 STREAM_METHOD_UNSUPPORTED = 2 << 31 57 STREAM_METHOD_UNSUPPORTED = 2 << 31
58 } stream_method; 58 } stream_method;
59 59
60 GList *streamhosts; 60 GList *streamhosts;
61 PurpleProxyInfo *gpi; 61 PurpleProxyInfo *gpi;
1419 } else { 1419 } else {
1420 char *msg = g_strdup_printf(_("Unable to send file to %s, user does not support file transfers"), who); 1420 char *msg = g_strdup_printf(_("Unable to send file to %s, user does not support file transfers"), who);
1421 purple_notify_error(js->gc, _("File Send Failed"), 1421 purple_notify_error(js->gc, _("File Send Failed"),
1422 _("File Send Failed"), msg); 1422 _("File Send Failed"), msg);
1423 g_free(msg); 1423 g_free(msg);
1424 purple_xfer_cancel_local(xfer);
1424 } 1425 }
1425 } 1426 }
1426 1427
1427 static void resource_select_cancel_cb(PurpleXfer *xfer, PurpleRequestFields *fields) 1428 static void resource_select_cancel_cb(PurpleXfer *xfer, PurpleRequestFields *fields)
1428 { 1429 {
1432 static void do_transfer_send(PurpleXfer *xfer, const char *resource) 1433 static void do_transfer_send(PurpleXfer *xfer, const char *resource)
1433 { 1434 {
1434 JabberSIXfer *jsx = xfer->data; 1435 JabberSIXfer *jsx = xfer->data;
1435 char **who_v = g_strsplit(xfer->who, "/", 2); 1436 char **who_v = g_strsplit(xfer->who, "/", 2);
1436 char *who; 1437 char *who;
1438 JabberBuddy *jb;
1439 JabberBuddyResource *jbr = NULL;
1440
1441 jb = jabber_buddy_find(jsx->js, who_v[0], FALSE);
1442 if (jb) {
1443 jbr = jabber_buddy_find_resource(jb, resource);
1444 }
1437 1445
1438 who = g_strdup_printf("%s/%s", who_v[0], resource); 1446 who = g_strdup_printf("%s/%s", who_v[0], resource);
1439 g_strfreev(who_v); 1447 g_strfreev(who_v);
1440 g_free(xfer->who); 1448 g_free(xfer->who);
1441 xfer->who = who; 1449 xfer->who = who;
1442 jabber_disco_info_do(jsx->js, who, 1450
1443 jabber_si_xfer_send_disco_cb, xfer); 1451 if (jbr) {
1452 char *msg;
1453
1454 if (jabber_resource_has_capability(jbr, XEP_0047_NAMESPACE))
1455 jsx->stream_method |= STREAM_METHOD_IBB;
1456 if (jabber_resource_has_capability(jbr, "http://jabber.org/protocol/si/profile/file-transfer")) {
1457 jabber_si_xfer_send_request(xfer);
1458 return;
1459 }
1460
1461 msg = g_strdup_printf(_("Unable to send file to %s, user does not support file transfers"), who);
1462 purple_notify_error(jsx->js->gc, _("File Send Failed"),
1463 _("File Send Failed"), msg);
1464 g_free(msg);
1465 purple_xfer_cancel_local(xfer);
1466 } else {
1467 jabber_disco_info_do(jsx->js, who,
1468 jabber_si_xfer_send_disco_cb, xfer);
1469 }
1444 } 1470 }
1445 1471
1446 static void resource_select_ok_cb(PurpleXfer *xfer, PurpleRequestFields *fields) 1472 static void resource_select_ok_cb(PurpleXfer *xfer, PurpleRequestFields *fields)
1447 { 1473 {
1448 PurpleRequestField *field = purple_request_fields_get_field(fields, "resource"); 1474 PurpleRequestField *field = purple_request_fields_get_field(fields, "resource");