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 }