| 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_info("QQ", |
57 purple_debug(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_info("QQ", |
90 purple_debug(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_info("QQ", "sending to channel: %d.%d.%d.%d:%d\n", |
124 purple_debug(PURPLE_DEBUG_INFO, "QQ", "sending to channel: %d.%d.%d.%d:%d\n", |
| 125 sin.sin_addr.s_addr & 0xff, |
125 (int)sin.sin_addr.s_addr & 0xff, |
| 126 (sin.sin_addr.s_addr >> 8) & 0xff, |
126 (int)(sin.sin_addr.s_addr >> 8) & 0xff, |
| 127 (sin.sin_addr.s_addr >> 16) & 0xff, |
127 (int)(sin.sin_addr.s_addr >> 16) & 0xff, |
| 128 sin.sin_addr.s_addr >> 24, |
128 (int)sin.sin_addr.s_addr >> 24, |
| 129 g_ntohs(sin.sin_port) |
129 (int)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_info("QQ", "file closed\n"); |
210 purple_debug(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_info("QQ", "major port closed\n"); |
214 purple_debug(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_info("QQ", "minor port closed\n"); |
218 purple_debug(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_info("QQ", "file mapping buffer is freed.\n"); |
223 purple_debug(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_info("QQ", "remote internet ip[%s:%d], major port[%d], real ip[%s], minor port[%d]\n", |
238 purple_debug(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_info("QQ", "local real ip is %x", info->local_real_ip); |
396 purple_debug(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_info("QQ", "UDP Major Channel created on port[%d]\n", |
415 purple_debug(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_info("QQ", "UDP Minor Channel created on port[%d]\n", |
421 purple_debug(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(gc, QQ_CMD_SEND_IM, raw_data, bytes); |
478 qq_send_cmd (qd, QQ_CMD_SEND_IM, raw_data, bytes); |
| 479 else |
479 else |
| 480 purple_debug_info("qq_send_packet_file_request", |
480 purple_debug (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_info("QQ", "I've accepted the file transfer request from %d\n", to_uid); |
500 purple_debug(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(gc, QQ_CMD_SEND_IM, raw_data, bytes); |
519 qq_send_cmd (qd, QQ_CMD_SEND_IM, raw_data, bytes); |
| 520 else |
520 else |
| 521 purple_debug_info("qq_send_packet_file_accept", |
521 purple_debug (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_info("QQ", "<== sending qq file notify ip packet\n"); |
542 purple_debug(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(gc, QQ_CMD_SEND_IM, raw_data, bytes); |
546 qq_send_cmd (qd, QQ_CMD_SEND_IM, raw_data, bytes); |
| 547 else |
547 else |
| 548 purple_debug_info("qq_send_packet_file_notify", |
548 purple_debug (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_info("_qq_send_packet_file_reject", "start"); |
564 purple_debug(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(gc, QQ_CMD_SEND_IM, raw_data, bytes); |
574 qq_send_cmd (qd, QQ_CMD_SEND_IM, raw_data, bytes); |
| 575 else |
575 else |
| 576 purple_debug_info("qq_send_packet_file", |
576 purple_debug (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_info("_qq_send_packet_file_cancel", "start\n"); |
588 purple_debug(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_info("_qq_send_packet_file_cancel", "before create header\n"); |
595 purple_debug(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_info("_qq_send_packet_file_cancel", "end create header\n"); |
597 purple_debug(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_info("_qq_send_packet_file_cancel", "before send cmd\n"); |
600 purple_debug(PURPLE_DEBUG_INFO, "_qq_send_packet_file_cancel", "before send cmd\n"); |
| 601 qq_send_cmd(gc, QQ_CMD_SEND_IM, raw_data, bytes); |
601 qq_send_cmd (qd, QQ_CMD_SEND_IM, raw_data, bytes); |
| 602 } |
602 } |
| 603 else |
603 else |
| 604 purple_debug_info("qq_send_packet_file", |
604 purple_debug (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_info("qq_send_packet_file_cancel", "end\n"); |
608 purple_debug (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_warning("QQ", |
697 purple_debug (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_warning("QQ", "Received file reject message is empty\n"); |
727 purple_debug (PURPLE_DEBUG_WARNING, "QQ", |
| |
728 "Received file reject message is empty\n"); |
| 728 return; |
729 return; |
| 729 } |
730 } |
| 730 */ |
731 */ |
| 731 filename = strrchr(purple_xfer_get_local_filename(qd->xfer), '/') + 1; |
732 filename = strrchr(purple_xfer_get_local_filename(qd->xfer), '/') + 1; |
| 732 msg = g_strdup_printf |
733 msg = g_strdup_printf |
| 752 qd = (qq_data *) gc->proto_data; |
753 qd = (qq_data *) gc->proto_data; |
| 753 xfer = qd->xfer; |
754 xfer = qd->xfer; |
| 754 info = (ft_info *) qd->xfer->data; |
755 info = (ft_info *) qd->xfer->data; |
| 755 |
756 |
| 756 if (data_len <= 30 + QQ_CONN_INFO_LEN) { |
757 if (data_len <= 30 + QQ_CONN_INFO_LEN) { |
| 757 purple_debug_warning("QQ", "Received file reject message is empty\n"); |
758 purple_debug (PURPLE_DEBUG_WARNING, "QQ", |
| |
759 "Received file reject message is empty\n"); |
| 758 return; |
760 return; |
| 759 } |
761 } |
| 760 |
762 |
| 761 bytes = 18 + 12; /* skip 30 bytes */ |
763 bytes = 18 + 12; /* skip 30 bytes */ |
| 762 qq_get_conn_info(info, data + bytes); |
764 qq_get_conn_info(info, data + bytes); |
| 785 info->local_internet_port = qd->my_port; |
787 info->local_internet_port = qd->my_port; |
| 786 info->local_real_ip = 0x00000000; |
788 info->local_real_ip = 0x00000000; |
| 787 info->to_uid = sender_uid; |
789 info->to_uid = sender_uid; |
| 788 |
790 |
| 789 if (data_len <= 2 + 30 + QQ_CONN_INFO_LEN) { |
791 if (data_len <= 2 + 30 + QQ_CONN_INFO_LEN) { |
| 790 purple_debug_warning("QQ", "Received file request message is empty\n"); |
792 purple_debug (PURPLE_DEBUG_WARNING, "QQ", |
| |
793 "Received file request message is empty\n"); |
| 791 return; |
794 return; |
| 792 } |
795 } |
| 793 bytes = 0; |
796 bytes = 0; |
| 794 bytes += qq_get16(&(info->send_seq), data + bytes); |
797 bytes += qq_get16(&(info->send_seq), data + bytes); |
| 795 |
798 |
| 801 |
804 |
| 802 sender_name = uid_to_purple_name(sender_uid); |
805 sender_name = uid_to_purple_name(sender_uid); |
| 803 |
806 |
| 804 /* FACE from IP detector, ignored by gfhuang */ |
807 /* FACE from IP detector, ignored by gfhuang */ |
| 805 if(g_ascii_strcasecmp(fileinfo[0], "FACE") == 0) { |
808 if(g_ascii_strcasecmp(fileinfo[0], "FACE") == 0) { |
| 806 purple_debug_warning("QQ", |
809 purple_debug(PURPLE_DEBUG_WARNING, "QQ", |
| 807 "Received a FACE ip detect from qq-%d, so he/she must be online :)\n", sender_uid); |
810 "Received a FACE ip detect from qq-%d, so he/she must be online :)\n", sender_uid); |
| 808 |
811 |
| 809 b = purple_find_buddy(gc->account, sender_name); |
812 b = purple_find_buddy(gc->account, sender_name); |
| 810 q_bud = (b == NULL) ? NULL : (qq_buddy *) b->proto_data; |
813 q_bud = (b == NULL) ? NULL : (qq_buddy *) b->proto_data; |
| 811 if (q_bud) { |
814 if (q_bud) { |
| 821 if(!is_online(q_bud->status)) { |
824 if(!is_online(q_bud->status)) { |
| 822 q_bud->status = QQ_BUDDY_ONLINE_INVISIBLE; |
825 q_bud->status = QQ_BUDDY_ONLINE_INVISIBLE; |
| 823 qq_update_buddy_contact(gc, q_bud); |
826 qq_update_buddy_contact(gc, q_bud); |
| 824 } |
827 } |
| 825 else |
828 else |
| 826 purple_debug_info("QQ", "buddy %d is already online\n", sender_uid); |
829 purple_debug(PURPLE_DEBUG_INFO, "QQ", "buddy %d is already online\n", sender_uid); |
| 827 |
830 |
| 828 } |
831 } |
| 829 else |
832 else |
| 830 purple_debug_warning("QQ", "buddy %d is not in list\n", sender_uid); |
833 purple_debug(PURPLE_DEBUG_WARNING, "QQ", "buddy %d is not in list\n", sender_uid); |
| 831 |
834 |
| 832 g_free(sender_name); |
835 g_free(sender_name); |
| 833 g_strfreev(fileinfo); |
836 g_strfreev(fileinfo); |
| 834 return; |
837 return; |
| 835 } |
838 } |
| 887 qd = (qq_data *) gc->proto_data; |
890 qd = (qq_data *) gc->proto_data; |
| 888 |
891 |
| 889 xfer = qd->xfer; |
892 xfer = qd->xfer; |
| 890 info = (ft_info *) qd->xfer->data; |
893 info = (ft_info *) qd->xfer->data; |
| 891 if (data_len <= 2 + 30 + QQ_CONN_INFO_LEN) { |
894 if (data_len <= 2 + 30 + QQ_CONN_INFO_LEN) { |
| 892 purple_debug_warning("QQ", "Received file notify message is empty\n"); |
895 purple_debug (PURPLE_DEBUG_WARNING, "QQ", |
| |
896 "Received file notify message is empty\n"); |
| 893 return; |
897 return; |
| 894 } |
898 } |
| 895 |
899 |
| 896 bytes = 0; |
900 bytes = 0; |
| 897 bytes += qq_get16(&(info->send_seq), data + bytes); |
901 bytes += qq_get16(&(info->send_seq), data + bytes); |