Mercurial > pidgin
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 { |