comparison libpurple/protocols/jabber/si.c @ 25752:2faa374df334

Remove timeout for IBB when receiving an IBB session open from the initiator This should prevent the timeout firing off if a transfer succeded before the timeout is called
author Marcus Lundblad <ml@update.uu.se>
date Sat, 13 Dec 2008 10:13:12 +0000
parents d7cdbee6d9be
children 151b4054ce40
comparison
equal deleted inserted replaced
25751:d7cdbee6d9be 25752:2faa374df334
64 size_t rxlen; 64 size_t rxlen;
65 gsize rxmaxlen; 65 gsize rxmaxlen;
66 int local_streamhost_fd; 66 int local_streamhost_fd;
67 67
68 JabberIBBSession *ibb_session; 68 JabberIBBSession *ibb_session;
69 guint ibb_timeout_handle;
69 FILE *fp; 70 FILE *fp;
70 } JabberSIXfer; 71 } JabberSIXfer;
71 72
72 /* some forward declarations */ 73 /* some forward declarations */
73 static void jabber_si_xfer_ibb_send_init(JabberStream *js, PurpleXfer *xfer); 74 static void jabber_si_xfer_ibb_send_init(JabberStream *js, PurpleXfer *xfer);
183 jabber_si_bytestreams_connect_cb(xfer, -1, "Timeout Exceeded."); 184 jabber_si_bytestreams_connect_cb(xfer, -1, "Timeout Exceeded.");
184 185
185 return FALSE; 186 return FALSE;
186 } 187 }
187 188
189 static void
190 jabber_si_bytestreams_ibb_timeout_remove(JabberSIXfer *jsx)
191 {
192 if (jsx->ibb_timeout_handle) {
193 purple_timeout_remove(jsx->ibb_timeout_handle);
194 jsx->ibb_timeout_handle = 0;
195 }
196 }
197
188 static gboolean 198 static gboolean
189 jabber_si_bytestreams_ibb_timeout_cb(gpointer data) 199 jabber_si_bytestreams_ibb_timeout_cb(gpointer data)
190 { 200 {
191 PurpleXfer *xfer = (PurpleXfer *) data; 201 PurpleXfer *xfer = (PurpleXfer *) data;
192 JabberSIXfer *jsx = xfer->data; 202 JabberSIXfer *jsx = xfer->data;
193 203
194 if (!jsx->ibb_session) { 204 if (jsx && !jsx->ibb_session) {
195 purple_debug_info("jabber", 205 purple_debug_info("jabber",
196 "jabber_si_bytestreams_ibb_timeout called and IBB session not set " 206 "jabber_si_bytestreams_ibb_timeout called and IBB session not set "
197 " up yet, cancel transfer"); 207 " up yet, cancel transfer");
198 purple_xfer_cancel_local(xfer); 208 purple_xfer_cancel_local(xfer);
209 jabber_si_bytestreams_ibb_timeout_remove(jsx);
199 } 210 }
200 211
201 return FALSE; 212 return FALSE;
202 } 213 }
203 214
235 if (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND 246 if (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND
236 && !jsx->ibb_session) { 247 && !jsx->ibb_session) {
237 jabber_si_xfer_ibb_send_init(jsx->js, xfer); 248 jabber_si_xfer_ibb_send_init(jsx->js, xfer);
238 } else { 249 } else {
239 /* setup a timeout to cancel waiting for IBB open */ 250 /* setup a timeout to cancel waiting for IBB open */
240 purple_timeout_add_seconds(30, 251 jsx->ibb_timeout_handle = purple_timeout_add_seconds(30,
241 jabber_si_bytestreams_ibb_timeout_cb, xfer); 252 jabber_si_bytestreams_ibb_timeout_cb, xfer);
242 } 253 }
243 /* if we are the receiver, just wait for IBB open, callback is 254 /* if we are the receiver, just wait for IBB open, callback is
244 already set up... */ 255 already set up... */
245 } else { 256 } else {
713 the bytestream proxy ourselves when receiving this <iq/> */ 724 the bytestream proxy ourselves when receiving this <iq/> */
714 if (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND 725 if (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND
715 && !jsx->ibb_session) { 726 && !jsx->ibb_session) {
716 jabber_si_xfer_ibb_send_init(js, xfer); 727 jabber_si_xfer_ibb_send_init(js, xfer);
717 } else { 728 } else {
718 purple_timeout_add_seconds(30, 729 jsx->ibb_timeout_handle = purple_timeout_add_seconds(30,
719 jabber_si_bytestreams_ibb_timeout_cb, xfer); 730 jabber_si_bytestreams_ibb_timeout_cb, xfer);
720 } 731 }
721 /* if we are receiver, just wait for IBB open stanza, callback 732 /* if we are receiver, just wait for IBB open stanza, callback
722 is already set up */ 733 is already set up */
723 } else { 734 } else {
755 purple_debug_info("jabber", 766 purple_debug_info("jabber",
756 "jabber_si_connect_proxy_cb: trying to revert to IBB\n"); 767 "jabber_si_connect_proxy_cb: trying to revert to IBB\n");
757 if (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND) { 768 if (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND) {
758 jabber_si_xfer_ibb_send_init(jsx->js, xfer); 769 jabber_si_xfer_ibb_send_init(jsx->js, xfer);
759 } else { 770 } else {
760 purple_timeout_add_seconds(30, 771 jsx->ibb_timeout_handle = purple_timeout_add_seconds(30,
761 jabber_si_bytestreams_ibb_timeout_cb, xfer); 772 jabber_si_bytestreams_ibb_timeout_cb, xfer);
762 } 773 }
763 /* if we are the receiver, we are already set up...*/ 774 /* if we are the receiver, we are already set up...*/
764 } else { 775 } else {
765 purple_debug_info("jabber", 776 purple_debug_info("jabber",
899 "jabber_si_xfer_bytestreams_listen_cb: trying to revert to IBB\n"); 910 "jabber_si_xfer_bytestreams_listen_cb: trying to revert to IBB\n");
900 if (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND) { 911 if (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND) {
901 /* if we are the sender, init the IBB session... */ 912 /* if we are the sender, init the IBB session... */
902 jabber_si_xfer_ibb_send_init(jsx->js, xfer); 913 jabber_si_xfer_ibb_send_init(jsx->js, xfer);
903 } else { 914 } else {
904 purple_timeout_add_seconds(30, 915 jsx->ibb_timeout_handle = purple_timeout_add_seconds(30,
905 jabber_si_bytestreams_ibb_timeout_cb, xfer); 916 jabber_si_bytestreams_ibb_timeout_cb, xfer);
906 } 917 }
907 /* if we are the receiver, we should just wait... the IBB open 918 /* if we are the receiver, we should just wait... the IBB open
908 handler has already been set up... */ 919 handler has already been set up... */
909 } else { 920 } else {
1048 purple_debug_error("jabber", "failed to create IBB session\n"); 1059 purple_debug_error("jabber", "failed to create IBB session\n");
1049 jabber_si_xfer_cancel_recv(xfer); 1060 jabber_si_xfer_cancel_recv(xfer);
1050 purple_xfer_end(xfer); 1061 purple_xfer_end(xfer);
1051 return FALSE; 1062 return FALSE;
1052 } 1063 }
1064
1065 jabber_si_bytestreams_ibb_timeout_remove(jsx);
1053 } else { 1066 } else {
1054 /* we got an IBB <open/> for an unknown file transfer, pass along... */ 1067 /* we got an IBB <open/> for an unknown file transfer, pass along... */
1055 purple_debug_info("jabber", 1068 purple_debug_info("jabber",
1056 "IBB open did not match any SI file transfer\n"); 1069 "IBB open did not match any SI file transfer\n");
1057 return FALSE; 1070 return FALSE;
1283 jabber_iq_remove_callback_by_id(js, jsx->iq_id); 1296 jabber_iq_remove_callback_by_id(js, jsx->iq_id);
1284 if (jsx->local_streamhost_fd >= 0) 1297 if (jsx->local_streamhost_fd >= 0)
1285 close(jsx->local_streamhost_fd); 1298 close(jsx->local_streamhost_fd);
1286 if (jsx->connect_timeout > 0) 1299 if (jsx->connect_timeout > 0)
1287 purple_timeout_remove(jsx->connect_timeout); 1300 purple_timeout_remove(jsx->connect_timeout);
1288 1301 if (jsx->ibb_timeout_handle > 0)
1302 purple_timeout_remove(jsx->ibb_timeout_handle);
1303
1289 if (jsx->streamhosts) { 1304 if (jsx->streamhosts) {
1290 g_list_foreach(jsx->streamhosts, jabber_si_free_streamhost, NULL); 1305 g_list_foreach(jsx->streamhosts, jabber_si_free_streamhost, NULL);
1291 g_list_free(jsx->streamhosts); 1306 g_list_free(jsx->streamhosts);
1292 } 1307 }
1293 1308