| 1097 |
1097 |
| 1098 static void |
1098 static void |
| 1099 jabber_si_xfer_ibb_sent_cb(JabberIBBSession *sess) |
1099 jabber_si_xfer_ibb_sent_cb(JabberIBBSession *sess) |
| 1100 { |
1100 { |
| 1101 PurpleXfer *xfer = (PurpleXfer *) jabber_ibb_session_get_user_data(sess); |
1101 PurpleXfer *xfer = (PurpleXfer *) jabber_ibb_session_get_user_data(sess); |
| 1102 gsize remaining = purple_xfer_get_bytes_remaining(xfer); |
1102 goffset remaining = purple_xfer_get_bytes_remaining(xfer); |
| 1103 |
1103 |
| 1104 if (remaining == 0) { |
1104 if (remaining == 0) { |
| 1105 /* close the session */ |
1105 /* close the session */ |
| 1106 jabber_ibb_session_close(sess); |
1106 jabber_ibb_session_close(sess); |
| 1107 purple_xfer_set_completed(xfer, TRUE); |
1107 purple_xfer_set_completed(xfer, TRUE); |
| 1238 xmlnode_set_attrib(si, "profile", NS_SI_FILE_TRANSFER); |
1238 xmlnode_set_attrib(si, "profile", NS_SI_FILE_TRANSFER); |
| 1239 |
1239 |
| 1240 file = xmlnode_new_child(si, "file"); |
1240 file = xmlnode_new_child(si, "file"); |
| 1241 xmlnode_set_namespace(file, NS_SI_FILE_TRANSFER); |
1241 xmlnode_set_namespace(file, NS_SI_FILE_TRANSFER); |
| 1242 xmlnode_set_attrib(file, "name", purple_xfer_get_filename(xfer)); |
1242 xmlnode_set_attrib(file, "name", purple_xfer_get_filename(xfer)); |
| 1243 g_snprintf(buf, sizeof(buf), "%" G_GSIZE_FORMAT, purple_xfer_get_size(xfer)); |
1243 g_snprintf(buf, sizeof(buf), "%" G_GOFFSET_FORMAT, purple_xfer_get_size(xfer)); |
| 1244 xmlnode_set_attrib(file, "size", buf); |
1244 xmlnode_set_attrib(file, "size", buf); |
| 1245 /* maybe later we'll do hash and date attribs */ |
1245 /* maybe later we'll do hash and date attribs */ |
| 1246 |
1246 |
| 1247 #if ENABLE_FT_THUMBNAILS |
1247 #if ENABLE_FT_THUMBNAILS |
| 1248 /* add thumbnail, if appropriate */ |
1248 /* add thumbnail, if appropriate */ |
| 1674 xmlnode *file, *feature, *x, *field, *option, *value; |
1674 xmlnode *file, *feature, *x, *field, *option, *value; |
| 1675 #if ENABLE_FT_THUMBNAILS |
1675 #if ENABLE_FT_THUMBNAILS |
| 1676 xmlnode *thumbnail; |
1676 xmlnode *thumbnail; |
| 1677 #endif |
1677 #endif |
| 1678 const char *stream_id, *filename, *filesize_c, *profile; |
1678 const char *stream_id, *filename, *filesize_c, *profile; |
| 1679 guint64 filesize_64 = 0; |
1679 goffset filesize = 0; |
| 1680 size_t filesize = 0; |
|
| 1681 |
1680 |
| 1682 if(!(profile = xmlnode_get_attrib(si, "profile")) || |
1681 if(!(profile = xmlnode_get_attrib(si, "profile")) || |
| 1683 strcmp(profile, NS_SI_FILE_TRANSFER)) |
1682 strcmp(profile, NS_SI_FILE_TRANSFER)) |
| 1684 return; |
1683 return; |
| 1685 |
1684 |
| 1691 |
1690 |
| 1692 if(!(filename = xmlnode_get_attrib(file, "name"))) |
1691 if(!(filename = xmlnode_get_attrib(file, "name"))) |
| 1693 return; |
1692 return; |
| 1694 |
1693 |
| 1695 if((filesize_c = xmlnode_get_attrib(file, "size"))) |
1694 if((filesize_c = xmlnode_get_attrib(file, "size"))) |
| 1696 filesize_64 = g_ascii_strtoull(filesize_c, NULL, 10); |
1695 filesize = g_ascii_strtoull(filesize_c, NULL, 10); |
| 1697 /* TODO 3.0.0: When the core uses a guint64, this is redundant. |
|
| 1698 * See #8477. |
|
| 1699 */ |
|
| 1700 if (filesize_64 > G_MAXSIZE) { |
|
| 1701 /* Should this pop up a warning? */ |
|
| 1702 purple_debug_warning("jabber", "Unable to transfer file (too large)" |
|
| 1703 " -- see #8477 for more details."); |
|
| 1704 return; |
|
| 1705 } |
|
| 1706 filesize = filesize_64; |
|
| 1707 |
1696 |
| 1708 if(!(feature = xmlnode_get_child(si, "feature"))) |
1697 if(!(feature = xmlnode_get_child(si, "feature"))) |
| 1709 return; |
1698 return; |
| 1710 |
1699 |
| 1711 if(!(x = xmlnode_get_child_with_namespace(feature, "x", "jabber:x:data"))) |
1700 if(!(x = xmlnode_get_child_with_namespace(feature, "x", "jabber:x:data"))) |