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: