comparison libpurple/protocols/jabber/si.c @ 29825:885ceb384678

propagate from branch 'im.pidgin.pidgin' (head f23de15cf5cab74ad9b1c2ce72676be0e80e7f23) to branch 'im.pidgin.cpw.malu.ft_thumbnails' (head f7a917c6041411a0428726f88f9200290adde6de)
author Marcus Lundblad <ml@update.uu.se>
date Sun, 21 Mar 2010 19:44:45 +0000
parents 8f442c566ff2 79bb2804a19e
children 93f6a5d48a46
comparison
equal deleted inserted replaced
29626:fce17268c9ec 29825:885ceb384678
30 #include "request.h" 30 #include "request.h"
31 #include "network.h" 31 #include "network.h"
32 #include "notify.h" 32 #include "notify.h"
33 33
34 #include "buddy.h" 34 #include "buddy.h"
35 #include "data.h"
35 #include "disco.h" 36 #include "disco.h"
36 #include "jabber.h" 37 #include "jabber.h"
37 #include "ibb.h" 38 #include "ibb.h"
38 #include "iq.h" 39 #include "iq.h"
39 #include "si.h" 40 #include "si.h"
1246 JabberIq *iq; 1247 JabberIq *iq;
1247 xmlnode *si, *file, *feature, *x, *field, *option, *value; 1248 xmlnode *si, *file, *feature, *x, *field, *option, *value;
1248 char buf[32]; 1249 char buf[32];
1249 1250
1250 xfer->filename = g_path_get_basename(xfer->local_filename); 1251 xfer->filename = g_path_get_basename(xfer->local_filename);
1251 1252 purple_xfer_prepare_thumbnail(xfer, "jpeg,png");
1253
1252 iq = jabber_iq_new(jsx->js, JABBER_IQ_SET); 1254 iq = jabber_iq_new(jsx->js, JABBER_IQ_SET);
1253 xmlnode_set_attrib(iq->node, "to", xfer->who); 1255 xmlnode_set_attrib(iq->node, "to", xfer->who);
1254 si = xmlnode_new_child(iq->node, "si"); 1256 si = xmlnode_new_child(iq->node, "si");
1255 xmlnode_set_namespace(si, "http://jabber.org/protocol/si"); 1257 xmlnode_set_namespace(si, "http://jabber.org/protocol/si");
1256 jsx->stream_id = jabber_get_next_id(jsx->js); 1258 jsx->stream_id = jabber_get_next_id(jsx->js);
1264 xmlnode_set_attrib(file, "name", xfer->filename); 1266 xmlnode_set_attrib(file, "name", xfer->filename);
1265 g_snprintf(buf, sizeof(buf), "%" G_GSIZE_FORMAT, xfer->size); 1267 g_snprintf(buf, sizeof(buf), "%" G_GSIZE_FORMAT, xfer->size);
1266 xmlnode_set_attrib(file, "size", buf); 1268 xmlnode_set_attrib(file, "size", buf);
1267 /* maybe later we'll do hash and date attribs */ 1269 /* maybe later we'll do hash and date attribs */
1268 1270
1271 /* add thumbnail, if appropriate */
1272 if (purple_xfer_get_thumbnail_data(xfer)) {
1273 const gchar *mimetype = purple_xfer_get_thumbnail_mimetype(xfer);
1274 JabberData *thumbnail_data =
1275 jabber_data_create_from_data(purple_xfer_get_thumbnail_data(xfer),
1276 purple_xfer_get_thumbnail_size(xfer), mimetype, TRUE,
1277 jsx->js);
1278 xmlnode *thumbnail = xmlnode_new_child(file, "thumbnail");
1279 xmlnode_set_namespace(thumbnail, NS_THUMBS);
1280 xmlnode_set_attrib(thumbnail, "cid",
1281 jabber_data_get_cid(thumbnail_data));
1282 xmlnode_set_attrib(thumbnail, "mime-type", mimetype);
1283 /* cache data */
1284 jabber_data_associate_local(thumbnail_data, NULL);
1285 }
1286
1269 feature = xmlnode_new_child(si, "feature"); 1287 feature = xmlnode_new_child(si, "feature");
1270 xmlnode_set_namespace(feature, "http://jabber.org/protocol/feature-neg"); 1288 xmlnode_set_namespace(feature, "http://jabber.org/protocol/feature-neg");
1271 x = xmlnode_new_child(feature, "x"); 1289 x = xmlnode_new_child(feature, "x");
1272 xmlnode_set_namespace(x, "jabber:x:data"); 1290 xmlnode_set_namespace(x, "jabber:x:data");
1273 xmlnode_set_attrib(x, "type", "form"); 1291 xmlnode_set_attrib(x, "type", "form");
1642 purple_xfer_request_accepted(xfer, file); 1660 purple_xfer_request_accepted(xfer, file);
1643 else 1661 else
1644 purple_xfer_request(xfer); 1662 purple_xfer_request(xfer);
1645 } 1663 }
1646 1664
1665 static void
1666 jabber_si_thumbnail_cb(JabberStream *js, const char *from, JabberIqType type,
1667 const char *id, xmlnode *packet, gpointer data)
1668 {
1669 PurpleXfer *xfer = (PurpleXfer *) data;
1670 xmlnode *data_element = xmlnode_get_child(packet, "data");
1671 xmlnode *item_not_found = xmlnode_get_child(packet, "item-not-found");
1672
1673 if (data_element) {
1674 JabberData *data = jabber_data_create_from_xml(data_element);
1675
1676 if (data) {
1677 purple_xfer_set_thumbnail(xfer, jabber_data_get_data(data),
1678 jabber_data_get_size(data), jabber_data_get_type(data));
1679 jabber_data_destroy(data);
1680 }
1681 } else if (item_not_found) {
1682 purple_debug_info("jabber",
1683 "Responder didn't recognize requested data\n");
1684 } else {
1685 purple_debug_error("jabber", "Unknown response to data request\n");
1686 }
1687 purple_xfer_request(xfer);
1688 }
1689
1647 void jabber_si_parse(JabberStream *js, const char *from, JabberIqType type, 1690 void jabber_si_parse(JabberStream *js, const char *from, JabberIqType type,
1648 const char *id, xmlnode *si) 1691 const char *id, xmlnode *si)
1649 { 1692 {
1650 JabberSIXfer *jsx; 1693 JabberSIXfer *jsx;
1651 PurpleXfer *xfer; 1694 PurpleXfer *xfer;
1652 xmlnode *file, *feature, *x, *field, *option, *value; 1695 xmlnode *file, *feature, *x, *field, *option, *value, *thumbnail;
1653 const char *stream_id, *filename, *filesize_c, *profile; 1696 const char *stream_id, *filename, *filesize_c, *profile;
1654 size_t filesize = 0; 1697 size_t filesize = 0;
1655 1698
1656 if(!(profile = xmlnode_get_attrib(si, "profile")) || 1699 if(!(profile = xmlnode_get_attrib(si, "profile")) ||
1657 strcmp(profile, "http://jabber.org/protocol/si/profile/file-transfer")) 1700 strcmp(profile, "http://jabber.org/protocol/si/profile/file-transfer"))
1729 1772
1730 purple_xfer_set_init_fnc(xfer, jabber_si_xfer_init); 1773 purple_xfer_set_init_fnc(xfer, jabber_si_xfer_init);
1731 purple_xfer_set_request_denied_fnc(xfer, jabber_si_xfer_request_denied); 1774 purple_xfer_set_request_denied_fnc(xfer, jabber_si_xfer_request_denied);
1732 purple_xfer_set_cancel_recv_fnc(xfer, jabber_si_xfer_cancel_recv); 1775 purple_xfer_set_cancel_recv_fnc(xfer, jabber_si_xfer_cancel_recv);
1733 purple_xfer_set_end_fnc(xfer, jabber_si_xfer_end); 1776 purple_xfer_set_end_fnc(xfer, jabber_si_xfer_end);
1734 1777
1735 js->file_transfers = g_list_append(js->file_transfers, xfer); 1778 js->file_transfers = g_list_append(js->file_transfers, xfer);
1736 1779
1737 purple_xfer_request(xfer); 1780 /* if there is a thumbnail, we should request it... */
1781 if ((thumbnail = xmlnode_get_child_with_namespace(file, "thumbnail",
1782 NS_THUMBS))) {
1783 const char *cid = xmlnode_get_attrib(thumbnail, "cid");
1784 if (cid) {
1785 JabberIq *request =
1786 jabber_iq_new(jsx->js, JABBER_IQ_GET);
1787
1788 purple_debug_info("jabber", "got file thumbnail, request it\n");
1789 xmlnode_insert_child(request->node,
1790 jabber_data_get_xml_request(cid));
1791 xmlnode_set_attrib(request->node, "to",
1792 purple_xfer_get_remote_user(xfer));
1793 jabber_iq_set_callback(request, jabber_si_thumbnail_cb, xfer);
1794 jabber_iq_send(request);
1795 } else {
1796 purple_xfer_request(xfer);
1797 }
1798 } else {
1799 purple_xfer_request(xfer);
1800 }
1738 } 1801 }
1739 1802
1740 void 1803 void
1741 jabber_si_init(void) 1804 jabber_si_init(void)
1742 { 1805 {