annotate src/protocols/bonjour/jabber.c @ 13909:8264f52a1142

[gaim-migrate @ 16406] More of sf patch #1490646, from Jonty Wareing & Jono Cole "The screen name + hostname of the sending user is sent in the outgoing jabber message, fixing a sporadic problem with iChat. The port in use has been fixed to the one described in the Bonjour specification and can no longer be changed in the prpl preferences - modifiying this just stops the client from being able to start a chat. The option for a buddy icon has been removed for now as no code actually uses it yet - we plan to change this in the future. This update also introduces automatic local port retry for up to ten attempts if the port is in use (e.g. if multiple instances of gaim are running)." committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Mon, 03 Jul 2006 00:37:41 +0000
parents 425e0f861e88
children 6c907830a45f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
1 /*
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
2 * gaim - Bonjour Protocol Plugin
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
3 *
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
4 * Gaim is the legal property of its developers, whose names are too numerous
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
5 * to list here. Please refer to the COPYRIGHT file distributed with this
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
6 * source distribution.
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
7 *
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
8 * This program is free software; you can redistribute it and/or modify
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
9 * it under the terms of the GNU General Public License as published by
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
11 * (at your option) any later version.
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
12 *
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful,
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
16 * GNU General Public License for more details.
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
17 *
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
18 * You should have received a copy of the GNU General Public License
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
19 * along with this program; if not, write to the Free Software
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
21 */
11688
1fd2a974379f [gaim-migrate @ 13974]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11539
diff changeset
22 #ifndef _WIN32
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
23 #include <sys/socket.h>
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
24 #include <netinet/in.h>
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
25 #include <arpa/inet.h>
11688
1fd2a974379f [gaim-migrate @ 13974]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11539
diff changeset
26 #else
1fd2a974379f [gaim-migrate @ 13974]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11539
diff changeset
27 #include "libc_interface.h"
1fd2a974379f [gaim-migrate @ 13974]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11539
diff changeset
28 #endif
1fd2a974379f [gaim-migrate @ 13974]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11539
diff changeset
29 #include <sys/types.h>
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
30 #include <glib.h>
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
31 #include <glib/gprintf.h>
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
32 #include <unistd.h>
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
33 #include <fcntl.h>
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
34
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
35 #include "network.h"
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
36 #include "eventloop.h"
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
37 #include "connection.h"
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
38 #include "blist.h"
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
39 #include "xmlnode.h"
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
40 #include "debug.h"
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
41 #include "notify.h"
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
42 #include "util.h"
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
43
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
44 #include "jabber.h"
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
45 #include "bonjour.h"
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
46 #include "buddy.h"
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
47
12443
488a305f9aff [gaim-migrate @ 14750]
Stu Tomlinson <stu@nosnilmot.com>
parents: 11830
diff changeset
48 static gint
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
49 _connect_to_buddy(GaimBuddy *gb)
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
50 {
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
51 gint socket_fd;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
52 gint retorno = 0;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
53 struct sockaddr_in buddy_address;
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
54
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
55 /* Create a socket and make it non-blocking */
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
56 socket_fd = socket(PF_INET, SOCK_STREAM, 0);
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
57
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
58 buddy_address.sin_family = PF_INET;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
59 buddy_address.sin_port = htons(((BonjourBuddy*)(gb->proto_data))->port_p2pj);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
60 inet_aton(((BonjourBuddy*)(gb->proto_data))->ip, &(buddy_address.sin_addr));
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
61 memset(&(buddy_address.sin_zero), '\0', 8);
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
62
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
63 retorno = connect(socket_fd, (struct sockaddr*)&buddy_address, sizeof(struct sockaddr));
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
64 if (retorno == -1) {
11823
27ed05facc71 [gaim-migrate @ 14114]
Mark Doliner <mark@kingant.net>
parents: 11693
diff changeset
65 gaim_debug_warning("bonjour", "connect error: %s\n", strerror(errno));
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
66 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
67 fcntl(socket_fd, F_SETFL, O_NONBLOCK);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
68
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
69 return socket_fd;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
70 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
71
12443
488a305f9aff [gaim-migrate @ 14750]
Stu Tomlinson <stu@nosnilmot.com>
parents: 11830
diff changeset
72 #if 0 /* this isn't used anywhere... */
488a305f9aff [gaim-migrate @ 14750]
Stu Tomlinson <stu@nosnilmot.com>
parents: 11830
diff changeset
73 static const char *
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
74 _font_size_gaim_to_ichat(int size)
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
75 {
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
76 switch (size) {
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
77 case 1:
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
78 return "8";
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
79 case 2:
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
80 return "10";
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
81 case 3:
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
82 return "12";
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
83 case 4:
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
84 return "14";
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
85 case 5:
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
86 return "17";
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
87 case 6:
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
88 return "21";
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
89 case 7:
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
90 return "24";
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
91 }
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
92
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
93 return "12";
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
94 }
12443
488a305f9aff [gaim-migrate @ 14750]
Stu Tomlinson <stu@nosnilmot.com>
parents: 11830
diff changeset
95 #endif
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
96
12443
488a305f9aff [gaim-migrate @ 14750]
Stu Tomlinson <stu@nosnilmot.com>
parents: 11830
diff changeset
97 static const char *
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
98 _font_size_ichat_to_gaim(int size)
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
99 {
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
100 if (size > 24) {
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
101 return "7";
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
102 } else if (size >= 21) {
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
103 return "6";
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
104 } else if (size >= 17) {
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
105 return "5";
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
106 } else if (size >= 14) {
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
107 return "4";
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
108 } else if (size >= 12) {
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
109 return "3";
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
110 } else if (size >= 10) {
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
111 return "2";
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
112 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
113
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
114 return "1";
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
115 }
12443
488a305f9aff [gaim-migrate @ 14750]
Stu Tomlinson <stu@nosnilmot.com>
parents: 11830
diff changeset
116 static void
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
117 _jabber_parse_and_write_message_to_ui(char *message, GaimConnection *connection, GaimBuddy *gb)
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
118 {
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
119 xmlnode *body_node = NULL;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
120 char *body = NULL;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
121 xmlnode *html_node = NULL;
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
122 gboolean isHTML = FALSE;
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
123 xmlnode *html_body_node = NULL;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
124 const char *ichat_balloon_color = NULL;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
125 const char *ichat_text_color = NULL;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
126 xmlnode *html_body_font_node = NULL;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
127 const char *font_face = NULL;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
128 const char *font_size = NULL;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
129 const char *font_color = NULL;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
130 char *html_body = NULL;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
131 xmlnode *events_node = NULL;
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
132 gboolean composing_event = FALSE;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
133 gint garbage = -1;
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
134 xmlnode *message_node = NULL;
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
135
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
136 /* Parsing of the message */
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
137 message_node = xmlnode_from_str(message, strlen(message));
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
138 if (message_node == NULL) {
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
139 return;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
140 }
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
141
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
142 body_node = xmlnode_get_child(message_node, "body");
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
143 if (body_node != NULL) {
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
144 body = xmlnode_get_data(body_node);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
145 } else {
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
146 return;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
147 }
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
148
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
149 html_node = xmlnode_get_child(message_node, "html");
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
150 if (html_node != NULL)
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
151 {
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
152 isHTML = TRUE;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
153 html_body_node = xmlnode_get_child(html_node, "body");
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
154 if (html_body_node != NULL)
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
155 {
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
156 ichat_balloon_color = xmlnode_get_attrib(html_body_node, "ichatballooncolor");
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
157 ichat_text_color = xmlnode_get_attrib(html_body_node, "ichattextcolor");
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
158 html_body_font_node = xmlnode_get_child(html_body_node, "font");
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
159 if (html_body_font_node != NULL)
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
160 { /* Types of messages sent by iChat */
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
161 font_face = xmlnode_get_attrib(html_body_font_node, "face");
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
162 /* The absolute iChat font sizes should be converted to 1..7 range */
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
163 font_size = xmlnode_get_attrib(html_body_font_node, "ABSZ");
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
164 if (font_size != NULL)
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
165 {
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
166 font_size = _font_size_ichat_to_gaim(atoi(font_size));
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
167 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
168 font_color = xmlnode_get_attrib(html_body_font_node, "color");
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
169 html_body = xmlnode_get_data(html_body_font_node);
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
170 if (html_body == NULL)
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
171 {
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
172 /* This is the kind of formated messages that Gaim creates */
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
173 html_body = xmlnode_to_str(html_body_font_node, &garbage);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
174 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
175 } else {
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
176 isHTML = FALSE;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
177 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
178 } else {
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
179 isHTML = FALSE;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
180 }
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
181
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
182 }
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
183
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
184 events_node = xmlnode_get_child_with_namespace(message_node, "x", "jabber:x:event");
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
185 if (events_node != NULL)
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
186 {
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
187 if (xmlnode_get_child(events_node, "composing") != NULL)
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
188 {
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
189 composing_event = TRUE;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
190 }
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
191 if (xmlnode_get_child(events_node, "id") != NULL)
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
192 {
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
193 /* The user is just typing */
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
194 xmlnode_free(message_node);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
195 g_free(body);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
196 g_free(html_body);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
197 return;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
198 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
199 }
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
200
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
201 /* Compose the message */
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
202 if (isHTML)
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
203 {
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
204 if (font_face == NULL) font_face = "Helvetica";
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
205 if (font_size == NULL) font_size = "3";
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
206 if (ichat_text_color == NULL) ichat_text_color = "#000000";
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
207 if (ichat_balloon_color == NULL) ichat_balloon_color = "#FFFFFF";
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
208 body = g_strconcat("<font face='", font_face, "' size='", font_size, "' color='", ichat_text_color,
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
209 "' back='", ichat_balloon_color, "'>", html_body, "</font>", NULL);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
210 }
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
211
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
212 /* Send the message to the UI */
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
213 serv_got_im(connection, gb->name, body, 0, time(NULL));
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
214
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
215 /* Free all the strings and nodes (the attributes are freed with their nodes) */
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
216 xmlnode_free(message_node);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
217 g_free(body);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
218 g_free(html_body);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
219 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
220
12708
495856ce025b [gaim-migrate @ 15052]
Sean Egan <seanegan@gmail.com>
parents: 12443
diff changeset
221 struct _check_buddy_by_address_t {
495856ce025b [gaim-migrate @ 15052]
Sean Egan <seanegan@gmail.com>
parents: 12443
diff changeset
222 char *address;
495856ce025b [gaim-migrate @ 15052]
Sean Egan <seanegan@gmail.com>
parents: 12443
diff changeset
223 GaimBuddy **gb;
13900
47c3d00713af [gaim-migrate @ 16386]
Mark Doliner <mark@kingant.net>
parents: 13266
diff changeset
224 BonjourJabber *bj;
12708
495856ce025b [gaim-migrate @ 15052]
Sean Egan <seanegan@gmail.com>
parents: 12443
diff changeset
225 };
495856ce025b [gaim-migrate @ 15052]
Sean Egan <seanegan@gmail.com>
parents: 12443
diff changeset
226
495856ce025b [gaim-migrate @ 15052]
Sean Egan <seanegan@gmail.com>
parents: 12443
diff changeset
227 static void
495856ce025b [gaim-migrate @ 15052]
Sean Egan <seanegan@gmail.com>
parents: 12443
diff changeset
228 _check_buddy_by_address(gpointer key, gpointer value, gpointer data)
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
229 {
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
230 GaimBuddy *gb = (GaimBuddy*)value;
13900
47c3d00713af [gaim-migrate @ 16386]
Mark Doliner <mark@kingant.net>
parents: 13266
diff changeset
231 BonjourBuddy *bb;
47c3d00713af [gaim-migrate @ 16386]
Mark Doliner <mark@kingant.net>
parents: 13266
diff changeset
232 struct _check_buddy_by_address_t *cbba;
47c3d00713af [gaim-migrate @ 16386]
Mark Doliner <mark@kingant.net>
parents: 13266
diff changeset
233
47c3d00713af [gaim-migrate @ 16386]
Mark Doliner <mark@kingant.net>
parents: 13266
diff changeset
234 gb = value;
47c3d00713af [gaim-migrate @ 16386]
Mark Doliner <mark@kingant.net>
parents: 13266
diff changeset
235 cbba = data;
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
236
13900
47c3d00713af [gaim-migrate @ 16386]
Mark Doliner <mark@kingant.net>
parents: 13266
diff changeset
237 /*
47c3d00713af [gaim-migrate @ 16386]
Mark Doliner <mark@kingant.net>
parents: 13266
diff changeset
238 * If the current GaimBuddy's data is not null and the GaimBuddy's account
47c3d00713af [gaim-migrate @ 16386]
Mark Doliner <mark@kingant.net>
parents: 13266
diff changeset
239 * is the same as the account requesting the check then continue to determine
47c3d00713af [gaim-migrate @ 16386]
Mark Doliner <mark@kingant.net>
parents: 13266
diff changeset
240 * whether the buddies IP matches the target IP.
47c3d00713af [gaim-migrate @ 16386]
Mark Doliner <mark@kingant.net>
parents: 13266
diff changeset
241 */
47c3d00713af [gaim-migrate @ 16386]
Mark Doliner <mark@kingant.net>
parents: 13266
diff changeset
242 if (cbba->bj->account == gb->account)
47c3d00713af [gaim-migrate @ 16386]
Mark Doliner <mark@kingant.net>
parents: 13266
diff changeset
243 {
47c3d00713af [gaim-migrate @ 16386]
Mark Doliner <mark@kingant.net>
parents: 13266
diff changeset
244 bb = gb->proto_data;
47c3d00713af [gaim-migrate @ 16386]
Mark Doliner <mark@kingant.net>
parents: 13266
diff changeset
245 if ((bb != NULL) && (g_strcasecmp(bb->ip, cbba->address) == 0))
47c3d00713af [gaim-migrate @ 16386]
Mark Doliner <mark@kingant.net>
parents: 13266
diff changeset
246 *(cbba->gb) = gb;
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
247 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
248 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
249
12443
488a305f9aff [gaim-migrate @ 14750]
Stu Tomlinson <stu@nosnilmot.com>
parents: 11830
diff changeset
250 static gint
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
251 _read_data(gint socket, char **message)
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
252 {
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
253 GString *data = g_string_new("");
13006
e19c59a6ff11 [gaim-migrate @ 15359]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12733
diff changeset
254 char partial_data[512];
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
255 gint total_message_length = 0;
13006
e19c59a6ff11 [gaim-migrate @ 15359]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12733
diff changeset
256 gint partial_message_length = 0;
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
257
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
258 /* Read chunks of 512 bytes till the end of the data */
13006
e19c59a6ff11 [gaim-migrate @ 15359]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12733
diff changeset
259 while ((partial_message_length = recv(socket, partial_data, 512, 0)) > 0)
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
260 {
13006
e19c59a6ff11 [gaim-migrate @ 15359]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12733
diff changeset
261 g_string_append_len(data, partial_data, partial_message_length);
e19c59a6ff11 [gaim-migrate @ 15359]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12733
diff changeset
262 total_message_length += partial_message_length;
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
263 }
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
264
13006
e19c59a6ff11 [gaim-migrate @ 15359]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12733
diff changeset
265 if (partial_message_length == -1)
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
266 {
11823
27ed05facc71 [gaim-migrate @ 14114]
Mark Doliner <mark@kingant.net>
parents: 11693
diff changeset
267 gaim_debug_warning("bonjour", "receive error: %s\n", strerror(errno));
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
268 if (total_message_length == 0) {
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
269 return -1;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
270 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
271 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
272
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
273 *message = data->str;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
274 g_string_free(data, FALSE);
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
275 if (total_message_length != 0)
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
276 gaim_debug_info("bonjour", "Receive: -%s- %d bytes\n", *message, total_message_length);
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
277
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
278 return total_message_length;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
279 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
280
12443
488a305f9aff [gaim-migrate @ 14750]
Stu Tomlinson <stu@nosnilmot.com>
parents: 11830
diff changeset
281 static gint
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
282 _send_data(gint socket, char *message)
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
283 {
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
284 gint message_len = strlen(message);
13006
e19c59a6ff11 [gaim-migrate @ 15359]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12733
diff changeset
285 gint partial_sent = 0;
e19c59a6ff11 [gaim-migrate @ 15359]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12733
diff changeset
286 gchar *partial_message = message;
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
287
13006
e19c59a6ff11 [gaim-migrate @ 15359]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12733
diff changeset
288 while ((partial_sent = send(socket, partial_message, message_len, 0)) < message_len)
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
289 {
13006
e19c59a6ff11 [gaim-migrate @ 15359]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12733
diff changeset
290 if (partial_sent != -1) {
e19c59a6ff11 [gaim-migrate @ 15359]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12733
diff changeset
291 partial_message += partial_sent;
e19c59a6ff11 [gaim-migrate @ 15359]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12733
diff changeset
292 message_len -= partial_sent;
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
293 } else {
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
294 return -1;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
295 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
296 }
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
297
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
298 return strlen(message);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
299 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
300
12443
488a305f9aff [gaim-migrate @ 14750]
Stu Tomlinson <stu@nosnilmot.com>
parents: 11830
diff changeset
301 static void
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
302 _client_socket_handler(gpointer data, gint socket, GaimInputCondition condition)
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
303 {
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
304 char *message = NULL;
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
305 gint message_length;
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
306 GaimBuddy *gb = (GaimBuddy*)data;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
307 GaimAccount *account = gb->account;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
308 GaimConversation *conversation;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
309 char *closed_conv_message;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
310 BonjourBuddy *bb = (BonjourBuddy*)gb->proto_data;
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
311 gboolean closed_conversation = FALSE;
13902
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
312 xmlnode *message_node = NULL;
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
313
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
314 /* Read the data from the socket */
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
315 if ((message_length = _read_data(socket, &message)) == -1) {
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
316 /* There have been an error reading from the socket */
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
317 return;
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
318 } else if (message_length == 0) { /* The other end has closed the socket */
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
319 closed_conversation = TRUE;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
320 } else {
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
321 message[message_length] = '\0';
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
322
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
323 while (g_ascii_iscntrl(message[message_length - 1])) {
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
324 message[message_length - 1] = '\0';
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
325 message_length--;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
326 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
327 }
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
328
13902
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
329 /* Parse the message into an XMLnode for analysis */
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
330 message_node = xmlnode_from_str(message, strlen(message));
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
331
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
332 /* Check if the start of the stream has been received, if not check that the current */
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
333 /* data is the start of the stream */
13902
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
334 if (!(bb->conversation->stream_started))
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
335 {
13902
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
336 /* Check if this is the start of the stream */
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
337 if ((message_node != NULL) &&
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
338 g_ascii_strcasecmp(xmlnode_get_attrib(message_node, "xmlns"), "jabber:client") &&
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
339 (xmlnode_get_attrib(message_node,"xmlns:stream") != NULL))
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
340 {
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
341 bb->conversation->stream_started = TRUE;
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
342 }
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
343 else
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
344 {
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
345 /* TODO: This needs to be nonblocking! */
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
346 if (send(bb->conversation->socket, DOCTYPE, strlen(DOCTYPE), 0) == -1)
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
347 {
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
348 gaim_debug_error("bonjour", "Unable to start a conversation with %s\n", bb->name);
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
349 }
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
350 else
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
351 {
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
352 bb->conversation->stream_started = TRUE;
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
353 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
354 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
355 }
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
356
13902
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
357 /*
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
358 * Check that this is not the end of the conversation. This is
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
359 * using a magic string, but xmlnode won't play nice when just
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
360 * parsing an end tag
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
361 */
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
362 if (g_str_has_prefix(message, STREAM_END) || (closed_conversation == TRUE)) {
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
363 /* Close the socket, clear the watcher and free memory */
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
364 if (bb->conversation != NULL) {
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
365 close(bb->conversation->socket);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
366 gaim_input_remove(bb->conversation->watcher_id);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
367 g_free(bb->conversation->buddy_name);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
368 g_free(bb->conversation);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
369 bb->conversation = NULL;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
370 }
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
371
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
372 /* Inform the user that the conversation has been closed */
11498
ea52fefd3602 [gaim-migrate @ 13743]
Mark Doliner <mark@kingant.net>
parents: 11477
diff changeset
373 conversation = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, gb->name, account);
13266
d1088b7771d4 [gaim-migrate @ 15632]
Mark Doliner <mark@kingant.net>
parents: 13249
diff changeset
374 closed_conv_message = g_strdup_printf(_("%s has closed the conversation."), gb->name);
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
375 gaim_conversation_write(conversation, NULL, closed_conv_message, GAIM_MESSAGE_SYSTEM, time(NULL));
13266
d1088b7771d4 [gaim-migrate @ 15632]
Mark Doliner <mark@kingant.net>
parents: 13249
diff changeset
376 g_free(closed_conv_message);
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
377 } else {
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
378 /* Parse the message to get the data and send to the ui */
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
379 _jabber_parse_and_write_message_to_ui(message, account->gc, gb);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
380 }
13902
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
381
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
382 xmlnode_free(message_node);
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
383 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
384
12443
488a305f9aff [gaim-migrate @ 14750]
Stu Tomlinson <stu@nosnilmot.com>
parents: 11830
diff changeset
385 static void
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
386 _server_socket_handler(gpointer data, int server_socket, GaimInputCondition condition)
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
387 {
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
388 GaimBuddy *gb = NULL;
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
389 struct sockaddr_in their_addr; /* connector's address information */
11515
f8a447af7494 [gaim-migrate @ 13760]
Mark Doliner <mark@kingant.net>
parents: 11498
diff changeset
390 socklen_t sin_size = sizeof(struct sockaddr);
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
391 int client_socket;
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
392 BonjourBuddy *bb = NULL;
13900
47c3d00713af [gaim-migrate @ 16386]
Mark Doliner <mark@kingant.net>
parents: 13266
diff changeset
393 BonjourJabber *bj = data;
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
394 char *address_text = NULL;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
395 GaimBuddyList *bl = gaim_get_blist();
12733
b6577059c9e5 [gaim-migrate @ 15077]
Mark Doliner <mark@kingant.net>
parents: 12730
diff changeset
396 struct _check_buddy_by_address_t *cbba;
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
397
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
398 /* Check that it is a read condition */
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
399 if (condition != GAIM_INPUT_READ) {
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
400 return;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
401 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
402
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
403 if ((client_socket = accept(server_socket, (struct sockaddr *)&their_addr, &sin_size)) == -1)
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
404 {
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
405 return;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
406 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
407 fcntl(client_socket, F_SETFL, O_NONBLOCK);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
408
13900
47c3d00713af [gaim-migrate @ 16386]
Mark Doliner <mark@kingant.net>
parents: 13266
diff changeset
409 /* Look for the buddy that has opened the conversation and fill information */
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
410 address_text = inet_ntoa(their_addr.sin_addr);
12733
b6577059c9e5 [gaim-migrate @ 15077]
Mark Doliner <mark@kingant.net>
parents: 12730
diff changeset
411 cbba = g_new0(struct _check_buddy_by_address_t, 1);
12708
495856ce025b [gaim-migrate @ 15052]
Sean Egan <seanegan@gmail.com>
parents: 12443
diff changeset
412 cbba->address = address_text;
495856ce025b [gaim-migrate @ 15052]
Sean Egan <seanegan@gmail.com>
parents: 12443
diff changeset
413 cbba->gb = &gb;
13900
47c3d00713af [gaim-migrate @ 16386]
Mark Doliner <mark@kingant.net>
parents: 13266
diff changeset
414 cbba->bj = bj;
13249
65a7de0f59ff [gaim-migrate @ 15615]
Stu Tomlinson <stu@nosnilmot.com>
parents: 13006
diff changeset
415 g_hash_table_foreach(bl->buddies, _check_buddy_by_address, cbba);
12708
495856ce025b [gaim-migrate @ 15052]
Sean Egan <seanegan@gmail.com>
parents: 12443
diff changeset
416 g_free(cbba);
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
417 if (gb == NULL)
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
418 {
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
419 gaim_debug_info("bonjour", "We don't like invisible buddies, this is not a superheros comic\n");
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
420 close(client_socket);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
421 return;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
422 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
423 bb = (BonjourBuddy*)gb->proto_data;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
424
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
425 /* Check if the conversation has been previously started */
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
426 if (bb->conversation == NULL)
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
427 {
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
428 bb->conversation = g_new(BonjourJabberConversation, 1);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
429 bb->conversation->socket = client_socket;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
430 bb->conversation->stream_started = FALSE;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
431 bb->conversation->buddy_name = g_strdup(gb->name);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
432 bb->conversation->message_id = 1;
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
433
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
434 if (bb->conversation->stream_started == FALSE) {
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
435 /* Start the stream */
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
436 send(bb->conversation->socket, DOCTYPE, strlen(DOCTYPE), 0);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
437 bb->conversation->stream_started = TRUE;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
438 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
439
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
440 /* Open a watcher for the client socket */
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
441 bb->conversation->watcher_id = gaim_input_add(client_socket, GAIM_INPUT_READ,
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
442 _client_socket_handler, gb);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
443 } else {
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
444 close(client_socket);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
445 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
446 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
447
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
448 gint
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
449 bonjour_jabber_start(BonjourJabber *data)
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
450 {
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
451 struct sockaddr_in my_addr;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
452 int yes = 1;
13909
8264f52a1142 [gaim-migrate @ 16406]
Mark Doliner <mark@kingant.net>
parents: 13902
diff changeset
453 int i;
8264f52a1142 [gaim-migrate @ 16406]
Mark Doliner <mark@kingant.net>
parents: 13902
diff changeset
454 gboolean bind_successful;
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
455
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
456 /* Open a listening socket for incoming conversations */
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
457 if ((data->socket = socket(PF_INET, SOCK_STREAM, 0)) < 0)
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
458 {
13266
d1088b7771d4 [gaim-migrate @ 15632]
Mark Doliner <mark@kingant.net>
parents: 13249
diff changeset
459 gaim_debug_error("bonjour", "Cannot open socket: %s\n", strerror(errno));
d1088b7771d4 [gaim-migrate @ 15632]
Mark Doliner <mark@kingant.net>
parents: 13249
diff changeset
460 gaim_connection_error(data->account->gc, _("Cannot open socket"));
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
461 return -1;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
462 }
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
463
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
464 /* Make the socket reusable */
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
465 if (setsockopt(data->socket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) != 0)
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
466 {
13266
d1088b7771d4 [gaim-migrate @ 15632]
Mark Doliner <mark@kingant.net>
parents: 13249
diff changeset
467 gaim_debug_error("bonjour", "Error setting socket options: %s\n", strerror(errno));
d1088b7771d4 [gaim-migrate @ 15632]
Mark Doliner <mark@kingant.net>
parents: 13249
diff changeset
468 gaim_connection_error(data->account->gc, _("Error setting socket options"));
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
469 return -1;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
470 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
471
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
472 memset(&my_addr, 0, sizeof(struct sockaddr_in));
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
473 my_addr.sin_family = PF_INET;
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
474
13909
8264f52a1142 [gaim-migrate @ 16406]
Mark Doliner <mark@kingant.net>
parents: 13902
diff changeset
475 /* Attempt to find a free port */
8264f52a1142 [gaim-migrate @ 16406]
Mark Doliner <mark@kingant.net>
parents: 13902
diff changeset
476 bind_successful = FALSE;
8264f52a1142 [gaim-migrate @ 16406]
Mark Doliner <mark@kingant.net>
parents: 13902
diff changeset
477 for (i = 0; i < 10; i++)
8264f52a1142 [gaim-migrate @ 16406]
Mark Doliner <mark@kingant.net>
parents: 13902
diff changeset
478 {
8264f52a1142 [gaim-migrate @ 16406]
Mark Doliner <mark@kingant.net>
parents: 13902
diff changeset
479 my_addr.sin_port = htons(data->port);
8264f52a1142 [gaim-migrate @ 16406]
Mark Doliner <mark@kingant.net>
parents: 13902
diff changeset
480 if (bind(data->socket, (struct sockaddr*)&my_addr, sizeof(struct sockaddr)) == 0)
8264f52a1142 [gaim-migrate @ 16406]
Mark Doliner <mark@kingant.net>
parents: 13902
diff changeset
481 {
8264f52a1142 [gaim-migrate @ 16406]
Mark Doliner <mark@kingant.net>
parents: 13902
diff changeset
482 bind_successful = TRUE;
8264f52a1142 [gaim-migrate @ 16406]
Mark Doliner <mark@kingant.net>
parents: 13902
diff changeset
483 break;
8264f52a1142 [gaim-migrate @ 16406]
Mark Doliner <mark@kingant.net>
parents: 13902
diff changeset
484 }
8264f52a1142 [gaim-migrate @ 16406]
Mark Doliner <mark@kingant.net>
parents: 13902
diff changeset
485 data->port++;
8264f52a1142 [gaim-migrate @ 16406]
Mark Doliner <mark@kingant.net>
parents: 13902
diff changeset
486 }
8264f52a1142 [gaim-migrate @ 16406]
Mark Doliner <mark@kingant.net>
parents: 13902
diff changeset
487
8264f52a1142 [gaim-migrate @ 16406]
Mark Doliner <mark@kingant.net>
parents: 13902
diff changeset
488 /* On no! We tried 10 ports and could not bind to ANY of them */
8264f52a1142 [gaim-migrate @ 16406]
Mark Doliner <mark@kingant.net>
parents: 13902
diff changeset
489 if (!bind_successful)
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
490 {
13266
d1088b7771d4 [gaim-migrate @ 15632]
Mark Doliner <mark@kingant.net>
parents: 13249
diff changeset
491 gaim_debug_error("bonjour", "Cannot bind socket: %s\n", strerror(errno));
13909
8264f52a1142 [gaim-migrate @ 16406]
Mark Doliner <mark@kingant.net>
parents: 13902
diff changeset
492 gaim_connection_error(data->account->gc, _("Could not bind socket to port"));
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
493 return -1;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
494 }
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
495
13909
8264f52a1142 [gaim-migrate @ 16406]
Mark Doliner <mark@kingant.net>
parents: 13902
diff changeset
496 /* Attempt to listen on the bound socket */
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
497 if (listen(data->socket, 10) != 0)
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
498 {
13266
d1088b7771d4 [gaim-migrate @ 15632]
Mark Doliner <mark@kingant.net>
parents: 13249
diff changeset
499 gaim_debug_error("bonjour", "Cannot listen on socket: %s\n", strerror(errno));
13909
8264f52a1142 [gaim-migrate @ 16406]
Mark Doliner <mark@kingant.net>
parents: 13902
diff changeset
500 gaim_connection_error(data->account->gc, _("Could not listen on socket"));
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
501 return -1;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
502 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
503
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
504 #if 0
12730
d5b8f4dc1622 [gaim-migrate @ 15074]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12708
diff changeset
505 /* TODO: Why isn't this being used? */
d5b8f4dc1622 [gaim-migrate @ 15074]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12708
diff changeset
506 data->socket = gaim_network_listen(data->port, SOCK_STREAM);
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
507
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
508 if (data->socket == -1)
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
509 {
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
510 gaim_debug_error("bonjour", "No se ha podido crear el socket\n");
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
511 }
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
512 #endif
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
513
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
514 /* Open a watcher in the socket we have just opened */
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
515 data->watcher_id = gaim_input_add(data->socket, GAIM_INPUT_READ, _server_socket_handler, data);
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
516
13909
8264f52a1142 [gaim-migrate @ 16406]
Mark Doliner <mark@kingant.net>
parents: 13902
diff changeset
517 return data->port;
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
518 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
519
11693
b91a84e7cbcb [gaim-migrate @ 13979]
Mark Doliner <mark@kingant.net>
parents: 11688
diff changeset
520 int
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
521 bonjour_jabber_send_message(BonjourJabber *data, const gchar *to, const gchar *body)
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
522 {
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
523 xmlnode *message_node = NULL;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
524 gchar *message = NULL;
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
525 gint message_length = -1;
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
526 xmlnode *message_body_node = NULL;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
527 xmlnode *message_html_node = NULL;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
528 xmlnode *message_html_body_node = NULL;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
529 xmlnode *message_html_body_font_node = NULL;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
530 xmlnode *message_x_node = NULL;
11693
b91a84e7cbcb [gaim-migrate @ 13979]
Mark Doliner <mark@kingant.net>
parents: 11688
diff changeset
531 GaimBuddy *gb = NULL;
b91a84e7cbcb [gaim-migrate @ 13979]
Mark Doliner <mark@kingant.net>
parents: 11688
diff changeset
532 BonjourBuddy *bb = NULL;
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
533 char *conv_message = NULL;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
534 GaimConversation *conversation = NULL;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
535 char *message_from_ui = NULL;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
536 char *stripped_message = NULL;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
537
11693
b91a84e7cbcb [gaim-migrate @ 13979]
Mark Doliner <mark@kingant.net>
parents: 11688
diff changeset
538 gb = gaim_find_buddy(data->account, to);
b91a84e7cbcb [gaim-migrate @ 13979]
Mark Doliner <mark@kingant.net>
parents: 11688
diff changeset
539 if (gb == NULL)
b91a84e7cbcb [gaim-migrate @ 13979]
Mark Doliner <mark@kingant.net>
parents: 11688
diff changeset
540 /* You can not send a message to an offline buddy */
b91a84e7cbcb [gaim-migrate @ 13979]
Mark Doliner <mark@kingant.net>
parents: 11688
diff changeset
541 return -10000;
b91a84e7cbcb [gaim-migrate @ 13979]
Mark Doliner <mark@kingant.net>
parents: 11688
diff changeset
542
b91a84e7cbcb [gaim-migrate @ 13979]
Mark Doliner <mark@kingant.net>
parents: 11688
diff changeset
543 bb = (BonjourBuddy *)gb->proto_data;
b91a84e7cbcb [gaim-migrate @ 13979]
Mark Doliner <mark@kingant.net>
parents: 11688
diff changeset
544
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
545 /* Enclose the message from the UI within a "font" node */
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
546 message_body_node = xmlnode_new("body");
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
547 stripped_message = gaim_markup_strip_html(body);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
548 xmlnode_insert_data(message_body_node, stripped_message, strlen(stripped_message));
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
549
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
550 message_from_ui = g_strconcat("<font>", body, "</font>", NULL);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
551 message_html_body_font_node = xmlnode_from_str(message_from_ui, strlen(message_from_ui));
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
552
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
553 message_html_body_node = xmlnode_new("body");
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
554 xmlnode_insert_child(message_html_body_node, message_html_body_font_node);
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
555
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
556 message_html_node = xmlnode_new("html");
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
557 xmlnode_set_attrib(message_html_node, "xmlns", "http://www.w3.org/1999/xhtml");
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
558 xmlnode_insert_child(message_html_node, message_html_body_node);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
559
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
560 message_x_node = xmlnode_new("x");
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
561 xmlnode_set_attrib(message_x_node, "xmlns", "jabber:x:event");
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
562 xmlnode_insert_child(message_x_node, xmlnode_new("composing"));
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
563
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
564 message_node = xmlnode_new("message");
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
565 xmlnode_set_attrib(message_node, "to", ((BonjourBuddy*)(gb->proto_data))->name);
13909
8264f52a1142 [gaim-migrate @ 16406]
Mark Doliner <mark@kingant.net>
parents: 13902
diff changeset
566 xmlnode_set_attrib(message_node, "from", data->account->username);
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
567 xmlnode_set_attrib(message_node, "type", "chat");
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
568 xmlnode_insert_child(message_node, message_body_node);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
569 xmlnode_insert_child(message_node, message_html_node);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
570 xmlnode_insert_child(message_node, message_x_node);
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
571
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
572 message = xmlnode_to_str(message_node, &message_length);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
573
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
574 /* Check if there is a previously open conversation */
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
575 if (bb->conversation == NULL)
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
576 {
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
577 bb->conversation = g_new(BonjourJabberConversation, 1);
13006
e19c59a6ff11 [gaim-migrate @ 15359]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12733
diff changeset
578 bb->conversation->socket = _connect_to_buddy(gb);
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
579 bb->conversation->stream_started = FALSE;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
580 bb->conversation->buddy_name = g_strdup(gb->name);
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
581 bb->conversation->watcher_id = gaim_input_add(bb->conversation->socket,
13902
425e0f861e88 [gaim-migrate @ 16390]
Mark Doliner <mark@kingant.net>
parents: 13900
diff changeset
582 GAIM_INPUT_READ, _client_socket_handler, gb);
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
583 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
584
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
585 /* Check if the stream for the conversation has been started */
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
586 if (bb->conversation->stream_started == FALSE)
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
587 {
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
588 /* Start the stream */
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
589 if (send(bb->conversation->socket, DOCTYPE, strlen(DOCTYPE), 0) == -1)
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
590 {
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
591 gaim_debug_error("bonjour", "Unable to start a conversation\n");
11823
27ed05facc71 [gaim-migrate @ 14114]
Mark Doliner <mark@kingant.net>
parents: 11693
diff changeset
592 gaim_debug_warning("bonjour", "send error: %s\n", strerror(errno));
13266
d1088b7771d4 [gaim-migrate @ 15632]
Mark Doliner <mark@kingant.net>
parents: 13249
diff changeset
593 conv_message = g_strdup(_("Unable to send the message, the conversation couldn't be started."));
11498
ea52fefd3602 [gaim-migrate @ 13743]
Mark Doliner <mark@kingant.net>
parents: 11477
diff changeset
594 conversation = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, bb->name, data->account);
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
595 gaim_conversation_write(conversation, NULL, conv_message, GAIM_MESSAGE_SYSTEM, time(NULL));
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
596 close(bb->conversation->socket);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
597 gaim_input_remove(bb->conversation->watcher_id);
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
598
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
599 /* Free all the data related to the conversation */
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
600 g_free(bb->conversation->buddy_name);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
601 g_free(bb->conversation);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
602 bb->conversation = NULL;
11693
b91a84e7cbcb [gaim-migrate @ 13979]
Mark Doliner <mark@kingant.net>
parents: 11688
diff changeset
603 return 0;
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
604 }
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
605
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
606 bb->conversation->stream_started = TRUE;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
607 }
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
608
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
609 /* Send the message */
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
610 if (_send_data(bb->conversation->socket, message) == -1)
11693
b91a84e7cbcb [gaim-migrate @ 13979]
Mark Doliner <mark@kingant.net>
parents: 11688
diff changeset
611 return -10000;
b91a84e7cbcb [gaim-migrate @ 13979]
Mark Doliner <mark@kingant.net>
parents: 11688
diff changeset
612
b91a84e7cbcb [gaim-migrate @ 13979]
Mark Doliner <mark@kingant.net>
parents: 11688
diff changeset
613 return 1;
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
614 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
615
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
616 void
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
617 bonjour_jabber_close_conversation(BonjourJabber *data, GaimBuddy *gb)
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
618 {
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
619 BonjourBuddy *bb = (BonjourBuddy*)gb->proto_data;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
620
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
621 if (bb->conversation != NULL)
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
622 {
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
623 /* Send the end of the stream to the other end of the conversation */
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
624 send(bb->conversation->socket, STREAM_END, strlen(STREAM_END), 0);
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
625
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
626 /* Close the socket and remove the watcher */
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
627 close(bb->conversation->socket);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
628 gaim_input_remove(bb->conversation->watcher_id);
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
629
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
630 /* Free all the data related to the conversation */
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
631 g_free(bb->conversation->buddy_name);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
632 g_free(bb->conversation);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
633 bb->conversation = NULL;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
634 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
635 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
636
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
637 void
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
638 bonjour_jabber_stop(BonjourJabber *data)
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
639 {
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
640 GaimBuddy *gb = NULL;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
641 BonjourBuddy *bb = NULL;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
642 GSList *buddies;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
643 GSList *l;
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
644
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
645 /* Close the server socket and remove all the watcher */
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
646 close(data->socket);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
647 gaim_input_remove(data->watcher_id);
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
648
11826
e05778d4f12d [gaim-migrate @ 14117]
Richard Laager <rlaager@wiktel.com>
parents: 11823
diff changeset
649 /* Close all the sockets and remove all the watchers after sending end streams */
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
650 if (data->account->gc != NULL)
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
651 {
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
652 buddies = gaim_find_buddies(data->account, data->account->username);
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
653 for (l = buddies; l; l = l->next)
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
654 {
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
655 gb = (GaimBuddy*)l->data;
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
656 bb = (BonjourBuddy*)gb->proto_data;
11539
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
657 if (bb->conversation != NULL)
5a2c38d33eb4 [gaim-migrate @ 13794]
Mark Doliner <mark@kingant.net>
parents: 11515
diff changeset
658 {
11477
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
659 send(bb->conversation->socket, STREAM_END, strlen(STREAM_END), 0);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
660 close(bb->conversation->socket);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
661 gaim_input_remove(bb->conversation->watcher_id);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
662 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
663 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
664 g_slist_free(buddies);
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
665 }
36f575351c49 [gaim-migrate @ 13719]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
666 }