Mercurial > pidgin.yaz
comparison libpurple/protocols/jabber/si.c @ 32437:ac6353ffa129
merge to upstream
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Mon, 29 Aug 2011 12:28:49 +0900 |
parents | 380f530c3f86 ac88c8fc3f47 |
children | 0f94ec89f0bc |
comparison
equal
deleted
inserted
replaced
32360:9aee8493db7f | 32437:ac6353ffa129 |
---|---|
87 if(!sid || !from) | 87 if(!sid || !from) |
88 return NULL; | 88 return NULL; |
89 | 89 |
90 for(xfers = js->file_transfers; xfers; xfers = xfers->next) { | 90 for(xfers = js->file_transfers; xfers; xfers = xfers->next) { |
91 PurpleXfer *xfer = xfers->data; | 91 PurpleXfer *xfer = xfers->data; |
92 JabberSIXfer *jsx = xfer->data; | 92 JabberSIXfer *jsx = purple_xfer_get_protocol_data(xfer); |
93 if(jsx->stream_id && xfer->who && | 93 if(jsx->stream_id && xfer->who && |
94 !strcmp(jsx->stream_id, sid) && !strcmp(xfer->who, from)) | 94 !strcmp(jsx->stream_id, sid) && !strcmp(xfer->who, from)) |
95 return xfer; | 95 return xfer; |
96 } | 96 } |
97 | 97 |
118 | 118 |
119 static void | 119 static void |
120 jabber_si_bytestreams_connect_cb(gpointer data, gint source, const gchar *error_message) | 120 jabber_si_bytestreams_connect_cb(gpointer data, gint source, const gchar *error_message) |
121 { | 121 { |
122 PurpleXfer *xfer = data; | 122 PurpleXfer *xfer = data; |
123 JabberSIXfer *jsx = xfer->data; | 123 JabberSIXfer *jsx = purple_xfer_get_protocol_data(xfer); |
124 JabberIq *iq; | 124 JabberIq *iq; |
125 xmlnode *query, *su; | 125 xmlnode *query, *su; |
126 JabberBytestreamsStreamhost *streamhost = jsx->streamhosts->data; | 126 JabberBytestreamsStreamhost *streamhost = jsx->streamhosts->data; |
127 | 127 |
128 purple_proxy_info_destroy(jsx->gpi); | 128 purple_proxy_info_destroy(jsx->gpi); |
174 | 174 |
175 static gboolean | 175 static gboolean |
176 connect_timeout_cb(gpointer data) | 176 connect_timeout_cb(gpointer data) |
177 { | 177 { |
178 PurpleXfer *xfer = data; | 178 PurpleXfer *xfer = data; |
179 JabberSIXfer *jsx = xfer->data; | 179 JabberSIXfer *jsx = purple_xfer_get_protocol_data(xfer); |
180 | 180 |
181 purple_debug_info("jabber", "Streamhost connection timeout of %d seconds exceeded.\n", STREAMHOST_CONNECT_TIMEOUT); | 181 purple_debug_info("jabber", "Streamhost connection timeout of %d seconds exceeded.\n", STREAMHOST_CONNECT_TIMEOUT); |
182 | 182 |
183 jsx->connect_timeout = 0; | 183 jsx->connect_timeout = 0; |
184 | 184 |
203 | 203 |
204 static gboolean | 204 static gboolean |
205 jabber_si_bytestreams_ibb_timeout_cb(gpointer data) | 205 jabber_si_bytestreams_ibb_timeout_cb(gpointer data) |
206 { | 206 { |
207 PurpleXfer *xfer = (PurpleXfer *) data; | 207 PurpleXfer *xfer = (PurpleXfer *) data; |
208 JabberSIXfer *jsx = xfer->data; | 208 JabberSIXfer *jsx = purple_xfer_get_protocol_data(xfer); |
209 | 209 |
210 if (jsx && !jsx->ibb_session) { | 210 if (jsx && !jsx->ibb_session) { |
211 purple_debug_info("jabber", | 211 purple_debug_info("jabber", |
212 "jabber_si_bytestreams_ibb_timeout called and IBB session not set " | 212 "jabber_si_bytestreams_ibb_timeout called and IBB session not set " |
213 " up yet, cancel transfer"); | 213 " up yet, cancel transfer"); |
218 return FALSE; | 218 return FALSE; |
219 } | 219 } |
220 | 220 |
221 static void jabber_si_bytestreams_attempt_connect(PurpleXfer *xfer) | 221 static void jabber_si_bytestreams_attempt_connect(PurpleXfer *xfer) |
222 { | 222 { |
223 JabberSIXfer *jsx = xfer->data; | 223 JabberSIXfer *jsx = purple_xfer_get_protocol_data(xfer); |
224 JabberBytestreamsStreamhost *streamhost; | 224 JabberBytestreamsStreamhost *streamhost; |
225 JabberID *dstjid; | 225 JabberID *dstjid; |
226 | 226 |
227 if(!jsx->streamhosts) { | 227 if(!jsx->streamhosts) { |
228 JabberIq *iq = jabber_iq_new(jsx->js, JABBER_IQ_ERROR); | 228 JabberIq *iq = jabber_iq_new(jsx->js, JABBER_IQ_ERROR); |
337 return; | 337 return; |
338 | 338 |
339 if(!(xfer = jabber_si_xfer_find(js, sid, from))) | 339 if(!(xfer = jabber_si_xfer_find(js, sid, from))) |
340 return; | 340 return; |
341 | 341 |
342 jsx = xfer->data; | 342 jsx = purple_xfer_get_protocol_data(xfer); |
343 | 343 |
344 if(!jsx->accepted) | 344 if(!jsx->accepted) |
345 return; | 345 return; |
346 | 346 |
347 if(jsx->iq_id) | 347 if(jsx->iq_id) |
375 static void | 375 static void |
376 jabber_si_xfer_bytestreams_send_read_again_resp_cb(gpointer data, gint source, | 376 jabber_si_xfer_bytestreams_send_read_again_resp_cb(gpointer data, gint source, |
377 PurpleInputCondition cond) | 377 PurpleInputCondition cond) |
378 { | 378 { |
379 PurpleXfer *xfer = data; | 379 PurpleXfer *xfer = data; |
380 JabberSIXfer *jsx = xfer->data; | 380 JabberSIXfer *jsx = purple_xfer_get_protocol_data(xfer); |
381 int len; | 381 int len; |
382 | 382 |
383 len = write(source, jsx->rxqueue + jsx->rxlen, jsx->rxmaxlen - jsx->rxlen); | 383 len = write(source, jsx->rxqueue + jsx->rxlen, jsx->rxmaxlen - jsx->rxlen); |
384 if (len < 0 && errno == EAGAIN) | 384 if (len < 0 && errno == EAGAIN) |
385 return; | 385 return; |
412 static void | 412 static void |
413 jabber_si_xfer_bytestreams_send_read_again_cb(gpointer data, gint source, | 413 jabber_si_xfer_bytestreams_send_read_again_cb(gpointer data, gint source, |
414 PurpleInputCondition cond) | 414 PurpleInputCondition cond) |
415 { | 415 { |
416 PurpleXfer *xfer = data; | 416 PurpleXfer *xfer = data; |
417 JabberSIXfer *jsx = xfer->data; | 417 JabberSIXfer *jsx = purple_xfer_get_protocol_data(xfer); |
418 char buffer[42]; /* 40 for DST.ADDR + 2 bytes for port number*/ | 418 char buffer[42]; /* 40 for DST.ADDR + 2 bytes for port number*/ |
419 int len; | 419 int len; |
420 char *dstaddr, *hash; | 420 char *dstaddr, *hash; |
421 const char *host; | 421 const char *host; |
422 | 422 |
527 static void | 527 static void |
528 jabber_si_xfer_bytestreams_send_read_response_cb(gpointer data, gint source, | 528 jabber_si_xfer_bytestreams_send_read_response_cb(gpointer data, gint source, |
529 PurpleInputCondition cond) | 529 PurpleInputCondition cond) |
530 { | 530 { |
531 PurpleXfer *xfer = data; | 531 PurpleXfer *xfer = data; |
532 JabberSIXfer *jsx = xfer->data; | 532 JabberSIXfer *jsx = purple_xfer_get_protocol_data(xfer); |
533 int len; | 533 int len; |
534 | 534 |
535 len = write(source, jsx->rxqueue + jsx->rxlen, jsx->rxmaxlen - jsx->rxlen); | 535 len = write(source, jsx->rxqueue + jsx->rxlen, jsx->rxmaxlen - jsx->rxlen); |
536 if (len < 0 && errno == EAGAIN) | 536 if (len < 0 && errno == EAGAIN) |
537 return; | 537 return; |
568 static void | 568 static void |
569 jabber_si_xfer_bytestreams_send_read_cb(gpointer data, gint source, | 569 jabber_si_xfer_bytestreams_send_read_cb(gpointer data, gint source, |
570 PurpleInputCondition cond) | 570 PurpleInputCondition cond) |
571 { | 571 { |
572 PurpleXfer *xfer = data; | 572 PurpleXfer *xfer = data; |
573 JabberSIXfer *jsx = xfer->data; | 573 JabberSIXfer *jsx = purple_xfer_get_protocol_data(xfer); |
574 int i; | 574 int i; |
575 int len; | 575 int len; |
576 char buffer[256]; | 576 char buffer[256]; |
577 | 577 |
578 purple_debug_info("jabber", "in jabber_si_xfer_bytestreams_send_read_cb\n"); | 578 purple_debug_info("jabber", "in jabber_si_xfer_bytestreams_send_read_cb\n"); |
680 static void | 680 static void |
681 jabber_si_xfer_bytestreams_send_connected_cb(gpointer data, gint source, | 681 jabber_si_xfer_bytestreams_send_connected_cb(gpointer data, gint source, |
682 PurpleInputCondition cond) | 682 PurpleInputCondition cond) |
683 { | 683 { |
684 PurpleXfer *xfer = data; | 684 PurpleXfer *xfer = data; |
685 JabberSIXfer *jsx = xfer->data; | 685 JabberSIXfer *jsx = purple_xfer_get_protocol_data(xfer); |
686 int acceptfd, flags; | 686 int acceptfd, flags; |
687 | 687 |
688 purple_debug_info("jabber", "in jabber_si_xfer_bytestreams_send_connected_cb\n"); | 688 purple_debug_info("jabber", "in jabber_si_xfer_bytestreams_send_connected_cb\n"); |
689 | 689 |
690 acceptfd = accept(source, NULL, 0); | 690 acceptfd = accept(source, NULL, 0); |
727 if (!g_list_find(js->file_transfers, xfer)) { | 727 if (!g_list_find(js->file_transfers, xfer)) { |
728 purple_debug_error("jabber", "Got bytestreams response for no longer existing xfer (%p)\n", xfer); | 728 purple_debug_error("jabber", "Got bytestreams response for no longer existing xfer (%p)\n", xfer); |
729 return; | 729 return; |
730 } | 730 } |
731 | 731 |
732 jsx = purple_xfer_get_protocol_data(xfer); | |
733 | |
732 /* In the case of a direct file transfer, this is expected to return */ | 734 /* In the case of a direct file transfer, this is expected to return */ |
733 if(!xfer->data) | 735 if(!jsx) |
734 return; | 736 return; |
735 | |
736 jsx = xfer->data; | |
737 | 737 |
738 if(type != JABBER_IQ_RESULT) { | 738 if(type != JABBER_IQ_RESULT) { |
739 purple_debug_info("jabber", | 739 purple_debug_info("jabber", |
740 "jabber_si_xfer_connect_proxy_cb: type = error\n"); | 740 "jabber_si_xfer_connect_proxy_cb: type = error\n"); |
741 /* if IBB is available, open IBB session */ | 741 /* if IBB is available, open IBB session */ |
835 char port[6]; | 835 char port[6]; |
836 GList *tmp; | 836 GList *tmp; |
837 JabberBytestreamsStreamhost *sh, *sh2; | 837 JabberBytestreamsStreamhost *sh, *sh2; |
838 int streamhost_count = 0; | 838 int streamhost_count = 0; |
839 | 839 |
840 jsx = xfer->data; | 840 jsx = purple_xfer_get_protocol_data(xfer); |
841 jsx->listen_data = NULL; | 841 jsx->listen_data = NULL; |
842 | 842 |
843 /* I'm not sure under which conditions this can happen | 843 /* I'm not sure under which conditions this can happen |
844 * (it seems like it shouldn't be possible */ | 844 * (it seems like it shouldn't be possible */ |
845 if (purple_xfer_get_status(xfer) == PURPLE_XFER_STATUS_CANCEL_LOCAL) { | 845 if (purple_xfer_get_status(xfer) == PURPLE_XFER_STATUS_CANCEL_LOCAL) { |
969 JabberSIXfer *jsx; | 969 JabberSIXfer *jsx; |
970 PurpleProxyType proxy_type; | 970 PurpleProxyType proxy_type; |
971 | 971 |
972 purple_xfer_ref(xfer); | 972 purple_xfer_ref(xfer); |
973 | 973 |
974 jsx = xfer->data; | 974 jsx = purple_xfer_get_protocol_data(xfer); |
975 | 975 |
976 /* TODO: This should probably be done with an account option instead of | 976 /* TODO: This should probably be done with an account option instead of |
977 * piggy-backing on the TOR proxy type. */ | 977 * piggy-backing on the TOR proxy type. */ |
978 proxy_type = purple_proxy_info_get_type( | 978 proxy_type = purple_proxy_info_get_type( |
979 purple_proxy_get_setup(purple_connection_get_account(jsx->js->gc))); | 979 purple_proxy_get_setup(purple_connection_get_account(jsx->js->gc))); |
1017 static void | 1017 static void |
1018 jabber_si_xfer_ibb_recv_data_cb(JabberIBBSession *sess, gpointer data, | 1018 jabber_si_xfer_ibb_recv_data_cb(JabberIBBSession *sess, gpointer data, |
1019 gsize size) | 1019 gsize size) |
1020 { | 1020 { |
1021 PurpleXfer *xfer = (PurpleXfer *) jabber_ibb_session_get_user_data(sess); | 1021 PurpleXfer *xfer = (PurpleXfer *) jabber_ibb_session_get_user_data(sess); |
1022 JabberSIXfer *jsx = (JabberSIXfer *) xfer->data; | 1022 JabberSIXfer *jsx = purple_xfer_get_protocol_data(xfer); |
1023 | 1023 |
1024 if (size <= purple_xfer_get_bytes_remaining(xfer)) { | 1024 if (size <= purple_xfer_get_bytes_remaining(xfer)) { |
1025 purple_debug_info("jabber", "about to write %" G_GSIZE_FORMAT " bytes from IBB stream\n", | 1025 purple_debug_info("jabber", "about to write %" G_GSIZE_FORMAT " bytes from IBB stream\n", |
1026 size); | 1026 size); |
1027 purple_circ_buffer_append(jsx->ibb_buffer, data, size); | 1027 purple_circ_buffer_append(jsx->ibb_buffer, data, size); |
1037 } | 1037 } |
1038 | 1038 |
1039 static gssize | 1039 static gssize |
1040 jabber_si_xfer_ibb_read(guchar **out_buffer, PurpleXfer *xfer) | 1040 jabber_si_xfer_ibb_read(guchar **out_buffer, PurpleXfer *xfer) |
1041 { | 1041 { |
1042 JabberSIXfer *jsx = xfer->data; | 1042 JabberSIXfer *jsx = purple_xfer_get_protocol_data(xfer); |
1043 guchar *buffer; | 1043 guchar *buffer; |
1044 gsize size; | 1044 gsize size; |
1045 gsize tmp; | 1045 gsize tmp; |
1046 | 1046 |
1047 size = jsx->ibb_buffer->bufused; | 1047 size = jsx->ibb_buffer->bufused; |
1060 xmlnode *open) | 1060 xmlnode *open) |
1061 { | 1061 { |
1062 const gchar *sid = xmlnode_get_attrib(open, "sid"); | 1062 const gchar *sid = xmlnode_get_attrib(open, "sid"); |
1063 PurpleXfer *xfer = jabber_si_xfer_find(js, sid, who); | 1063 PurpleXfer *xfer = jabber_si_xfer_find(js, sid, who); |
1064 if (xfer) { | 1064 if (xfer) { |
1065 JabberSIXfer *jsx = (JabberSIXfer *) xfer->data; | 1065 JabberSIXfer *jsx = purple_xfer_get_protocol_data(xfer); |
1066 JabberIBBSession *sess = | 1066 JabberIBBSession *sess = |
1067 jabber_ibb_session_create_from_xmlnode(js, who, id, open, xfer); | 1067 jabber_ibb_session_create_from_xmlnode(js, who, id, open, xfer); |
1068 | 1068 |
1069 jabber_si_bytestreams_ibb_timeout_remove(jsx); | 1069 jabber_si_bytestreams_ibb_timeout_remove(jsx); |
1070 | 1070 |
1105 } | 1105 } |
1106 | 1106 |
1107 static gssize | 1107 static gssize |
1108 jabber_si_xfer_ibb_write(const guchar *buffer, size_t len, PurpleXfer *xfer) | 1108 jabber_si_xfer_ibb_write(const guchar *buffer, size_t len, PurpleXfer *xfer) |
1109 { | 1109 { |
1110 JabberSIXfer *jsx = (JabberSIXfer *) xfer->data; | 1110 JabberSIXfer *jsx = purple_xfer_get_protocol_data(xfer); |
1111 JabberIBBSession *sess = jsx->ibb_session; | 1111 JabberIBBSession *sess = jsx->ibb_session; |
1112 gsize packet_size = len < jabber_ibb_session_get_max_data_size(sess) ? | 1112 gsize packet_size = len < jabber_ibb_session_get_max_data_size(sess) ? |
1113 len : jabber_ibb_session_get_max_data_size(sess); | 1113 len : jabber_ibb_session_get_max_data_size(sess); |
1114 | 1114 |
1115 jabber_ibb_session_send_data(sess, buffer, packet_size); | 1115 jabber_ibb_session_send_data(sess, buffer, packet_size); |
1149 } | 1149 } |
1150 | 1150 |
1151 static void | 1151 static void |
1152 jabber_si_xfer_ibb_send_init(JabberStream *js, PurpleXfer *xfer) | 1152 jabber_si_xfer_ibb_send_init(JabberStream *js, PurpleXfer *xfer) |
1153 { | 1153 { |
1154 JabberSIXfer *jsx = (JabberSIXfer *) xfer->data; | 1154 JabberSIXfer *jsx = purple_xfer_get_protocol_data(xfer); |
1155 | 1155 |
1156 jsx->ibb_session = jabber_ibb_session_create(js, jsx->stream_id, | 1156 jsx->ibb_session = jabber_ibb_session_create(js, jsx->stream_id, |
1157 purple_xfer_get_remote_user(xfer), xfer); | 1157 purple_xfer_get_remote_user(xfer), xfer); |
1158 | 1158 |
1159 if (jsx->ibb_session) { | 1159 if (jsx->ibb_session) { |
1206 return; | 1206 return; |
1207 } | 1207 } |
1208 | 1208 |
1209 for(field = xmlnode_get_child(x, "field"); field; field = xmlnode_get_next_twin(field)) { | 1209 for(field = xmlnode_get_child(x, "field"); field; field = xmlnode_get_next_twin(field)) { |
1210 const char *var = xmlnode_get_attrib(field, "var"); | 1210 const char *var = xmlnode_get_attrib(field, "var"); |
1211 JabberSIXfer *jsx = (JabberSIXfer *) xfer->data; | 1211 JabberSIXfer *jsx = purple_xfer_get_protocol_data(xfer); |
1212 | 1212 |
1213 if(var && !strcmp(var, "stream-method")) { | 1213 if(var && !strcmp(var, "stream-method")) { |
1214 if((value = xmlnode_get_child(field, "value"))) { | 1214 if((value = xmlnode_get_child(field, "value"))) { |
1215 char *val = xmlnode_get_data(value); | 1215 char *val = xmlnode_get_data(value); |
1216 if(val && !strcmp(val, NS_BYTESTREAMS)) { | 1216 if(val && !strcmp(val, NS_BYTESTREAMS)) { |
1237 | 1237 |
1238 } | 1238 } |
1239 | 1239 |
1240 static void jabber_si_xfer_send_request(PurpleXfer *xfer) | 1240 static void jabber_si_xfer_send_request(PurpleXfer *xfer) |
1241 { | 1241 { |
1242 JabberSIXfer *jsx = xfer->data; | 1242 JabberSIXfer *jsx = purple_xfer_get_protocol_data(xfer); |
1243 JabberIq *iq; | 1243 JabberIq *iq; |
1244 xmlnode *si, *file, *feature, *x, *field, *option, *value; | 1244 xmlnode *si, *file, *feature, *x, *field, *option, *value; |
1245 char buf[32]; | 1245 char buf[32]; |
1246 gchar *f1 = NULL, *f2 = NULL; | 1246 gchar *f1 = NULL, *f2 = NULL; |
1247 gsize dummy; | 1247 gsize dummy; |
1320 jabber_iq_send(iq); | 1320 jabber_iq_send(iq); |
1321 } | 1321 } |
1322 | 1322 |
1323 static void jabber_si_xfer_free(PurpleXfer *xfer) | 1323 static void jabber_si_xfer_free(PurpleXfer *xfer) |
1324 { | 1324 { |
1325 JabberSIXfer *jsx = xfer->data; | 1325 JabberSIXfer *jsx = purple_xfer_get_protocol_data(xfer); |
1326 | 1326 |
1327 if (jsx) { | 1327 if (jsx) { |
1328 JabberStream *js = jsx->js; | 1328 JabberStream *js = jsx->js; |
1329 | 1329 |
1330 js->file_transfers = g_list_remove(js->file_transfers, xfer); | 1330 js->file_transfers = g_list_remove(js->file_transfers, xfer); |
1367 g_free(jsx->stream_id); | 1367 g_free(jsx->stream_id); |
1368 g_free(jsx->iq_id); | 1368 g_free(jsx->iq_id); |
1369 /* XXX: free other stuff */ | 1369 /* XXX: free other stuff */ |
1370 g_free(jsx->rxqueue); | 1370 g_free(jsx->rxqueue); |
1371 g_free(jsx); | 1371 g_free(jsx); |
1372 xfer->data = NULL; | 1372 purple_xfer_set_protocol_data(xfer, NULL); |
1373 } | 1373 } |
1374 } | 1374 } |
1375 | 1375 |
1376 /* | 1376 /* |
1377 * These four functions should only be called from the PurpleXfer functions | 1377 * These four functions should only be called from the PurpleXfer functions |
1378 * (typically purple_xfer_cancel_(remote|local), purple_xfer_end, or | 1378 * (typically purple_xfer_cancel_(remote|local), purple_xfer_end, or |
1379 * purple_xfer_request_denied. | 1379 * purple_xfer_request_denied. |
1380 */ | 1380 */ |
1381 static void jabber_si_xfer_cancel_send(PurpleXfer *xfer) | 1381 static void jabber_si_xfer_cancel_send(PurpleXfer *xfer) |
1382 { | 1382 { |
1383 JabberSIXfer *jsx = (JabberSIXfer *) xfer->data; | 1383 JabberSIXfer *jsx = purple_xfer_get_protocol_data(xfer); |
1384 | 1384 |
1385 /* if there is an IBB session active, send close on that */ | 1385 /* if there is an IBB session active, send close on that */ |
1386 if (jsx->ibb_session) { | 1386 if (jsx->ibb_session) { |
1387 jabber_ibb_session_close(jsx->ibb_session); | 1387 jabber_ibb_session_close(jsx->ibb_session); |
1388 } | 1388 } |
1391 } | 1391 } |
1392 | 1392 |
1393 | 1393 |
1394 static void jabber_si_xfer_request_denied(PurpleXfer *xfer) | 1394 static void jabber_si_xfer_request_denied(PurpleXfer *xfer) |
1395 { | 1395 { |
1396 JabberSIXfer *jsx = (JabberSIXfer *) xfer->data; | 1396 JabberSIXfer *jsx = purple_xfer_get_protocol_data(xfer); |
1397 JabberStream *js = jsx->js; | 1397 JabberStream *js = jsx->js; |
1398 | 1398 |
1399 /* | 1399 /* |
1400 * TODO: It's probably an error if jsx->iq_id == NULL. g_return_if_fail | 1400 * TODO: It's probably an error if jsx->iq_id == NULL. g_return_if_fail |
1401 * might be warranted. | 1401 * might be warranted. |
1423 } | 1423 } |
1424 | 1424 |
1425 | 1425 |
1426 static void jabber_si_xfer_cancel_recv(PurpleXfer *xfer) | 1426 static void jabber_si_xfer_cancel_recv(PurpleXfer *xfer) |
1427 { | 1427 { |
1428 JabberSIXfer *jsx = (JabberSIXfer *) xfer->data; | 1428 JabberSIXfer *jsx = purple_xfer_get_protocol_data(xfer); |
1429 /* if there is an IBB session active, send close */ | 1429 /* if there is an IBB session active, send close */ |
1430 if (jsx->ibb_session) { | 1430 if (jsx->ibb_session) { |
1431 jabber_ibb_session_close(jsx->ibb_session); | 1431 jabber_ibb_session_close(jsx->ibb_session); |
1432 } | 1432 } |
1433 jabber_si_xfer_free(xfer); | 1433 jabber_si_xfer_free(xfer); |
1443 | 1443 |
1444 static void jabber_si_xfer_send_disco_cb(JabberStream *js, const char *who, | 1444 static void jabber_si_xfer_send_disco_cb(JabberStream *js, const char *who, |
1445 JabberCapabilities capabilities, gpointer data) | 1445 JabberCapabilities capabilities, gpointer data) |
1446 { | 1446 { |
1447 PurpleXfer *xfer = (PurpleXfer *) data; | 1447 PurpleXfer *xfer = (PurpleXfer *) data; |
1448 JabberSIXfer *jsx = (JabberSIXfer *) xfer->data; | 1448 JabberSIXfer *jsx = purple_xfer_get_protocol_data(xfer); |
1449 | 1449 |
1450 if (capabilities & JABBER_CAP_IBB) { | 1450 if (capabilities & JABBER_CAP_IBB) { |
1451 purple_debug_info("jabber", | 1451 purple_debug_info("jabber", |
1452 "jabber_si_xfer_send_disco_cb: remote JID supports IBB\n"); | 1452 "jabber_si_xfer_send_disco_cb: remote JID supports IBB\n"); |
1453 jsx->stream_method |= STREAM_METHOD_IBB; | 1453 jsx->stream_method |= STREAM_METHOD_IBB; |
1469 purple_xfer_cancel_local(xfer); | 1469 purple_xfer_cancel_local(xfer); |
1470 } | 1470 } |
1471 | 1471 |
1472 static void do_transfer_send(PurpleXfer *xfer, const char *resource) | 1472 static void do_transfer_send(PurpleXfer *xfer, const char *resource) |
1473 { | 1473 { |
1474 JabberSIXfer *jsx = xfer->data; | 1474 JabberSIXfer *jsx = purple_xfer_get_protocol_data(xfer); |
1475 char **who_v = g_strsplit(xfer->who, "/", 2); | 1475 char **who_v = g_strsplit(xfer->who, "/", 2); |
1476 char *who; | 1476 char *who; |
1477 JabberBuddy *jb; | 1477 JabberBuddy *jb; |
1478 JabberBuddyResource *jbr = NULL; | 1478 JabberBuddyResource *jbr = NULL; |
1479 | 1479 |
1519 do_transfer_send(xfer, selected_label); | 1519 do_transfer_send(xfer, selected_label); |
1520 } | 1520 } |
1521 | 1521 |
1522 static void jabber_si_xfer_init(PurpleXfer *xfer) | 1522 static void jabber_si_xfer_init(PurpleXfer *xfer) |
1523 { | 1523 { |
1524 JabberSIXfer *jsx = xfer->data; | 1524 JabberSIXfer *jsx = purple_xfer_get_protocol_data(xfer); |
1525 JabberIq *iq; | 1525 JabberIq *iq; |
1526 if(purple_xfer_get_type(xfer) == PURPLE_XFER_SEND) { | 1526 if(purple_xfer_get_type(xfer) == PURPLE_XFER_SEND) { |
1527 JabberBuddy *jb; | 1527 JabberBuddy *jb; |
1528 JabberBuddyResource *jbr = NULL; | 1528 JabberBuddyResource *jbr = NULL; |
1529 char *resource; | 1529 char *resource; |
1652 js = gc->proto_data; | 1652 js = gc->proto_data; |
1653 | 1653 |
1654 xfer = purple_xfer_new(gc->account, PURPLE_XFER_SEND, who); | 1654 xfer = purple_xfer_new(gc->account, PURPLE_XFER_SEND, who); |
1655 if (xfer) | 1655 if (xfer) |
1656 { | 1656 { |
1657 xfer->data = jsx = g_new0(JabberSIXfer, 1); | 1657 jsx = g_new0(JabberSIXfer, 1); |
1658 purple_xfer_set_protocol_data(xfer, jsx); | |
1658 jsx->js = js; | 1659 jsx->js = js; |
1659 jsx->local_streamhost_fd = -1; | 1660 jsx->local_streamhost_fd = -1; |
1660 | 1661 |
1661 jsx->ibb_session = NULL; | 1662 jsx->ibb_session = NULL; |
1662 | 1663 |
1788 jsx->iq_id = g_strdup(id); | 1789 jsx->iq_id = g_strdup(id); |
1789 | 1790 |
1790 xfer = purple_xfer_new(js->gc->account, PURPLE_XFER_RECEIVE, from); | 1791 xfer = purple_xfer_new(js->gc->account, PURPLE_XFER_RECEIVE, from); |
1791 g_return_if_fail(xfer != NULL); | 1792 g_return_if_fail(xfer != NULL); |
1792 | 1793 |
1793 xfer->data = jsx; | 1794 purple_xfer_set_protocol_data(xfer, jsx); |
1794 | 1795 |
1795 purple_xfer_set_filename(xfer, filename); | 1796 purple_xfer_set_filename(xfer, filename); |
1796 if(filesize > 0) | 1797 if(filesize > 0) |
1797 purple_xfer_set_size(xfer, filesize); | 1798 purple_xfer_set_size(xfer, filesize); |
1798 | 1799 |