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