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