comparison libpurple/protocols/qq/file_trans.c @ 24019:147ada94a1d8

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