Mercurial > pidgin.yaz
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 } |