comparison libpurple/protocols/yahoo/yahoo_filexfer.c @ 32449:b6defcebfe4b

Steps toward hiding PurpleXfer. To convert prpls as they are now, lot of new accessors are needed (for stuff that maybe shouldn't be exposed directly). To convert prpls so that they don't keep re-implementing the same type of stuff, a lot of error-prone changes are needed.
author Daniel Atallah <daniel.atallah@gmail.com>
date Mon, 29 Aug 2011 22:55:51 +0000
parents dc4de0b08405
children fcf841ffd620
comparison
equal deleted inserted replaced
32448:011abe09b264 32449:b6defcebfe4b
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;
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);
242 if (!(xd = purple_xfer_get_protocol_data(xfer))) 243 if (!(xd = purple_xfer_get_protocol_data(xfer)))
243 return; 244 return;
244 245
245 if (source < 0) { 246 if (source < 0) {
246 purple_xfer_error(PURPLE_XFER_RECEIVE, purple_xfer_get_account(xfer), 247 purple_xfer_error(PURPLE_XFER_RECEIVE, purple_xfer_get_account(xfer),
247 xfer->who, _("Unable to connect.")); 248 purple_xfer_get_remote_user(xfer), _("Unable to connect."));
248 purple_xfer_cancel_remote(xfer); 249 purple_xfer_cancel_remote(xfer);
249 return; 250 return;
250 } 251 }
251 252
252 xfer->fd = source; 253 xfer->fd = source;
262 size = g_strdup_printf("%" G_GSIZE_FORMAT, purple_xfer_get_size(xfer)); 263 size = g_strdup_printf("%" G_GSIZE_FORMAT, purple_xfer_get_size(xfer));
263 filename = g_path_get_basename(purple_xfer_get_local_filename(xfer)); 264 filename = g_path_get_basename(purple_xfer_get_local_filename(xfer));
264 encoded_filename = yahoo_string_encode(gc, filename, NULL); 265 encoded_filename = yahoo_string_encode(gc, filename, NULL);
265 266
266 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),
267 5, xfer->who, 14, "", 27, encoded_filename, 28, size); 268 5, purple_xfer_get_remote_user(xfer), 14, "", 27, encoded_filename, 28, size);
268 g_free(size); 269 g_free(size);
269 g_free(encoded_filename); 270 g_free(encoded_filename);
270 g_free(filename); 271 g_free(filename);
271 272
272 content_length = YAHOO_PACKET_HDRLEN + yahoo_packet_length(pkt); 273 content_length = YAHOO_PACKET_HDRLEN + yahoo_packet_length(pkt);
368 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15, 369 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15,
369 YAHOO_STATUS_AVAILABLE, 370 YAHOO_STATUS_AVAILABLE,
370 yd->session_id); 371 yd->session_id);
371 yahoo_packet_hash(pkt, "sssiiiisiii", 372 yahoo_packet_hash(pkt, "sssiiiisiii",
372 1, purple_normalize(account, purple_account_get_username(account)), 373 1, purple_normalize(account, purple_account_get_username(account)),
373 5, xfer->who, 374 5, purple_xfer_get_remote_user(xfer),
374 265, xfer_data->xfer_peer_idstring, 375 265, xfer_data->xfer_peer_idstring,
375 222, 1, 376 222, 1,
376 266, 1, 377 266, 1,
377 302, 268, 378 302, 268,
378 300, 268, 379 300, 268,
379 27, filename, 380 27, filename,
380 28, xfer->size, 381 28, purple_xfer_get_size(xfer),
381 301, 268, 382 301, 268,
382 303, 268); 383 303, 268);
383 g_free(filename); 384 g_free(filename);
384 } else { 385 } else {
385 if(xfer_data->firstoflist == TRUE) { 386 if(xfer_data->firstoflist == TRUE) {
386 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15, 387 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15,
387 YAHOO_STATUS_AVAILABLE, yd->session_id); 388 YAHOO_STATUS_AVAILABLE, yd->session_id);
388 389
389 yahoo_packet_hash(pkt, "sssi", 390 yahoo_packet_hash(pkt, "sssi",
390 1, purple_normalize(account, purple_account_get_username(account)), 391 1, purple_normalize(account, purple_account_get_username(account)),
391 5, xfer->who, 392 5, purple_xfer_get_remote_user(xfer),
392 265, xfer_data->xfer_peer_idstring, 393 265, xfer_data->xfer_peer_idstring,
393 222, 3); 394 222, 3);
394 } else { 395 } else {
395 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_ACC_15, 396 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_ACC_15,
396 YAHOO_STATUS_AVAILABLE, yd->session_id); 397 YAHOO_STATUS_AVAILABLE, yd->session_id);
397 398
398 yahoo_packet_hash(pkt, "sssi", 399 yahoo_packet_hash(pkt, "sssi",
399 1, purple_normalize(account, purple_account_get_username(account)), 400 1, purple_normalize(account, purple_account_get_username(account)),
400 5, xfer->who, 401 5, purple_xfer_get_remote_user(xfer),
401 265, xfer_data->xfer_peer_idstring, 402 265, xfer_data->xfer_peer_idstring,
402 271, 1); 403 271, 1);
403 } 404 }
404 } 405 }
405 yahoo_packet_send_and_free(pkt, yd); 406 yahoo_packet_send_and_free(pkt, yd);
533 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_INFO_15, 534 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_INFO_15,
534 YAHOO_STATUS_DISCONNECTED, 535 YAHOO_STATUS_DISCONNECTED,
535 yd->session_id); 536 yd->session_id);
536 yahoo_packet_hash(pkt, "sssi", 537 yahoo_packet_hash(pkt, "sssi",
537 1, purple_normalize(account, purple_account_get_username(account)), 538 1, purple_normalize(account, purple_account_get_username(account)),
538 5, xfer->who, 539 5, purple_xfer_get_remote_user(xfer),
539 265, xfer_data->xfer_peer_idstring, 540 265, xfer_data->xfer_peer_idstring,
540 66, -1); 541 66, -1);
541 } 542 }
542 else 543 else
543 { 544 {
544 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15, 545 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15,
545 YAHOO_STATUS_AVAILABLE, 546 YAHOO_STATUS_AVAILABLE,
546 yd->session_id); 547 yd->session_id);
547 yahoo_packet_hash(pkt, "sssi", 548 yahoo_packet_hash(pkt, "sssi",
548 1, purple_normalize(account, purple_account_get_username(account)), 549 1, purple_normalize(account, purple_account_get_username(account)),
549 5, xfer->who, 550 5, purple_xfer_get_remote_user(xfer),
550 265, xfer_data->xfer_peer_idstring, 551 265, xfer_data->xfer_peer_idstring,
551 222, 2); 552 222, 2);
552 } 553 }
553 yahoo_packet_send_and_free(pkt, yd); 554 yahoo_packet_send_and_free(pkt, yd);
554 } 555 }
581 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15, 582 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15,
582 YAHOO_STATUS_AVAILABLE, 583 YAHOO_STATUS_AVAILABLE,
583 yd->session_id); 584 yd->session_id);
584 yahoo_packet_hash(pkt, "sssi", 585 yahoo_packet_hash(pkt, "sssi",
585 1, purple_normalize(account, purple_account_get_username(account)), 586 1, purple_normalize(account, purple_account_get_username(account)),
586 5, xfer->who, 587 5, purple_xfer_get_remote_user(xfer),
587 265, xfer_data->xfer_peer_idstring, 588 265, xfer_data->xfer_peer_idstring,
588 222, 4); 589 222, 4);
589 } 590 }
590 else 591 else
591 { 592 {
592 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15, 593 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15,
593 YAHOO_STATUS_DISCONNECTED, 594 YAHOO_STATUS_DISCONNECTED,
594 yd->session_id); 595 yd->session_id);
595 yahoo_packet_hash(pkt, "sssi", 596 yahoo_packet_hash(pkt, "sssi",
596 1, purple_normalize(account, purple_account_get_username(account)), 597 1, purple_normalize(account, purple_account_get_username(account)),
597 5, xfer->who, 598 5, purple_xfer_get_remote_user(xfer),
598 265, xfer_data->xfer_peer_idstring, 599 265, xfer_data->xfer_peer_idstring,
599 66, -1); 600 66, -1);
600 } 601 }
601 yahoo_packet_send_and_free(pkt, yd); 602 yahoo_packet_send_and_free(pkt, yd);
602 } 603 }
610 static void yahoo_p2p_ft_server_send_OK(PurpleXfer *xfer) 611 static void yahoo_p2p_ft_server_send_OK(PurpleXfer *xfer)
611 { 612 {
612 char *tx = NULL; 613 char *tx = NULL;
613 int written; 614 int written;
614 615
615 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"); 616 tx = "HTTP/1.1 200 OK\r\nContent-Length: 0\r\nContent-Type: application/octet-stream\r\nConnection: close\r\n\r\n";
616 written = write(xfer->fd, tx, strlen(tx)); 617 written = write(xfer->fd, tx, strlen(tx));
617 618
618 if (written < 0 && errno == EAGAIN) 619 if (written < 0 && errno == EAGAIN)
619 written = 0; 620 written = 0;
620 else if (written <= 0) 621 else if (written <= 0)
621 purple_debug_info("yahoo", "p2p filetransfer: Unable to write HTTP OK"); 622 purple_debug_info("yahoo", "p2p filetransfer: Unable to write HTTP OK");
622 623
623 /* close connection */ 624 /* close connection */
624 close(xfer->fd); 625 close(xfer->fd);
625 xfer->fd = -1; 626 xfer->fd = -1;
626 g_free(tx);
627 } 627 }
628 628
629 static void yahoo_xfer_end(PurpleXfer *xfer_old) 629 static void yahoo_xfer_end(PurpleXfer *xfer_old)
630 { 630 {
631 struct yahoo_xfer_data *xfer_data; 631 struct yahoo_xfer_data *xfer_data;
690 690
691 /* Dereference xfer_data from old xfer */ 691 /* Dereference xfer_data from old xfer */
692 purple_xfer_set_protocol_data(xfer_old, NULL); 692 purple_xfer_set_protocol_data(xfer_old, NULL);
693 693
694 /* Build the file transfer handle. */ 694 /* Build the file transfer handle. */
695 xfer = purple_xfer_new(gc->account, PURPLE_XFER_RECEIVE, xfer_old->who); 695 xfer = purple_xfer_new(gc->account, PURPLE_XFER_RECEIVE, purple_xfer_get_remote_user(xfer_old));
696 696
697 697
698 if (xfer) { 698 if (xfer) {
699 /* Set the info about the incoming file. */ 699 /* Set the info about the incoming file. */
700 char *utf8_filename = yahoo_string_decode(gc, filename, TRUE); 700 char *utf8_filename = yahoo_string_decode(gc, filename, TRUE);
1054 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_INFO_15, YAHOO_STATUS_AVAILABLE, yd->session_id); 1054 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_INFO_15, YAHOO_STATUS_AVAILABLE, yd->session_id);
1055 filename = g_path_get_basename(purple_xfer_get_local_filename(xfer)); 1055 filename = g_path_get_basename(purple_xfer_get_local_filename(xfer));
1056 1056
1057 yahoo_packet_hash(pkt, "ssssis", 1057 yahoo_packet_hash(pkt, "ssssis",
1058 1, purple_normalize(account, purple_account_get_username(account)), 1058 1, purple_normalize(account, purple_account_get_username(account)),
1059 5, xfer->who, 1059 5, purple_xfer_get_remote_user(xfer),
1060 265, xd->xfer_peer_idstring, 1060 265, xd->xfer_peer_idstring,
1061 27, filename, 1061 27, filename,
1062 249, 3, 1062 249, 3,
1063 250, xd->host); 1063 250, xd->host);
1064 1064
1105 static void yahoo_xfer_recv_cb_15(gpointer data, gint source, PurpleInputCondition condition) 1105 static void yahoo_xfer_recv_cb_15(gpointer data, gint source, PurpleInputCondition condition)
1106 { 1106 {
1107 PurpleXfer *xfer; 1107 PurpleXfer *xfer;
1108 struct yahoo_xfer_data *xd; 1108 struct yahoo_xfer_data *xd;
1109 int did; 1109 int did;
1110 gchar* buf; 1110 guchar buf[1000];
1111 gchar* t;
1112 PurpleAccount *account; 1111 PurpleAccount *account;
1113 PurpleConnection *gc; 1112 PurpleConnection *gc;
1114 1113
1115 xfer = data; 1114 xfer = data;
1116 xd = purple_xfer_get_protocol_data(xfer); 1115 xd = purple_xfer_get_protocol_data(xfer);
1117 account = purple_connection_get_account(xd->gc); 1116 account = purple_connection_get_account(xd->gc);
1118 gc = xd->gc; 1117 gc = xd->gc;
1119 1118
1120 buf=g_strnfill(1000, 0); 1119 while((did = read(source, buf, sizeof(buf))) > 0)
1121 while((did = read(source, buf, 998)) > 0) 1120 {
1122 { 1121 /* TODO: Convert to circ buffer, this all is pretty horrible */
1122 xd->txbuf = g_realloc(xd->txbuf, xd->txbuflen + did);
1123 g_memmove(xd->txbuf + xd->txbuflen, buf, did);
1123 xd->txbuflen += did; 1124 xd->txbuflen += did;
1124 buf[did] = '\0'; 1125 }
1125 t = xd->txbuf;
1126 xd->txbuf = g_strconcat(t,buf,NULL);
1127 g_free(t);
1128 }
1129 g_free(buf);
1130 1126
1131 if (did < 0 && errno == EAGAIN) 1127 if (did < 0 && errno == EAGAIN)
1132 return; 1128 return;
1133 else if (did < 0) { 1129 else if (did < 0) {
1134 purple_debug_error("yahoo", "Unable to write in order to start ft errno = %d\n", errno); 1130 purple_debug_error("yahoo", "Unable to write in order to start ft errno = %d\n", errno);
1242 return; 1238 return;
1243 gc = xd->gc; 1239 gc = xd->gc;
1244 account = purple_connection_get_account(gc); 1240 account = purple_connection_get_account(gc);
1245 if ((source < 0) || (xd->path == NULL) || (xd->host == NULL)) { 1241 if ((source < 0) || (xd->path == NULL) || (xd->host == NULL)) {
1246 purple_xfer_error(PURPLE_XFER_RECEIVE, purple_xfer_get_account(xfer), 1242 purple_xfer_error(PURPLE_XFER_RECEIVE, purple_xfer_get_account(xfer),
1247 xfer->who, _("Unable to connect.")); 1243 purple_xfer_get_remote_user(xfer), _("Unable to connect."));
1248 purple_xfer_cancel_remote(xfer); 1244 purple_xfer_cancel_remote(xfer);
1249 return; 1245 return;
1250 } 1246 }
1251 /* The first time we get here, assemble the tx buffer */ 1247 /* The first time we get here, assemble the tx buffer */
1252 if (xd->txbuflen == 0) 1248 if (xd->txbuflen == 0)
1253 { 1249 {
1254 gchar* cookies; 1250 gchar* cookies;
1251 gchar* initial_buffer;
1255 YahooData *yd = gc->proto_data; 1252 YahooData *yd = gc->proto_data;
1256 1253
1257 /* cookies = yahoo_get_cookies(gc); 1254 /* cookies = yahoo_get_cookies(gc);
1258 * This doesn't seem to be working. The function is returning NULL, which yahoo servers don't like 1255 * This doesn't seem to be working. The function is returning NULL, which yahoo servers don't like
1259 * For now let us not use this function */ 1256 * For now let us not use this function */
1263 if(purple_xfer_get_type(xfer) == PURPLE_XFER_SEND && xd->status_15 == ACCEPTED) 1260 if(purple_xfer_get_type(xfer) == PURPLE_XFER_SEND && xd->status_15 == ACCEPTED)
1264 { 1261 {
1265 if(xd->info_val_249 == 2) 1262 if(xd->info_val_249 == 2)
1266 { 1263 {
1267 /* sending file via p2p, we are connected as client */ 1264 /* sending file via p2p, we are connected as client */
1268 xd->txbuf = g_strdup_printf("POST /%s HTTP/1.1\r\n" 1265 initial_buffer = g_strdup_printf("POST /%s HTTP/1.1\r\n"
1269 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" 1266 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n"
1270 "Host: %s\r\n" 1267 "Host: %s\r\n"
1271 "Content-Length: %ld\r\n" 1268 "Content-Length: %" G_GSIZE_FORMAT "\r\n"
1272 "Cache-Control: no-cache\r\n\r\n", 1269 "Cache-Control: no-cache\r\n\r\n",
1273 xd->path, 1270 xd->path,
1274 xd->host, 1271 xd->host,
1275 (long int)xfer->size); /* to do, add Referer */ 1272 purple_xfer_get_size(xfer)); /* to do, add Referer */
1276 } 1273 }
1277 else 1274 else
1278 { 1275 {
1279 /* sending file via relaying */ 1276 /* sending file via relaying */
1280 xd->txbuf = 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"
1281 "Cookie:%s\r\n" 1278 "Cookie:%s\r\n"
1282 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" 1279 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n"
1283 "Host: %s\r\n" 1280 "Host: %s\r\n"
1284 "Content-Length: %ld\r\n" 1281 "Content-Length: %" G_GSIZE_FORMAT "\r\n"
1285 "Cache-Control: no-cache\r\n\r\n", 1282 "Cache-Control: no-cache\r\n\r\n",
1286 purple_url_encode(xd->xfer_idstring_for_relay), 1283 purple_url_encode(xd->xfer_idstring_for_relay),
1287 purple_normalize(account, purple_account_get_username(account)), 1284 purple_normalize(account, purple_account_get_username(account)),
1288 xfer->who, 1285 purple_xfer_get_remote_user(xfer),
1289 cookies, 1286 cookies,
1290 xd->host, 1287 xd->host,
1291 (long int)xfer->size); 1288 purple_xfer_get_size(xfer)); /* to do, add Referer */
1292 } 1289 }
1293 } 1290 }
1294 else if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE && xd->status_15 == STARTED) 1291 else if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE && xd->status_15 == STARTED)
1295 { 1292 {
1296 if(xd->info_val_249 == 1) 1293 if(xd->info_val_249 == 1)
1297 { 1294 {
1298 /* receiving file via p2p, connected as client */ 1295 /* receiving file via p2p, connected as client */
1299 xd->txbuf = g_strdup_printf("HEAD /%s HTTP/1.1\r\n" 1296 initial_buffer = g_strdup_printf("HEAD /%s HTTP/1.1\r\n"
1300 "Accept: */*\r\n" 1297 "Accept: */*\r\n"
1301 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" 1298 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n"
1302 "Host: %s\r\n" 1299 "Host: %s\r\n"
1303 "Content-Length: 0\r\n" 1300 "Content-Length: 0\r\n"
1304 "Cache-Control: no-cache\r\n\r\n", 1301 "Cache-Control: no-cache\r\n\r\n",
1305 xd->path,xd->host); 1302 xd->path,xd->host);
1306 } 1303 }
1307 else 1304 else
1308 { 1305 {
1309 /* receiving file via relaying */ 1306 /* receiving file via relaying */
1310 xd->txbuf = g_strdup_printf("HEAD /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\n" 1307 initial_buffer = g_strdup_printf("HEAD /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\n"
1311 "Accept: */*\r\n" 1308 "Accept: */*\r\n"
1312 "Cookie: %s\r\n" 1309 "Cookie: %s\r\n"
1313 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" 1310 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n"
1314 "Host: %s\r\n" 1311 "Host: %s\r\n"
1315 "Content-Length: 0\r\n" 1312 "Content-Length: 0\r\n"
1316 "Cache-Control: no-cache\r\n\r\n", 1313 "Cache-Control: no-cache\r\n\r\n",
1317 purple_url_encode(xd->xfer_idstring_for_relay), 1314 purple_url_encode(xd->xfer_idstring_for_relay),
1318 purple_normalize(account, purple_account_get_username(account)), 1315 purple_normalize(account, purple_account_get_username(account)),
1319 xfer->who, 1316 purple_xfer_get_remote_user(xfer),
1320 cookies, 1317 cookies,
1321 xd->host); 1318 xd->host);
1322 } 1319 }
1323 } 1320 }
1324 else if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE && xd->status_15 == HEAD_REPLY_RECEIVED) 1321 else if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE && xd->status_15 == HEAD_REPLY_RECEIVED)
1325 { 1322 {
1326 if(xd->info_val_249 == 1) 1323 if(xd->info_val_249 == 1)
1327 { 1324 {
1328 /* receiving file via p2p, connected as client */ 1325 /* receiving file via p2p, connected as client */
1329 xd->txbuf = g_strdup_printf("GET /%s HTTP/1.1\r\n" 1326 initial_buffer = g_strdup_printf("GET /%s HTTP/1.1\r\n"
1330 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" 1327 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n"
1331 "Host: %s\r\n" 1328 "Host: %s\r\n"
1332 "Connection: Keep-Alive\r\n\r\n", 1329 "Connection: Keep-Alive\r\n\r\n",
1333 xd->path, xd->host); 1330 xd->path, xd->host);
1334 } 1331 }
1335 else 1332 else
1336 { 1333 {
1337 /* receiving file via relaying */ 1334 /* receiving file via relaying */
1338 xd->txbuf = g_strdup_printf("GET /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\n" 1335 initial_buffer = g_strdup_printf("GET /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\n"
1339 "Cookie: %s\r\n" 1336 "Cookie: %s\r\n"
1340 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" 1337 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n"
1341 "Host: %s\r\n" 1338 "Host: %s\r\n"
1342 "Connection: Keep-Alive\r\n\r\n", 1339 "Connection: Keep-Alive\r\n\r\n",
1343 purple_url_encode(xd->xfer_idstring_for_relay), 1340 purple_url_encode(xd->xfer_idstring_for_relay),
1344 purple_normalize(account, purple_account_get_username(account)), 1341 purple_normalize(account, purple_account_get_username(account)),
1345 xfer->who, 1342 purple_xfer_get_remote_user(xfer),
1346 cookies, 1343 cookies,
1347 xd->host); 1344 xd->host);
1348 } 1345 }
1349 } 1346 }
1350 else 1347 else
1351 { 1348 {
1352 purple_debug_error("yahoo", "Unrecognized yahoo file transfer mode and stage (ymsg15):%d,%d\n", purple_xfer_get_type(xfer), xd->status_15); 1349 purple_debug_error("yahoo", "Unrecognized yahoo file transfer mode and stage (ymsg15):%d,%d\n", purple_xfer_get_type(xfer), xd->status_15);
1353 g_free(cookies); 1350 g_free(cookies);
1354 return; 1351 return;
1355 } 1352 }
1356 xd->txbuflen = strlen(xd->txbuf); 1353 xd->txbuf = (guchar*) initial_buffer;
1354 xd->txbuflen = strlen(initial_buffer);
1357 xd->txbuf_written = 0; 1355 xd->txbuf_written = 0;
1358 g_free(cookies); 1356 g_free(cookies);
1359 } 1357 }
1360 1358
1361 if (!xd->tx_handler) 1359 if (!xd->tx_handler)
1428 unix_time = time(NULL); 1426 unix_time = time(NULL);
1429 time_str = ctime(&unix_time); 1427 time_str = ctime(&unix_time);
1430 time_str[strlen(time_str) - 1] = '\0'; 1428 time_str[strlen(time_str) - 1] = '\0';
1431 1429
1432 if (xd->txbuflen == 0) { 1430 if (xd->txbuflen == 0) {
1433 xd->txbuf = g_strdup_printf("HTTP/1.0 200 OK\r\n" 1431 gchar *initial_buffer = g_strdup_printf("HTTP/1.0 200 OK\r\n"
1434 "Date: %s GMT\r\n" 1432 "Date: %s GMT\r\n"
1435 "Server: Y!/1.0\r\n" 1433 "Server: Y!/1.0\r\n"
1436 "MIME-version: 1.0\r\n" 1434 "MIME-version: 1.0\r\n"
1437 "Last-modified: %s GMT\r\n" 1435 "Last-modified: %s GMT\r\n"
1438 "Content-length: %" G_GSIZE_FORMAT "\r\n\r\n", 1436 "Content-length: %" G_GSIZE_FORMAT "\r\n\r\n",
1439 time_str, time_str, xfer->size); 1437 time_str, time_str, purple_xfer_get_size(xfer));
1440 xd->txbuflen = strlen(xd->txbuf); 1438 xd->txbuf = (guchar *)initial_buffer;
1439 xd->txbuflen = strlen(initial_buffer);
1441 xd->txbuf_written = 0; 1440 xd->txbuf_written = 0;
1442 } 1441 }
1443 1442
1444 if (!xd->tx_handler) { 1443 if (!xd->tx_handler) {
1445 xd->tx_handler = purple_input_add(source, PURPLE_INPUT_WRITE, yahoo_xfer_send_cb_15, xfer); 1444 xd->tx_handler = purple_input_add(source, PURPLE_INPUT_WRITE, yahoo_xfer_send_cb_15, xfer);
1478 purple_input_remove(xd->yahoo_p2p_ft_server_watcher); 1477 purple_input_remove(xd->yahoo_p2p_ft_server_watcher);
1479 close(xd->yahoo_local_p2p_ft_server_fd); 1478 close(xd->yahoo_local_p2p_ft_server_fd);
1480 1479
1481 /* Add an Input Read event to the file descriptor */ 1480 /* Add an Input Read event to the file descriptor */
1482 xfer->fd = acceptfd; 1481 xfer->fd = acceptfd;
1483 if(xfer->type == PURPLE_XFER_RECEIVE) 1482 if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE)
1484 xd->input_event = purple_input_add(acceptfd, PURPLE_INPUT_READ, yahoo_p2p_ft_POST_cb, data); 1483 xd->input_event = purple_input_add(acceptfd, PURPLE_INPUT_READ, yahoo_p2p_ft_POST_cb, data);
1485 else 1484 else
1486 xd->input_event = purple_input_add(acceptfd, PURPLE_INPUT_READ, yahoo_p2p_ft_HEAD_GET_cb, data); 1485 xd->input_event = purple_input_add(acceptfd, PURPLE_INPUT_READ, yahoo_p2p_ft_HEAD_GET_cb, data);
1487 } 1486 }
1488 1487
1503 purple_debug_warning("yahoo","p2p: error starting server for p2p file transfer\n"); 1502 purple_debug_warning("yahoo","p2p: error starting server for p2p file transfer\n");
1504 purple_xfer_cancel_remote(xfer); 1503 purple_xfer_cancel_remote(xfer);
1505 return; 1504 return;
1506 } 1505 }
1507 1506
1508 if( (xfer->type == PURPLE_XFER_RECEIVE) || (xd->status_15 != P2P_HEAD_REPLIED) ) { 1507 if( (purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE) || (xd->status_15 != P2P_HEAD_REPLIED) ) {
1509 yd = xd->gc->proto_data; 1508 yd = xd->gc->proto_data;
1510 account = purple_connection_get_account(xd->gc); 1509 account = purple_connection_get_account(xd->gc);
1511 local_ip = purple_network_get_my_ip(listenfd); 1510 local_ip = purple_network_get_my_ip(listenfd);
1512 xd->yahoo_local_p2p_ft_server_port = purple_network_get_port_from_fd(listenfd); 1511 xd->yahoo_local_p2p_ft_server_port = purple_network_get_port_from_fd(listenfd);
1513 1512
1514 filename = g_path_get_basename(purple_xfer_get_local_filename(xfer)); 1513 filename = g_path_get_basename(purple_xfer_get_local_filename(xfer));
1515 filename_without_spaces = g_strdup(filename); 1514 filename_without_spaces = g_strdup(filename);
1516 purple_util_chrreplace(filename_without_spaces, ' ', '+'); 1515 purple_util_chrreplace(filename_without_spaces, ' ', '+');
1517 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); 1516 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));
1518 url_to_send = g_strdup_printf("http://%s:%d%s", local_ip, xd->yahoo_local_p2p_ft_server_port, xd->xfer_url); 1517 url_to_send = g_strdup_printf("http://%s:%d%s", local_ip, xd->yahoo_local_p2p_ft_server_port, xd->xfer_url);
1519 1518
1520 if(xfer->type == PURPLE_XFER_RECEIVE) { 1519 if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE) {
1521 xd->info_val_249 = 2; /* 249=2: we are p2p server, and receiving file */ 1520 xd->info_val_249 = 2; /* 249=2: we are p2p server, and receiving file */
1522 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_ACC_15, 1521 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_ACC_15,
1523 YAHOO_STATUS_AVAILABLE, yd->session_id); 1522 YAHOO_STATUS_AVAILABLE, yd->session_id);
1524 yahoo_packet_hash(pkt, "ssssis", 1523 yahoo_packet_hash(pkt, "ssssis",
1525 1, purple_normalize(account, purple_account_get_username(account)), 1524 1, purple_normalize(account, purple_account_get_username(account)),
1526 5, xfer->who, 1525 5, purple_xfer_get_remote_user(xfer),
1527 265, xd->xfer_peer_idstring, 1526 265, xd->xfer_peer_idstring,
1528 27, xfer->filename, 1527 27, purple_xfer_get_filename(xfer),
1529 249, 2, 1528 249, 2,
1530 250, url_to_send); 1529 250, url_to_send);
1531 } 1530 }
1532 else { 1531 else {
1533 xd->info_val_249 = 1; /* 249=1: we are p2p server, and sending file */ 1532 xd->info_val_249 = 1; /* 249=1: we are p2p server, and sending file */
1534 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_INFO_15, YAHOO_STATUS_AVAILABLE, yd->session_id); 1533 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_INFO_15, YAHOO_STATUS_AVAILABLE, yd->session_id);
1535 yahoo_packet_hash(pkt, "ssssis", 1534 yahoo_packet_hash(pkt, "ssssis",
1536 1, purple_normalize(account, purple_account_get_username(account)), 1535 1, purple_normalize(account, purple_account_get_username(account)),
1537 5, xfer->who, 1536 5, purple_xfer_get_remote_user(xfer),
1538 265, xd->xfer_peer_idstring, 1537 265, xd->xfer_peer_idstring,
1539 27, filename, 1538 27, filename,
1540 249, 1, 1539 249, 1,
1541 250, url_to_send); 1540 250, url_to_send);
1542 } 1541 }
1567 return; 1566 return;
1568 1567
1569 account = purple_connection_get_account(gc); 1568 account = purple_connection_get_account(gc);
1570 yd = gc->proto_data; 1569 yd = gc->proto_data;
1571 1570
1572 p2p_data = g_hash_table_lookup(yd->peers, xfer->who); 1571 p2p_data = g_hash_table_lookup(yd->peers, purple_xfer_get_remote_user(xfer));
1573 if( p2p_data->connection_type == YAHOO_P2P_WE_ARE_SERVER ) 1572 if( p2p_data->connection_type == YAHOO_P2P_WE_ARE_SERVER )
1574 if(purple_network_listen_range(0, 0, SOCK_STREAM, yahoo_p2p_ft_server_listen_cb, xfer)) 1573 if(purple_network_listen_range(0, 0, SOCK_STREAM, yahoo_p2p_ft_server_listen_cb, xfer))
1575 return; 1574 return;
1576 1575
1577 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_INFO_15, YAHOO_STATUS_AVAILABLE, yd->session_id); 1576 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_INFO_15, YAHOO_STATUS_AVAILABLE, yd->session_id);
1578 filename = g_path_get_basename(purple_xfer_get_local_filename(xfer)); 1577 filename = g_path_get_basename(purple_xfer_get_local_filename(xfer));
1579 1578
1580 yahoo_packet_hash(pkt, "ssssi", 1579 yahoo_packet_hash(pkt, "ssssi",
1581 1, purple_normalize(account, purple_account_get_username(account)), 1580 1, purple_normalize(account, purple_account_get_username(account)),
1582 5, xfer->who, 1581 5, purple_xfer_get_remote_user(xfer),
1583 265, xd->xfer_peer_idstring, 1582 265, xd->xfer_peer_idstring,
1584 27, filename, 1583 27, filename,
1585 249, 2); /* 249=2: we are p2p client */ 1584 249, 2); /* 249=2: we are p2p client */
1586 xd->info_val_249 = 2; 1585 xd->info_val_249 = 2;
1587 yahoo_packet_send_and_free(pkt, yd); 1586 yahoo_packet_send_and_free(pkt, yd);
1736 { 1735 {
1737 g_free(xfer_data); 1736 g_free(xfer_data);
1738 g_return_if_reached(); 1737 g_return_if_reached();
1739 } 1738 }
1740 1739
1741 xfer->message = NULL;
1742
1743 /* Set the info about the incoming file. */ 1740 /* Set the info about the incoming file. */
1744 utf8_filename = yahoo_string_decode(gc, filename, TRUE); 1741 utf8_filename = yahoo_string_decode(gc, filename, TRUE);
1745 purple_xfer_set_filename(xfer, utf8_filename); 1742 purple_xfer_set_filename(xfer, utf8_filename);
1746 g_free(utf8_filename); 1743 g_free(utf8_filename);
1747 purple_xfer_set_size(xfer, filesize); 1744 purple_xfer_set_size(xfer, filesize);
1762 xfer_data->xfer_peer_idstring, 1759 xfer_data->xfer_peer_idstring,
1763 xfer); 1760 xfer);
1764 1761
1765 if(nooffiles > 1) { 1762 if(nooffiles > 1) {
1766 gchar* message; 1763 gchar* message;
1767 message = g_strdup_printf(_("%s is trying to send you a group of %d files.\n"), xfer->who, nooffiles); 1764 message = g_strdup_printf(_("%s is trying to send you a group of %d files.\n"), purple_xfer_get_remote_user(xfer), nooffiles);
1768 purple_xfer_conversation_write(xfer, message, FALSE); 1765 purple_xfer_conversation_write(xfer, message, FALSE);
1769 g_free(message); 1766 g_free(message);
1770 } 1767 }
1771 /* Now perform the request */ 1768 /* Now perform the request */
1772 purple_xfer_request(xfer); 1769 purple_xfer_request(xfer);
1851 1848
1852 pkt_to_send = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_ACC_15, 1849 pkt_to_send = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_ACC_15,
1853 YAHOO_STATUS_AVAILABLE, yd->session_id); 1850 YAHOO_STATUS_AVAILABLE, yd->session_id);
1854 yahoo_packet_hash(pkt_to_send, "ssssis", 1851 yahoo_packet_hash(pkt_to_send, "ssssis",
1855 1, purple_normalize(account, purple_account_get_username(account)), 1852 1, purple_normalize(account, purple_account_get_username(account)),
1856 5, xfer->who, 1853 5, purple_xfer_get_remote_user(xfer),
1857 265, xfer_data->xfer_peer_idstring, 1854 265, xfer_data->xfer_peer_idstring,
1858 27, xfer->filename, 1855 27, purple_xfer_get_filename(xfer),
1859 249, xfer_data->info_val_249, 1856 249, xfer_data->info_val_249,
1860 251, xfer_data->xfer_idstring_for_relay); 1857 251, xfer_data->xfer_idstring_for_relay);
1861 1858
1862 yahoo_packet_send_and_free(pkt_to_send, yd); 1859 yahoo_packet_send_and_free(pkt_to_send, yd);
1863 1860
1867 _("Unable to establish file descriptor.")); 1864 _("Unable to establish file descriptor."));
1868 purple_xfer_cancel_remote(xfer); 1865 purple_xfer_cancel_remote(xfer);
1869 } 1866 }
1870 } 1867 }
1871 else if(val_249 == 2) { 1868 else if(val_249 == 2) {
1872 p2p_data = g_hash_table_lookup(yd->peers, xfer->who); 1869 p2p_data = g_hash_table_lookup(yd->peers, purple_xfer_get_remote_user(xfer));
1873 if( !( p2p_data && (p2p_data->connection_type == YAHOO_P2P_WE_ARE_SERVER) ) ) { 1870 if( !( p2p_data && (p2p_data->connection_type == YAHOO_P2P_WE_ARE_SERVER) ) ) {
1874 purple_xfer_cancel_remote(xfer); 1871 purple_xfer_cancel_remote(xfer);
1875 return; 1872 return;
1876 } 1873 }
1877 if(!purple_network_listen_range(0, 0, SOCK_STREAM, yahoo_p2p_ft_server_listen_cb, xfer)) { 1874 if(!purple_network_listen_range(0, 0, SOCK_STREAM, yahoo_p2p_ft_server_listen_cb, xfer)) {