Mercurial > pidgin.yaz
comparison libpurple/protocols/yahoo/yahoo_filexfer.c @ 32827:4a34689eeb33 default tip
merged from im.pidgin.pidgin
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Sat, 19 Nov 2011 14:42:54 +0900 |
parents | 0f94ec89f0bc 5bd5e024c977 |
children |
comparison
equal
deleted
inserted
replaced
32692:0f94ec89f0bc | 32827:4a34689eeb33 |
---|---|
167 purple_xfer_get_remote_user(xfer), _("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 purple_xfer_set_fd(xfer, 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 gchar *header = 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); |
249 purple_xfer_get_remote_user(xfer), _("Unable to connect.")); | 249 purple_xfer_get_remote_user(xfer), _("Unable to connect.")); |
250 purple_xfer_cancel_remote(xfer); | 250 purple_xfer_cancel_remote(xfer); |
251 return; | 251 return; |
252 } | 252 } |
253 | 253 |
254 xfer->fd = source; | 254 purple_xfer_set_fd(xfer, source); |
255 | 255 |
256 /* Assemble the tx buffer */ | 256 /* Assemble the tx buffer */ |
257 gc = xd->gc; | 257 gc = xd->gc; |
258 account = purple_connection_get_account(gc); | 258 account = purple_connection_get_account(gc); |
259 yd = purple_connection_get_protocol_data(gc); | 259 yd = purple_connection_get_protocol_data(gc); |
260 | 260 |
261 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANSFER, | 261 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANSFER, |
262 YAHOO_STATUS_AVAILABLE, yd->session_id); | 262 YAHOO_STATUS_AVAILABLE, yd->session_id); |
263 | 263 |
264 size = g_strdup_printf("%" G_GSIZE_FORMAT, purple_xfer_get_size(xfer)); | 264 size = g_strdup_printf("%" G_GOFFSET_FORMAT, purple_xfer_get_size(xfer)); |
265 | 265 |
266 /* yaz */ | 266 /* yaz */ |
267 tmp = g_filename_display_basename(purple_xfer_get_local_filename(xfer)); | 267 tmp = g_filename_display_basename(purple_xfer_get_local_filename(xfer)); |
268 filename = botch_utf(tmp, strlen(tmp), &dummy); | 268 filename = botch_utf(tmp, strlen(tmp), &dummy); |
269 g_free(tmp); | 269 g_free(tmp); |
282 | 282 |
283 host = purple_account_get_string(account, "xfer_host", YAHOO_XFER_HOST); | 283 host = purple_account_get_string(account, "xfer_host", YAHOO_XFER_HOST); |
284 port = purple_account_get_int(account, "xfer_port", YAHOO_XFER_PORT); | 284 port = purple_account_get_int(account, "xfer_port", YAHOO_XFER_PORT); |
285 header = g_strdup_printf( | 285 header = g_strdup_printf( |
286 "POST http://%s:%d/notifyft HTTP/1.0\r\n" | 286 "POST http://%s:%d/notifyft HTTP/1.0\r\n" |
287 "Content-length: %" G_GSIZE_FORMAT "\r\n" | 287 "Content-length: %" G_GOFFSET_FORMAT "\r\n" |
288 "Host: %s:%d\r\n" | 288 "Host: %s:%d\r\n" |
289 "Cookie: Y=%s; T=%s\r\n" | 289 "Cookie: Y=%s; T=%s\r\n" |
290 "\r\n", | 290 "\r\n", |
291 host, port, content_length + 4 + purple_xfer_get_size(xfer), | 291 host, port, content_length + 4 + purple_xfer_get_size(xfer), |
292 host, port, yd->cookie_y, yd->cookie_t); | 292 host, port, yd->cookie_y, yd->cookie_t); |
343 _("Unable to establish file descriptor.")); | 343 _("Unable to establish file descriptor.")); |
344 purple_xfer_cancel_remote(xfer); | 344 purple_xfer_cancel_remote(xfer); |
345 } | 345 } |
346 } | 346 } |
347 } else { | 347 } else { |
348 xfer->fd = -1; | 348 purple_xfer_set_fd(xfer, -1); |
349 if (purple_proxy_connect(gc, account, xfer_data->host, xfer_data->port, | 349 if (purple_proxy_connect(gc, account, xfer_data->host, xfer_data->port, |
350 yahoo_receivefile_connected, xfer) == NULL) { | 350 yahoo_receivefile_connected, xfer) == NULL) { |
351 purple_notify_error(gc, NULL, _("File Transfer Failed"), | 351 purple_notify_error(gc, NULL, _("File Transfer Failed"), |
352 _("Unable to establish file descriptor.")); | 352 _("Unable to establish file descriptor.")); |
353 purple_xfer_cancel_remote(xfer); | 353 purple_xfer_cancel_remote(xfer); |
381 222, 1, | 381 222, 1, |
382 266, 1, | 382 266, 1, |
383 302, 268, | 383 302, 268, |
384 300, 268, | 384 300, 268, |
385 27, filename, | 385 27, filename, |
386 28, purple_xfer_get_size(xfer), | 386 28, (int)purple_xfer_get_size(xfer), |
387 301, 268, | 387 301, 268, |
388 303, 268); | 388 303, 268); |
389 g_free(filename); | 389 g_free(filename); |
390 } else { | 390 } else { |
391 if(xfer_data->firstoflist == TRUE) { | 391 if(xfer_data->firstoflist == TRUE) { |
414 static void yahoo_xfer_start(PurpleXfer *xfer) | 414 static void yahoo_xfer_start(PurpleXfer *xfer) |
415 { | 415 { |
416 /* We don't need to do anything here, do we? */ | 416 /* We don't need to do anything here, do we? */ |
417 } | 417 } |
418 | 418 |
419 static guint calculate_length(const gchar *l, size_t len) | 419 static goffset calculate_length(const gchar *l, size_t len) |
420 { | 420 { |
421 int i; | 421 int i; |
422 | 422 |
423 for (i = 0; i < len; i++) { | 423 for (i = 0; i < len; i++) { |
424 if (!g_ascii_isdigit(l[i])) | 424 if (!g_ascii_isdigit(l[i])) |
425 continue; | 425 continue; |
426 return strtol(l + i, NULL, 10); | 426 return g_ascii_strtoll(l + i, NULL, 10); |
427 } | 427 } |
428 return 0; | 428 return 0; |
429 } | 429 } |
430 | 430 |
431 static gssize yahoo_xfer_read(guchar **buffer, PurpleXfer *xfer) | 431 static gssize yahoo_xfer_read(guchar **buffer, PurpleXfer *xfer) |
433 gchar buf[4096]; | 433 gchar buf[4096]; |
434 gssize len; | 434 gssize len; |
435 gchar *start = NULL; | 435 gchar *start = NULL; |
436 gchar *length; | 436 gchar *length; |
437 gchar *end; | 437 gchar *end; |
438 int filelen; | 438 goffset filelen; |
439 struct yahoo_xfer_data *xd = purple_xfer_get_protocol_data(xfer); | 439 struct yahoo_xfer_data *xd = purple_xfer_get_protocol_data(xfer); |
440 | 440 |
441 if (purple_xfer_get_type(xfer) != PURPLE_XFER_RECEIVE) { | 441 if (purple_xfer_get_type(xfer) != PURPLE_XFER_RECEIVE) { |
442 return 0; | 442 return 0; |
443 } | 443 } |
444 | 444 |
445 len = read(xfer->fd, buf, sizeof(buf)); | 445 len = read(purple_xfer_get_fd(xfer), buf, sizeof(buf)); |
446 | 446 |
447 if (len <= 0) { | 447 if (len <= 0) { |
448 if ((purple_xfer_get_size(xfer) > 0) && | 448 if ((purple_xfer_get_size(xfer) > 0) && |
449 (purple_xfer_get_bytes_sent(xfer) >= purple_xfer_get_size(xfer))) { | 449 (purple_xfer_get_bytes_sent(xfer) >= purple_xfer_get_size(xfer))) { |
450 purple_xfer_set_completed(xfer, TRUE); | 450 purple_xfer_set_completed(xfer, TRUE); |
503 | 503 |
504 if (purple_xfer_get_type(xfer) != PURPLE_XFER_SEND) { | 504 if (purple_xfer_get_type(xfer) != PURPLE_XFER_SEND) { |
505 return -1; | 505 return -1; |
506 } | 506 } |
507 | 507 |
508 len = write(xfer->fd, buffer, size); | 508 len = write(purple_xfer_get_fd(xfer), buffer, size); |
509 | 509 |
510 if (len == -1) { | 510 if (len == -1) { |
511 if (purple_xfer_get_bytes_sent(xfer) >= purple_xfer_get_size(xfer)) | 511 if (purple_xfer_get_bytes_sent(xfer) >= purple_xfer_get_size(xfer)) |
512 purple_xfer_set_completed(xfer, TRUE); | 512 purple_xfer_set_completed(xfer, TRUE); |
513 if ((errno != EAGAIN) && (errno != EINTR)) | 513 if ((errno != EAGAIN) && (errno != EINTR)) |
615 /* Send HTTP OK after receiving file */ | 615 /* Send HTTP OK after receiving file */ |
616 static void yahoo_p2p_ft_server_send_OK(PurpleXfer *xfer) | 616 static void yahoo_p2p_ft_server_send_OK(PurpleXfer *xfer) |
617 { | 617 { |
618 char *tx = NULL; | 618 char *tx = NULL; |
619 int written; | 619 int written; |
620 int fd = purple_xfer_get_fd(xfer); | |
620 | 621 |
621 tx = "HTTP/1.1 200 OK\r\nContent-Length: 0\r\nContent-Type: application/octet-stream\r\nConnection: close\r\n\r\n"; | 622 tx = "HTTP/1.1 200 OK\r\nContent-Length: 0\r\nContent-Type: application/octet-stream\r\nConnection: close\r\n\r\n"; |
622 written = write(xfer->fd, tx, strlen(tx)); | 623 written = write(fd, tx, strlen(tx)); |
623 | 624 |
624 if (written < 0 && errno == EAGAIN) | 625 if (written < 0 && errno == EAGAIN) |
625 written = 0; | 626 written = 0; |
626 else if (written <= 0) | 627 else if (written <= 0) |
627 purple_debug_info("yahoo", "p2p filetransfer: Unable to write HTTP OK"); | 628 purple_debug_info("yahoo", "p2p filetransfer: Unable to write HTTP OK"); |
628 | 629 |
629 /* close connection */ | 630 /* close connection */ |
630 close(xfer->fd); | 631 close(fd); |
631 xfer->fd = -1; | 632 purple_xfer_set_fd(xfer, -1); |
632 } | 633 } |
633 | 634 |
634 static void yahoo_xfer_end(PurpleXfer *xfer_old) | 635 static void yahoo_xfer_end(PurpleXfer *xfer_old) |
635 { | 636 { |
636 struct yahoo_xfer_data *xfer_data; | 637 struct yahoo_xfer_data *xfer_data; |
642 if(xfer_data && xfer_data->version == 15 | 643 if(xfer_data && xfer_data->version == 15 |
643 && purple_xfer_get_type(xfer_old) == PURPLE_XFER_RECEIVE | 644 && purple_xfer_get_type(xfer_old) == PURPLE_XFER_RECEIVE |
644 && xfer_data->filename_list) { | 645 && xfer_data->filename_list) { |
645 | 646 |
646 /* Send HTTP OK in case of p2p transfer, when we act as server */ | 647 /* Send HTTP OK in case of p2p transfer, when we act as server */ |
647 if((xfer_data->xfer_url != NULL) && (xfer_old->fd >=0) && (purple_xfer_get_status(xfer_old) == PURPLE_XFER_STATUS_DONE)) | 648 if((xfer_data->xfer_url != NULL) && (purple_xfer_get_fd(xfer_old) >=0) && (purple_xfer_get_status(xfer_old) == PURPLE_XFER_STATUS_DONE)) |
648 yahoo_p2p_ft_server_send_OK(xfer_old); | 649 yahoo_p2p_ft_server_send_OK(xfer_old); |
649 | 650 |
650 /* removing top of filename & size list completely */ | 651 /* removing top of filename & size list completely */ |
651 g_free( xfer_data->filename_list->data ); | 652 g_free( xfer_data->filename_list->data ); |
652 g_free( xfer_data->size_list->data ); | 653 g_free( xfer_data->size_list->data ); |
659 | 660 |
660 /* if there are still more files */ | 661 /* if there are still more files */ |
661 if(xfer_data->filename_list) | 662 if(xfer_data->filename_list) |
662 { | 663 { |
663 gchar* filename; | 664 gchar* filename; |
664 long filesize; | 665 goffset filesize; |
665 | 666 |
666 filename = xfer_data->filename_list->data; | 667 filename = xfer_data->filename_list->data; |
667 filesize = atol( xfer_data->size_list->data ); | 668 filesize = g_ascii_strtoll( xfer_data->size_list->data, NULL, 10 ); |
668 | 669 |
669 gc = xfer_data->gc; | 670 gc = xfer_data->gc; |
670 yd = purple_connection_get_protocol_data(gc); | 671 yd = purple_connection_get_protocol_data(gc); |
671 | 672 |
672 /* setting up xfer_data for next file's tranfer */ | 673 /* setting up xfer_data for next file's tranfer */ |
695 | 696 |
696 /* Dereference xfer_data from old xfer */ | 697 /* Dereference xfer_data from old xfer */ |
697 purple_xfer_set_protocol_data(xfer_old, NULL); | 698 purple_xfer_set_protocol_data(xfer_old, NULL); |
698 | 699 |
699 /* Build the file transfer handle. */ | 700 /* Build the file transfer handle. */ |
700 xfer = purple_xfer_new(gc->account, PURPLE_XFER_RECEIVE, purple_xfer_get_remote_user(xfer_old)); | 701 xfer = purple_xfer_new(purple_connection_get_account(gc), PURPLE_XFER_RECEIVE, purple_xfer_get_remote_user(xfer_old)); |
701 | 702 |
702 | 703 |
703 if (xfer) { | 704 if (xfer) { |
704 /* Set the info about the incoming file. */ | 705 /* Set the info about the incoming file. */ |
705 char *utf8_filename = yahoo_string_decode(gc, filename, TRUE); | 706 char *utf8_filename = yahoo_string_decode(gc, filename, TRUE); |
805 PurpleXfer *xfer; | 806 PurpleXfer *xfer; |
806 YahooData *yd; | 807 YahooData *yd; |
807 struct yahoo_xfer_data *xfer_data; | 808 struct yahoo_xfer_data *xfer_data; |
808 char *service = NULL; | 809 char *service = NULL; |
809 char *filename = NULL; | 810 char *filename = NULL; |
810 unsigned long filesize = 0L; | 811 goffset filesize = G_GOFFSET_CONSTANT(0); |
811 GSList *l; | 812 GSList *l; |
812 | 813 |
813 yd = purple_connection_get_protocol_data(gc); | 814 yd = purple_connection_get_protocol_data(gc); |
814 | 815 |
815 for (l = pkt->hash; l; l = l->next) { | 816 for (l = pkt->hash; l; l = l->next) { |
833 break; | 834 break; |
834 case 27: | 835 case 27: |
835 filename = pair->value; | 836 filename = pair->value; |
836 break; | 837 break; |
837 case 28: | 838 case 28: |
838 filesize = atol(pair->value); | 839 filesize = g_ascii_strtoll(pair->value, NULL, 10); |
839 break; | 840 break; |
840 case 49: | 841 case 49: |
841 service = pair->value; | 842 service = pair->value; |
842 break; | 843 break; |
843 case 63: | 844 case 63: |
882 | 883 |
883 purple_debug_misc("yahoo_filexfer", "Host is %s, port is %d, path is %s, and the full url was %s.\n", | 884 purple_debug_misc("yahoo_filexfer", "Host is %s, port is %d, path is %s, and the full url was %s.\n", |
884 xfer_data->host, xfer_data->port, xfer_data->path, url); | 885 xfer_data->host, xfer_data->port, xfer_data->path, url); |
885 | 886 |
886 /* Build the file transfer handle. */ | 887 /* Build the file transfer handle. */ |
887 xfer = purple_xfer_new(gc->account, PURPLE_XFER_RECEIVE, from); | 888 xfer = purple_xfer_new(purple_connection_get_account(gc), PURPLE_XFER_RECEIVE, from); |
888 if (xfer == NULL) { | 889 if (xfer == NULL) { |
889 g_free(xfer_data); | 890 g_free(xfer_data); |
890 g_return_if_reached(); | 891 g_return_if_reached(); |
891 } | 892 } |
892 | 893 |
938 | 939 |
939 xfer_data = g_new0(struct yahoo_xfer_data, 1); | 940 xfer_data = g_new0(struct yahoo_xfer_data, 1); |
940 xfer_data->gc = gc; | 941 xfer_data->gc = gc; |
941 | 942 |
942 /* Build the file transfer handle. */ | 943 /* Build the file transfer handle. */ |
943 xfer = purple_xfer_new(gc->account, PURPLE_XFER_SEND, who); | 944 xfer = purple_xfer_new(purple_connection_get_account(gc), PURPLE_XFER_SEND, who); |
944 if (xfer == NULL) | 945 if (xfer == NULL) |
945 { | 946 { |
946 g_free(xfer_data); | 947 g_free(xfer_data); |
947 g_return_val_if_reached(NULL); | 948 g_return_val_if_reached(NULL); |
948 } | 949 } |
1198 yahoo_xfer_recv_cb_15(xfer, source, PURPLE_INPUT_READ); | 1199 yahoo_xfer_recv_cb_15(xfer, source, PURPLE_INPUT_READ); |
1199 } | 1200 } |
1200 else if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE && xd->status_15 == HEAD_REPLY_RECEIVED) | 1201 else if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE && xd->status_15 == HEAD_REPLY_RECEIVED) |
1201 { | 1202 { |
1202 xd->status_15 = TRANSFER_PHASE; | 1203 xd->status_15 = TRANSFER_PHASE; |
1203 xfer->fd = source; | 1204 purple_xfer_set_fd(xfer, source); |
1204 purple_xfer_start(xfer, source, NULL, 0); | 1205 purple_xfer_start(xfer, source, NULL, 0); |
1205 } | 1206 } |
1206 else if(purple_xfer_get_type(xfer) == PURPLE_XFER_SEND && (xd->status_15 == ACCEPTED || xd->status_15 == P2P_GET_REQUESTED) ) | 1207 else if(purple_xfer_get_type(xfer) == PURPLE_XFER_SEND && (xd->status_15 == ACCEPTED || xd->status_15 == P2P_GET_REQUESTED) ) |
1207 { | 1208 { |
1208 xd->status_15 = TRANSFER_PHASE; | 1209 xd->status_15 = TRANSFER_PHASE; |
1209 xfer->fd = source; | 1210 purple_xfer_set_fd(xfer, source); |
1210 /* Remove Read event */ | 1211 /* Remove Read event */ |
1211 purple_input_remove(xd->input_event); | 1212 purple_input_remove(xd->input_event); |
1212 xd->input_event = 0; | 1213 xd->input_event = 0; |
1213 purple_xfer_start(xfer, source, NULL, 0); | 1214 purple_xfer_start(xfer, source, NULL, 0); |
1214 } | 1215 } |
1217 xd->status_15 = P2P_HEAD_REPLIED; | 1218 xd->status_15 = P2P_HEAD_REPLIED; |
1218 /* Remove Read event and close descriptor */ | 1219 /* Remove Read event and close descriptor */ |
1219 purple_input_remove(xd->input_event); | 1220 purple_input_remove(xd->input_event); |
1220 xd->input_event = 0; | 1221 xd->input_event = 0; |
1221 close(source); | 1222 close(source); |
1222 xfer->fd = -1; | 1223 purple_xfer_set_fd(xfer, -1); |
1223 /* start local server, listen for connections */ | 1224 /* start local server, listen for connections */ |
1224 purple_network_listen(xd->yahoo_local_p2p_ft_server_port, AF_UNSPEC, SOCK_STREAM, TRUE, yahoo_p2p_ft_server_listen_cb, xfer); | 1225 purple_network_listen(xd->yahoo_local_p2p_ft_server_port, AF_UNSPEC, SOCK_STREAM, TRUE, yahoo_p2p_ft_server_listen_cb, xfer); |
1225 } | 1226 } |
1226 else | 1227 else |
1227 { | 1228 { |
1268 { | 1269 { |
1269 /* sending file via p2p, we are connected as client */ | 1270 /* sending file via p2p, we are connected as client */ |
1270 initial_buffer = g_strdup_printf("POST /%s HTTP/1.1\r\n" | 1271 initial_buffer = g_strdup_printf("POST /%s HTTP/1.1\r\n" |
1271 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" | 1272 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" |
1272 "Host: %s\r\n" | 1273 "Host: %s\r\n" |
1273 "Content-Length: %" G_GSIZE_FORMAT "\r\n" | 1274 "Content-Length: %" G_GOFFSET_FORMAT "\r\n" |
1274 "Cache-Control: no-cache\r\n\r\n", | 1275 "Cache-Control: no-cache\r\n\r\n", |
1275 xd->path, | 1276 xd->path, |
1276 xd->host, | 1277 xd->host, |
1277 purple_xfer_get_size(xfer)); /* to do, add Referer */ | 1278 purple_xfer_get_size(xfer)); /* to do, add Referer */ |
1278 } | 1279 } |
1281 /* sending file via relaying */ | 1282 /* sending file via relaying */ |
1282 initial_buffer = g_strdup_printf("POST /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\n" | 1283 initial_buffer = g_strdup_printf("POST /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\n" |
1283 "Cookie:%s\r\n" | 1284 "Cookie:%s\r\n" |
1284 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" | 1285 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" |
1285 "Host: %s\r\n" | 1286 "Host: %s\r\n" |
1286 "Content-Length: %" G_GSIZE_FORMAT "\r\n" | 1287 "Content-Length: %" G_GOFFSET_FORMAT "\r\n" |
1287 "Cache-Control: no-cache\r\n\r\n", | 1288 "Cache-Control: no-cache\r\n\r\n", |
1288 purple_url_encode(xd->xfer_idstring_for_relay), | 1289 purple_url_encode(xd->xfer_idstring_for_relay), |
1289 purple_normalize(account, purple_account_get_username(account)), | 1290 purple_normalize(account, purple_account_get_username(account)), |
1290 purple_xfer_get_remote_user(xfer), | 1291 purple_xfer_get_remote_user(xfer), |
1291 cookies, | 1292 cookies, |
1380 return; | 1381 return; |
1381 } | 1382 } |
1382 | 1383 |
1383 purple_input_remove(xd->input_event); | 1384 purple_input_remove(xd->input_event); |
1384 xd->status_15 = TRANSFER_PHASE; | 1385 xd->status_15 = TRANSFER_PHASE; |
1385 xfer->fd = source; | 1386 purple_xfer_set_fd(xfer, source); |
1386 purple_xfer_start(xfer, source, NULL, 0); | 1387 purple_xfer_start(xfer, source, NULL, 0); |
1387 } | 1388 } |
1388 | 1389 |
1389 static void yahoo_p2p_ft_HEAD_GET_cb(gpointer data, gint source, PurpleInputCondition cond) | 1390 static void yahoo_p2p_ft_HEAD_GET_cb(gpointer data, gint source, PurpleInputCondition cond) |
1390 { | 1391 { |
1436 gchar *initial_buffer = g_strdup_printf("HTTP/1.0 200 OK\r\n" | 1437 gchar *initial_buffer = g_strdup_printf("HTTP/1.0 200 OK\r\n" |
1437 "Date: %s GMT\r\n" | 1438 "Date: %s GMT\r\n" |
1438 "Server: Y!/1.0\r\n" | 1439 "Server: Y!/1.0\r\n" |
1439 "MIME-version: 1.0\r\n" | 1440 "MIME-version: 1.0\r\n" |
1440 "Last-modified: %s GMT\r\n" | 1441 "Last-modified: %s GMT\r\n" |
1441 "Content-length: %" G_GSIZE_FORMAT "\r\n\r\n", | 1442 "Content-length: %" G_GOFFSET_FORMAT "\r\n\r\n", |
1442 time_str, time_str, purple_xfer_get_size(xfer)); | 1443 time_str, time_str, purple_xfer_get_size(xfer)); |
1443 xd->txbuf = (guchar *)initial_buffer; | 1444 xd->txbuf = (guchar *)initial_buffer; |
1444 xd->txbuflen = strlen(initial_buffer); | 1445 xd->txbuflen = strlen(initial_buffer); |
1445 xd->txbuf_written = 0; | 1446 xd->txbuf_written = 0; |
1446 } | 1447 } |
1481 /* remove watcher and close p2p ft server */ | 1482 /* remove watcher and close p2p ft server */ |
1482 purple_input_remove(xd->yahoo_p2p_ft_server_watcher); | 1483 purple_input_remove(xd->yahoo_p2p_ft_server_watcher); |
1483 close(xd->yahoo_local_p2p_ft_server_fd); | 1484 close(xd->yahoo_local_p2p_ft_server_fd); |
1484 | 1485 |
1485 /* Add an Input Read event to the file descriptor */ | 1486 /* Add an Input Read event to the file descriptor */ |
1486 xfer->fd = acceptfd; | 1487 purple_xfer_set_fd(xfer, acceptfd); |
1487 if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE) | 1488 if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE) |
1488 xd->input_event = purple_input_add(acceptfd, PURPLE_INPUT_READ, yahoo_p2p_ft_POST_cb, data); | 1489 xd->input_event = purple_input_add(acceptfd, PURPLE_INPUT_READ, yahoo_p2p_ft_POST_cb, data); |
1489 else | 1490 else |
1490 xd->input_event = purple_input_add(acceptfd, PURPLE_INPUT_READ, yahoo_p2p_ft_HEAD_GET_cb, data); | 1491 xd->input_event = purple_input_add(acceptfd, PURPLE_INPUT_READ, yahoo_p2p_ft_HEAD_GET_cb, data); |
1491 } | 1492 } |
1604 struct yahoo_xfer_data *xfer_data; | 1605 struct yahoo_xfer_data *xfer_data; |
1605 char *service = NULL; | 1606 char *service = NULL; |
1606 char *filename = NULL; | 1607 char *filename = NULL; |
1607 char *xfer_peer_idstring = NULL; | 1608 char *xfer_peer_idstring = NULL; |
1608 char *utf8_filename; | 1609 char *utf8_filename; |
1609 unsigned long filesize = 0L; | 1610 goffset filesize = G_GOFFSET_CONSTANT(0); |
1610 GSList *l; | 1611 GSList *l; |
1611 GSList *filename_list = NULL; | 1612 GSList *filename_list = NULL; |
1612 GSList *size_list = NULL; | 1613 GSList *size_list = NULL; |
1613 int nooffiles = 0; | 1614 int nooffiles = 0; |
1614 | 1615 |
1721 return; | 1722 return; |
1722 /* have to change list into order in which client at other end sends */ | 1723 /* have to change list into order in which client at other end sends */ |
1723 filename_list = g_slist_reverse(filename_list); | 1724 filename_list = g_slist_reverse(filename_list); |
1724 size_list = g_slist_reverse(size_list); | 1725 size_list = g_slist_reverse(size_list); |
1725 filename = filename_list->data; | 1726 filename = filename_list->data; |
1726 filesize = atol(size_list->data); | 1727 filesize = g_ascii_strtoll(size_list->data, NULL, 10); |
1727 | 1728 |
1728 if(!from) return; | 1729 if(!from) return; |
1729 xfer_data = g_new0(struct yahoo_xfer_data, 1); | 1730 xfer_data = g_new0(struct yahoo_xfer_data, 1); |
1730 xfer_data->version = 15; | 1731 xfer_data->version = 15; |
1731 xfer_data->firstoflist = TRUE; | 1732 xfer_data->firstoflist = TRUE; |
1733 xfer_data->xfer_peer_idstring = g_strdup(xfer_peer_idstring); | 1734 xfer_data->xfer_peer_idstring = g_strdup(xfer_peer_idstring); |
1734 xfer_data->filename_list = filename_list; | 1735 xfer_data->filename_list = filename_list; |
1735 xfer_data->size_list = size_list; | 1736 xfer_data->size_list = size_list; |
1736 | 1737 |
1737 /* Build the file transfer handle. */ | 1738 /* Build the file transfer handle. */ |
1738 xfer = purple_xfer_new(gc->account, PURPLE_XFER_RECEIVE, from); | 1739 xfer = purple_xfer_new(purple_connection_get_account(gc), PURPLE_XFER_RECEIVE, from); |
1739 if (xfer == NULL) | 1740 if (xfer == NULL) |
1740 { | 1741 { |
1741 g_free(xfer_data); | 1742 g_free(xfer_data); |
1742 g_return_if_reached(); | 1743 g_return_if_reached(); |
1743 } | 1744 } |