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;