Mercurial > pidgin.yaz
comparison libpurple/protocols/yahoo/yahoo_filexfer.c @ 32692:0f94ec89f0bc
merged from im.pidgin.pidgin
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Mon, 26 Sep 2011 14:57:21 +0900 |
parents | ac6353ffa129 d2ef8926b960 |
children | 4a34689eeb33 |
comparison
equal
deleted
inserted
replaced
32438:55e678325bda | 32692:0f94ec89f0bc |
---|---|
41 gchar *path; | 41 gchar *path; |
42 int port; | 42 int port; |
43 PurpleConnection *gc; | 43 PurpleConnection *gc; |
44 long expires; | 44 long expires; |
45 gboolean started; | 45 gboolean started; |
46 gchar *txbuf; | 46 guchar *txbuf; |
47 gsize txbuflen; | 47 gsize txbuflen; |
48 gsize txbuf_written; | 48 gsize txbuf_written; |
49 guint tx_handler; | 49 guint tx_handler; |
50 gchar *rxqueue; | 50 gchar *rxqueue; |
51 guint rxlen; | 51 guint rxlen; |
83 YahooData *yd; | 83 YahooData *yd; |
84 PurpleXfer *xfer; | 84 PurpleXfer *xfer; |
85 GSList *l; | 85 GSList *l; |
86 | 86 |
87 gc = xd->gc; | 87 gc = xd->gc; |
88 yd = gc->proto_data; | 88 yd = purple_connection_get_protocol_data(gc); |
89 | 89 |
90 /* remove entry from map */ | 90 /* remove entry from map */ |
91 if(xd->xfer_peer_idstring) { | 91 if(xd->xfer_peer_idstring) { |
92 xfer = g_hash_table_lookup(yd->xfer_peer_idstring_map, xd->xfer_peer_idstring); | 92 xfer = g_hash_table_lookup(yd->xfer_peer_idstring_map, xd->xfer_peer_idstring); |
93 if(xfer) | 93 if(xfer) |
118 | 118 |
119 static void yahoo_receivefile_send_cb(gpointer data, gint source, PurpleInputCondition condition) | 119 static void yahoo_receivefile_send_cb(gpointer data, gint source, PurpleInputCondition condition) |
120 { | 120 { |
121 PurpleXfer *xfer; | 121 PurpleXfer *xfer; |
122 struct yahoo_xfer_data *xd; | 122 struct yahoo_xfer_data *xd; |
123 int remaining, written; | 123 gssize remaining, written; |
124 | 124 |
125 xfer = data; | 125 xfer = data; |
126 xd = purple_xfer_get_protocol_data(xfer); | 126 xd = purple_xfer_get_protocol_data(xfer); |
127 | 127 |
128 remaining = xd->txbuflen - xd->txbuf_written; | 128 remaining = xd->txbuflen - xd->txbuf_written; |
129 written = write(xfer->fd, xd->txbuf + xd->txbuf_written, remaining); | 129 written = purple_xfer_write(xfer, xd->txbuf + xd->txbuf_written, remaining); |
130 | 130 |
131 if (written < 0 && errno == EAGAIN) | 131 if (written < 0 && errno == EAGAIN) |
132 written = 0; | 132 written = 0; |
133 else if (written <= 0) { | 133 else if (written <= 0) { |
134 purple_debug_error("yahoo", "Unable to write in order to start ft errno = %d\n", errno); | 134 purple_debug_error("yahoo", "Unable to write in order to start ft errno = %d\n", errno); |
162 return; | 162 return; |
163 if (!(xd = purple_xfer_get_protocol_data(xfer))) | 163 if (!(xd = purple_xfer_get_protocol_data(xfer))) |
164 return; | 164 return; |
165 if ((source < 0) || (xd->path == NULL) || (xd->host == NULL)) { | 165 if ((source < 0) || (xd->path == NULL) || (xd->host == NULL)) { |
166 purple_xfer_error(PURPLE_XFER_RECEIVE, purple_xfer_get_account(xfer), | 166 purple_xfer_error(PURPLE_XFER_RECEIVE, purple_xfer_get_account(xfer), |
167 xfer->who, _("Unable to connect.")); | 167 purple_xfer_get_remote_user(xfer), _("Unable to connect.")); |
168 purple_xfer_cancel_remote(xfer); | 168 purple_xfer_cancel_remote(xfer); |
169 return; | 169 return; |
170 } | 170 } |
171 | 171 |
172 xfer->fd = source; | 172 xfer->fd = source; |
173 | 173 |
174 /* The first time we get here, assemble the tx buffer */ | 174 /* The first time we get here, assemble the tx buffer */ |
175 if (xd->txbuflen == 0) { | 175 if (xd->txbuflen == 0) { |
176 xd->txbuf = g_strdup_printf("GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n", | 176 gchar *header = g_strdup_printf("GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n", |
177 xd->path, xd->host); | 177 xd->path, xd->host); |
178 xd->txbuflen = strlen(xd->txbuf); | 178 xd->txbuf = (guchar*) header; |
179 xd->txbuflen = strlen(header); | |
179 xd->txbuf_written = 0; | 180 xd->txbuf_written = 0; |
180 } | 181 } |
181 | 182 |
182 if (!xd->tx_handler) | 183 if (!xd->tx_handler) |
183 { | 184 { |
189 | 190 |
190 static void yahoo_sendfile_send_cb(gpointer data, gint source, PurpleInputCondition condition) | 191 static void yahoo_sendfile_send_cb(gpointer data, gint source, PurpleInputCondition condition) |
191 { | 192 { |
192 PurpleXfer *xfer; | 193 PurpleXfer *xfer; |
193 struct yahoo_xfer_data *xd; | 194 struct yahoo_xfer_data *xd; |
194 int written, remaining; | 195 gssize written, remaining; |
195 | 196 |
196 xfer = data; | 197 xfer = data; |
197 xd = purple_xfer_get_protocol_data(xfer); | 198 xd = purple_xfer_get_protocol_data(xfer); |
198 | 199 |
199 remaining = xd->txbuflen - xd->txbuf_written; | 200 remaining = xd->txbuflen - xd->txbuf_written; |
200 written = write(xfer->fd, xd->txbuf + xd->txbuf_written, remaining); | 201 written = purple_xfer_write(xfer, xd->txbuf + xd->txbuf_written, remaining); |
201 | 202 |
202 if (written < 0 && errno == EAGAIN) | 203 if (written < 0 && errno == EAGAIN) |
203 written = 0; | 204 written = 0; |
204 else if (written <= 0) { | 205 else if (written <= 0) { |
205 purple_debug_error("yahoo", "Unable to write in order to start ft errno = %d\n", errno); | 206 purple_debug_error("yahoo", "Unable to write in order to start ft errno = %d\n", errno); |
243 if (!(xd = purple_xfer_get_protocol_data(xfer))) | 244 if (!(xd = purple_xfer_get_protocol_data(xfer))) |
244 return; | 245 return; |
245 | 246 |
246 if (source < 0) { | 247 if (source < 0) { |
247 purple_xfer_error(PURPLE_XFER_RECEIVE, purple_xfer_get_account(xfer), | 248 purple_xfer_error(PURPLE_XFER_RECEIVE, purple_xfer_get_account(xfer), |
248 xfer->who, _("Unable to connect.")); | 249 purple_xfer_get_remote_user(xfer), _("Unable to connect.")); |
249 purple_xfer_cancel_remote(xfer); | 250 purple_xfer_cancel_remote(xfer); |
250 return; | 251 return; |
251 } | 252 } |
252 | 253 |
253 xfer->fd = source; | 254 xfer->fd = source; |
254 | 255 |
255 /* Assemble the tx buffer */ | 256 /* Assemble the tx buffer */ |
256 gc = xd->gc; | 257 gc = xd->gc; |
257 account = purple_connection_get_account(gc); | 258 account = purple_connection_get_account(gc); |
258 yd = gc->proto_data; | 259 yd = purple_connection_get_protocol_data(gc); |
259 | 260 |
260 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANSFER, | 261 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANSFER, |
261 YAHOO_STATUS_AVAILABLE, yd->session_id); | 262 YAHOO_STATUS_AVAILABLE, yd->session_id); |
262 | 263 |
263 size = g_strdup_printf("%" G_GSIZE_FORMAT, purple_xfer_get_size(xfer)); | 264 size = g_strdup_printf("%" G_GSIZE_FORMAT, purple_xfer_get_size(xfer)); |
267 filename = botch_utf(tmp, strlen(tmp), &dummy); | 268 filename = botch_utf(tmp, strlen(tmp), &dummy); |
268 g_free(tmp); | 269 g_free(tmp); |
269 encoded_filename = yahoo_string_encode(gc, filename, NULL); // this takes utf8 as input. --yaz | 270 encoded_filename = yahoo_string_encode(gc, filename, NULL); // this takes utf8 as input. --yaz |
270 | 271 |
271 yahoo_packet_hash(pkt, "sssss", 0, purple_connection_get_display_name(gc), | 272 yahoo_packet_hash(pkt, "sssss", 0, purple_connection_get_display_name(gc), |
272 5, xfer->who, 14, "", 27, encoded_filename, 28, size); | 273 5, purple_xfer_get_remote_user(xfer), 14, "", 27, encoded_filename, 28, size); |
273 g_free(size); | 274 g_free(size); |
274 g_free(encoded_filename); | 275 g_free(encoded_filename); |
275 g_free(filename); | 276 g_free(filename); |
276 | 277 |
277 content_length = YAHOO_PACKET_HDRLEN + yahoo_packet_length(pkt); | 278 content_length = YAHOO_PACKET_HDRLEN + yahoo_packet_length(pkt); |
318 PurpleAccount *account; | 319 PurpleAccount *account; |
319 YahooData *yd; | 320 YahooData *yd; |
320 | 321 |
321 xfer_data = purple_xfer_get_protocol_data(xfer); | 322 xfer_data = purple_xfer_get_protocol_data(xfer); |
322 gc = xfer_data->gc; | 323 gc = xfer_data->gc; |
323 yd = gc->proto_data; | 324 yd = purple_connection_get_protocol_data(gc); |
324 account = purple_connection_get_account(gc); | 325 account = purple_connection_get_account(gc); |
325 | 326 |
326 if (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND) { | 327 if (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND) { |
327 if (yd->jp) { | 328 if (yd->jp) { |
328 if (purple_proxy_connect(gc, account, purple_account_get_string(account, "xferjp_host", YAHOOJP_XFER_HOST), | 329 if (purple_proxy_connect(gc, account, purple_account_get_string(account, "xferjp_host", YAHOOJP_XFER_HOST), |
362 YahooData *yd; | 363 YahooData *yd; |
363 struct yahoo_packet *pkt; | 364 struct yahoo_packet *pkt; |
364 | 365 |
365 xfer_data = purple_xfer_get_protocol_data(xfer); | 366 xfer_data = purple_xfer_get_protocol_data(xfer); |
366 gc = xfer_data->gc; | 367 gc = xfer_data->gc; |
367 yd = gc->proto_data; | 368 yd = purple_connection_get_protocol_data(gc); |
368 account = purple_connection_get_account(gc); | 369 account = purple_connection_get_account(gc); |
369 | 370 |
370 if (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND) { | 371 if (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND) { |
371 gchar *filename; | 372 gchar *filename; |
372 filename = g_path_get_basename(purple_xfer_get_local_filename(xfer)); | 373 filename = g_path_get_basename(purple_xfer_get_local_filename(xfer)); |
373 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15, | 374 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15, |
374 YAHOO_STATUS_AVAILABLE, | 375 YAHOO_STATUS_AVAILABLE, |
375 yd->session_id); | 376 yd->session_id); |
376 yahoo_packet_hash(pkt, "sssiiiisiii", | 377 yahoo_packet_hash(pkt, "sssiiiisiii", |
377 1, purple_normalize(account, purple_account_get_username(account)), | 378 1, purple_normalize(account, purple_account_get_username(account)), |
378 5, xfer->who, | 379 5, purple_xfer_get_remote_user(xfer), |
379 265, xfer_data->xfer_peer_idstring, | 380 265, xfer_data->xfer_peer_idstring, |
380 222, 1, | 381 222, 1, |
381 266, 1, | 382 266, 1, |
382 302, 268, | 383 302, 268, |
383 300, 268, | 384 300, 268, |
384 27, filename, | 385 27, filename, |
385 28, xfer->size, | 386 28, purple_xfer_get_size(xfer), |
386 301, 268, | 387 301, 268, |
387 303, 268); | 388 303, 268); |
388 g_free(filename); | 389 g_free(filename); |
389 } else { | 390 } else { |
390 if(xfer_data->firstoflist == TRUE) { | 391 if(xfer_data->firstoflist == TRUE) { |
391 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15, | 392 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15, |
392 YAHOO_STATUS_AVAILABLE, yd->session_id); | 393 YAHOO_STATUS_AVAILABLE, yd->session_id); |
393 | 394 |
394 yahoo_packet_hash(pkt, "sssi", | 395 yahoo_packet_hash(pkt, "sssi", |
395 1, purple_normalize(account, purple_account_get_username(account)), | 396 1, purple_normalize(account, purple_account_get_username(account)), |
396 5, xfer->who, | 397 5, purple_xfer_get_remote_user(xfer), |
397 265, xfer_data->xfer_peer_idstring, | 398 265, xfer_data->xfer_peer_idstring, |
398 222, 3); | 399 222, 3); |
399 } else { | 400 } else { |
400 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_ACC_15, | 401 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_ACC_15, |
401 YAHOO_STATUS_AVAILABLE, yd->session_id); | 402 YAHOO_STATUS_AVAILABLE, yd->session_id); |
402 | 403 |
403 yahoo_packet_hash(pkt, "sssi", | 404 yahoo_packet_hash(pkt, "sssi", |
404 1, purple_normalize(account, purple_account_get_username(account)), | 405 1, purple_normalize(account, purple_account_get_username(account)), |
405 5, xfer->who, | 406 5, purple_xfer_get_remote_user(xfer), |
406 265, xfer_data->xfer_peer_idstring, | 407 265, xfer_data->xfer_peer_idstring, |
407 271, 1); | 408 271, 1); |
408 } | 409 } |
409 } | 410 } |
410 yahoo_packet_send_and_free(pkt, yd); | 411 yahoo_packet_send_and_free(pkt, yd); |
529 PurpleAccount *account; | 530 PurpleAccount *account; |
530 YahooData *yd; | 531 YahooData *yd; |
531 struct yahoo_packet *pkt; | 532 struct yahoo_packet *pkt; |
532 | 533 |
533 gc = xfer_data->gc; | 534 gc = xfer_data->gc; |
534 yd = gc->proto_data; | 535 yd = purple_connection_get_protocol_data(gc); |
535 account = purple_connection_get_account(gc); | 536 account = purple_connection_get_account(gc); |
536 if(xfer_data->xfer_idstring_for_relay) /* hack to see if file trans acc/info packet has been received */ | 537 if(xfer_data->xfer_idstring_for_relay) /* hack to see if file trans acc/info packet has been received */ |
537 { | 538 { |
538 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_INFO_15, | 539 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_INFO_15, |
539 YAHOO_STATUS_DISCONNECTED, | 540 YAHOO_STATUS_DISCONNECTED, |
540 yd->session_id); | 541 yd->session_id); |
541 yahoo_packet_hash(pkt, "sssi", | 542 yahoo_packet_hash(pkt, "sssi", |
542 1, purple_normalize(account, purple_account_get_username(account)), | 543 1, purple_normalize(account, purple_account_get_username(account)), |
543 5, xfer->who, | 544 5, purple_xfer_get_remote_user(xfer), |
544 265, xfer_data->xfer_peer_idstring, | 545 265, xfer_data->xfer_peer_idstring, |
545 66, -1); | 546 66, -1); |
546 } | 547 } |
547 else | 548 else |
548 { | 549 { |
549 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15, | 550 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15, |
550 YAHOO_STATUS_AVAILABLE, | 551 YAHOO_STATUS_AVAILABLE, |
551 yd->session_id); | 552 yd->session_id); |
552 yahoo_packet_hash(pkt, "sssi", | 553 yahoo_packet_hash(pkt, "sssi", |
553 1, purple_normalize(account, purple_account_get_username(account)), | 554 1, purple_normalize(account, purple_account_get_username(account)), |
554 5, xfer->who, | 555 5, purple_xfer_get_remote_user(xfer), |
555 265, xfer_data->xfer_peer_idstring, | 556 265, xfer_data->xfer_peer_idstring, |
556 222, 2); | 557 222, 2); |
557 } | 558 } |
558 yahoo_packet_send_and_free(pkt, yd); | 559 yahoo_packet_send_and_free(pkt, yd); |
559 } | 560 } |
577 PurpleAccount *account; | 578 PurpleAccount *account; |
578 YahooData *yd; | 579 YahooData *yd; |
579 struct yahoo_packet *pkt; | 580 struct yahoo_packet *pkt; |
580 | 581 |
581 gc = xfer_data->gc; | 582 gc = xfer_data->gc; |
582 yd = gc->proto_data; | 583 yd = purple_connection_get_protocol_data(gc); |
583 account = purple_connection_get_account(gc); | 584 account = purple_connection_get_account(gc); |
584 if(!xfer_data->xfer_idstring_for_relay) /* hack to see if file trans acc/info packet has been received */ | 585 if(!xfer_data->xfer_idstring_for_relay) /* hack to see if file trans acc/info packet has been received */ |
585 { | 586 { |
586 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15, | 587 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15, |
587 YAHOO_STATUS_AVAILABLE, | 588 YAHOO_STATUS_AVAILABLE, |
588 yd->session_id); | 589 yd->session_id); |
589 yahoo_packet_hash(pkt, "sssi", | 590 yahoo_packet_hash(pkt, "sssi", |
590 1, purple_normalize(account, purple_account_get_username(account)), | 591 1, purple_normalize(account, purple_account_get_username(account)), |
591 5, xfer->who, | 592 5, purple_xfer_get_remote_user(xfer), |
592 265, xfer_data->xfer_peer_idstring, | 593 265, xfer_data->xfer_peer_idstring, |
593 222, 4); | 594 222, 4); |
594 } | 595 } |
595 else | 596 else |
596 { | 597 { |
597 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15, | 598 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15, |
598 YAHOO_STATUS_DISCONNECTED, | 599 YAHOO_STATUS_DISCONNECTED, |
599 yd->session_id); | 600 yd->session_id); |
600 yahoo_packet_hash(pkt, "sssi", | 601 yahoo_packet_hash(pkt, "sssi", |
601 1, purple_normalize(account, purple_account_get_username(account)), | 602 1, purple_normalize(account, purple_account_get_username(account)), |
602 5, xfer->who, | 603 5, purple_xfer_get_remote_user(xfer), |
603 265, xfer_data->xfer_peer_idstring, | 604 265, xfer_data->xfer_peer_idstring, |
604 66, -1); | 605 66, -1); |
605 } | 606 } |
606 yahoo_packet_send_and_free(pkt, yd); | 607 yahoo_packet_send_and_free(pkt, yd); |
607 } | 608 } |
615 static void yahoo_p2p_ft_server_send_OK(PurpleXfer *xfer) | 616 static void yahoo_p2p_ft_server_send_OK(PurpleXfer *xfer) |
616 { | 617 { |
617 char *tx = NULL; | 618 char *tx = NULL; |
618 int written; | 619 int written; |
619 | 620 |
620 tx = g_strdup_printf("HTTP/1.1 200 OK\r\nContent-Length: 0\r\nContent-Type: application/octet-stream\r\nConnection: close\r\n\r\n"); | 621 tx = "HTTP/1.1 200 OK\r\nContent-Length: 0\r\nContent-Type: application/octet-stream\r\nConnection: close\r\n\r\n"; |
621 written = write(xfer->fd, tx, strlen(tx)); | 622 written = write(xfer->fd, tx, strlen(tx)); |
622 | 623 |
623 if (written < 0 && errno == EAGAIN) | 624 if (written < 0 && errno == EAGAIN) |
624 written = 0; | 625 written = 0; |
625 else if (written <= 0) | 626 else if (written <= 0) |
626 purple_debug_info("yahoo", "p2p filetransfer: Unable to write HTTP OK"); | 627 purple_debug_info("yahoo", "p2p filetransfer: Unable to write HTTP OK"); |
627 | 628 |
628 /* close connection */ | 629 /* close connection */ |
629 close(xfer->fd); | 630 close(xfer->fd); |
630 xfer->fd = -1; | 631 xfer->fd = -1; |
631 g_free(tx); | |
632 } | 632 } |
633 | 633 |
634 static void yahoo_xfer_end(PurpleXfer *xfer_old) | 634 static void yahoo_xfer_end(PurpleXfer *xfer_old) |
635 { | 635 { |
636 struct yahoo_xfer_data *xfer_data; | 636 struct yahoo_xfer_data *xfer_data; |
665 | 665 |
666 filename = xfer_data->filename_list->data; | 666 filename = xfer_data->filename_list->data; |
667 filesize = atol( xfer_data->size_list->data ); | 667 filesize = atol( xfer_data->size_list->data ); |
668 | 668 |
669 gc = xfer_data->gc; | 669 gc = xfer_data->gc; |
670 yd = gc->proto_data; | 670 yd = purple_connection_get_protocol_data(gc); |
671 | 671 |
672 /* setting up xfer_data for next file's tranfer */ | 672 /* setting up xfer_data for next file's tranfer */ |
673 g_free(xfer_data->host); | 673 g_free(xfer_data->host); |
674 g_free(xfer_data->path); | 674 g_free(xfer_data->path); |
675 g_free(xfer_data->txbuf); | 675 g_free(xfer_data->txbuf); |
695 | 695 |
696 /* Dereference xfer_data from old xfer */ | 696 /* Dereference xfer_data from old xfer */ |
697 purple_xfer_set_protocol_data(xfer_old, NULL); | 697 purple_xfer_set_protocol_data(xfer_old, NULL); |
698 | 698 |
699 /* Build the file transfer handle. */ | 699 /* Build the file transfer handle. */ |
700 xfer = purple_xfer_new(gc->account, PURPLE_XFER_RECEIVE, xfer_old->who); | 700 xfer = purple_xfer_new(gc->account, PURPLE_XFER_RECEIVE, purple_xfer_get_remote_user(xfer_old)); |
701 | 701 |
702 | 702 |
703 if (xfer) { | 703 if (xfer) { |
704 /* Set the info about the incoming file. */ | 704 /* Set the info about the incoming file. */ |
705 char *utf8_filename = yahoo_string_decode(gc, filename, TRUE); | 705 char *utf8_filename = yahoo_string_decode(gc, filename, TRUE); |
808 char *service = NULL; | 808 char *service = NULL; |
809 char *filename = NULL; | 809 char *filename = NULL; |
810 unsigned long filesize = 0L; | 810 unsigned long filesize = 0L; |
811 GSList *l; | 811 GSList *l; |
812 | 812 |
813 yd = gc->proto_data; | 813 yd = purple_connection_get_protocol_data(gc); |
814 | 814 |
815 for (l = pkt->hash; l; l = l->next) { | 815 for (l = pkt->hash; l; l = l->next) { |
816 struct yahoo_pair *pair = l->data; | 816 struct yahoo_pair *pair = l->data; |
817 | 817 |
818 switch (pair->key) { | 818 switch (pair->key) { |
999 return; | 999 return; |
1000 if (!(xd = purple_xfer_get_protocol_data(xfer))) | 1000 if (!(xd = purple_xfer_get_protocol_data(xfer))) |
1001 return; | 1001 return; |
1002 gc = xd->gc; | 1002 gc = xd->gc; |
1003 account = purple_connection_get_account(gc); | 1003 account = purple_connection_get_account(gc); |
1004 yd = gc->proto_data; | 1004 yd = purple_connection_get_protocol_data(gc); |
1005 | 1005 |
1006 if(!hosts) | 1006 if(!hosts) |
1007 { | 1007 { |
1008 purple_debug_error("yahoo", "Unable to find an IP address for relay.msg.yahoo.com\n"); | 1008 purple_debug_error("yahoo", "Unable to find an IP address for relay.msg.yahoo.com\n"); |
1009 purple_xfer_cancel_remote(xfer); | 1009 purple_xfer_cancel_remote(xfer); |
1059 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_INFO_15, YAHOO_STATUS_AVAILABLE, yd->session_id); | 1059 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_INFO_15, YAHOO_STATUS_AVAILABLE, yd->session_id); |
1060 filename = g_path_get_basename(purple_xfer_get_local_filename(xfer)); | 1060 filename = g_path_get_basename(purple_xfer_get_local_filename(xfer)); |
1061 | 1061 |
1062 yahoo_packet_hash(pkt, "ssssis", | 1062 yahoo_packet_hash(pkt, "ssssis", |
1063 1, purple_normalize(account, purple_account_get_username(account)), | 1063 1, purple_normalize(account, purple_account_get_username(account)), |
1064 5, xfer->who, | 1064 5, purple_xfer_get_remote_user(xfer), |
1065 265, xd->xfer_peer_idstring, | 1065 265, xd->xfer_peer_idstring, |
1066 27, filename, | 1066 27, filename, |
1067 249, 3, | 1067 249, 3, |
1068 250, xd->host); | 1068 250, xd->host); |
1069 | 1069 |
1079 } | 1079 } |
1080 | 1080 |
1081 void yahoo_send_file(PurpleConnection *gc, const char *who, const char *file) | 1081 void yahoo_send_file(PurpleConnection *gc, const char *who, const char *file) |
1082 { | 1082 { |
1083 struct yahoo_xfer_data *xfer_data; | 1083 struct yahoo_xfer_data *xfer_data; |
1084 YahooData *yd = gc->proto_data; | 1084 YahooData *yd = purple_connection_get_protocol_data(gc); |
1085 PurpleXfer *xfer = yahoo_new_xfer(gc, who); | 1085 PurpleXfer *xfer = yahoo_new_xfer(gc, who); |
1086 | 1086 |
1087 g_return_if_fail(xfer != NULL); | 1087 g_return_if_fail(xfer != NULL); |
1088 | 1088 |
1089 /* if we don't have a p2p connection, try establishing it now */ | 1089 /* if we don't have a p2p connection, try establishing it now */ |
1110 static void yahoo_xfer_recv_cb_15(gpointer data, gint source, PurpleInputCondition condition) | 1110 static void yahoo_xfer_recv_cb_15(gpointer data, gint source, PurpleInputCondition condition) |
1111 { | 1111 { |
1112 PurpleXfer *xfer; | 1112 PurpleXfer *xfer; |
1113 struct yahoo_xfer_data *xd; | 1113 struct yahoo_xfer_data *xd; |
1114 int did; | 1114 int did; |
1115 gchar* buf; | 1115 guchar buf[1000]; |
1116 gchar* t; | |
1117 PurpleAccount *account; | 1116 PurpleAccount *account; |
1118 PurpleConnection *gc; | 1117 PurpleConnection *gc; |
1119 | 1118 |
1120 xfer = data; | 1119 xfer = data; |
1121 xd = purple_xfer_get_protocol_data(xfer); | 1120 xd = purple_xfer_get_protocol_data(xfer); |
1122 account = purple_connection_get_account(xd->gc); | 1121 account = purple_connection_get_account(xd->gc); |
1123 gc = xd->gc; | 1122 gc = xd->gc; |
1124 | 1123 |
1125 buf=g_strnfill(1000, 0); | 1124 while((did = read(source, buf, sizeof(buf))) > 0) |
1126 while((did = read(source, buf, 998)) > 0) | 1125 { |
1127 { | 1126 /* TODO: Convert to circ buffer, this all is pretty horrible */ |
1127 xd->txbuf = g_realloc(xd->txbuf, xd->txbuflen + did); | |
1128 g_memmove(xd->txbuf + xd->txbuflen, buf, did); | |
1128 xd->txbuflen += did; | 1129 xd->txbuflen += did; |
1129 buf[did] = '\0'; | 1130 } |
1130 t = xd->txbuf; | |
1131 xd->txbuf = g_strconcat(t,buf,NULL); | |
1132 g_free(t); | |
1133 } | |
1134 g_free(buf); | |
1135 | 1131 |
1136 if (did < 0 && errno == EAGAIN) | 1132 if (did < 0 && errno == EAGAIN) |
1137 return; | 1133 return; |
1138 else if (did < 0) { | 1134 else if (did < 0) { |
1139 purple_debug_error("yahoo", "Unable to write in order to start ft errno = %d\n", errno); | 1135 purple_debug_error("yahoo", "Unable to write in order to start ft errno = %d\n", errno); |
1223 purple_input_remove(xd->input_event); | 1219 purple_input_remove(xd->input_event); |
1224 xd->input_event = 0; | 1220 xd->input_event = 0; |
1225 close(source); | 1221 close(source); |
1226 xfer->fd = -1; | 1222 xfer->fd = -1; |
1227 /* start local server, listen for connections */ | 1223 /* start local server, listen for connections */ |
1228 purple_network_listen(xd->yahoo_local_p2p_ft_server_port, SOCK_STREAM, yahoo_p2p_ft_server_listen_cb, xfer); | 1224 purple_network_listen(xd->yahoo_local_p2p_ft_server_port, AF_UNSPEC, SOCK_STREAM, TRUE, yahoo_p2p_ft_server_listen_cb, xfer); |
1229 } | 1225 } |
1230 else | 1226 else |
1231 { | 1227 { |
1232 purple_debug_error("yahoo", "Unrecognized yahoo file transfer mode and stage (ymsg15):%d,%d\n", purple_xfer_get_type(xfer), xd->status_15); | 1228 purple_debug_error("yahoo", "Unrecognized yahoo file transfer mode and stage (ymsg15):%d,%d\n", purple_xfer_get_type(xfer), xd->status_15); |
1233 return; | 1229 return; |
1247 return; | 1243 return; |
1248 gc = xd->gc; | 1244 gc = xd->gc; |
1249 account = purple_connection_get_account(gc); | 1245 account = purple_connection_get_account(gc); |
1250 if ((source < 0) || (xd->path == NULL) || (xd->host == NULL)) { | 1246 if ((source < 0) || (xd->path == NULL) || (xd->host == NULL)) { |
1251 purple_xfer_error(PURPLE_XFER_RECEIVE, purple_xfer_get_account(xfer), | 1247 purple_xfer_error(PURPLE_XFER_RECEIVE, purple_xfer_get_account(xfer), |
1252 xfer->who, _("Unable to connect.")); | 1248 purple_xfer_get_remote_user(xfer), _("Unable to connect.")); |
1253 purple_xfer_cancel_remote(xfer); | 1249 purple_xfer_cancel_remote(xfer); |
1254 return; | 1250 return; |
1255 } | 1251 } |
1256 /* The first time we get here, assemble the tx buffer */ | 1252 /* The first time we get here, assemble the tx buffer */ |
1257 if (xd->txbuflen == 0) | 1253 if (xd->txbuflen == 0) |
1258 { | 1254 { |
1259 gchar* cookies; | 1255 gchar* cookies; |
1260 YahooData *yd = gc->proto_data; | 1256 gchar* initial_buffer; |
1257 YahooData *yd = purple_connection_get_protocol_data(gc); | |
1261 | 1258 |
1262 /* cookies = yahoo_get_cookies(gc); | 1259 /* cookies = yahoo_get_cookies(gc); |
1263 * This doesn't seem to be working. The function is returning NULL, which yahoo servers don't like | 1260 * This doesn't seem to be working. The function is returning NULL, which yahoo servers don't like |
1264 * For now let us not use this function */ | 1261 * For now let us not use this function */ |
1265 | 1262 |
1268 if(purple_xfer_get_type(xfer) == PURPLE_XFER_SEND && xd->status_15 == ACCEPTED) | 1265 if(purple_xfer_get_type(xfer) == PURPLE_XFER_SEND && xd->status_15 == ACCEPTED) |
1269 { | 1266 { |
1270 if(xd->info_val_249 == 2) | 1267 if(xd->info_val_249 == 2) |
1271 { | 1268 { |
1272 /* sending file via p2p, we are connected as client */ | 1269 /* sending file via p2p, we are connected as client */ |
1273 xd->txbuf = g_strdup_printf("POST /%s HTTP/1.1\r\n" | 1270 initial_buffer = g_strdup_printf("POST /%s HTTP/1.1\r\n" |
1274 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" | 1271 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" |
1275 "Host: %s\r\n" | 1272 "Host: %s\r\n" |
1276 "Content-Length: %ld\r\n" | 1273 "Content-Length: %" G_GSIZE_FORMAT "\r\n" |
1277 "Cache-Control: no-cache\r\n\r\n", | 1274 "Cache-Control: no-cache\r\n\r\n", |
1278 xd->path, | 1275 xd->path, |
1279 xd->host, | 1276 xd->host, |
1280 (long int)xfer->size); /* to do, add Referer */ | 1277 purple_xfer_get_size(xfer)); /* to do, add Referer */ |
1281 } | 1278 } |
1282 else | 1279 else |
1283 { | 1280 { |
1284 /* sending file via relaying */ | 1281 /* sending file via relaying */ |
1285 xd->txbuf = g_strdup_printf("POST /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\n" | 1282 initial_buffer = g_strdup_printf("POST /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\n" |
1286 "Cookie:%s\r\n" | 1283 "Cookie:%s\r\n" |
1287 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" | 1284 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" |
1288 "Host: %s\r\n" | 1285 "Host: %s\r\n" |
1289 "Content-Length: %ld\r\n" | 1286 "Content-Length: %" G_GSIZE_FORMAT "\r\n" |
1290 "Cache-Control: no-cache\r\n\r\n", | 1287 "Cache-Control: no-cache\r\n\r\n", |
1291 purple_url_encode(xd->xfer_idstring_for_relay), | 1288 purple_url_encode(xd->xfer_idstring_for_relay), |
1292 purple_normalize(account, purple_account_get_username(account)), | 1289 purple_normalize(account, purple_account_get_username(account)), |
1293 xfer->who, | 1290 purple_xfer_get_remote_user(xfer), |
1294 cookies, | 1291 cookies, |
1295 xd->host, | 1292 xd->host, |
1296 (long int)xfer->size); | 1293 purple_xfer_get_size(xfer)); /* to do, add Referer */ |
1297 } | 1294 } |
1298 } | 1295 } |
1299 else if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE && xd->status_15 == STARTED) | 1296 else if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE && xd->status_15 == STARTED) |
1300 { | 1297 { |
1301 if(xd->info_val_249 == 1) | 1298 if(xd->info_val_249 == 1) |
1302 { | 1299 { |
1303 /* receiving file via p2p, connected as client */ | 1300 /* receiving file via p2p, connected as client */ |
1304 xd->txbuf = g_strdup_printf("HEAD /%s HTTP/1.1\r\n" | 1301 initial_buffer = g_strdup_printf("HEAD /%s HTTP/1.1\r\n" |
1305 "Accept: */*\r\n" | 1302 "Accept: */*\r\n" |
1306 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" | 1303 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" |
1307 "Host: %s\r\n" | 1304 "Host: %s\r\n" |
1308 "Content-Length: 0\r\n" | 1305 "Content-Length: 0\r\n" |
1309 "Cache-Control: no-cache\r\n\r\n", | 1306 "Cache-Control: no-cache\r\n\r\n", |
1310 xd->path,xd->host); | 1307 xd->path,xd->host); |
1311 } | 1308 } |
1312 else | 1309 else |
1313 { | 1310 { |
1314 /* receiving file via relaying */ | 1311 /* receiving file via relaying */ |
1315 xd->txbuf = g_strdup_printf("HEAD /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\n" | 1312 initial_buffer = g_strdup_printf("HEAD /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\n" |
1316 "Accept: */*\r\n" | 1313 "Accept: */*\r\n" |
1317 "Cookie: %s\r\n" | 1314 "Cookie: %s\r\n" |
1318 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" | 1315 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" |
1319 "Host: %s\r\n" | 1316 "Host: %s\r\n" |
1320 "Content-Length: 0\r\n" | 1317 "Content-Length: 0\r\n" |
1321 "Cache-Control: no-cache\r\n\r\n", | 1318 "Cache-Control: no-cache\r\n\r\n", |
1322 purple_url_encode(xd->xfer_idstring_for_relay), | 1319 purple_url_encode(xd->xfer_idstring_for_relay), |
1323 purple_normalize(account, purple_account_get_username(account)), | 1320 purple_normalize(account, purple_account_get_username(account)), |
1324 xfer->who, | 1321 purple_xfer_get_remote_user(xfer), |
1325 cookies, | 1322 cookies, |
1326 xd->host); | 1323 xd->host); |
1327 } | 1324 } |
1328 } | 1325 } |
1329 else if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE && xd->status_15 == HEAD_REPLY_RECEIVED) | 1326 else if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE && xd->status_15 == HEAD_REPLY_RECEIVED) |
1330 { | 1327 { |
1331 if(xd->info_val_249 == 1) | 1328 if(xd->info_val_249 == 1) |
1332 { | 1329 { |
1333 /* receiving file via p2p, connected as client */ | 1330 /* receiving file via p2p, connected as client */ |
1334 xd->txbuf = g_strdup_printf("GET /%s HTTP/1.1\r\n" | 1331 initial_buffer = g_strdup_printf("GET /%s HTTP/1.1\r\n" |
1335 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" | 1332 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" |
1336 "Host: %s\r\n" | 1333 "Host: %s\r\n" |
1337 "Connection: Keep-Alive\r\n\r\n", | 1334 "Connection: Keep-Alive\r\n\r\n", |
1338 xd->path, xd->host); | 1335 xd->path, xd->host); |
1339 } | 1336 } |
1340 else | 1337 else |
1341 { | 1338 { |
1342 /* receiving file via relaying */ | 1339 /* receiving file via relaying */ |
1343 xd->txbuf = g_strdup_printf("GET /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\n" | 1340 initial_buffer = g_strdup_printf("GET /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\n" |
1344 "Cookie: %s\r\n" | 1341 "Cookie: %s\r\n" |
1345 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" | 1342 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" |
1346 "Host: %s\r\n" | 1343 "Host: %s\r\n" |
1347 "Connection: Keep-Alive\r\n\r\n", | 1344 "Connection: Keep-Alive\r\n\r\n", |
1348 purple_url_encode(xd->xfer_idstring_for_relay), | 1345 purple_url_encode(xd->xfer_idstring_for_relay), |
1349 purple_normalize(account, purple_account_get_username(account)), | 1346 purple_normalize(account, purple_account_get_username(account)), |
1350 xfer->who, | 1347 purple_xfer_get_remote_user(xfer), |
1351 cookies, | 1348 cookies, |
1352 xd->host); | 1349 xd->host); |
1353 } | 1350 } |
1354 } | 1351 } |
1355 else | 1352 else |
1356 { | 1353 { |
1357 purple_debug_error("yahoo", "Unrecognized yahoo file transfer mode and stage (ymsg15):%d,%d\n", purple_xfer_get_type(xfer), xd->status_15); | 1354 purple_debug_error("yahoo", "Unrecognized yahoo file transfer mode and stage (ymsg15):%d,%d\n", purple_xfer_get_type(xfer), xd->status_15); |
1358 g_free(cookies); | 1355 g_free(cookies); |
1359 return; | 1356 return; |
1360 } | 1357 } |
1361 xd->txbuflen = strlen(xd->txbuf); | 1358 xd->txbuf = (guchar*) initial_buffer; |
1359 xd->txbuflen = strlen(initial_buffer); | |
1362 xd->txbuf_written = 0; | 1360 xd->txbuf_written = 0; |
1363 g_free(cookies); | 1361 g_free(cookies); |
1364 } | 1362 } |
1365 | 1363 |
1366 if (!xd->tx_handler) | 1364 if (!xd->tx_handler) |
1433 unix_time = time(NULL); | 1431 unix_time = time(NULL); |
1434 time_str = ctime(&unix_time); | 1432 time_str = ctime(&unix_time); |
1435 time_str[strlen(time_str) - 1] = '\0'; | 1433 time_str[strlen(time_str) - 1] = '\0'; |
1436 | 1434 |
1437 if (xd->txbuflen == 0) { | 1435 if (xd->txbuflen == 0) { |
1438 xd->txbuf = g_strdup_printf("HTTP/1.0 200 OK\r\n" | 1436 gchar *initial_buffer = g_strdup_printf("HTTP/1.0 200 OK\r\n" |
1439 "Date: %s GMT\r\n" | 1437 "Date: %s GMT\r\n" |
1440 "Server: Y!/1.0\r\n" | 1438 "Server: Y!/1.0\r\n" |
1441 "MIME-version: 1.0\r\n" | 1439 "MIME-version: 1.0\r\n" |
1442 "Last-modified: %s GMT\r\n" | 1440 "Last-modified: %s GMT\r\n" |
1443 "Content-length: %" G_GSIZE_FORMAT "\r\n\r\n", | 1441 "Content-length: %" G_GSIZE_FORMAT "\r\n\r\n", |
1444 time_str, time_str, xfer->size); | 1442 time_str, time_str, purple_xfer_get_size(xfer)); |
1445 xd->txbuflen = strlen(xd->txbuf); | 1443 xd->txbuf = (guchar *)initial_buffer; |
1444 xd->txbuflen = strlen(initial_buffer); | |
1446 xd->txbuf_written = 0; | 1445 xd->txbuf_written = 0; |
1447 } | 1446 } |
1448 | 1447 |
1449 if (!xd->tx_handler) { | 1448 if (!xd->tx_handler) { |
1450 xd->tx_handler = purple_input_add(source, PURPLE_INPUT_WRITE, yahoo_xfer_send_cb_15, xfer); | 1449 xd->tx_handler = purple_input_add(source, PURPLE_INPUT_WRITE, yahoo_xfer_send_cb_15, xfer); |
1483 purple_input_remove(xd->yahoo_p2p_ft_server_watcher); | 1482 purple_input_remove(xd->yahoo_p2p_ft_server_watcher); |
1484 close(xd->yahoo_local_p2p_ft_server_fd); | 1483 close(xd->yahoo_local_p2p_ft_server_fd); |
1485 | 1484 |
1486 /* Add an Input Read event to the file descriptor */ | 1485 /* Add an Input Read event to the file descriptor */ |
1487 xfer->fd = acceptfd; | 1486 xfer->fd = acceptfd; |
1488 if(xfer->type == PURPLE_XFER_RECEIVE) | 1487 if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE) |
1489 xd->input_event = purple_input_add(acceptfd, PURPLE_INPUT_READ, yahoo_p2p_ft_POST_cb, data); | 1488 xd->input_event = purple_input_add(acceptfd, PURPLE_INPUT_READ, yahoo_p2p_ft_POST_cb, data); |
1490 else | 1489 else |
1491 xd->input_event = purple_input_add(acceptfd, PURPLE_INPUT_READ, yahoo_p2p_ft_HEAD_GET_cb, data); | 1490 xd->input_event = purple_input_add(acceptfd, PURPLE_INPUT_READ, yahoo_p2p_ft_HEAD_GET_cb, data); |
1492 } | 1491 } |
1493 | 1492 |
1508 purple_debug_warning("yahoo","p2p: error starting server for p2p file transfer\n"); | 1507 purple_debug_warning("yahoo","p2p: error starting server for p2p file transfer\n"); |
1509 purple_xfer_cancel_remote(xfer); | 1508 purple_xfer_cancel_remote(xfer); |
1510 return; | 1509 return; |
1511 } | 1510 } |
1512 | 1511 |
1513 if( (xfer->type == PURPLE_XFER_RECEIVE) || (xd->status_15 != P2P_HEAD_REPLIED) ) { | 1512 if( (purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE) || (xd->status_15 != P2P_HEAD_REPLIED) ) { |
1514 yd = xd->gc->proto_data; | 1513 yd = purple_connection_get_protocol_data(xd->gc); |
1515 account = purple_connection_get_account(xd->gc); | 1514 account = purple_connection_get_account(xd->gc); |
1516 local_ip = purple_network_get_my_ip(listenfd); | 1515 local_ip = purple_network_get_my_ip(listenfd); |
1517 xd->yahoo_local_p2p_ft_server_port = purple_network_get_port_from_fd(listenfd); | 1516 xd->yahoo_local_p2p_ft_server_port = purple_network_get_port_from_fd(listenfd); |
1518 | 1517 |
1519 filename = g_path_get_basename(purple_xfer_get_local_filename(xfer)); | 1518 filename = g_path_get_basename(purple_xfer_get_local_filename(xfer)); |
1520 filename_without_spaces = g_strdup(filename); | 1519 filename_without_spaces = g_strdup(filename); |
1521 purple_util_chrreplace(filename_without_spaces, ' ', '+'); | 1520 purple_util_chrreplace(filename_without_spaces, ' ', '+'); |
1522 xd->xfer_url = g_strdup_printf("/Messenger.%s.%d000%s?AppID=Messenger&UserID=%s&K=lc9lu2u89gz1llmplwksajkjx", xfer->who, (int)time(NULL), filename_without_spaces, xfer->who); | 1521 xd->xfer_url = g_strdup_printf("/Messenger.%s.%d000%s?AppID=Messenger&UserID=%s&K=lc9lu2u89gz1llmplwksajkjx", purple_xfer_get_remote_user(xfer), (int)time(NULL), filename_without_spaces, purple_xfer_get_remote_user(xfer)); |
1523 url_to_send = g_strdup_printf("http://%s:%d%s", local_ip, xd->yahoo_local_p2p_ft_server_port, xd->xfer_url); | 1522 url_to_send = g_strdup_printf("http://%s:%d%s", local_ip, xd->yahoo_local_p2p_ft_server_port, xd->xfer_url); |
1524 | 1523 |
1525 if(xfer->type == PURPLE_XFER_RECEIVE) { | 1524 if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE) { |
1526 xd->info_val_249 = 2; /* 249=2: we are p2p server, and receiving file */ | 1525 xd->info_val_249 = 2; /* 249=2: we are p2p server, and receiving file */ |
1527 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_ACC_15, | 1526 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_ACC_15, |
1528 YAHOO_STATUS_AVAILABLE, yd->session_id); | 1527 YAHOO_STATUS_AVAILABLE, yd->session_id); |
1529 yahoo_packet_hash(pkt, "ssssis", | 1528 yahoo_packet_hash(pkt, "ssssis", |
1530 1, purple_normalize(account, purple_account_get_username(account)), | 1529 1, purple_normalize(account, purple_account_get_username(account)), |
1531 5, xfer->who, | 1530 5, purple_xfer_get_remote_user(xfer), |
1532 265, xd->xfer_peer_idstring, | 1531 265, xd->xfer_peer_idstring, |
1533 27, xfer->filename, | 1532 27, purple_xfer_get_filename(xfer), |
1534 249, 2, | 1533 249, 2, |
1535 250, url_to_send); | 1534 250, url_to_send); |
1536 } | 1535 } |
1537 else { | 1536 else { |
1538 xd->info_val_249 = 1; /* 249=1: we are p2p server, and sending file */ | 1537 xd->info_val_249 = 1; /* 249=1: we are p2p server, and sending file */ |
1539 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_INFO_15, YAHOO_STATUS_AVAILABLE, yd->session_id); | 1538 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_INFO_15, YAHOO_STATUS_AVAILABLE, yd->session_id); |
1540 yahoo_packet_hash(pkt, "ssssis", | 1539 yahoo_packet_hash(pkt, "ssssis", |
1541 1, purple_normalize(account, purple_account_get_username(account)), | 1540 1, purple_normalize(account, purple_account_get_username(account)), |
1542 5, xfer->who, | 1541 5, purple_xfer_get_remote_user(xfer), |
1543 265, xd->xfer_peer_idstring, | 1542 265, xd->xfer_peer_idstring, |
1544 27, filename, | 1543 27, filename, |
1545 249, 1, | 1544 249, 1, |
1546 250, url_to_send); | 1545 250, url_to_send); |
1547 } | 1546 } |
1570 | 1569 |
1571 if (!(xd = purple_xfer_get_protocol_data(xfer))) | 1570 if (!(xd = purple_xfer_get_protocol_data(xfer))) |
1572 return; | 1571 return; |
1573 | 1572 |
1574 account = purple_connection_get_account(gc); | 1573 account = purple_connection_get_account(gc); |
1575 yd = gc->proto_data; | 1574 yd = purple_connection_get_protocol_data(gc); |
1576 | 1575 |
1577 p2p_data = g_hash_table_lookup(yd->peers, xfer->who); | 1576 p2p_data = g_hash_table_lookup(yd->peers, purple_xfer_get_remote_user(xfer)); |
1578 if( p2p_data->connection_type == YAHOO_P2P_WE_ARE_SERVER ) | 1577 if( p2p_data->connection_type == YAHOO_P2P_WE_ARE_SERVER ) |
1579 if(purple_network_listen_range(0, 0, SOCK_STREAM, yahoo_p2p_ft_server_listen_cb, xfer)) | 1578 if(purple_network_listen_range(0, 0, AF_UNSPEC, SOCK_STREAM, TRUE, yahoo_p2p_ft_server_listen_cb, xfer)) |
1580 return; | 1579 return; |
1581 | 1580 |
1582 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_INFO_15, YAHOO_STATUS_AVAILABLE, yd->session_id); | 1581 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_INFO_15, YAHOO_STATUS_AVAILABLE, yd->session_id); |
1583 filename = g_path_get_basename(purple_xfer_get_local_filename(xfer)); | 1582 filename = g_path_get_basename(purple_xfer_get_local_filename(xfer)); |
1584 | 1583 |
1585 yahoo_packet_hash(pkt, "ssssi", | 1584 yahoo_packet_hash(pkt, "ssssi", |
1586 1, purple_normalize(account, purple_account_get_username(account)), | 1585 1, purple_normalize(account, purple_account_get_username(account)), |
1587 5, xfer->who, | 1586 5, purple_xfer_get_remote_user(xfer), |
1588 265, xd->xfer_peer_idstring, | 1587 265, xd->xfer_peer_idstring, |
1589 27, filename, | 1588 27, filename, |
1590 249, 2); /* 249=2: we are p2p client */ | 1589 249, 2); /* 249=2: we are p2p client */ |
1591 xd->info_val_249 = 2; | 1590 xd->info_val_249 = 2; |
1592 yahoo_packet_send_and_free(pkt, yd); | 1591 yahoo_packet_send_and_free(pkt, yd); |
1611 GSList *l; | 1610 GSList *l; |
1612 GSList *filename_list = NULL; | 1611 GSList *filename_list = NULL; |
1613 GSList *size_list = NULL; | 1612 GSList *size_list = NULL; |
1614 int nooffiles = 0; | 1613 int nooffiles = 0; |
1615 | 1614 |
1616 yd = gc->proto_data; | 1615 yd = purple_connection_get_protocol_data(gc); |
1617 | 1616 |
1618 for (l = pkt->hash; l; l = l->next) { | 1617 for (l = pkt->hash; l; l = l->next) { |
1619 struct yahoo_pair *pair = l->data; | 1618 struct yahoo_pair *pair = l->data; |
1620 | 1619 |
1621 switch (pair->key) { | 1620 switch (pair->key) { |
1685 } | 1684 } |
1686 | 1685 |
1687 account = purple_connection_get_account(gc); | 1686 account = purple_connection_get_account(gc); |
1688 if (yd->jp) | 1687 if (yd->jp) |
1689 { | 1688 { |
1690 purple_dnsquery_a_account(account, YAHOOJP_XFER_RELAY_HOST, | 1689 purple_dnsquery_a(account, YAHOOJP_XFER_RELAY_HOST, |
1691 YAHOOJP_XFER_RELAY_PORT, | 1690 YAHOOJP_XFER_RELAY_PORT, |
1692 yahoo_xfer_dns_connected_15, xfer); | 1691 yahoo_xfer_dns_connected_15, xfer); |
1693 } | 1692 } |
1694 else | 1693 else |
1695 { | 1694 { |
1696 purple_dnsquery_a_account(account, YAHOO_XFER_RELAY_HOST, | 1695 purple_dnsquery_a(account, YAHOO_XFER_RELAY_HOST, |
1697 YAHOO_XFER_RELAY_PORT, | 1696 YAHOO_XFER_RELAY_PORT, |
1698 yahoo_xfer_dns_connected_15, xfer); | 1697 yahoo_xfer_dns_connected_15, xfer); |
1699 } | 1698 } |
1700 return; | 1699 return; |
1701 } | 1700 } |
1740 if (xfer == NULL) | 1739 if (xfer == NULL) |
1741 { | 1740 { |
1742 g_free(xfer_data); | 1741 g_free(xfer_data); |
1743 g_return_if_reached(); | 1742 g_return_if_reached(); |
1744 } | 1743 } |
1745 | |
1746 xfer->message = NULL; | |
1747 | 1744 |
1748 /* Set the info about the incoming file. */ | 1745 /* Set the info about the incoming file. */ |
1749 utf8_filename = yahoo_string_decode(gc, filename, TRUE); | 1746 utf8_filename = yahoo_string_decode(gc, filename, TRUE); |
1750 purple_xfer_set_filename(xfer, utf8_filename); | 1747 purple_xfer_set_filename(xfer, utf8_filename); |
1751 g_free(utf8_filename); | 1748 g_free(utf8_filename); |
1767 xfer_data->xfer_peer_idstring, | 1764 xfer_data->xfer_peer_idstring, |
1768 xfer); | 1765 xfer); |
1769 | 1766 |
1770 if(nooffiles > 1) { | 1767 if(nooffiles > 1) { |
1771 gchar* message; | 1768 gchar* message; |
1772 message = g_strdup_printf(_("%s is trying to send you a group of %d files.\n"), xfer->who, nooffiles); | 1769 message = g_strdup_printf(_("%s is trying to send you a group of %d files.\n"), purple_xfer_get_remote_user(xfer), nooffiles); |
1773 purple_xfer_conversation_write(xfer, message, FALSE); | 1770 purple_xfer_conversation_write(xfer, message, FALSE); |
1774 g_free(message); | 1771 g_free(message); |
1775 } | 1772 } |
1776 /* Now perform the request */ | 1773 /* Now perform the request */ |
1777 purple_xfer_request(xfer); | 1774 purple_xfer_request(xfer); |
1792 char *xfer_idstring_for_relay = NULL; | 1789 char *xfer_idstring_for_relay = NULL; |
1793 GSList *l; | 1790 GSList *l; |
1794 struct yahoo_packet *pkt_to_send; | 1791 struct yahoo_packet *pkt_to_send; |
1795 struct yahoo_p2p_data *p2p_data; | 1792 struct yahoo_p2p_data *p2p_data; |
1796 | 1793 |
1797 yd = gc->proto_data; | 1794 yd = purple_connection_get_protocol_data(gc); |
1798 | 1795 |
1799 for (l = pkt->hash; l; l = l->next) { | 1796 for (l = pkt->hash; l; l = l->next) { |
1800 struct yahoo_pair *pair = l->data; | 1797 struct yahoo_pair *pair = l->data; |
1801 | 1798 |
1802 switch (pair->key) { | 1799 switch (pair->key) { |
1856 | 1853 |
1857 pkt_to_send = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_ACC_15, | 1854 pkt_to_send = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_ACC_15, |
1858 YAHOO_STATUS_AVAILABLE, yd->session_id); | 1855 YAHOO_STATUS_AVAILABLE, yd->session_id); |
1859 yahoo_packet_hash(pkt_to_send, "ssssis", | 1856 yahoo_packet_hash(pkt_to_send, "ssssis", |
1860 1, purple_normalize(account, purple_account_get_username(account)), | 1857 1, purple_normalize(account, purple_account_get_username(account)), |
1861 5, xfer->who, | 1858 5, purple_xfer_get_remote_user(xfer), |
1862 265, xfer_data->xfer_peer_idstring, | 1859 265, xfer_data->xfer_peer_idstring, |
1863 27, xfer->filename, | 1860 27, purple_xfer_get_filename(xfer), |
1864 249, xfer_data->info_val_249, | 1861 249, xfer_data->info_val_249, |
1865 251, xfer_data->xfer_idstring_for_relay); | 1862 251, xfer_data->xfer_idstring_for_relay); |
1866 | 1863 |
1867 yahoo_packet_send_and_free(pkt_to_send, yd); | 1864 yahoo_packet_send_and_free(pkt_to_send, yd); |
1868 | 1865 |
1872 _("Unable to establish file descriptor.")); | 1869 _("Unable to establish file descriptor.")); |
1873 purple_xfer_cancel_remote(xfer); | 1870 purple_xfer_cancel_remote(xfer); |
1874 } | 1871 } |
1875 } | 1872 } |
1876 else if(val_249 == 2) { | 1873 else if(val_249 == 2) { |
1877 p2p_data = g_hash_table_lookup(yd->peers, xfer->who); | 1874 p2p_data = g_hash_table_lookup(yd->peers, purple_xfer_get_remote_user(xfer)); |
1878 if( !( p2p_data && (p2p_data->connection_type == YAHOO_P2P_WE_ARE_SERVER) ) ) { | 1875 if( !( p2p_data && (p2p_data->connection_type == YAHOO_P2P_WE_ARE_SERVER) ) ) { |
1879 purple_xfer_cancel_remote(xfer); | 1876 purple_xfer_cancel_remote(xfer); |
1880 return; | 1877 return; |
1881 } | 1878 } |
1882 if(!purple_network_listen_range(0, 0, SOCK_STREAM, yahoo_p2p_ft_server_listen_cb, xfer)) { | 1879 if(!purple_network_listen_range(0, 0, AF_UNSPEC, SOCK_STREAM, TRUE, yahoo_p2p_ft_server_listen_cb, xfer)) { |
1883 purple_xfer_cancel_remote(xfer); | 1880 purple_xfer_cancel_remote(xfer); |
1884 return; | 1881 return; |
1885 } | 1882 } |
1886 } | 1883 } |
1887 } | 1884 } |
1898 PurpleAccount *account; | 1895 PurpleAccount *account; |
1899 long val_66 = 0; | 1896 long val_66 = 0; |
1900 gchar *url = NULL; | 1897 gchar *url = NULL; |
1901 int val_249 = 0; | 1898 int val_249 = 0; |
1902 | 1899 |
1903 yd = gc->proto_data; | 1900 yd = purple_connection_get_protocol_data(gc); |
1904 for (l = pkt->hash; l; l = l->next) { | 1901 for (l = pkt->hash; l; l = l->next) { |
1905 struct yahoo_pair *pair = l->data; | 1902 struct yahoo_pair *pair = l->data; |
1906 | 1903 |
1907 switch (pair->key) { | 1904 switch (pair->key) { |
1908 case 251: | 1905 case 251: |