Mercurial > pidgin
annotate src/protocols/msn/servconn.c @ 6148:82e7eaa67406
[gaim-migrate @ 6622]
A last-minute surprise to all of gaim's MSN users who wanted this feature.
Chats can now be initiated by right-clicking an MSN user and choosing
Initiate Chat. Note that chats in MSN don't work like chats elsewhere,
because IMs and Chats in MSN are the exact same things, and we can't detect
the number of users before connecting to the switchboard.
committer: Tailor Script <tailor@pidgin.im>
author | Christian Hammond <chipx86@chipx86.com> |
---|---|
date | Wed, 16 Jul 2003 06:15:19 +0000 |
parents | 914f2d5da21c |
children | b7e113a59b51 |
rev | line source |
---|---|
5309 | 1 /** |
2 * @file servconn.c Server connection functions | |
3 * | |
4 * gaim | |
5 * | |
6 * Copyright (C) 2003 Christian Hammond <chipx86@gnupdate.org> | |
7 * | |
8 * This program is free software; you can redistribute it and/or modify | |
9 * it under the terms of the GNU General Public License as published by | |
10 * the Free Software Foundation; either version 2 of the License, or | |
11 * (at your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 * GNU General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU General Public License | |
19 * along with this program; if not, write to the Free Software | |
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
21 */ | |
22 #include "msn.h" | |
23 #include "servconn.h" | |
24 | |
5506
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
25 typedef struct |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
26 { |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
27 char *command; |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
28 MsnMessage *msg; |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
29 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
30 } MsnQueueEntry; |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
31 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
32 static gboolean |
5793
952710ac6635
[gaim-migrate @ 6218]
Christian Hammond <chipx86@chipx86.com>
parents:
5785
diff
changeset
|
33 process_message(MsnServConn *servconn, MsnMessage *msg) |
5506
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
34 { |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
35 MsnServConnMsgCb cb; |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
36 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
37 cb = g_hash_table_lookup(servconn->msg_types, |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
38 msn_message_get_content_type(msg)); |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
39 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
40 if (cb == NULL) { |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
41 gaim_debug(GAIM_DEBUG_WARNING, "msn", |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
42 "Unhandled content-type '%s': %s\n", |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
43 msn_message_get_content_type(msg), |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
44 msn_message_get_body(msg)); |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
45 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
46 return FALSE; |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
47 } |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
48 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
49 cb(servconn, msg); |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
50 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
51 return TRUE; |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
52 } |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
53 |
5309 | 54 static gboolean |
5793
952710ac6635
[gaim-migrate @ 6218]
Christian Hammond <chipx86@chipx86.com>
parents:
5785
diff
changeset
|
55 process_single_line(MsnServConn *servconn, char *str) |
5309 | 56 { |
5897
e3733414ca08
[gaim-migrate @ 6329]
Christian Hammond <chipx86@chipx86.com>
parents:
5793
diff
changeset
|
57 MsnSession *session = servconn->session; |
5309 | 58 MsnServConnCommandCb cb; |
5897
e3733414ca08
[gaim-migrate @ 6329]
Christian Hammond <chipx86@chipx86.com>
parents:
5793
diff
changeset
|
59 GSList *l, *l_next = NULL; |
5309 | 60 gboolean result; |
61 size_t param_count = 0; | |
62 char *command, *param_start; | |
63 char **params = NULL; | |
64 | |
65 command = str; | |
66 | |
67 /** | |
68 * See how many spaces we have in this. | |
69 */ | |
70 param_start = strchr(command, ' '); | |
71 | |
72 if (param_start != NULL) { | |
73 params = g_strsplit(param_start + 1, " ", 0); | |
74 | |
75 for (param_count = 0; params[param_count] != NULL; param_count++) | |
76 ; | |
77 | |
78 *param_start = '\0'; | |
79 } | |
80 | |
81 cb = g_hash_table_lookup(servconn->commands, command); | |
82 | |
83 if (cb == NULL) { | |
5317
2b437c18719e
[gaim-migrate @ 5689]
Christian Hammond <chipx86@chipx86.com>
parents:
5309
diff
changeset
|
84 cb = g_hash_table_lookup(servconn->commands, "_UNKNOWN_"); |
5309 | 85 |
86 if (cb == NULL) { | |
87 gaim_debug(GAIM_DEBUG_WARNING, "msn", | |
88 "Unhandled command '%s'\n", str); | |
89 | |
90 if (params != NULL) | |
91 g_strfreev(params); | |
92 | |
93 return TRUE; | |
94 } | |
95 } | |
96 | |
97 result = cb(servconn, command, (const char **)params, param_count); | |
98 | |
99 if (params != NULL) | |
100 g_strfreev(params); | |
101 | |
5898
5baeb89ee2d4
[gaim-migrate @ 6330]
Christian Hammond <chipx86@chipx86.com>
parents:
5897
diff
changeset
|
102 if (g_list_find(session->servconns, servconn) == NULL) |
5897
e3733414ca08
[gaim-migrate @ 6329]
Christian Hammond <chipx86@chipx86.com>
parents:
5793
diff
changeset
|
103 return result; |
e3733414ca08
[gaim-migrate @ 6329]
Christian Hammond <chipx86@chipx86.com>
parents:
5793
diff
changeset
|
104 |
5506
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
105 /* Process all queued messages that are waiting on this command. */ |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
106 for (l = servconn->msg_queue; l != NULL; l = l_next) { |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
107 MsnQueueEntry *entry = l->data; |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
108 MsnMessage *msg; |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
109 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
110 l_next = l->next; |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
111 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
112 if (entry->command == NULL || |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
113 !g_ascii_strcasecmp(entry->command, command)) { |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
114 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
115 MsnUser *sender; |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
116 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
117 msg = entry->msg; |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
118 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
119 msn_message_ref(msg); |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
120 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
121 sender = msn_message_get_sender(msg); |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
122 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
123 servconn->msg_passport = g_strdup(msn_user_get_passport(sender)); |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
124 servconn->msg_friendly = g_strdup(msn_user_get_name(sender)); |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
125 |
5793
952710ac6635
[gaim-migrate @ 6218]
Christian Hammond <chipx86@chipx86.com>
parents:
5785
diff
changeset
|
126 process_message(servconn, msg); |
5506
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
127 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
128 g_free(servconn->msg_passport); |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
129 g_free(servconn->msg_friendly); |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
130 |
6122 | 131 msn_servconn_unqueue_message(servconn, entry->msg); |
132 | |
5506
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
133 msn_message_destroy(msg); |
5744
6b87c127fe7b
[gaim-migrate @ 6168]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
134 entry->msg = NULL; |
5506
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
135 } |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
136 } |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
137 |
5309 | 138 return result; |
139 } | |
140 | |
141 static gboolean | |
5793
952710ac6635
[gaim-migrate @ 6218]
Christian Hammond <chipx86@chipx86.com>
parents:
5785
diff
changeset
|
142 process_multi_line(MsnServConn *servconn, char *buffer) |
5309 | 143 { |
144 char msg_str[MSN_BUF_LEN]; | |
5962
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
145 gboolean result = TRUE; |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
146 |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
147 if (servconn->multiline_type == MSN_MULTILINE_MSG) { |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
148 MsnMessage *msg; |
5309 | 149 |
5962
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
150 g_snprintf(msg_str, sizeof(msg_str), |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
151 "MSG %s %s %d\r\n%s", |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
152 servconn->msg_passport, servconn->msg_friendly, |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
153 servconn->multiline_len, buffer); |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
154 |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
155 gaim_debug(GAIM_DEBUG_MISC, "msn", |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
156 "Message: {%s}\n", buffer); |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
157 |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
158 msg = msn_message_new_from_str(servconn->session, msg_str); |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
159 |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
160 result = process_message(servconn, msg); |
5309 | 161 |
5962
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
162 msn_message_destroy(msg); |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
163 } |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
164 else if (servconn->multiline_type == MSN_MULTILINE_IPG) { |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
165 g_snprintf(msg_str, sizeof(msg_str), |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
166 "IPG %d\r\n%s", |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
167 servconn->multiline_len, buffer); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5317
diff
changeset
|
168 |
5962
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
169 gaim_debug(GAIM_DEBUG_MISC, "msn", |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
170 "Incoming Page: {%s}\n", buffer); |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
171 } |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
172 else if (servconn->multiline_type == MSN_MULTILINE_NOT) { |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
173 g_snprintf(msg_str, sizeof(msg_str), |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
174 "NOT %d\r\n%s", |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
175 servconn->multiline_len, buffer); |
5506
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
176 |
5962
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
177 gaim_debug(GAIM_DEBUG_MISC, "msn", |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
178 "Notification: {%s}\n", buffer); |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
179 } |
5309 | 180 |
5506
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
181 return result; |
5309 | 182 } |
183 | |
184 static void | |
5793
952710ac6635
[gaim-migrate @ 6218]
Christian Hammond <chipx86@chipx86.com>
parents:
5785
diff
changeset
|
185 connect_cb(gpointer data, gint source, GaimInputCondition cond) |
5309 | 186 { |
187 MsnServConn *servconn = data; | |
188 | |
189 if (servconn->connect_cb(data, source, cond)) | |
190 servconn->inpa = gaim_input_add(servconn->fd, GAIM_INPUT_READ, | |
191 servconn->login_cb, data); | |
192 } | |
193 | |
194 MsnServConn * | |
195 msn_servconn_new(MsnSession *session) | |
196 { | |
197 MsnServConn *servconn; | |
198 | |
199 g_return_val_if_fail(session != NULL, NULL); | |
200 | |
201 servconn = g_new0(MsnServConn, 1); | |
202 | |
203 servconn->login_cb = msn_servconn_parse_data; | |
204 servconn->session = session; | |
205 | |
206 servconn->commands = g_hash_table_new_full(g_str_hash, g_str_equal, | |
207 g_free, NULL); | |
208 | |
209 servconn->msg_types = g_hash_table_new_full(g_str_hash, g_str_equal, | |
210 g_free, NULL); | |
211 | |
5898
5baeb89ee2d4
[gaim-migrate @ 6330]
Christian Hammond <chipx86@chipx86.com>
parents:
5897
diff
changeset
|
212 session->servconns = g_list_append(session->servconns, servconn); |
5baeb89ee2d4
[gaim-migrate @ 6330]
Christian Hammond <chipx86@chipx86.com>
parents:
5897
diff
changeset
|
213 |
5309 | 214 return servconn; |
215 } | |
216 | |
217 gboolean | |
218 msn_servconn_connect(MsnServConn *servconn) | |
219 { | |
220 int i; | |
221 | |
222 g_return_val_if_fail(servconn != NULL, FALSE); | |
223 g_return_val_if_fail(servconn->server != NULL, FALSE); | |
224 g_return_val_if_fail(!servconn->connected, TRUE); | |
225 | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5506
diff
changeset
|
226 i = gaim_proxy_connect(servconn->session->account, servconn->server, |
5793
952710ac6635
[gaim-migrate @ 6218]
Christian Hammond <chipx86@chipx86.com>
parents:
5785
diff
changeset
|
227 servconn->port, connect_cb, servconn); |
5309 | 228 |
229 if (i == 0) | |
230 servconn->connected = TRUE; | |
231 | |
232 return servconn->connected; | |
233 } | |
234 | |
235 void | |
236 msn_servconn_disconnect(MsnServConn *servconn) | |
237 { | |
238 g_return_if_fail(servconn != NULL); | |
239 g_return_if_fail(servconn->connected); | |
240 | |
241 if (servconn->inpa) | |
242 gaim_input_remove(servconn->inpa); | |
243 | |
5744
6b87c127fe7b
[gaim-migrate @ 6168]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
244 close(servconn->fd); |
6b87c127fe7b
[gaim-migrate @ 6168]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
245 |
5309 | 246 g_free(servconn->rxqueue); |
247 | |
5506
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
248 while (servconn->txqueue != NULL) { |
5309 | 249 g_free(servconn->txqueue->data); |
250 | |
251 servconn->txqueue = g_slist_remove(servconn->txqueue, | |
252 servconn->txqueue->data); | |
253 } | |
254 | |
5506
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
255 while (servconn->msg_queue != NULL) { |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
256 MsnQueueEntry *entry = servconn->msg_queue->data; |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
257 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
258 msn_servconn_unqueue_message(servconn, entry->msg); |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
259 } |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
260 |
5309 | 261 servconn->connected = FALSE; |
262 } | |
263 | |
264 void | |
265 msn_servconn_destroy(MsnServConn *servconn) | |
266 { | |
5898
5baeb89ee2d4
[gaim-migrate @ 6330]
Christian Hammond <chipx86@chipx86.com>
parents:
5897
diff
changeset
|
267 MsnSession *session; |
5baeb89ee2d4
[gaim-migrate @ 6330]
Christian Hammond <chipx86@chipx86.com>
parents:
5897
diff
changeset
|
268 |
5309 | 269 g_return_if_fail(servconn != NULL); |
270 | |
5898
5baeb89ee2d4
[gaim-migrate @ 6330]
Christian Hammond <chipx86@chipx86.com>
parents:
5897
diff
changeset
|
271 session = servconn->session; |
5baeb89ee2d4
[gaim-migrate @ 6330]
Christian Hammond <chipx86@chipx86.com>
parents:
5897
diff
changeset
|
272 |
5baeb89ee2d4
[gaim-migrate @ 6330]
Christian Hammond <chipx86@chipx86.com>
parents:
5897
diff
changeset
|
273 session->servconns = g_list_remove(session->servconns, servconn); |
5baeb89ee2d4
[gaim-migrate @ 6330]
Christian Hammond <chipx86@chipx86.com>
parents:
5897
diff
changeset
|
274 |
5309 | 275 if (servconn->connected) |
276 msn_servconn_disconnect(servconn); | |
277 | |
278 if (servconn->server != NULL) | |
279 g_free(servconn->server); | |
280 | |
281 g_free(servconn); | |
282 } | |
283 | |
284 void | |
285 msn_servconn_set_server(MsnServConn *servconn, const char *server, int port) | |
286 { | |
287 g_return_if_fail(servconn != NULL); | |
288 g_return_if_fail(server != NULL); | |
289 g_return_if_fail(port > 0); | |
290 | |
291 if (servconn->server != NULL) | |
292 g_free(servconn->server); | |
293 | |
294 servconn->server = g_strdup(server); | |
295 servconn->port = port; | |
296 } | |
297 | |
298 const char * | |
299 msn_servconn_get_server(const MsnServConn *servconn) | |
300 { | |
301 g_return_val_if_fail(servconn != NULL, NULL); | |
302 | |
303 return servconn->server; | |
304 } | |
305 | |
306 int | |
307 msn_servconn_get_port(const MsnServConn *servconn) | |
308 { | |
309 g_return_val_if_fail(servconn != NULL, 0); | |
310 | |
311 return servconn->port; | |
312 } | |
313 | |
314 void | |
315 msn_servconn_set_connect_cb(MsnServConn *servconn, | |
316 gboolean (*connect_cb)(gpointer, gint, | |
317 GaimInputCondition)) | |
318 { | |
319 g_return_if_fail(servconn != NULL); | |
320 | |
321 servconn->connect_cb = connect_cb; | |
322 } | |
323 | |
324 void | |
325 msn_servconn_set_failed_read_cb(MsnServConn *servconn, | |
326 void (*failed_read_cb)(gpointer, gint, | |
327 GaimInputCondition)) | |
328 { | |
329 g_return_if_fail(servconn != NULL); | |
330 | |
331 servconn->failed_read_cb = failed_read_cb; | |
332 } | |
333 | |
334 size_t | |
335 msn_servconn_write(MsnServConn *servconn, const char *buf, size_t size) | |
336 { | |
337 g_return_val_if_fail(servconn != NULL, 0); | |
338 | |
339 gaim_debug(GAIM_DEBUG_MISC, "msn", "C: %s%s", buf, | |
340 (*(buf + size - 1) == '\n' ? "" : "\n")); | |
341 | |
342 return write(servconn->fd, buf, size); | |
343 } | |
344 | |
345 gboolean | |
346 msn_servconn_send_command(MsnServConn *servconn, const char *command, | |
347 const char *params) | |
348 { | |
349 char buf[MSN_BUF_LEN]; | |
350 | |
351 g_return_val_if_fail(servconn != NULL, FALSE); | |
352 g_return_val_if_fail(command != NULL, FALSE); | |
353 | |
354 if (params == NULL) | |
355 g_snprintf(buf, sizeof(buf), "%s %u\r\n", command, | |
356 servconn->session->trId++); | |
357 else | |
358 g_snprintf(buf, sizeof(buf), "%s %u %s\r\n", | |
359 command, servconn->session->trId++, params); | |
360 | |
361 return (msn_servconn_write(servconn, buf, strlen(buf)) > 0); | |
362 } | |
363 | |
364 void | |
5506
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
365 msn_servconn_queue_message(MsnServConn *servconn, const char *command, |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
366 MsnMessage *msg) |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
367 { |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
368 MsnQueueEntry *entry; |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
369 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
370 g_return_if_fail(servconn != NULL); |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
371 g_return_if_fail(msg != NULL); |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
372 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
373 entry = g_new0(MsnQueueEntry, 1); |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
374 entry->msg = msg; |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
375 entry->command = (command == NULL ? NULL : g_strdup(command)); |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
376 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
377 servconn->msg_queue = g_slist_append(servconn->msg_queue, entry); |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
378 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
379 msn_message_ref(msg); |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
380 } |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
381 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
382 void |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
383 msn_servconn_unqueue_message(MsnServConn *servconn, MsnMessage *msg) |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
384 { |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
385 MsnQueueEntry *entry = NULL; |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
386 GSList *l; |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
387 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
388 g_return_if_fail(servconn != NULL); |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
389 g_return_if_fail(msg != NULL); |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
390 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
391 for (l = servconn->msg_queue; l != NULL; l = l->next) { |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
392 entry = l->data; |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
393 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
394 if (entry->msg == msg) |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
395 break; |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
396 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
397 entry = NULL; |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
398 } |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
399 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
400 g_return_if_fail(entry != NULL); |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
401 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
402 msn_message_unref(msg); |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
403 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
404 servconn->msg_queue = g_slist_remove(servconn->msg_queue, entry); |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
405 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
406 if (entry->command != NULL) |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
407 g_free(entry->command); |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
408 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
409 g_free(entry); |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
410 } |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
411 |
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
412 void |
5309 | 413 msn_servconn_register_command(MsnServConn *servconn, const char *command, |
414 MsnServConnCommandCb cb) | |
415 { | |
416 char *command_up; | |
417 | |
418 g_return_if_fail(servconn != NULL); | |
419 g_return_if_fail(command != NULL); | |
420 g_return_if_fail(cb != NULL); | |
421 | |
422 command_up = g_ascii_strup(command, -1); | |
423 | |
424 g_hash_table_insert(servconn->commands, command_up, cb); | |
425 } | |
426 | |
427 void | |
428 msn_servconn_register_msg_type(MsnServConn *servconn, | |
429 const char *content_type, | |
430 MsnServConnMsgCb cb) | |
431 { | |
432 g_return_if_fail(servconn != NULL); | |
433 g_return_if_fail(content_type != NULL); | |
434 g_return_if_fail(cb != NULL); | |
435 | |
436 g_hash_table_insert(servconn->msg_types, g_strdup(content_type), cb); | |
437 } | |
438 | |
439 void | |
440 msn_servconn_parse_data(gpointer data, gint source, GaimInputCondition cond) | |
441 { | |
442 MsnServConn *servconn = (MsnServConn *)data; | |
5899
349204c9a709
[gaim-migrate @ 6331]
Christian Hammond <chipx86@chipx86.com>
parents:
5898
diff
changeset
|
443 MsnSession *session = servconn->session; |
5309 | 444 char buf[MSN_BUF_LEN]; |
445 gboolean cont = TRUE; | |
446 int len; | |
447 | |
448 len = read(servconn->fd, buf, sizeof(buf)); | |
449 | |
450 if (len <= 0) { | |
451 if (servconn->failed_read_cb != NULL) | |
452 servconn->failed_read_cb(data, source, cond); | |
453 | |
454 return; | |
455 } | |
456 | |
457 servconn->rxqueue = g_realloc(servconn->rxqueue, len + servconn->rxlen); | |
458 memcpy(servconn->rxqueue + servconn->rxlen, buf, len); | |
459 servconn->rxlen += len; | |
460 | |
461 while (cont) { | |
5962
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
462 if (servconn->parsing_multiline) { |
5309 | 463 char *msg; |
464 | |
465 if (servconn->rxlen == 0) | |
466 break; | |
467 | |
5962
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
468 if (servconn->multiline_len > servconn->rxlen) |
5309 | 469 break; |
470 | |
471 msg = servconn->rxqueue; | |
5962
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
472 servconn->rxlen -= servconn->multiline_len; |
5309 | 473 |
474 if (servconn->rxlen) { | |
5962
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
475 servconn->rxqueue = g_memdup(msg + servconn->multiline_len, |
5309 | 476 servconn->rxlen); |
477 } | |
478 else { | |
479 servconn->rxqueue = NULL; | |
5962
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
480 msg = g_realloc(msg, servconn->multiline_len + 1); |
5309 | 481 } |
482 | |
5962
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
483 msg[servconn->multiline_len] = '\0'; |
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
484 servconn->parsing_multiline = FALSE; |
5309 | 485 |
5793
952710ac6635
[gaim-migrate @ 6218]
Christian Hammond <chipx86@chipx86.com>
parents:
5785
diff
changeset
|
486 process_multi_line(servconn, msg); |
5309 | 487 |
5899
349204c9a709
[gaim-migrate @ 6331]
Christian Hammond <chipx86@chipx86.com>
parents:
5898
diff
changeset
|
488 if (g_list_find(session->servconns, servconn) != NULL) { |
5962
115769a4c6fc
[gaim-migrate @ 6409]
Christian Hammond <chipx86@chipx86.com>
parents:
5899
diff
changeset
|
489 servconn->multiline_len = 0; |
5899
349204c9a709
[gaim-migrate @ 6331]
Christian Hammond <chipx86@chipx86.com>
parents:
5898
diff
changeset
|
490 |
349204c9a709
[gaim-migrate @ 6331]
Christian Hammond <chipx86@chipx86.com>
parents:
5898
diff
changeset
|
491 if (servconn->msg_passport != NULL) |
349204c9a709
[gaim-migrate @ 6331]
Christian Hammond <chipx86@chipx86.com>
parents:
5898
diff
changeset
|
492 g_free(servconn->msg_passport); |
349204c9a709
[gaim-migrate @ 6331]
Christian Hammond <chipx86@chipx86.com>
parents:
5898
diff
changeset
|
493 |
349204c9a709
[gaim-migrate @ 6331]
Christian Hammond <chipx86@chipx86.com>
parents:
5898
diff
changeset
|
494 if (servconn->msg_friendly != NULL) |
349204c9a709
[gaim-migrate @ 6331]
Christian Hammond <chipx86@chipx86.com>
parents:
5898
diff
changeset
|
495 g_free(servconn->msg_friendly); |
349204c9a709
[gaim-migrate @ 6331]
Christian Hammond <chipx86@chipx86.com>
parents:
5898
diff
changeset
|
496 } |
349204c9a709
[gaim-migrate @ 6331]
Christian Hammond <chipx86@chipx86.com>
parents:
5898
diff
changeset
|
497 else |
349204c9a709
[gaim-migrate @ 6331]
Christian Hammond <chipx86@chipx86.com>
parents:
5898
diff
changeset
|
498 cont = 0; |
349204c9a709
[gaim-migrate @ 6331]
Christian Hammond <chipx86@chipx86.com>
parents:
5898
diff
changeset
|
499 |
5309 | 500 g_free(msg); |
501 } | |
502 else { | |
503 char *end = servconn->rxqueue; | |
504 char *cmd; | |
505 int cmdlen, i; | |
506 | |
507 if (!servconn->rxlen) | |
508 return; | |
509 | |
510 for (i = 0; i < servconn->rxlen - 1; end++, i++) { | |
511 if (*end == '\r' && end[1] == '\n') | |
512 break; | |
513 } | |
514 | |
515 if (i == servconn->rxlen - 1) | |
516 return; | |
517 | |
518 cmdlen = end - servconn->rxqueue + 2; | |
519 cmd = servconn->rxqueue; | |
520 servconn->rxlen -= cmdlen; | |
521 | |
522 if (servconn->rxlen) | |
523 servconn->rxqueue = g_memdup(cmd + cmdlen, servconn->rxlen); | |
524 else { | |
525 servconn->rxqueue = NULL; | |
526 cmd = g_realloc(cmd, cmdlen + 1); | |
527 } | |
528 | |
529 cmd[cmdlen] = '\0'; | |
530 | |
531 gaim_debug(GAIM_DEBUG_MISC, "msn", "S: %s", cmd); | |
532 | |
533 g_strchomp(cmd); | |
534 | |
5793
952710ac6635
[gaim-migrate @ 6218]
Christian Hammond <chipx86@chipx86.com>
parents:
5785
diff
changeset
|
535 cont = process_single_line(servconn, cmd); |
5309 | 536 |
537 g_free(cmd); | |
538 } | |
539 } | |
540 } | |
541 |