Mercurial > pidgin.yaz
comparison libpurple/protocols/yahoo/yahoo_filexfer.c @ 32757:9bbfb9d74085
Update Yahoo for 64-bit file transfers. I'm not really sure if this
will work, but since the file sizes are strings, it's should be okay,
theoretically. The only exception is this yahoo_xfer_init_15 function,
though it seems we never parse have to parse that packet.
Refs #8477.
author | Elliott Sales de Andrade <qulogic@pidgin.im> |
---|---|
date | Sun, 16 Oct 2011 07:41:49 +0000 |
parents | d2ef8926b960 |
children | 2ec94166be43 |
comparison
equal
deleted
inserted
replaced
32756:280ef1bd125b | 32757:9bbfb9d74085 |
---|---|
258 yd = purple_connection_get_protocol_data(gc); | 258 yd = purple_connection_get_protocol_data(gc); |
259 | 259 |
260 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANSFER, | 260 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANSFER, |
261 YAHOO_STATUS_AVAILABLE, yd->session_id); | 261 YAHOO_STATUS_AVAILABLE, yd->session_id); |
262 | 262 |
263 size = g_strdup_printf("%" G_GSIZE_FORMAT, purple_xfer_get_size(xfer)); | 263 size = g_strdup_printf("%" G_GOFFSET_FORMAT, purple_xfer_get_size(xfer)); |
264 filename = g_path_get_basename(purple_xfer_get_local_filename(xfer)); | 264 filename = g_path_get_basename(purple_xfer_get_local_filename(xfer)); |
265 encoded_filename = yahoo_string_encode(gc, filename, NULL); | 265 encoded_filename = yahoo_string_encode(gc, filename, NULL); |
266 | 266 |
267 yahoo_packet_hash(pkt, "sssss", 0, purple_connection_get_display_name(gc), | 267 yahoo_packet_hash(pkt, "sssss", 0, purple_connection_get_display_name(gc), |
268 5, purple_xfer_get_remote_user(xfer), 14, "", 27, encoded_filename, 28, size); | 268 5, purple_xfer_get_remote_user(xfer), 14, "", 27, encoded_filename, 28, size); |
277 | 277 |
278 host = purple_account_get_string(account, "xfer_host", YAHOO_XFER_HOST); | 278 host = purple_account_get_string(account, "xfer_host", YAHOO_XFER_HOST); |
279 port = purple_account_get_int(account, "xfer_port", YAHOO_XFER_PORT); | 279 port = purple_account_get_int(account, "xfer_port", YAHOO_XFER_PORT); |
280 header = g_strdup_printf( | 280 header = g_strdup_printf( |
281 "POST http://%s:%d/notifyft HTTP/1.0\r\n" | 281 "POST http://%s:%d/notifyft HTTP/1.0\r\n" |
282 "Content-length: %" G_GSIZE_FORMAT "\r\n" | 282 "Content-length: %" G_GOFFSET_FORMAT "\r\n" |
283 "Host: %s:%d\r\n" | 283 "Host: %s:%d\r\n" |
284 "Cookie: Y=%s; T=%s\r\n" | 284 "Cookie: Y=%s; T=%s\r\n" |
285 "\r\n", | 285 "\r\n", |
286 host, port, content_length + 4 + purple_xfer_get_size(xfer), | 286 host, port, content_length + 4 + purple_xfer_get_size(xfer), |
287 host, port, yd->cookie_y, yd->cookie_t); | 287 host, port, yd->cookie_y, yd->cookie_t); |
376 222, 1, | 376 222, 1, |
377 266, 1, | 377 266, 1, |
378 302, 268, | 378 302, 268, |
379 300, 268, | 379 300, 268, |
380 27, filename, | 380 27, filename, |
381 28, purple_xfer_get_size(xfer), | 381 28, (int)purple_xfer_get_size(xfer), |
382 301, 268, | 382 301, 268, |
383 303, 268); | 383 303, 268); |
384 g_free(filename); | 384 g_free(filename); |
385 } else { | 385 } else { |
386 if(xfer_data->firstoflist == TRUE) { | 386 if(xfer_data->firstoflist == TRUE) { |
409 static void yahoo_xfer_start(PurpleXfer *xfer) | 409 static void yahoo_xfer_start(PurpleXfer *xfer) |
410 { | 410 { |
411 /* We don't need to do anything here, do we? */ | 411 /* We don't need to do anything here, do we? */ |
412 } | 412 } |
413 | 413 |
414 static guint calculate_length(const gchar *l, size_t len) | 414 static goffset calculate_length(const gchar *l, size_t len) |
415 { | 415 { |
416 int i; | 416 int i; |
417 | 417 |
418 for (i = 0; i < len; i++) { | 418 for (i = 0; i < len; i++) { |
419 if (!g_ascii_isdigit(l[i])) | 419 if (!g_ascii_isdigit(l[i])) |
420 continue; | 420 continue; |
421 return strtol(l + i, NULL, 10); | 421 return g_ascii_strtoll(l + i, NULL, 10); |
422 } | 422 } |
423 return 0; | 423 return 0; |
424 } | 424 } |
425 | 425 |
426 static gssize yahoo_xfer_read(guchar **buffer, PurpleXfer *xfer) | 426 static gssize yahoo_xfer_read(guchar **buffer, PurpleXfer *xfer) |
428 gchar buf[4096]; | 428 gchar buf[4096]; |
429 gssize len; | 429 gssize len; |
430 gchar *start = NULL; | 430 gchar *start = NULL; |
431 gchar *length; | 431 gchar *length; |
432 gchar *end; | 432 gchar *end; |
433 int filelen; | 433 goffset filelen; |
434 struct yahoo_xfer_data *xd = purple_xfer_get_protocol_data(xfer); | 434 struct yahoo_xfer_data *xd = purple_xfer_get_protocol_data(xfer); |
435 | 435 |
436 if (purple_xfer_get_type(xfer) != PURPLE_XFER_RECEIVE) { | 436 if (purple_xfer_get_type(xfer) != PURPLE_XFER_RECEIVE) { |
437 return 0; | 437 return 0; |
438 } | 438 } |
654 | 654 |
655 /* if there are still more files */ | 655 /* if there are still more files */ |
656 if(xfer_data->filename_list) | 656 if(xfer_data->filename_list) |
657 { | 657 { |
658 gchar* filename; | 658 gchar* filename; |
659 long filesize; | 659 goffset filesize; |
660 | 660 |
661 filename = xfer_data->filename_list->data; | 661 filename = xfer_data->filename_list->data; |
662 filesize = atol( xfer_data->size_list->data ); | 662 filesize = g_ascii_strtoll( xfer_data->size_list->data, NULL, 10 ); |
663 | 663 |
664 gc = xfer_data->gc; | 664 gc = xfer_data->gc; |
665 yd = purple_connection_get_protocol_data(gc); | 665 yd = purple_connection_get_protocol_data(gc); |
666 | 666 |
667 /* setting up xfer_data for next file's tranfer */ | 667 /* setting up xfer_data for next file's tranfer */ |
800 PurpleXfer *xfer; | 800 PurpleXfer *xfer; |
801 YahooData *yd; | 801 YahooData *yd; |
802 struct yahoo_xfer_data *xfer_data; | 802 struct yahoo_xfer_data *xfer_data; |
803 char *service = NULL; | 803 char *service = NULL; |
804 char *filename = NULL; | 804 char *filename = NULL; |
805 unsigned long filesize = 0L; | 805 goffset filesize = G_GOFFSET_CONSTANT(0); |
806 GSList *l; | 806 GSList *l; |
807 | 807 |
808 yd = purple_connection_get_protocol_data(gc); | 808 yd = purple_connection_get_protocol_data(gc); |
809 | 809 |
810 for (l = pkt->hash; l; l = l->next) { | 810 for (l = pkt->hash; l; l = l->next) { |
828 break; | 828 break; |
829 case 27: | 829 case 27: |
830 filename = pair->value; | 830 filename = pair->value; |
831 break; | 831 break; |
832 case 28: | 832 case 28: |
833 filesize = atol(pair->value); | 833 filesize = g_ascii_strtoll(pair->value, NULL, 10); |
834 break; | 834 break; |
835 case 49: | 835 case 49: |
836 service = pair->value; | 836 service = pair->value; |
837 break; | 837 break; |
838 case 63: | 838 case 63: |
1263 { | 1263 { |
1264 /* sending file via p2p, we are connected as client */ | 1264 /* sending file via p2p, we are connected as client */ |
1265 initial_buffer = g_strdup_printf("POST /%s HTTP/1.1\r\n" | 1265 initial_buffer = g_strdup_printf("POST /%s HTTP/1.1\r\n" |
1266 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" | 1266 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" |
1267 "Host: %s\r\n" | 1267 "Host: %s\r\n" |
1268 "Content-Length: %" G_GSIZE_FORMAT "\r\n" | 1268 "Content-Length: %" G_GOFFSET_FORMAT "\r\n" |
1269 "Cache-Control: no-cache\r\n\r\n", | 1269 "Cache-Control: no-cache\r\n\r\n", |
1270 xd->path, | 1270 xd->path, |
1271 xd->host, | 1271 xd->host, |
1272 purple_xfer_get_size(xfer)); /* to do, add Referer */ | 1272 purple_xfer_get_size(xfer)); /* to do, add Referer */ |
1273 } | 1273 } |
1276 /* sending file via relaying */ | 1276 /* sending file via relaying */ |
1277 initial_buffer = g_strdup_printf("POST /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\n" | 1277 initial_buffer = g_strdup_printf("POST /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\n" |
1278 "Cookie:%s\r\n" | 1278 "Cookie:%s\r\n" |
1279 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" | 1279 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" |
1280 "Host: %s\r\n" | 1280 "Host: %s\r\n" |
1281 "Content-Length: %" G_GSIZE_FORMAT "\r\n" | 1281 "Content-Length: %" G_GOFFSET_FORMAT "\r\n" |
1282 "Cache-Control: no-cache\r\n\r\n", | 1282 "Cache-Control: no-cache\r\n\r\n", |
1283 purple_url_encode(xd->xfer_idstring_for_relay), | 1283 purple_url_encode(xd->xfer_idstring_for_relay), |
1284 purple_normalize(account, purple_account_get_username(account)), | 1284 purple_normalize(account, purple_account_get_username(account)), |
1285 purple_xfer_get_remote_user(xfer), | 1285 purple_xfer_get_remote_user(xfer), |
1286 cookies, | 1286 cookies, |
1431 gchar *initial_buffer = g_strdup_printf("HTTP/1.0 200 OK\r\n" | 1431 gchar *initial_buffer = g_strdup_printf("HTTP/1.0 200 OK\r\n" |
1432 "Date: %s GMT\r\n" | 1432 "Date: %s GMT\r\n" |
1433 "Server: Y!/1.0\r\n" | 1433 "Server: Y!/1.0\r\n" |
1434 "MIME-version: 1.0\r\n" | 1434 "MIME-version: 1.0\r\n" |
1435 "Last-modified: %s GMT\r\n" | 1435 "Last-modified: %s GMT\r\n" |
1436 "Content-length: %" G_GSIZE_FORMAT "\r\n\r\n", | 1436 "Content-length: %" G_GOFFSET_FORMAT "\r\n\r\n", |
1437 time_str, time_str, purple_xfer_get_size(xfer)); | 1437 time_str, time_str, purple_xfer_get_size(xfer)); |
1438 xd->txbuf = (guchar *)initial_buffer; | 1438 xd->txbuf = (guchar *)initial_buffer; |
1439 xd->txbuflen = strlen(initial_buffer); | 1439 xd->txbuflen = strlen(initial_buffer); |
1440 xd->txbuf_written = 0; | 1440 xd->txbuf_written = 0; |
1441 } | 1441 } |
1599 struct yahoo_xfer_data *xfer_data; | 1599 struct yahoo_xfer_data *xfer_data; |
1600 char *service = NULL; | 1600 char *service = NULL; |
1601 char *filename = NULL; | 1601 char *filename = NULL; |
1602 char *xfer_peer_idstring = NULL; | 1602 char *xfer_peer_idstring = NULL; |
1603 char *utf8_filename; | 1603 char *utf8_filename; |
1604 unsigned long filesize = 0L; | 1604 goffset filesize = G_GOFFSET_CONSTANT(0); |
1605 GSList *l; | 1605 GSList *l; |
1606 GSList *filename_list = NULL; | 1606 GSList *filename_list = NULL; |
1607 GSList *size_list = NULL; | 1607 GSList *size_list = NULL; |
1608 int nooffiles = 0; | 1608 int nooffiles = 0; |
1609 | 1609 |
1716 return; | 1716 return; |
1717 /* have to change list into order in which client at other end sends */ | 1717 /* have to change list into order in which client at other end sends */ |
1718 filename_list = g_slist_reverse(filename_list); | 1718 filename_list = g_slist_reverse(filename_list); |
1719 size_list = g_slist_reverse(size_list); | 1719 size_list = g_slist_reverse(size_list); |
1720 filename = filename_list->data; | 1720 filename = filename_list->data; |
1721 filesize = atol(size_list->data); | 1721 filesize = g_ascii_strtoll(size_list->data, NULL, 10); |
1722 | 1722 |
1723 if(!from) return; | 1723 if(!from) return; |
1724 xfer_data = g_new0(struct yahoo_xfer_data, 1); | 1724 xfer_data = g_new0(struct yahoo_xfer_data, 1); |
1725 xfer_data->version = 15; | 1725 xfer_data->version = 15; |
1726 xfer_data->firstoflist = TRUE; | 1726 xfer_data->firstoflist = TRUE; |