comparison libpurple/protocols/qq/send_file.c @ 24088: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 1568dc7a14f8
children 25f62d21b3f8
comparison
equal deleted inserted replaced
24087:40a4e02027f4 24088:147ada94a1d8
52 }; 52 };
53 53
54 static int _qq_in_same_lan(ft_info *info) 54 static int _qq_in_same_lan(ft_info *info)
55 { 55 {
56 if (info->remote_internet_ip == info->local_internet_ip) return 1; 56 if (info->remote_internet_ip == info->local_internet_ip) return 1;
57 purple_debug(PURPLE_DEBUG_INFO, "QQ", 57 purple_debug_info("QQ",
58 "Not in the same LAN, remote internet ip[%x], local internet ip[%x]\n", 58 "Not in the same LAN, remote internet ip[%x], local internet ip[%x]\n",
59 info->remote_internet_ip 59 info->remote_internet_ip
60 , info->local_internet_ip); 60 , info->local_internet_ip);
61 return 0; 61 return 0;
62 } 62 }
85 gint r; 85 gint r;
86 86
87 info = (ft_info *) xfer->data; 87 info = (ft_info *) xfer->data;
88 sinlen = sizeof(sin); 88 sinlen = sizeof(sin);
89 r = recvfrom(info->recv_fd, buf, len, 0, (struct sockaddr *) &sin, &sinlen); 89 r = recvfrom(info->recv_fd, buf, len, 0, (struct sockaddr *) &sin, &sinlen);
90 purple_debug(PURPLE_DEBUG_INFO, "QQ", 90 purple_debug_info("QQ",
91 "==> recv %d bytes from File UDP Channel, remote ip[%s], remote port[%d]\n", 91 "==> recv %d bytes from File UDP Channel, remote ip[%s], remote port[%d]\n",
92 r, inet_ntoa(sin.sin_addr), g_ntohs(sin.sin_port)); 92 r, inet_ntoa(sin.sin_addr), g_ntohs(sin.sin_port));
93 return r; 93 return r;
94 } 94 }
95 95
119 sin.sin_addr.s_addr = g_htonl(info->remote_real_ip); 119 sin.sin_addr.s_addr = g_htonl(info->remote_real_ip);
120 } else { 120 } else {
121 sin.sin_port = g_htons(info->remote_minor_port); 121 sin.sin_port = g_htons(info->remote_minor_port);
122 sin.sin_addr.s_addr = g_htonl(info->remote_real_ip); 122 sin.sin_addr.s_addr = g_htonl(info->remote_real_ip);
123 } 123 }
124 purple_debug(PURPLE_DEBUG_INFO, "QQ", "sending to channel: %d.%d.%d.%d:%d\n", 124 purple_debug_info("QQ", "sending to channel: %d.%d.%d.%d:%d\n",
125 (int)sin.sin_addr.s_addr & 0xff, 125 sin.sin_addr.s_addr & 0xff,
126 (int)(sin.sin_addr.s_addr >> 8) & 0xff, 126 (sin.sin_addr.s_addr >> 8) & 0xff,
127 (int)(sin.sin_addr.s_addr >> 16) & 0xff, 127 (sin.sin_addr.s_addr >> 16) & 0xff,
128 (int)sin.sin_addr.s_addr >> 24, 128 sin.sin_addr.s_addr >> 24,
129 (int)g_ntohs(sin.sin_port) 129 g_ntohs(sin.sin_port)
130 ); 130 );
131 return sendto(info->sender_fd, buf, len, 0, (struct sockaddr *) &sin, sizeof(sin)); 131 return sendto(info->sender_fd, buf, len, 0, (struct sockaddr *) &sin, sizeof(sin));
132 } 132 }
133 133
134 /* user-defined functions for purple_xfer_read and purple_xfer_write */ 134 /* user-defined functions for purple_xfer_read and purple_xfer_write */
205 info = (ft_info *) xfer->data; 205 info = (ft_info *) xfer->data;
206 206
207 qq_xfer_close_file(xfer); 207 qq_xfer_close_file(xfer);
208 if (info->dest_fp != NULL) { 208 if (info->dest_fp != NULL) {
209 fclose(info->dest_fp); 209 fclose(info->dest_fp);
210 purple_debug(PURPLE_DEBUG_INFO, "QQ", "file closed\n"); 210 purple_debug_info("QQ", "file closed\n");
211 } 211 }
212 if (info->major_fd != 0) { 212 if (info->major_fd != 0) {
213 close(info->major_fd); 213 close(info->major_fd);
214 purple_debug(PURPLE_DEBUG_INFO, "QQ", "major port closed\n"); 214 purple_debug_info("QQ", "major port closed\n");
215 } 215 }
216 if (info->minor_fd != 0) { 216 if (info->minor_fd != 0) {
217 close(info->minor_fd); 217 close(info->minor_fd);
218 purple_debug(PURPLE_DEBUG_INFO, "QQ", "minor port closed\n"); 218 purple_debug_info("QQ", "minor port closed\n");
219 } 219 }
220 /* 220 /*
221 if (info->buffer != NULL) { 221 if (info->buffer != NULL) {
222 munmap(info->buffer, purple_xfer_get_size(xfer)); 222 munmap(info->buffer, purple_xfer_get_size(xfer));
223 purple_debug(PURPLE_DEBUG_INFO, "QQ", "file mapping buffer is freed.\n"); 223 purple_debug_info("QQ", "file mapping buffer is freed.\n");
224 } 224 }
225 */ 225 */
226 g_free(info); 226 g_free(info);
227 } 227 }
228 228
233 233
234 ip = g_htonl(info->remote_real_ip); 234 ip = g_htonl(info->remote_real_ip);
235 real_ip_str = gen_ip_str((guint8 *) &ip); 235 real_ip_str = gen_ip_str((guint8 *) &ip);
236 ip = g_htonl(info->remote_internet_ip); 236 ip = g_htonl(info->remote_internet_ip);
237 internet_ip_str = gen_ip_str((guint8 *) &ip); 237 internet_ip_str = gen_ip_str((guint8 *) &ip);
238 purple_debug(PURPLE_DEBUG_INFO, "QQ", "remote internet ip[%s:%d], major port[%d], real ip[%s], minor port[%d]\n", 238 purple_debug_info("QQ", "remote internet ip[%s:%d], major port[%d], real ip[%s], minor port[%d]\n",
239 internet_ip_str, info->remote_internet_port, 239 internet_ip_str, info->remote_internet_port,
240 info->remote_major_port, real_ip_str, info->remote_minor_port 240 info->remote_major_port, real_ip_str, info->remote_minor_port
241 ); 241 );
242 g_free(real_ip_str); 242 g_free(real_ip_str);
243 g_free(internet_ip_str); 243 g_free(internet_ip_str);
391 391
392 /* debug 392 /* debug
393 info->local_real_ip = 0x7f000001; 393 info->local_real_ip = 0x7f000001;
394 */ 394 */
395 info->local_real_ip = g_ntohl(inet_addr(purple_network_get_my_ip(-1))); 395 info->local_real_ip = g_ntohl(inet_addr(purple_network_get_my_ip(-1)));
396 purple_debug(PURPLE_DEBUG_INFO, "QQ", "local real ip is %x", info->local_real_ip); 396 purple_debug_info("QQ", "local real ip is %x", info->local_real_ip);
397 397
398 for (i = 0; i < 2; i++) { 398 for (i = 0; i < 2; i++) {
399 sockfd = socket(PF_INET, SOCK_DGRAM, 0); 399 sockfd = socket(PF_INET, SOCK_DGRAM, 0);
400 g_return_if_fail(sockfd >= 0); 400 g_return_if_fail(sockfd >= 0);
401 401
410 410
411 switch (i) { 411 switch (i) {
412 case 0: 412 case 0:
413 info->local_major_port = listen_port; 413 info->local_major_port = listen_port;
414 info->major_fd = sockfd; 414 info->major_fd = sockfd;
415 purple_debug(PURPLE_DEBUG_INFO, "QQ", "UDP Major Channel created on port[%d]\n", 415 purple_debug_info("QQ", "UDP Major Channel created on port[%d]\n",
416 info->local_major_port); 416 info->local_major_port);
417 break; 417 break;
418 case 1: 418 case 1:
419 info->local_minor_port = listen_port; 419 info->local_minor_port = listen_port;
420 info->minor_fd = sockfd; 420 info->minor_fd = sockfd;
421 purple_debug(PURPLE_DEBUG_INFO, "QQ", "UDP Minor Channel created on port[%d]\n", 421 purple_debug_info("QQ", "UDP Minor Channel created on port[%d]\n",
422 info->local_minor_port); 422 info->local_minor_port);
423 break; 423 break;
424 } 424 }
425 } 425 }
426 426
473 bytes += qq_put8 (raw_data + bytes, 0x1f); 473 bytes += qq_put8 (raw_data + bytes, 0x1f);
474 /* file length */ 474 /* file length */
475 bytes += qq_putdata (raw_data + bytes, (guint8 *) filelen_str, filelen_strlen); 475 bytes += qq_putdata (raw_data + bytes, (guint8 *) filelen_str, filelen_strlen);
476 476
477 if (packet_len == bytes) 477 if (packet_len == bytes)
478 qq_send_cmd (qd, QQ_CMD_SEND_IM, raw_data, bytes); 478 qq_send_cmd(gc, QQ_CMD_SEND_IM, raw_data, bytes);
479 else 479 else
480 purple_debug (PURPLE_DEBUG_INFO, "qq_send_packet_file_request", 480 purple_debug_info("qq_send_packet_file_request",
481 "%d bytes expected but got %d bytes\n", 481 "%d bytes expected but got %d bytes\n",
482 packet_len, bytes); 482 packet_len, bytes);
483 483
484 g_free (filelen_str); 484 g_free (filelen_str);
485 } 485 }
495 ft_info *info; 495 ft_info *info;
496 496
497 qd = (qq_data *) gc->proto_data; 497 qd = (qq_data *) gc->proto_data;
498 info = (ft_info *) qd->xfer->data; 498 info = (ft_info *) qd->xfer->data;
499 499
500 purple_debug(PURPLE_DEBUG_INFO, "QQ", "I've accepted the file transfer request from %d\n", to_uid); 500 purple_debug_info("QQ", "I've accepted the file transfer request from %d\n", to_uid);
501 _qq_xfer_init_socket(qd->xfer); 501 _qq_xfer_init_socket(qd->xfer);
502 502
503 packet_len = 79; 503 packet_len = 79;
504 raw_data = g_newa (guint8, packet_len); 504 raw_data = g_newa (guint8, packet_len);
505 bytes = 0; 505 bytes = 0;
514 514
515 info->local_minor_port = minor_port; 515 info->local_minor_port = minor_port;
516 info->local_real_ip = real_ip; 516 info->local_real_ip = real_ip;
517 517
518 if (packet_len == bytes) 518 if (packet_len == bytes)
519 qq_send_cmd (qd, QQ_CMD_SEND_IM, raw_data, bytes); 519 qq_send_cmd(gc, QQ_CMD_SEND_IM, raw_data, bytes);
520 else 520 else
521 purple_debug (PURPLE_DEBUG_INFO, "qq_send_packet_file_accept", 521 purple_debug_info("qq_send_packet_file_accept",
522 "%d bytes expected but got %d bytes\n", 522 "%d bytes expected but got %d bytes\n",
523 packet_len, bytes); 523 packet_len, bytes);
524 } 524 }
525 525
526 static void _qq_send_packet_file_notifyip(PurpleConnection *gc, guint32 to_uid) 526 static void _qq_send_packet_file_notifyip(PurpleConnection *gc, guint32 to_uid)
537 537
538 packet_len = 79; 538 packet_len = 79;
539 raw_data = g_newa (guint8, packet_len); 539 raw_data = g_newa (guint8, packet_len);
540 bytes = 0; 540 bytes = 0;
541 541
542 purple_debug(PURPLE_DEBUG_INFO, "QQ", "<== sending qq file notify ip packet\n"); 542 purple_debug_info("QQ", "<== sending qq file notify ip packet\n");
543 bytes += _qq_create_packet_file_header(raw_data + bytes, to_uid, QQ_FILE_TRANS_NOTIFY, qd, TRUE); 543 bytes += _qq_create_packet_file_header(raw_data + bytes, to_uid, QQ_FILE_TRANS_NOTIFY, qd, TRUE);
544 bytes += qq_fill_conn_info(raw_data + bytes, info); 544 bytes += qq_fill_conn_info(raw_data + bytes, info);
545 if (packet_len == bytes) 545 if (packet_len == bytes)
546 qq_send_cmd (qd, QQ_CMD_SEND_IM, raw_data, bytes); 546 qq_send_cmd(gc, QQ_CMD_SEND_IM, raw_data, bytes);
547 else 547 else
548 purple_debug (PURPLE_DEBUG_INFO, "qq_send_packet_file_notify", 548 purple_debug_info("qq_send_packet_file_notify",
549 "%d bytes expected but got %d bytes\n", 549 "%d bytes expected but got %d bytes\n",
550 packet_len, bytes); 550 packet_len, bytes);
551 551
552 if (xfer->watcher) purple_input_remove(xfer->watcher); 552 if (xfer->watcher) purple_input_remove(xfer->watcher);
553 xfer->watcher = purple_input_add(info->recv_fd, PURPLE_INPUT_READ, _qq_xfer_recv_packet, xfer); 553 xfer->watcher = purple_input_add(info->recv_fd, PURPLE_INPUT_READ, _qq_xfer_recv_packet, xfer);
559 { 559 {
560 qq_data *qd; 560 qq_data *qd;
561 guint8 *raw_data; 561 guint8 *raw_data;
562 gint packet_len, bytes; 562 gint packet_len, bytes;
563 563
564 purple_debug(PURPLE_DEBUG_INFO, "_qq_send_packet_file_reject", "start"); 564 purple_debug_info("_qq_send_packet_file_reject", "start");
565 qd = (qq_data *) gc->proto_data; 565 qd = (qq_data *) gc->proto_data;
566 566
567 packet_len = 64; 567 packet_len = 64;
568 raw_data = g_newa (guint8, packet_len); 568 raw_data = g_newa (guint8, packet_len);
569 bytes = 0; 569 bytes = 0;
570 570
571 bytes += _qq_create_packet_file_header(raw_data + bytes, to_uid, QQ_FILE_TRANS_DENY_UDP, qd, TRUE); 571 bytes += _qq_create_packet_file_header(raw_data + bytes, to_uid, QQ_FILE_TRANS_DENY_UDP, qd, TRUE);
572 572
573 if (packet_len == bytes) 573 if (packet_len == bytes)
574 qq_send_cmd (qd, QQ_CMD_SEND_IM, raw_data, bytes); 574 qq_send_cmd(gc, QQ_CMD_SEND_IM, raw_data, bytes);
575 else 575 else
576 purple_debug (PURPLE_DEBUG_INFO, "qq_send_packet_file", 576 purple_debug_info("qq_send_packet_file",
577 "%d bytes expected but got %d bytes\n", 577 "%d bytes expected but got %d bytes\n",
578 packet_len, bytes); 578 packet_len, bytes);
579 } 579 }
580 580
581 /* tell the buddy to cancel transfer */ 581 /* tell the buddy to cancel transfer */
583 { 583 {
584 qq_data *qd; 584 qq_data *qd;
585 guint8 *raw_data; 585 guint8 *raw_data;
586 gint packet_len, bytes; 586 gint packet_len, bytes;
587 587
588 purple_debug(PURPLE_DEBUG_INFO, "_qq_send_packet_file_cancel", "start\n"); 588 purple_debug_info("_qq_send_packet_file_cancel", "start\n");
589 qd = (qq_data *) gc->proto_data; 589 qd = (qq_data *) gc->proto_data;
590 590
591 packet_len = 64; 591 packet_len = 64;
592 raw_data = g_newa (guint8, packet_len); 592 raw_data = g_newa (guint8, packet_len);
593 bytes = 0; 593 bytes = 0;
594 594
595 purple_debug(PURPLE_DEBUG_INFO, "_qq_send_packet_file_cancel", "before create header\n"); 595 purple_debug_info("_qq_send_packet_file_cancel", "before create header\n");
596 bytes += _qq_create_packet_file_header(raw_data + bytes, to_uid, QQ_FILE_TRANS_CANCEL, qd, TRUE); 596 bytes += _qq_create_packet_file_header(raw_data + bytes, to_uid, QQ_FILE_TRANS_CANCEL, qd, TRUE);
597 purple_debug(PURPLE_DEBUG_INFO, "_qq_send_packet_file_cancel", "end create header\n"); 597 purple_debug_info("_qq_send_packet_file_cancel", "end create header\n");
598 598
599 if (packet_len == bytes) { 599 if (packet_len == bytes) {
600 purple_debug(PURPLE_DEBUG_INFO, "_qq_send_packet_file_cancel", "before send cmd\n"); 600 purple_debug_info("_qq_send_packet_file_cancel", "before send cmd\n");
601 qq_send_cmd (qd, QQ_CMD_SEND_IM, raw_data, bytes); 601 qq_send_cmd(gc, QQ_CMD_SEND_IM, raw_data, bytes);
602 } 602 }
603 else 603 else
604 purple_debug (PURPLE_DEBUG_INFO, "qq_send_packet_file", 604 purple_debug_info("qq_send_packet_file",
605 "%d bytes expected but got %d bytes\n", 605 "%d bytes expected but got %d bytes\n",
606 packet_len, bytes); 606 packet_len, bytes);
607 607
608 purple_debug (PURPLE_DEBUG_INFO, "qq_send_packet_file_cancel", "end\n"); 608 purple_debug_info("qq_send_packet_file_cancel", "end\n");
609 } 609 }
610 610
611 /* request to send a file */ 611 /* request to send a file */
612 static void 612 static void
613 _qq_xfer_init (PurpleXfer * xfer) 613 _qq_xfer_init (PurpleXfer * xfer)
692 qd = (qq_data *) gc->proto_data; 692 qd = (qq_data *) gc->proto_data;
693 g_return_if_fail (qd->xfer != NULL); 693 g_return_if_fail (qd->xfer != NULL);
694 694
695 /* border has been checked before 695 /* border has been checked before
696 if (*cursor >= (data + data_len - 1)) { 696 if (*cursor >= (data + data_len - 1)) {
697 purple_debug (PURPLE_DEBUG_WARNING, "QQ", 697 purple_debug_warning("QQ",
698 "Received file reject message is empty\n"); 698 "Received file reject message is empty\n");
699 return; 699 return;
700 } 700 }
701 */ 701 */
702 filename = strrchr(purple_xfer_get_local_filename(qd->xfer), '/') + 1; 702 filename = strrchr(purple_xfer_get_local_filename(qd->xfer), '/') + 1;
722 g_return_if_fail (qd->xfer != NULL 722 g_return_if_fail (qd->xfer != NULL
723 && purple_xfer_get_filename(qd->xfer) != NULL); 723 && purple_xfer_get_filename(qd->xfer) != NULL);
724 724
725 /* border has been checked before 725 /* border has been checked before
726 if (*cursor >= (data + data_len - 1)) { 726 if (*cursor >= (data + data_len - 1)) {
727 purple_debug (PURPLE_DEBUG_WARNING, "QQ", 727 purple_debug_warning("QQ", "Received file reject message is empty\n");
728 "Received file reject message is empty\n");
729 return; 728 return;
730 } 729 }
731 */ 730 */
732 filename = strrchr(purple_xfer_get_local_filename(qd->xfer), '/') + 1; 731 filename = strrchr(purple_xfer_get_local_filename(qd->xfer), '/') + 1;
733 msg = g_strdup_printf 732 msg = g_strdup_printf
753 qd = (qq_data *) gc->proto_data; 752 qd = (qq_data *) gc->proto_data;
754 xfer = qd->xfer; 753 xfer = qd->xfer;
755 info = (ft_info *) qd->xfer->data; 754 info = (ft_info *) qd->xfer->data;
756 755
757 if (data_len <= 30 + QQ_CONN_INFO_LEN) { 756 if (data_len <= 30 + QQ_CONN_INFO_LEN) {
758 purple_debug (PURPLE_DEBUG_WARNING, "QQ", 757 purple_debug_warning("QQ", "Received file reject message is empty\n");
759 "Received file reject message is empty\n");
760 return; 758 return;
761 } 759 }
762 760
763 bytes = 18 + 12; /* skip 30 bytes */ 761 bytes = 18 + 12; /* skip 30 bytes */
764 qq_get_conn_info(info, data + bytes); 762 qq_get_conn_info(info, data + bytes);
787 info->local_internet_port = qd->my_port; 785 info->local_internet_port = qd->my_port;
788 info->local_real_ip = 0x00000000; 786 info->local_real_ip = 0x00000000;
789 info->to_uid = sender_uid; 787 info->to_uid = sender_uid;
790 788
791 if (data_len <= 2 + 30 + QQ_CONN_INFO_LEN) { 789 if (data_len <= 2 + 30 + QQ_CONN_INFO_LEN) {
792 purple_debug (PURPLE_DEBUG_WARNING, "QQ", 790 purple_debug_warning("QQ", "Received file request message is empty\n");
793 "Received file request message is empty\n");
794 return; 791 return;
795 } 792 }
796 bytes = 0; 793 bytes = 0;
797 bytes += qq_get16(&(info->send_seq), data + bytes); 794 bytes += qq_get16(&(info->send_seq), data + bytes);
798 795
804 801
805 sender_name = uid_to_purple_name(sender_uid); 802 sender_name = uid_to_purple_name(sender_uid);
806 803
807 /* FACE from IP detector, ignored by gfhuang */ 804 /* FACE from IP detector, ignored by gfhuang */
808 if(g_ascii_strcasecmp(fileinfo[0], "FACE") == 0) { 805 if(g_ascii_strcasecmp(fileinfo[0], "FACE") == 0) {
809 purple_debug(PURPLE_DEBUG_WARNING, "QQ", 806 purple_debug_warning("QQ",
810 "Received a FACE ip detect from qq-%d, so he/she must be online :)\n", sender_uid); 807 "Received a FACE ip detect from qq-%d, so he/she must be online :)\n", sender_uid);
811 808
812 b = purple_find_buddy(gc->account, sender_name); 809 b = purple_find_buddy(gc->account, sender_name);
813 q_bud = (b == NULL) ? NULL : (qq_buddy *) b->proto_data; 810 q_bud = (b == NULL) ? NULL : (qq_buddy *) b->proto_data;
814 if (q_bud) { 811 if (q_bud) {
824 if(!is_online(q_bud->status)) { 821 if(!is_online(q_bud->status)) {
825 q_bud->status = QQ_BUDDY_ONLINE_INVISIBLE; 822 q_bud->status = QQ_BUDDY_ONLINE_INVISIBLE;
826 qq_update_buddy_contact(gc, q_bud); 823 qq_update_buddy_contact(gc, q_bud);
827 } 824 }
828 else 825 else
829 purple_debug(PURPLE_DEBUG_INFO, "QQ", "buddy %d is already online\n", sender_uid); 826 purple_debug_info("QQ", "buddy %d is already online\n", sender_uid);
830 827
831 } 828 }
832 else 829 else
833 purple_debug(PURPLE_DEBUG_WARNING, "QQ", "buddy %d is not in list\n", sender_uid); 830 purple_debug_warning("QQ", "buddy %d is not in list\n", sender_uid);
834 831
835 g_free(sender_name); 832 g_free(sender_name);
836 g_strfreev(fileinfo); 833 g_strfreev(fileinfo);
837 return; 834 return;
838 } 835 }
890 qd = (qq_data *) gc->proto_data; 887 qd = (qq_data *) gc->proto_data;
891 888
892 xfer = qd->xfer; 889 xfer = qd->xfer;
893 info = (ft_info *) qd->xfer->data; 890 info = (ft_info *) qd->xfer->data;
894 if (data_len <= 2 + 30 + QQ_CONN_INFO_LEN) { 891 if (data_len <= 2 + 30 + QQ_CONN_INFO_LEN) {
895 purple_debug (PURPLE_DEBUG_WARNING, "QQ", 892 purple_debug_warning("QQ", "Received file notify message is empty\n");
896 "Received file notify message is empty\n");
897 return; 893 return;
898 } 894 }
899 895
900 bytes = 0; 896 bytes = 0;
901 bytes += qq_get16(&(info->send_seq), data + bytes); 897 bytes += qq_get16(&(info->send_seq), data + bytes);