Mercurial > pidgin
comparison libpurple/protocols/qq/file_trans.c @ 24095:25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
author | Daniel Atallah <daniel.atallah@gmail.com> |
---|---|
date | Mon, 15 Sep 2008 03:04:07 +0000 |
parents | 147ada94a1d8 |
children | bcfc98c7a55f |
comparison
equal
deleted
inserted
replaced
24088:147ada94a1d8 | 24095:25f62d21b3f8 |
---|---|
20 * You should have received a copy of the GNU General Public License | 20 * You should have received a copy of the GNU General Public License |
21 * along with this program; if not, write to the Free Software | 21 * along with this program; if not, write to the Free Software |
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA | 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
23 */ | 23 */ |
24 | 24 |
25 #ifdef _WIN32 | |
26 #define random rand | |
27 #endif | |
28 | |
25 #include "internal.h" | 29 #include "internal.h" |
26 | 30 |
27 #include "debug.h" | 31 #include "debug.h" |
28 #include "ft.h" | 32 #include "ft.h" |
29 #include "cipher.h" | 33 #include "cipher.h" |
56 | 60 |
57 static guint32 _gen_file_key(void) | 61 static guint32 _gen_file_key(void) |
58 { | 62 { |
59 guint8 seed; | 63 guint8 seed; |
60 | 64 |
61 seed = rand() & 0xFF; | 65 seed = random(); |
62 return _get_file_key(seed); | 66 return _get_file_key(seed); |
63 } | 67 } |
64 | 68 |
65 static guint32 _decrypt_qq_uid(guint32 uid, guint32 key) | 69 static guint32 _decrypt_qq_uid(guint32 uid, guint32 key) |
66 { | 70 { |
255 bytes += qq_putdata(raw_data + bytes, data, len); | 259 bytes += qq_putdata(raw_data + bytes, data, len); |
256 | 260 |
257 if (bytes == len + 12) { | 261 if (bytes == len + 12) { |
258 _qq_xfer_write(raw_data, bytes, qd->xfer); | 262 _qq_xfer_write(raw_data, bytes, qd->xfer); |
259 } else | 263 } else |
260 purple_debug_info("QQ", "send_file: want %d but got %d\n", len + 12, bytes); | 264 purple_debug(PURPLE_DEBUG_INFO, "QQ", "send_file: want %d but got %d\n", len + 12, bytes); |
261 return bytes; | 265 return bytes; |
262 } | 266 } |
263 | 267 |
264 /* send a file to udp channel with QQ_FILE_CONTROL_PACKET_TAG */ | 268 /* send a file to udp channel with QQ_FILE_CONTROL_PACKET_TAG */ |
265 void qq_send_file_ctl_packet(PurpleConnection *gc, guint16 packet_type, guint32 to_uid, guint8 hellobyte) | 269 void qq_send_file_ctl_packet(PurpleConnection *gc, guint16 packet_type, guint32 to_uid, guint8 hellobyte) |
317 case QQ_FILE_CMD_NOTIFY_IP_ACK: | 321 case QQ_FILE_CMD_NOTIFY_IP_ACK: |
318 bytes += qq_fill_conn_info(raw_data, info); | 322 bytes += qq_fill_conn_info(raw_data, info); |
319 bytes_expected = 61; | 323 bytes_expected = 61; |
320 break; | 324 break; |
321 default: | 325 default: |
322 purple_debug_info("QQ", "qq_send_file_ctl_packet: Unknown packet type[%d]\n", | 326 purple_debug(PURPLE_DEBUG_INFO, "QQ", "qq_send_file_ctl_packet: Unknown packet type[%d]\n", |
323 packet_type); | 327 packet_type); |
324 bytes_expected = 0; | 328 bytes_expected = 0; |
325 } | 329 } |
326 | 330 |
327 if (bytes != bytes_expected) { | 331 if (bytes != bytes_expected) { |
328 purple_debug_error("QQ", "qq_send_file_ctl_packet: Expected to get %d bytes, but get %d", | 332 purple_debug(PURPLE_DEBUG_ERROR, "QQ", "qq_send_file_ctl_packet: Expected to get %d bytes, but get %d", |
329 bytes_expected, bytes); | 333 bytes_expected, bytes); |
330 return; | 334 return; |
331 } | 335 } |
332 | 336 |
333 qq_hex_dump(PURPLE_DEBUG_INFO, "QQ", | 337 qq_hex_dump(PURPLE_DEBUG_INFO, "QQ", |
340 | 344 |
341 #if 0 | 345 #if 0 |
342 guint8 *buf; | 346 guint8 *buf; |
343 int buflen; | 347 int buflen; |
344 hex_dump = hex_dump_to_str(encrypted_data, encrypted_len); | 348 hex_dump = hex_dump_to_str(encrypted_data, encrypted_len); |
345 purple_debug_info("QQ", "encrypted packet: \n%s", hex_dump); | 349 purple_debug(PURPLE_DEBUG_INFO, "QQ", "encrypted packet: \n%s", hex_dump); |
346 g_free(hex_dump); | 350 g_free(hex_dump); |
347 buf = g_newa(guint8, MAX_PACKET_SIZE); | 351 buf = g_newa(guint8, MAX_PACKET_SIZE); |
348 buflen = encrypted_len; | 352 buflen = encrypted_len; |
349 if (qq_crypt(DECRYPT, encrypted_data, encrypted_len, info->file_session_key, buf, &buflen)) { | 353 if (qq_crypt(DECRYPT, encrypted_data, encrypted_len, info->file_session_key, buf, &buflen)) { |
350 purple_debug_info("QQ", "decrypt success\n"); | 354 purple_debug(PURPLE_DEBUG_INFO, "QQ", "decrypt success\n"); |
351 if (buflen == bytes && memcmp(raw_data, buf, buflen) == 0) | 355 if (buflen == bytes && memcmp(raw_data, buf, buflen) == 0) |
352 purple_debug_info("QQ", "checksum ok\n"); | 356 purple_debug(PURPLE_DEBUG_INFO, "QQ", "checksum ok\n"); |
353 | 357 |
354 hex_dump = hex_dump_to_str(buf, buflen); | 358 hex_dump = hex_dump_to_str(buf, buflen); |
355 purple_debug_info("QQ", "decrypted packet: \n%s", hex_dump); | 359 purple_debug(PURPLE_DEBUG_INFO, "QQ", "decrypted packet: \n%s", hex_dump); |
356 g_free(hex_dump); | 360 g_free(hex_dump); |
357 } else { | 361 } else { |
358 purple_debug_info("QQ", "decrypt fail\n"); | 362 purple_debug(PURPLE_DEBUG_INFO, "QQ", "decrypt fail\n"); |
359 } | 363 } |
360 #endif | 364 #endif |
361 | 365 |
362 purple_debug_info("QQ", "<== send %s packet\n", qq_get_file_cmd_desc(packet_type)); | 366 purple_debug(PURPLE_DEBUG_INFO, "QQ", "<== send %s packet\n", qq_get_file_cmd_desc(packet_type)); |
363 _qq_send_file(gc, encrypted_data, encrypted_len, QQ_FILE_CONTROL_PACKET_TAG, info->to_uid); | 367 _qq_send_file(gc, encrypted_data, encrypted_len, QQ_FILE_CONTROL_PACKET_TAG, info->to_uid); |
364 } | 368 } |
365 | 369 |
366 /* send a file to udp channel with QQ_FILE_DATA_PACKET_TAG */ | 370 /* send a file to udp channel with QQ_FILE_DATA_PACKET_TAG */ |
367 static void _qq_send_file_data_packet(PurpleConnection *gc, guint16 packet_type, guint8 sub_type, | 371 static void _qq_send_file_data_packet(PurpleConnection *gc, guint16 packet_type, guint8 sub_type, |
404 file_md5); | 408 file_md5); |
405 | 409 |
406 info->fragment_num = (filesize - 1) / QQ_FILE_FRAGMENT_MAXLEN + 1; | 410 info->fragment_num = (filesize - 1) / QQ_FILE_FRAGMENT_MAXLEN + 1; |
407 info->fragment_len = QQ_FILE_FRAGMENT_MAXLEN; | 411 info->fragment_len = QQ_FILE_FRAGMENT_MAXLEN; |
408 | 412 |
409 purple_debug_info("QQ", | 413 purple_debug(PURPLE_DEBUG_INFO, "QQ", |
410 "start transfering data, %d fragments with %d length each\n", | 414 "start transfering data, %d fragments with %d length each\n", |
411 info->fragment_num, info->fragment_len); | 415 info->fragment_num, info->fragment_len); |
412 /* Unknown */ | 416 /* Unknown */ |
413 bytes += qq_put16(raw_data + bytes, 0x0000); | 417 bytes += qq_put16(raw_data + bytes, 0x0000); |
414 /* Sub-operation type */ | 418 /* Sub-operation type */ |
429 /* filename */ | 433 /* filename */ |
430 bytes += qq_putdata(raw_data + bytes, (guint8 *) filename, | 434 bytes += qq_putdata(raw_data + bytes, (guint8 *) filename, |
431 filename_len); | 435 filename_len); |
432 break; | 436 break; |
433 case QQ_FILE_DATA_INFO: | 437 case QQ_FILE_DATA_INFO: |
434 purple_debug_info("QQ", | 438 purple_debug(PURPLE_DEBUG_INFO, "QQ", |
435 "sending %dth fragment with length %d, offset %d\n", | 439 "sending %dth fragment with length %d, offset %d\n", |
436 fragment_index, len, (fragment_index-1)*fragment_size); | 440 fragment_index, len, (fragment_index-1)*fragment_size); |
437 /* bytes += qq_put16(raw_data + bytes, ++(qd->send_seq)); */ | 441 /* bytes += qq_put16(raw_data + bytes, ++(qd->send_seq)); */ |
438 bytes += qq_put16(raw_data + bytes, info->send_seq); | 442 bytes += qq_put16(raw_data + bytes, info->send_seq); |
439 bytes += qq_put8(raw_data + bytes, sub_type); | 443 bytes += qq_put8(raw_data + bytes, sub_type); |
442 bytes += qq_put32(raw_data + bytes, (fragment_index - 1) * fragment_size); | 446 bytes += qq_put32(raw_data + bytes, (fragment_index - 1) * fragment_size); |
443 bytes += qq_put16(raw_data + bytes, len); | 447 bytes += qq_put16(raw_data + bytes, len); |
444 bytes += qq_putdata(raw_data + bytes, data, len); | 448 bytes += qq_putdata(raw_data + bytes, data, len); |
445 break; | 449 break; |
446 case QQ_FILE_EOF: | 450 case QQ_FILE_EOF: |
447 purple_debug_info("QQ", "end of sending data\n"); | 451 purple_debug(PURPLE_DEBUG_INFO, "QQ", "end of sending data\n"); |
448 /* bytes += qq_put16(raw_data + bytes, info->fragment_num + 1); */ | 452 /* bytes += qq_put16(raw_data + bytes, info->fragment_num + 1); */ |
449 bytes += qq_put16(raw_data + bytes, info->fragment_num); | 453 bytes += qq_put16(raw_data + bytes, info->fragment_num); |
450 bytes += qq_put8(raw_data + bytes, sub_type); | 454 bytes += qq_put8(raw_data + bytes, sub_type); |
451 /* purple_xfer_set_completed(qd->xfer, TRUE); */ | 455 /* purple_xfer_set_completed(qd->xfer, TRUE); */ |
452 } | 456 } |
468 bytes += qq_put16(raw_data + bytes, filesize / QQ_FILE_FRAGMENT_MAXLEN + 2); | 472 bytes += qq_put16(raw_data + bytes, filesize / QQ_FILE_FRAGMENT_MAXLEN + 2); |
469 bytes += qq_put8(raw_data + bytes, sub_type); | 473 bytes += qq_put8(raw_data + bytes, sub_type); |
470 break; | 474 break; |
471 } | 475 } |
472 } | 476 } |
473 purple_debug_info("QQ", "<== send %s packet\n", qq_get_file_cmd_desc(packet_type)); | 477 purple_debug(PURPLE_DEBUG_INFO, "QQ", "<== send %s packet\n", qq_get_file_cmd_desc(packet_type)); |
474 _qq_send_file(gc, raw_data, bytes, QQ_FILE_DATA_PACKET_TAG, info->to_uid); | 478 _qq_send_file(gc, raw_data, bytes, QQ_FILE_DATA_PACKET_TAG, info->to_uid); |
475 } | 479 } |
476 | 480 |
477 /* A conversation starts like this: | 481 /* A conversation starts like this: |
478 * Sender ==> Receiver [QQ_FILE_CMD_PING] | 482 * Sender ==> Receiver [QQ_FILE_CMD_PING] |
510 bytes += _qq_get_file_header(&fh, data + bytes); | 514 bytes += _qq_get_file_header(&fh, data + bytes); |
511 | 515 |
512 decrypted_data = g_newa(guint8, data_len); | 516 decrypted_data = g_newa(guint8, data_len); |
513 decrypted_len = qq_decrypt(decrypted_data, data, data_len, qd->session_md5); | 517 decrypted_len = qq_decrypt(decrypted_data, data, data_len, qd->session_md5); |
514 if ( decrypted_len <= 0 ) { | 518 if ( decrypted_len <= 0 ) { |
515 purple_debug_error("QQ", "Error decrypt rcv file ctrl packet\n"); | 519 purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Error decrypt rcv file ctrl packet\n"); |
516 return; | 520 return; |
517 } | 521 } |
518 | 522 |
519 /* only for debug info */ | 523 /* only for debug info */ |
520 decryped_bytes = 16; /* skip md5 section */ | 524 decryped_bytes = 16; /* skip md5 section */ |
521 decryped_bytes += qq_get16(&packet_type, decrypted_data + decryped_bytes); | 525 decryped_bytes += qq_get16(&packet_type, decrypted_data + decryped_bytes); |
522 decryped_bytes += qq_get16(&seq, decrypted_data + decryped_bytes); | 526 decryped_bytes += qq_get16(&seq, decrypted_data + decryped_bytes); |
523 decryped_bytes += 4+1+1+19+1; /* skip something */ | 527 decryped_bytes += 4+1+1+19+1; /* skip something */ |
524 | 528 |
525 purple_debug_info("QQ", "==> [%d] receive %s packet\n", seq, qq_get_file_cmd_desc(packet_type)); | 529 purple_debug(PURPLE_DEBUG_INFO, "QQ", "==> [%d] receive %s packet\n", seq, qq_get_file_cmd_desc(packet_type)); |
526 qq_hex_dump(PURPLE_DEBUG_INFO, "QQ", | 530 qq_hex_dump(PURPLE_DEBUG_INFO, "QQ", |
527 decrypted_data, decrypted_len, | 531 decrypted_data, decrypted_len, |
528 "decrypted control packet received:"); | 532 "decrypted control packet received:"); |
529 | 533 |
530 switch (packet_type) { | 534 switch (packet_type) { |
560 break; | 564 break; |
561 case QQ_FILE_CMD_PONG: | 565 case QQ_FILE_CMD_PONG: |
562 qq_send_file_ctl_packet(gc, QQ_FILE_CMD_SENDER_SAY_HELLO, fh.sender_uid, 0); | 566 qq_send_file_ctl_packet(gc, QQ_FILE_CMD_SENDER_SAY_HELLO, fh.sender_uid, 0); |
563 break; | 567 break; |
564 default: | 568 default: |
565 purple_debug_info("QQ", "unprocess file command %d\n", packet_type); | 569 purple_debug(PURPLE_DEBUG_INFO, "QQ", "unprocess file command %d\n", packet_type); |
566 } | 570 } |
567 } | 571 } |
568 | 572 |
569 static void _qq_recv_file_progess(PurpleConnection *gc, guint8 *buffer, guint16 len, guint32 index, guint32 offset) | 573 static void _qq_recv_file_progess(PurpleConnection *gc, guint8 *buffer, guint16 len, guint32 index, guint32 offset) |
570 { | 574 { |
571 qq_data *qd = (qq_data *) gc->proto_data; | 575 qq_data *qd = (qq_data *) gc->proto_data; |
572 PurpleXfer *xfer = qd->xfer; | 576 PurpleXfer *xfer = qd->xfer; |
573 ft_info *info = (ft_info *) xfer->data; | 577 ft_info *info = (ft_info *) xfer->data; |
574 guint32 mask; | 578 guint32 mask; |
575 | 579 |
576 purple_debug_info("QQ", | 580 purple_debug(PURPLE_DEBUG_INFO, "QQ", |
577 "receiving %dth fragment with length %d, slide window status %o, max_fragment_index %d\n", | 581 "receiving %dth fragment with length %d, slide window status %o, max_fragment_index %d\n", |
578 index, len, info->window, info->max_fragment_index); | 582 index, len, info->window, info->max_fragment_index); |
579 if (info->window == 0 && info->max_fragment_index == 0) { | 583 if (info->window == 0 && info->max_fragment_index == 0) { |
580 if (_qq_xfer_open_file(purple_xfer_get_local_filename(xfer), "wb", xfer) == -1) { | 584 if (_qq_xfer_open_file(purple_xfer_get_local_filename(xfer), "wb", xfer) == -1) { |
581 purple_xfer_cancel_local(xfer); | 585 purple_xfer_cancel_local(xfer); |
582 return; | 586 return; |
583 } | 587 } |
584 purple_debug_info("QQ", "object file opened for writing\n"); | 588 purple_debug(PURPLE_DEBUG_INFO, "QQ", "object file opened for writing\n"); |
585 } | 589 } |
586 mask = 0x1 << (index % sizeof(info->window)); | 590 mask = 0x1 << (index % sizeof(info->window)); |
587 if (index < info->max_fragment_index || (info->window & mask)) { | 591 if (index < info->max_fragment_index || (info->window & mask)) { |
588 purple_debug_info("QQ", "duplicate %dth fragment, drop it!\n", index+1); | 592 purple_debug(PURPLE_DEBUG_INFO, "QQ", "duplicate %dth fragment, drop it!\n", index+1); |
589 return; | 593 return; |
590 } | 594 } |
591 | 595 |
592 info->window |= mask; | 596 info->window |= mask; |
593 | 597 |
603 info->window &= ~mask; | 607 info->window &= ~mask; |
604 info->max_fragment_index ++; | 608 info->max_fragment_index ++; |
605 if (mask & 0x8000) mask = 0x0001; | 609 if (mask & 0x8000) mask = 0x0001; |
606 else mask = mask << 1; | 610 else mask = mask << 1; |
607 } | 611 } |
608 purple_debug_info("QQ", "procceed %dth fragment, slide window status %o, max_fragment_index %d\n", | 612 purple_debug(PURPLE_DEBUG_INFO, "QQ", "procceed %dth fragment, slide window status %o, max_fragment_index %d\n", |
609 index, info->window, info->max_fragment_index); | 613 index, info->window, info->max_fragment_index); |
610 } | 614 } |
611 | 615 |
612 static void _qq_send_file_progess(PurpleConnection *gc) | 616 static void _qq_send_file_progess(PurpleConnection *gc) |
613 { | 617 { |
648 gint readbytes; | 652 gint readbytes; |
649 qq_data *qd = (qq_data *) gc->proto_data; | 653 qq_data *qd = (qq_data *) gc->proto_data; |
650 PurpleXfer *xfer = qd->xfer; | 654 PurpleXfer *xfer = qd->xfer; |
651 ft_info *info = (ft_info *) xfer->data; | 655 ft_info *info = (ft_info *) xfer->data; |
652 | 656 |
653 purple_debug_info("QQ", | 657 purple_debug(PURPLE_DEBUG_INFO, "QQ", |
654 "receiving %dth fragment ack, slide window status %o, max_fragment_index %d\n", | 658 "receiving %dth fragment ack, slide window status %o, max_fragment_index %d\n", |
655 fragment_index, info->window, info->max_fragment_index); | 659 fragment_index, info->window, info->max_fragment_index); |
656 if (fragment_index < info->max_fragment_index || | 660 if (fragment_index < info->max_fragment_index || |
657 fragment_index >= info->max_fragment_index + sizeof(info->window)) { | 661 fragment_index >= info->max_fragment_index + sizeof(info->window)) { |
658 purple_debug_info("QQ", "duplicate %dth fragment, drop it!\n", fragment_index+1); | 662 purple_debug(PURPLE_DEBUG_INFO, "QQ", "duplicate %dth fragment, drop it!\n", fragment_index+1); |
659 return; | 663 return; |
660 } | 664 } |
661 mask = 0x1 << (fragment_index % sizeof(info->window)); | 665 mask = 0x1 << (fragment_index % sizeof(info->window)); |
662 if ((info->window & mask) == 0) | 666 if ((info->window & mask) == 0) |
663 { | 667 { |
690 info->max_fragment_index ++; | 694 info->max_fragment_index ++; |
691 if (mask & 0x8000) mask = 0x0001; | 695 if (mask & 0x8000) mask = 0x0001; |
692 else mask = mask << 1; | 696 else mask = mask << 1; |
693 } | 697 } |
694 } | 698 } |
695 purple_debug_info("QQ", | 699 purple_debug(PURPLE_DEBUG_INFO, "QQ", |
696 "procceed %dth fragment ack, slide window status %o, max_fragment_index %d\n", | 700 "procceed %dth fragment ack, slide window status %o, max_fragment_index %d\n", |
697 fragment_index, info->window, info->max_fragment_index); | 701 fragment_index, info->window, info->max_fragment_index); |
698 } | 702 } |
699 | 703 |
700 static void _qq_process_recv_file_data(PurpleConnection *gc, guint8 *data, gint len) | 704 static void _qq_process_recv_file_data(PurpleConnection *gc, guint8 *data, gint len) |
731 * if md5 doesn't match we will ignore | 735 * if md5 doesn't match we will ignore |
732 * the packet or send sth as error number */ | 736 * the packet or send sth as error number */ |
733 | 737 |
734 info->max_fragment_index = 0; | 738 info->max_fragment_index = 0; |
735 info->window = 0; | 739 info->window = 0; |
736 purple_debug_info("QQ", | 740 purple_debug(PURPLE_DEBUG_INFO, "QQ", |
737 "start receiving data, %d fragments with %d length each\n", | 741 "start receiving data, %d fragments with %d length each\n", |
738 info->fragment_num, info->fragment_len); | 742 info->fragment_num, info->fragment_len); |
739 _qq_send_file_data_packet(gc, QQ_FILE_CMD_FILE_OP_ACK, sub_type, | 743 _qq_send_file_data_packet(gc, QQ_FILE_CMD_FILE_OP_ACK, sub_type, |
740 0, 0, NULL, 0); | 744 0, 0, NULL, 0); |
741 break; | 745 break; |
742 case QQ_FILE_DATA_INFO: | 746 case QQ_FILE_DATA_INFO: |
743 bytes += qq_get32(&fragment_index, data + bytes); | 747 bytes += qq_get32(&fragment_index, data + bytes); |
744 bytes += qq_get32(&fragment_offset, data + bytes); | 748 bytes += qq_get32(&fragment_offset, data + bytes); |
745 bytes += qq_get16(&fragment_len, data + bytes); | 749 bytes += qq_get16(&fragment_len, data + bytes); |
746 purple_debug_info("QQ", | 750 purple_debug(PURPLE_DEBUG_INFO, "QQ", |
747 "received %dth fragment with length %d, offset %d\n", | 751 "received %dth fragment with length %d, offset %d\n", |
748 fragment_index, fragment_len, fragment_offset); | 752 fragment_index, fragment_len, fragment_offset); |
749 | 753 |
750 _qq_send_file_data_packet(gc, QQ_FILE_CMD_FILE_OP_ACK, sub_type, | 754 _qq_send_file_data_packet(gc, QQ_FILE_CMD_FILE_OP_ACK, sub_type, |
751 fragment_index, packet_seq, NULL, 0); | 755 fragment_index, packet_seq, NULL, 0); |
752 _qq_recv_file_progess(gc, data + bytes, fragment_len, fragment_index, fragment_offset); | 756 _qq_recv_file_progess(gc, data + bytes, fragment_len, fragment_index, fragment_offset); |
753 break; | 757 break; |
754 case QQ_FILE_EOF: | 758 case QQ_FILE_EOF: |
755 purple_debug_info("QQ", "end of receiving\n"); | 759 purple_debug(PURPLE_DEBUG_INFO, "QQ", "end of receiving\n"); |
756 _qq_send_file_data_packet(gc, QQ_FILE_CMD_FILE_OP_ACK, sub_type, | 760 _qq_send_file_data_packet(gc, QQ_FILE_CMD_FILE_OP_ACK, sub_type, |
757 0, 0, NULL, 0); | 761 0, 0, NULL, 0); |
758 break; | 762 break; |
759 } | 763 } |
760 break; | 764 break; |
789 _qq_send_file_data_packet(gc, QQ_FILE_EOF, 0, 0, 0, NULL, 0); | 793 _qq_send_file_data_packet(gc, QQ_FILE_EOF, 0, 0, 0, NULL, 0); |
790 purple_xfer_set_completed(qd->xfer, TRUE); | 794 purple_xfer_set_completed(qd->xfer, TRUE); |
791 purple_xfer_end(qd->xfer); | 795 purple_xfer_end(qd->xfer); |
792 break; | 796 break; |
793 case QQ_FILE_BASIC_INFO: | 797 case QQ_FILE_BASIC_INFO: |
794 purple_debug_info("QQ", "here\n"); | 798 purple_debug(PURPLE_DEBUG_INFO, "QQ", "here\n"); |
795 _qq_send_file_data_packet(gc, QQ_FILE_DATA_INFO, 0, 0, 0, NULL, 0); | 799 _qq_send_file_data_packet(gc, QQ_FILE_DATA_INFO, 0, 0, 0, NULL, 0); |
796 break; | 800 break; |
797 default: | 801 default: |
798 purple_debug_info("QQ", "_qq_process_recv_file_data: unknown packet type [%d]\n", | 802 purple_debug(PURPLE_DEBUG_INFO, "QQ", "_qq_process_recv_file_data: unknown packet type [%d]\n", |
799 packet_type); | 803 packet_type); |
800 break; | 804 break; |
801 } | 805 } |
802 } | 806 } |
803 | 807 |
818 break; | 822 break; |
819 case QQ_FILE_DATA_PACKET_TAG: | 823 case QQ_FILE_DATA_PACKET_TAG: |
820 _qq_process_recv_file_data(gc, data + bytes, len - bytes); | 824 _qq_process_recv_file_data(gc, data + bytes, len - bytes); |
821 break; | 825 break; |
822 default: | 826 default: |
823 purple_debug_info("QQ", "unknown packet tag"); | 827 purple_debug(PURPLE_DEBUG_INFO, "QQ", "unknown packet tag"); |
824 } | 828 } |
825 } | 829 } |