comparison libpurple/protocols/bonjour/bonjour_ft.c @ 32827:4a34689eeb33 default tip

merged from im.pidgin.pidgin
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Sat, 19 Nov 2011 14:42:54 +0900
parents 1ffa35da9a7b
children
comparison
equal deleted inserted replaced
32692:0f94ec89f0bc 32827:4a34689eeb33
36 bonjour_bytestreams_connect(PurpleXfer *xfer, PurpleBuddy *pb); 36 bonjour_bytestreams_connect(PurpleXfer *xfer, PurpleBuddy *pb);
37 static void 37 static void
38 bonjour_xfer_init(PurpleXfer *xfer); 38 bonjour_xfer_init(PurpleXfer *xfer);
39 static void 39 static void
40 bonjour_xfer_receive(PurpleConnection *pc, const char *id, const char *sid, const char *from, 40 bonjour_xfer_receive(PurpleConnection *pc, const char *id, const char *sid, const char *from,
41 const int filesize, const char *filename, int option); 41 const goffset filesize, const char *filename, int option);
42 static void bonjour_free_xfer(PurpleXfer *xfer); 42 static void bonjour_free_xfer(PurpleXfer *xfer);
43 43
44 /* Look for specific xfer handle */ 44 /* Look for specific xfer handle */
45 static unsigned int next_id = 0; 45 static unsigned int next_id = 0;
46 46
134 134
135 /* We can't allow the server side to close the connection until the client is complete, 135 /* We can't allow the server side to close the connection until the client is complete,
136 * otherwise there is a RST resulting in an error on the client side */ 136 * otherwise there is a RST resulting in an error on the client side */
137 if (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND && purple_xfer_is_completed(xfer)) { 137 if (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND && purple_xfer_is_completed(xfer)) {
138 struct socket_cleanup *sc = g_new0(struct socket_cleanup, 1); 138 struct socket_cleanup *sc = g_new0(struct socket_cleanup, 1);
139 sc->fd = xfer->fd; 139 sc->fd = purple_xfer_get_fd(xfer);
140 xfer->fd = -1; 140 purple_xfer_set_fd(xfer, -1);
141 sc->handle = purple_input_add(sc->fd, PURPLE_INPUT_READ, 141 sc->handle = purple_input_add(sc->fd, PURPLE_INPUT_READ,
142 _wait_for_socket_close, sc); 142 _wait_for_socket_close, sc);
143 } 143 }
144 144
145 bonjour_free_xfer(xfer); 145 bonjour_free_xfer(xfer);
209 xmlnode_set_attrib(si_node, "id", xf->sid); 209 xmlnode_set_attrib(si_node, "id", xf->sid);
210 210
211 file = xmlnode_new_child(si_node, "file"); 211 file = xmlnode_new_child(si_node, "file");
212 xmlnode_set_namespace(file, "http://jabber.org/protocol/si/profile/file-transfer"); 212 xmlnode_set_namespace(file, "http://jabber.org/protocol/si/profile/file-transfer");
213 xmlnode_set_attrib(file, "name", purple_xfer_get_filename(xfer)); 213 xmlnode_set_attrib(file, "name", purple_xfer_get_filename(xfer));
214 g_snprintf(buf, sizeof(buf), "%" G_GSIZE_FORMAT, purple_xfer_get_size(xfer)); 214 g_snprintf(buf, sizeof(buf), "%" G_GOFFSET_FORMAT, purple_xfer_get_size(xfer));
215 xmlnode_set_attrib(file, "size", buf); 215 xmlnode_set_attrib(file, "size", buf);
216 216
217 feature = xmlnode_new_child(si_node, "feature"); 217 feature = xmlnode_new_child(si_node, "feature");
218 xmlnode_set_namespace(feature, "http://jabber.org/protocol/feature-neg"); 218 xmlnode_set_namespace(feature, "http://jabber.org/protocol/feature-neg");
219 219
331 bd = purple_connection_get_protocol_data(gc); 331 bd = purple_connection_get_protocol_data(gc);
332 if(bd == NULL) 332 if(bd == NULL)
333 return NULL; 333 return NULL;
334 334
335 /* Build the file transfer handle */ 335 /* Build the file transfer handle */
336 xfer = purple_xfer_new(gc->account, PURPLE_XFER_SEND, who); 336 xfer = purple_xfer_new(purple_connection_get_account(gc), PURPLE_XFER_SEND, who);
337 xep_xfer = g_new0(XepXfer, 1); 337 xep_xfer = g_new0(XepXfer, 1);
338 purple_xfer_set_protocol_data(xfer, xep_xfer); 338 purple_xfer_set_protocol_data(xfer, xep_xfer);
339 xep_xfer->data = bd; 339 xep_xfer->data = bd;
340 340
341 purple_debug_info("bonjour", "Bonjour-new-xfer bd=%p data=%p.\n", bd, xep_xfer->data); 341 purple_debug_info("bonjour", "Bonjour-new-xfer bd=%p data=%p.\n", bd, xep_xfer->data);
437 437
438 purple_debug_info("bonjour", "si offer Message type - SET.\n"); 438 purple_debug_info("bonjour", "si offer Message type - SET.\n");
439 if (si && (profile = xmlnode_get_attrib(si, "profile")) 439 if (si && (profile = xmlnode_get_attrib(si, "profile"))
440 && !strcmp(profile, "http://jabber.org/protocol/si/profile/file-transfer")) { 440 && !strcmp(profile, "http://jabber.org/protocol/si/profile/file-transfer")) {
441 const char *filename = NULL, *filesize_str = NULL; 441 const char *filename = NULL, *filesize_str = NULL;
442 int filesize = 0; 442 goffset filesize = 0;
443 xmlnode *file; 443 xmlnode *file;
444 444
445 const char *sid = xmlnode_get_attrib(si, "id"); 445 const char *sid = xmlnode_get_attrib(si, "id");
446 446
447 if ((file = xmlnode_get_child(si, "file"))) { 447 if ((file = xmlnode_get_child(si, "file"))) {
448 filename = xmlnode_get_attrib(file, "name"); 448 filename = xmlnode_get_attrib(file, "name");
449 if((filesize_str = xmlnode_get_attrib(file, "size"))) 449 if((filesize_str = xmlnode_get_attrib(file, "size")))
450 filesize = atoi(filesize_str); 450 filesize = g_ascii_strtoll(filesize_str, NULL, 10);
451 } 451 }
452 452
453 /* TODO: Make sure that it is advertising a bytestreams transfer */ 453 /* TODO: Make sure that it is advertising a bytestreams transfer */
454 454
455 if (filename) { 455 if (filename) {
574 } 574 }
575 } 575 }
576 576
577 static void 577 static void
578 bonjour_xfer_receive(PurpleConnection *pc, const char *id, const char *sid, const char *from, 578 bonjour_xfer_receive(PurpleConnection *pc, const char *id, const char *sid, const char *from,
579 const int filesize, const char *filename, int option) 579 const goffset filesize, const char *filename, int option)
580 { 580 {
581 PurpleXfer *xfer; 581 PurpleXfer *xfer;
582 XepXfer *xf; 582 XepXfer *xf;
583 BonjourData *bd; 583 BonjourData *bd;
584 584
590 return; 590 return;
591 591
592 purple_debug_info("bonjour", "bonjour-xfer-receive.\n"); 592 purple_debug_info("bonjour", "bonjour-xfer-receive.\n");
593 593
594 /* Build the file transfer handle */ 594 /* Build the file transfer handle */
595 xfer = purple_xfer_new(pc->account, PURPLE_XFER_RECEIVE, from); 595 xfer = purple_xfer_new(purple_connection_get_account(pc), PURPLE_XFER_RECEIVE, from);
596 xf = g_new0(XepXfer, 1); 596 xf = g_new0(XepXfer, 1);
597 purple_xfer_set_protocol_data(xfer, xf); 597 purple_xfer_set_protocol_data(xfer, xf);
598 xf->data = bd; 598 xf->data = bd;
599 purple_xfer_set_filename(xfer, filename); 599 purple_xfer_set_filename(xfer, filename);
600 xf->iq_id = g_strdup(id); 600 xf->iq_id = g_strdup(id);
646 fcntl(acceptfd, F_SETFL, flags | O_NONBLOCK); 646 fcntl(acceptfd, F_SETFL, flags | O_NONBLOCK);
647 #ifndef _WIN32 647 #ifndef _WIN32
648 fcntl(acceptfd, F_SETFD, FD_CLOEXEC); 648 fcntl(acceptfd, F_SETFD, FD_CLOEXEC);
649 #endif 649 #endif
650 650
651 purple_input_remove(xfer->watcher); 651 purple_input_remove(purple_xfer_get_watcher(xfer));
652 close(source); 652 close(source);
653 xfer->watcher = purple_input_add(acceptfd, PURPLE_INPUT_READ, 653 purple_xfer_set_watcher(xfer, purple_input_add(acceptfd, PURPLE_INPUT_READ,
654 bonjour_sock5_request_cb, xfer); 654 bonjour_sock5_request_cb, xfer));
655 xf->sock5_req_state++; 655 xf->sock5_req_state++;
656 xf->rxlen = 0; 656 xf->rxlen = 0;
657 } 657 }
658 break; 658 break;
659 case 0x01: 659 case 0x01:
660 xfer->fd = source; 660 purple_xfer_set_fd(xfer, source);
661 len = read(source, xf->rx_buf + xf->rxlen, 3); 661 len = read(source, xf->rx_buf + xf->rxlen, 3);
662 if(len < 0 && errno == EAGAIN) 662 if(len < 0 && errno == EAGAIN)
663 return; 663 return;
664 else if(len <= 0){ 664 else if(len <= 0){
665 purple_xfer_cancel_remote(xfer); 665 purple_xfer_cancel_remote(xfer);
666 return; 666 return;
667 } else { 667 } else {
668 purple_input_remove(xfer->watcher); 668 purple_input_remove(purple_xfer_get_watcher(xfer));
669 xfer->watcher = purple_input_add(source, PURPLE_INPUT_WRITE, 669 purple_xfer_set_watcher(xfer, purple_input_add(source, PURPLE_INPUT_WRITE,
670 bonjour_sock5_request_cb, xfer); 670 bonjour_sock5_request_cb, xfer));
671 xf->sock5_req_state++; 671 xf->sock5_req_state++;
672 xf->rxlen = 0; 672 xf->rxlen = 0;
673 bonjour_sock5_request_cb(xfer, source, PURPLE_INPUT_WRITE); 673 bonjour_sock5_request_cb(xfer, source, PURPLE_INPUT_WRITE);
674 } 674 }
675 break; 675 break;
682 else if (len < 0) { 682 else if (len < 0) {
683 close(source); 683 close(source);
684 purple_xfer_cancel_remote(xfer); 684 purple_xfer_cancel_remote(xfer);
685 return; 685 return;
686 } else { 686 } else {
687 purple_input_remove(xfer->watcher); 687 purple_input_remove(purple_xfer_get_watcher(xfer));
688 xfer->watcher = purple_input_add(source, PURPLE_INPUT_READ, 688 purple_xfer_set_watcher(xfer, purple_input_add(source, PURPLE_INPUT_READ,
689 bonjour_sock5_request_cb, xfer); 689 bonjour_sock5_request_cb, xfer));
690 xf->sock5_req_state++; 690 xf->sock5_req_state++;
691 xf->rxlen = 0; 691 xf->rxlen = 0;
692 } 692 }
693 break; 693 break;
694 case 0x03: 694 case 0x03:
695 len = read(source, xf->rx_buf + xf->rxlen, 20); 695 len = read(source, xf->rx_buf + xf->rxlen, 20);
696 if(len<=0){ 696 if(len<=0){
697 } else { 697 } else {
698 purple_input_remove(xfer->watcher); 698 purple_input_remove(purple_xfer_get_watcher(xfer));
699 xfer->watcher = purple_input_add(source, PURPLE_INPUT_WRITE, 699 purple_xfer_set_watcher(xfer, purple_input_add(source, PURPLE_INPUT_WRITE,
700 bonjour_sock5_request_cb, xfer); 700 bonjour_sock5_request_cb, xfer));
701 xf->sock5_req_state++; 701 xf->sock5_req_state++;
702 xf->rxlen = 0; 702 xf->rxlen = 0;
703 bonjour_sock5_request_cb(xfer, source, PURPLE_INPUT_WRITE); 703 bonjour_sock5_request_cb(xfer, source, PURPLE_INPUT_WRITE);
704 } 704 }
705 break; 705 break;
718 } else if (len < 0) { 718 } else if (len < 0) {
719 close(source); 719 close(source);
720 purple_xfer_cancel_remote(xfer); 720 purple_xfer_cancel_remote(xfer);
721 return; 721 return;
722 } else { 722 } else {
723 purple_input_remove(xfer->watcher); 723 purple_input_remove(purple_xfer_get_watcher(xfer));
724 xfer->watcher = 0; 724 purple_xfer_set_watcher(xfer, 0);
725 xf->rxlen = 0; 725 xf->rxlen = 0;
726 /*close(source);*/ 726 /*close(source);*/
727 purple_xfer_start(xfer, source, NULL, -1); 727 purple_xfer_start(xfer, source, NULL, -1);
728 } 728 }
729 break; 729 break;
748 if (sock < 0 || xfer == NULL) { 748 if (sock < 0 || xfer == NULL) {
749 /*purple_xfer_cancel_local(xfer);*/ 749 /*purple_xfer_cancel_local(xfer);*/
750 return; 750 return;
751 } 751 }
752 752
753 xfer->watcher = purple_input_add(sock, PURPLE_INPUT_READ, 753 purple_xfer_set_watcher(xfer, purple_input_add(sock, PURPLE_INPUT_READ,
754 bonjour_sock5_request_cb, xfer); 754 bonjour_sock5_request_cb, xfer));
755 xf = purple_xfer_get_protocol_data(xfer); 755 xf = purple_xfer_get_protocol_data(xfer);
756 xf->listen_data = NULL; 756 xf->listen_data = NULL;
757 757
758 bd = xf->data; 758 bd = xf->data;
759 759
762 query = xmlnode_new_child(iq->node, "query"); 762 query = xmlnode_new_child(iq->node, "query");
763 xmlnode_set_namespace(query, "http://jabber.org/protocol/bytestreams"); 763 xmlnode_set_namespace(query, "http://jabber.org/protocol/bytestreams");
764 xmlnode_set_attrib(query, "sid", xf->sid); 764 xmlnode_set_attrib(query, "sid", xf->sid);
765 xmlnode_set_attrib(query, "mode", "tcp"); 765 xmlnode_set_attrib(query, "mode", "tcp");
766 766
767 xfer->local_port = purple_network_get_port_from_fd(sock); 767 purple_xfer_set_local_port(xfer, purple_network_get_port_from_fd(sock));
768 768
769 local_ips = bonjour_jabber_get_local_ips(sock); 769 local_ips = bonjour_jabber_get_local_ips(sock);
770 770
771 port = g_strdup_printf("%hu", purple_xfer_get_local_port(xfer)); 771 port = g_strdup_printf("%hu", purple_xfer_get_local_port(xfer));
772 while(local_ips) { 772 while(local_ips) {