Mercurial > pidgin.yaz
annotate src/protocols/toc/toc.c @ 4916:d9b6b5ae34e4
[gaim-migrate @ 5250]
Buddy list editing.
Does this work? I don't know; I don't test things. It compiles though.
It probably does work though, because I'm perfect.
So, see, I did really terribly in school last semester (really terribly--
like, why didn't they kick me out terribly) and so I'm working really hard
to do well this semester (and I am so far :)). Anyway, that's why you may
have noticed I'm a bit slow with the development of late. In fact, I would
test and fix this stuff up, but I really need to work on an English paper,
so I figured it'd be best just to commit it as is and let Rob, Nathan, Chip
and the boys work out the kinks. Besides, I've had most of this code written
for weeks already.
Thank you all for your patience.
Oh, so there's now an Edit menu on your buddy list (which makes the minimum
buddy list width wider :-D) and here you'll find things with which to edit
your list and privacy, prefs and accounts. It should all be real intuitive.
Feel free to IM me if you want to talk about my paper.
committer: Tailor Script <tailor@pidgin.im>
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Mon, 31 Mar 2003 07:19:46 +0000 |
parents | 0ed37c803503 |
children | d5c136474f26 |
rev | line source |
---|---|
2086 | 1 /* |
2 * gaim | |
3 * | |
4 * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net> | |
5 * | |
6 * This program is free software; you can redistribute it and/or modify | |
7 * it under the terms of the GNU General Public License as published by | |
8 * the Free Software Foundation; either version 2 of the License, or | |
9 * (at your option) any later version. | |
10 * | |
11 * This program is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 * GNU General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License | |
17 * along with this program; if not, write to the Free Software | |
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
19 * | |
20 */ | |
21 | |
22 | |
23 | |
24 #ifdef HAVE_CONFIG_H | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
25 #include <config.h> |
2086 | 26 #endif |
3630 | 27 |
28 #ifndef _WIN32 | |
2086 | 29 #include <netdb.h> |
30 #include <unistd.h> | |
31 #include <netinet/in.h> | |
32 #include <arpa/inet.h> | |
3630 | 33 #include <sys/socket.h> |
34 #else | |
35 #include <winsock.h> | |
36 #endif | |
37 | |
38 #include <gtk/gtk.h> | |
39 #include <errno.h> | |
2086 | 40 #include <string.h> |
41 #include <stdlib.h> | |
42 #include <stdio.h> | |
43 #include <time.h> | |
44 #include <sys/types.h> | |
45 #include <sys/stat.h> | |
46 #include "prpl.h" | |
47 #include "multi.h" | |
48 #include "gaim.h" | |
49 #include "proxy.h" | |
50 | |
3630 | 51 #ifdef _WIN32 |
52 #include "win32dep.h" | |
53 #endif | |
54 | |
4249 | 55 static struct prpl *my_protocol = NULL; |
56 | |
3630 | 57 /* for win32 compatability */ |
58 G_MODULE_IMPORT GSList *connections; | |
59 | |
2086 | 60 #define REVISION "penguin" |
61 | |
62 #define TYPE_SIGNON 1 | |
63 #define TYPE_DATA 2 | |
64 #define TYPE_ERROR 3 | |
65 #define TYPE_SIGNOFF 4 | |
66 #define TYPE_KEEPALIVE 5 | |
67 | |
68 #define FLAPON "FLAPON\r\n\r\n" | |
69 #define ROAST "Tic/Toc" | |
70 | |
71 #define TOC_HOST "toc.oscar.aol.com" | |
72 #define TOC_PORT 9898 | |
73 #define AUTH_HOST "login.oscar.aol.com" | |
74 #define AUTH_PORT 5190 | |
75 #define LANGUAGE "english" | |
76 | |
77 #define STATE_OFFLINE 0 | |
78 #define STATE_FLAPON 1 | |
79 #define STATE_SIGNON_REQUEST 2 | |
80 #define STATE_ONLINE 3 | |
81 #define STATE_PAUSE 4 | |
82 | |
83 #define VOICE_UID "09461341-4C7F-11D1-8222-444553540000" | |
84 #define FILE_SEND_UID "09461343-4C7F-11D1-8222-444553540000" | |
85 #define IMAGE_UID "09461345-4C7F-11D1-8222-444553540000" | |
86 #define B_ICON_UID "09461346-4C7F-11D1-8222-444553540000" | |
87 #define STOCKS_UID "09461347-4C7F-11D1-8222-444553540000" | |
88 #define FILE_GET_UID "09461348-4C7F-11D1-8222-444553540000" | |
89 #define GAMES_UID "0946134a-4C7F-11D1-8222-444553540000" | |
90 | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2453
diff
changeset
|
91 #define UC_AOL 0x02 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2453
diff
changeset
|
92 #define UC_ADMIN 0x04 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2453
diff
changeset
|
93 #define UC_UNCONFIRMED 0x08 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2453
diff
changeset
|
94 #define UC_NORMAL 0x10 |
3083 | 95 #define UC_WIRELESS 0x20 |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2453
diff
changeset
|
96 |
2086 | 97 struct ft_request { |
98 struct gaim_connection *gc; | |
99 char *user; | |
100 char UID[2048]; | |
101 char *cookie; | |
102 char *ip; | |
103 int port; | |
104 char *message; | |
105 char *filename; | |
106 int files; | |
107 int size; | |
108 }; | |
109 | |
110 struct buddy_icon { | |
111 guint32 hash; | |
112 guint32 len; | |
113 time_t time; | |
114 void *data; | |
115 }; | |
116 | |
117 struct toc_data { | |
118 int toc_fd; | |
4597 | 119 char toc_ip[20]; |
2086 | 120 int seqno; |
121 int state; | |
122 }; | |
123 | |
124 struct sflap_hdr { | |
125 unsigned char ast; | |
126 unsigned char type; | |
127 unsigned short seqno; | |
128 unsigned short len; | |
129 }; | |
130 | |
131 struct signon { | |
132 unsigned int ver; | |
133 unsigned short tag; | |
134 unsigned short namelen; | |
135 char username[80]; | |
136 }; | |
137 | |
138 /* constants to identify proto_opts */ | |
139 #define USEROPT_AUTH 0 | |
140 #define USEROPT_AUTHPORT 1 | |
141 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
142 static void toc_login_callback(gpointer, gint, GaimInputCondition); |
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
143 static void toc_callback(gpointer, gint, GaimInputCondition); |
2086 | 144 static void accept_file_dialog(struct ft_request *); |
145 | |
3630 | 146 /* The following were added for win32 port - Herman */ |
147 | |
148 int toc_write(int fd, const void *buffer, int len) | |
149 { | |
150 #ifndef _WIN32 | |
151 return write(fd, buffer, len); | |
152 #else | |
153 return send(fd, buffer, len, 0); | |
154 #endif | |
155 } | |
156 | |
157 int toc_read(int fd, void *buffer, int size) | |
158 { | |
159 #ifndef _WIN32 | |
160 return read(fd, buffer, size); | |
161 #else | |
162 return recv(fd, buffer, size, 0); | |
163 #endif | |
164 } | |
165 | |
166 int toc_soc_close( int fd ) | |
167 { | |
168 #ifndef _WIN32 | |
169 return close(fd); | |
170 #else | |
171 return closesocket(fd); | |
172 #endif | |
173 } | |
174 | |
175 | |
2086 | 176 /* ok. this function used to take username/password, and return 0 on success. |
177 * now, it takes username/password, and returns NULL on error or a new gaim_connection | |
178 * on success. */ | |
4491 | 179 static void toc_login(struct gaim_account *account) |
2086 | 180 { |
181 struct gaim_connection *gc; | |
182 struct toc_data *tdt; | |
183 char buf[80]; | |
184 | |
4491 | 185 gc = new_gaim_conn(account); |
2086 | 186 gc->proto_data = tdt = g_new0(struct toc_data, 1); |
2918
4df759d607f3
[gaim-migrate @ 2931]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2916
diff
changeset
|
187 gc->flags |= OPT_CONN_HTML; |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
3867
diff
changeset
|
188 gc->flags |= OPT_CONN_AUTO_RESP; |
2086 | 189 |
4834 | 190 g_snprintf(buf, sizeof buf, _("Looking up %s"), |
4491 | 191 account->proto_opt[USEROPT_AUTH][0] ? account->proto_opt[USEROPT_AUTH] : TOC_HOST); |
2086 | 192 set_login_progress(gc, 1, buf); |
193 | |
194 debug_printf("* Client connects to TOC\n"); | |
4634 | 195 if (proxy_connect(account, account->proto_opt[USEROPT_AUTH][0] ? |
4491 | 196 account->proto_opt[USEROPT_AUTH] : TOC_HOST, |
197 account->proto_opt[USEROPT_AUTHPORT][0] ? | |
198 atoi(account->proto_opt[USEROPT_AUTHPORT]) : TOC_PORT, | |
199 toc_login_callback, gc) != 0 || !account->gc) { | |
200 g_snprintf(buf, sizeof(buf), "Connect to %s failed", account->proto_opt[USEROPT_AUTH]); | |
2086 | 201 hide_login_progress(gc, buf); |
202 signoff(gc); | |
203 return; | |
204 } | |
205 } | |
206 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
207 static void toc_login_callback(gpointer data, gint source, GaimInputCondition cond) |
2086 | 208 { |
209 struct gaim_connection *gc = data; | |
210 struct toc_data *tdt; | |
211 char buf[80]; | |
4597 | 212 struct sockaddr_in name; |
213 socklen_t namelen; | |
2086 | 214 |
215 if (!g_slist_find(connections, data)) { | |
3630 | 216 toc_soc_close(source); |
2086 | 217 return; |
218 } | |
219 | |
220 tdt = gc->proto_data; | |
221 | |
222 if (source == -1) { | |
223 /* we didn't successfully connect. tdt->toc_fd is valid here */ | |
224 hide_login_progress(gc, "Unable to connect."); | |
225 signoff(gc); | |
226 return; | |
227 } | |
4452 | 228 tdt->toc_fd = source; |
2086 | 229 |
4597 | 230 /* |
231 * Copy the IP that we're connected to. We need this because "GOTO_URL"'s | |
232 * should open on the exact server we're connected to. toc.oscar.aol.com | |
233 * doesn't work because that hostname resolves to multiple IP addresses. | |
234 */ | |
235 if (getpeername(tdt->toc_fd, (struct sockaddr *)&name, &namelen) == 0) | |
236 strncpy(tdt->toc_ip, inet_ntoa(name.sin_addr), sizeof(tdt->toc_ip)); | |
237 else if (gc->account && gc->account->proto_opt[USEROPT_AUTH][0]) | |
238 strncpy(tdt->toc_ip, gc->account->proto_opt[USEROPT_AUTH], sizeof(tdt->toc_ip)); | |
239 else | |
240 strncpy(tdt->toc_ip, TOC_HOST, sizeof(tdt->toc_ip)); | |
241 | |
2086 | 242 debug_printf("* Client sends \"FLAPON\\r\\n\\r\\n\"\n"); |
3630 | 243 if (toc_write(tdt->toc_fd, FLAPON, strlen(FLAPON)) < 0) { |
2086 | 244 hide_login_progress(gc, "Disconnected."); |
245 signoff(gc); | |
246 return; | |
247 } | |
248 tdt->state = STATE_FLAPON; | |
249 | |
250 /* i know a lot of people like to look at gaim to see how TOC works. so i'll comment | |
251 * on what this does. it's really simple. when there's data ready to be read from the | |
252 * toc_fd file descriptor, toc_callback is called, with gc passed as its data arg. */ | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
253 gc->inpa = gaim_input_add(tdt->toc_fd, GAIM_INPUT_READ, toc_callback, gc); |
2086 | 254 |
4834 | 255 g_snprintf(buf, sizeof(buf), _("Signon: %s"), gc->username); |
2086 | 256 set_login_progress(gc, 2, buf); |
257 } | |
258 | |
259 static void toc_close(struct gaim_connection *gc) | |
260 { | |
261 if (gc->inpa > 0) | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
262 gaim_input_remove(gc->inpa); |
2086 | 263 gc->inpa = 0; |
3630 | 264 toc_soc_close(((struct toc_data *)gc->proto_data)->toc_fd); |
2086 | 265 g_free(gc->proto_data); |
266 } | |
267 | |
4687 | 268 static void toc_build_config(struct gaim_account *account, char *s, int len, gboolean show) |
269 { | |
4785 | 270 GaimBlistNode *gnode,*bnode; |
4687 | 271 struct group *g; |
272 struct buddy *b; | |
273 GSList *plist = account->permit; | |
274 GSList *dlist = account->deny; | |
275 | |
276 int pos = 0; | |
277 | |
278 if (!account->permdeny) | |
279 account->permdeny = 1; | |
280 | |
281 pos += g_snprintf(&s[pos], len - pos, "m %d\n", account->permdeny); | |
4785 | 282 for(gnode = gaim_get_blist()->root; gnode && len > pos; gnode = gnode->next) { |
283 g = (struct group *)gnode; | |
284 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
285 continue; | |
4687 | 286 if(gaim_group_on_account(g, account)) { |
287 pos += g_snprintf(&s[pos], len - pos, "g %s\n", g->name); | |
4785 | 288 for(bnode = gnode->child; bnode && len > pos; bnode = bnode->next) { |
289 b = (struct buddy *)bnode; | |
290 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
291 continue; | |
4687 | 292 if(b->account == account) { |
293 pos += g_snprintf(&s[pos], len - pos, "b %s%s%s\n", b->name, | |
4705 | 294 (show && b->alias) ? ":" : "", |
295 (show && b->alias) ? b->alias : ""); | |
4687 | 296 } |
297 } | |
298 } | |
299 } | |
300 | |
301 while (len > pos && plist) { | |
302 pos += g_snprintf(&s[pos], len - pos, "p %s\n", (char *)plist->data); | |
303 plist = plist->next; | |
304 } | |
305 | |
306 while (len > pos && dlist) { | |
307 pos += g_snprintf(&s[pos], len - pos, "d %s\n", (char *)dlist->data); | |
308 dlist = dlist->next; | |
309 } | |
310 } | |
311 | |
2371
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
312 static int escape_message(char *msg) |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
313 { |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
314 char *c, *cpy; |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
315 int cnt = 0; |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
316 /* Assumes you have a buffer able to cary at least BUF_LEN * 2 bytes */ |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
317 if (strlen(msg) > BUF_LEN) { |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
318 debug_printf("Warning: truncating message to 2048 bytes\n"); |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
319 msg[2047] = '\0'; |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
320 } |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
321 |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
322 cpy = g_strdup(msg); |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
323 c = cpy; |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
324 while (*c) { |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
325 switch (*c) { |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
326 case '$': |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
327 case '[': |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
328 case ']': |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
329 case '(': |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
330 case ')': |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
331 msg[cnt++] = '\\'; |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
332 /* Fall through */ |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
333 default: |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
334 msg[cnt++] = *c; |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
335 } |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
336 c++; |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
337 } |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
338 msg[cnt] = '\0'; |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
339 g_free(cpy); |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
340 return cnt; |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
341 } |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
342 |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
343 static int escape_text(char *msg) |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
344 { |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
345 char *c, *cpy; |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
346 int cnt = 0; |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
347 /* Assumes you have a buffer able to cary at least BUF_LEN * 4 bytes */ |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
348 if (strlen(msg) > BUF_LEN) { |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
349 fprintf(stderr, "Warning: truncating message to 2048 bytes\n"); |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
350 msg[2047] = '\0'; |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
351 } |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
352 |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
353 cpy = g_strdup(msg); |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
354 c = cpy; |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
355 while (*c) { |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
356 switch (*c) { |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
357 case '\n': |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
358 msg[cnt++] = '<'; |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
359 msg[cnt++] = 'B'; |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
360 msg[cnt++] = 'R'; |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
361 msg[cnt++] = '>'; |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
362 break; |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
363 case '{': |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
364 case '}': |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
365 case '\\': |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
366 case '"': |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
367 msg[cnt++] = '\\'; |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
368 /* Fall through */ |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
369 default: |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
370 msg[cnt++] = *c; |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
371 } |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
372 c++; |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
373 } |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
374 msg[cnt] = '\0'; |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
375 g_free(cpy); |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
376 return cnt; |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
377 } |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
378 |
2086 | 379 static int sflap_send(struct gaim_connection *gc, char *buf, int olen, int type) |
380 { | |
381 int len; | |
382 int slen = 0; | |
383 struct sflap_hdr hdr; | |
384 char obuf[MSG_LEN]; | |
385 struct toc_data *tdt = (struct toc_data *)gc->proto_data; | |
386 | |
387 if (tdt->state == STATE_PAUSE) | |
388 /* TOC has given us the PAUSE message; sending could cause a disconnect | |
389 * so we just return here like everything went through fine */ | |
390 return 0; | |
391 | |
2281
cc462108c101
[gaim-migrate @ 2291]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
392 if (olen < 0) |
cc462108c101
[gaim-migrate @ 2291]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
393 len = escape_message(buf); |
cc462108c101
[gaim-migrate @ 2291]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
394 else |
cc462108c101
[gaim-migrate @ 2291]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
395 len = olen; |
cc462108c101
[gaim-migrate @ 2291]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
396 |
2086 | 397 /* One _last_ 2048 check here! This shouldn't ever |
398 * get hit though, hopefully. If it gets hit on an IM | |
399 * It'll lose the last " and the message won't go through, | |
400 * but this'll stop a segfault. */ | |
2281
cc462108c101
[gaim-migrate @ 2291]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
401 if (len > MSG_LEN) { |
2086 | 402 debug_printf("message too long, truncating\n"); |
2281
cc462108c101
[gaim-migrate @ 2291]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
403 buf[MSG_LEN - 1] = '\0'; |
cc462108c101
[gaim-migrate @ 2291]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
404 len = MSG_LEN; |
2086 | 405 } |
406 | |
2334
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
407 if (olen < 0) |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
408 debug_printf("TOC C: %s\n", buf); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
409 |
2086 | 410 hdr.ast = '*'; |
411 hdr.type = type; | |
412 hdr.seqno = htons(tdt->seqno++ & 0xffff); | |
413 hdr.len = htons(len + (type == TYPE_SIGNON ? 0 : 1)); | |
414 | |
415 memcpy(obuf, &hdr, sizeof(hdr)); | |
416 slen += sizeof(hdr); | |
417 memcpy(&obuf[slen], buf, len); | |
418 slen += len; | |
419 if (type != TYPE_SIGNON) { | |
420 obuf[slen] = '\0'; | |
421 slen += 1; | |
422 } | |
423 | |
3630 | 424 return toc_write(tdt->toc_fd, obuf, slen); |
2086 | 425 } |
426 | |
427 static int wait_reply(struct gaim_connection *gc, char *buffer, size_t buflen) | |
428 { | |
429 struct toc_data *tdt = (struct toc_data *)gc->proto_data; | |
430 struct sflap_hdr *hdr; | |
431 int ret; | |
432 | |
3630 | 433 if (toc_read(tdt->toc_fd, buffer, sizeof(struct sflap_hdr)) < 0) { |
2086 | 434 debug_printf("error, couldn't read flap header\n"); |
435 return -1; | |
436 } | |
437 | |
438 hdr = (struct sflap_hdr *)buffer; | |
439 | |
440 if (buflen < ntohs(hdr->len)) { | |
441 /* fake like there's a read error */ | |
442 debug_printf("buffer too small (have %d, need %d)\n", buflen, ntohs(hdr->len)); | |
443 return -1; | |
444 } | |
445 | |
446 if (ntohs(hdr->len) > 0) { | |
447 int count = 0; | |
448 ret = 0; | |
449 do { | |
450 count += ret; | |
3630 | 451 ret = toc_read(tdt->toc_fd, |
2086 | 452 buffer + sizeof(struct sflap_hdr) + count, ntohs(hdr->len) - count); |
453 } while (count + ret < ntohs(hdr->len) && ret > 0); | |
454 buffer[sizeof(struct sflap_hdr) + count + ret] = '\0'; | |
455 return ret; | |
456 } else | |
457 return 0; | |
458 } | |
459 | |
460 static unsigned char *roast_password(char *pass) | |
461 { | |
462 /* Trivial "encryption" */ | |
463 static unsigned char rp[256]; | |
464 static char *roast = ROAST; | |
465 int pos = 2; | |
466 int x; | |
467 strcpy(rp, "0x"); | |
468 for (x = 0; (x < 150) && pass[x]; x++) | |
469 pos += sprintf(&rp[pos], "%02x", pass[x] ^ roast[x % strlen(roast)]); | |
470 rp[pos] = '\0'; | |
471 return rp; | |
472 } | |
473 | |
4322 | 474 static void toc_got_info(gpointer data, char *url_text, unsigned long len) |
2086 | 475 { |
476 if (!url_text) | |
477 return; | |
478 | |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2773
diff
changeset
|
479 g_show_info_text(NULL, NULL, 2, url_text, NULL); |
2086 | 480 } |
481 | |
2453
b72143059ad4
[gaim-migrate @ 2466]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2382
diff
changeset
|
482 static char *show_error_message() |
2334
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
483 { |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
484 int no = atoi(strtok(NULL, ":")); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
485 char *w = strtok(NULL, ":"); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
486 static char buf[256]; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
487 |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
488 switch(no) { |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
489 case 69: |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
490 g_snprintf(buf, sizeof(buf), _("Unable to write file %s."), w); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
491 break; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
492 case 169: |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
493 g_snprintf(buf, sizeof(buf), _("Unable to read file %s."), w); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
494 break; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
495 case 269: |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
496 g_snprintf(buf, sizeof(buf), _("Message too long, last %s bytes truncated."), w); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
497 break; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
498 case 901: |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
499 g_snprintf(buf, sizeof(buf), _("%s not currently logged in."), w); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
500 break; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
501 case 902: |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
502 g_snprintf(buf, sizeof(buf), _("Warning of %s not allowed."), w); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
503 break; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
504 case 903: |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
505 g_snprintf(buf, sizeof(buf), _("A message has been dropped, you are exceeding the server speed limit.")); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
506 break; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
507 case 950: |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
508 g_snprintf(buf, sizeof(buf), _("Chat in %s is not available."), w); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
509 break; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
510 case 960: |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
511 g_snprintf(buf, sizeof(buf), _("You are sending messages too fast to %s."), w); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
512 break; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
513 case 961: |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
514 g_snprintf(buf, sizeof(buf), _("You missed an IM from %s because it was too big."), w); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
515 break; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
516 case 962: |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
517 g_snprintf(buf, sizeof(buf), _("You missed an IM from %s because it was sent too fast."), w); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
518 break; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
519 case 970: |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
520 g_snprintf(buf, sizeof(buf), _("Failure.")); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
521 break; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
522 case 971: |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
523 g_snprintf(buf, sizeof(buf), _("Too many matches.")); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
524 break; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
525 case 972: |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
526 g_snprintf(buf, sizeof(buf), _("Need more qualifiers.")); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
527 break; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
528 case 973: |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
529 g_snprintf(buf, sizeof(buf), _("Dir service temporarily unavailable.")); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
530 break; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
531 case 974: |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
532 g_snprintf(buf, sizeof(buf), _("Email lookup restricted.")); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
533 break; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
534 case 975: |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
535 g_snprintf(buf, sizeof(buf), _("Keyword ignored.")); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
536 break; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
537 case 976: |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
538 g_snprintf(buf, sizeof(buf), _("No keywords.")); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
539 break; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
540 case 977: |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
541 g_snprintf(buf, sizeof(buf), _("User has no directory information.")); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
542 /* g_snprintf(buf, sizeof(buf), "Language not supported."); */ |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
543 break; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
544 case 978: |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
545 g_snprintf(buf, sizeof(buf), _("Country not supported.")); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
546 break; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
547 case 979: |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
548 g_snprintf(buf, sizeof(buf), _("Failure unknown: %s."), w); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
549 break; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
550 case 980: |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
551 g_snprintf(buf, sizeof(buf), _("Incorrect nickname or password.")); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
552 break; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
553 case 981: |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
554 g_snprintf(buf, sizeof(buf), _("The service is temporarily unavailable.")); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
555 break; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
556 case 982: |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
557 g_snprintf(buf, sizeof(buf), _("Your warning level is currently too high to log in.")); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
558 break; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
559 case 983: |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
560 g_snprintf(buf, sizeof(buf), _("You have been connecting and disconnecting too frequently. Wait ten minutes and try again. If you continue to try, you will need to wait even longer.")); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
561 break; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
562 g_snprintf(buf, sizeof(buf), _("An unknown signon error has occurred: %s."), w); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
563 break; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
564 default: |
3100 | 565 g_snprintf(buf, sizeof(buf), _("An unknown error, %d, has occurred. Info: %s"), no, w); |
2334
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
566 } |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
567 |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
568 return buf; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
569 } |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
570 |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
571 static void toc_callback(gpointer data, gint source, GaimInputCondition condition) |
2086 | 572 { |
573 struct gaim_connection *gc = (struct gaim_connection *)data; | |
574 struct toc_data *tdt = (struct toc_data *)gc->proto_data; | |
575 struct sflap_hdr *hdr; | |
576 struct signon so; | |
577 char buf[8 * 1024], *c; | |
578 char snd[BUF_LEN * 2]; | |
579 | |
580 /* there's data waiting to be read, so read it. */ | |
581 if (wait_reply(gc, buf, 8 * 1024) <= 0) { | |
3074 | 582 hide_login_progress_error(gc, _("Connection Closed")); |
2086 | 583 signoff(gc); |
584 return; | |
585 } | |
586 | |
587 if (tdt->state == STATE_FLAPON) { | |
588 hdr = (struct sflap_hdr *)buf; | |
589 if (hdr->type != TYPE_SIGNON) | |
590 debug_printf("problem, hdr->type != TYPE_SIGNON\n"); | |
591 else | |
592 debug_printf("* TOC sends Client FLAP SIGNON\n"); | |
593 tdt->seqno = ntohs(hdr->seqno); | |
594 tdt->state = STATE_SIGNON_REQUEST; | |
595 | |
596 debug_printf("* Client sends TOC FLAP SIGNON\n"); | |
597 g_snprintf(so.username, sizeof(so.username), "%s", gc->username); | |
598 so.ver = htonl(1); | |
599 so.tag = htons(1); | |
600 so.namelen = htons(strlen(so.username)); | |
601 if (sflap_send(gc, (char *)&so, ntohs(so.namelen) + 8, TYPE_SIGNON) < 0) { | |
602 hide_login_progress(gc, _("Disconnected.")); | |
603 signoff(gc); | |
604 return; | |
605 } | |
606 | |
607 debug_printf("* Client sends TOC \"toc_signon\" message\n"); | |
2853
f0633f458a1c
[gaim-migrate @ 2866]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
608 /* i hate icq. */ |
f0633f458a1c
[gaim-migrate @ 2866]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
609 if (gc->username[0] >= '0' && gc->username[0] <= '9') |
f0633f458a1c
[gaim-migrate @ 2866]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
610 gc->password[9] = '\0'; |
2086 | 611 g_snprintf(snd, sizeof snd, "toc_signon %s %d %s %s %s \"%s\"", |
612 AUTH_HOST, AUTH_PORT, normalize(gc->username), | |
613 roast_password(gc->password), LANGUAGE, REVISION); | |
614 if (sflap_send(gc, snd, -1, TYPE_DATA) < 0) { | |
615 hide_login_progress(gc, _("Disconnected.")); | |
616 signoff(gc); | |
617 return; | |
618 } | |
619 | |
620 set_login_progress(gc, 3, _("Waiting for reply...")); | |
621 return; | |
622 } | |
623 | |
624 if (tdt->state == STATE_SIGNON_REQUEST) { | |
625 debug_printf("* TOC sends client SIGN_ON reply\n"); | |
4793 | 626 if (g_ascii_strncasecmp(buf + sizeof(struct sflap_hdr), "SIGN_ON", strlen("SIGN_ON"))) { |
2086 | 627 debug_printf("Didn't get SIGN_ON! buf was: %s\n", |
628 buf + sizeof(struct sflap_hdr)); | |
4793 | 629 if (!g_ascii_strncasecmp(buf + sizeof(struct sflap_hdr), "ERROR", 5)) { |
2334
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
630 strtok(buf + sizeof(struct sflap_hdr), ":"); |
2453
b72143059ad4
[gaim-migrate @ 2466]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2382
diff
changeset
|
631 hide_login_progress(gc, show_error_message()); |
2334
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
632 } else |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
633 hide_login_progress(gc, _("Authentication Failed")); |
2086 | 634 signoff(gc); |
635 return; | |
636 } | |
637 /* we're supposed to check that it's really TOC v1 here but we know it is ;) */ | |
2128
bc79be34eb73
[gaim-migrate @ 2138]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2123
diff
changeset
|
638 debug_printf("TOC version: %s\n", buf + sizeof(struct sflap_hdr) + 8); |
2086 | 639 |
640 /* we used to check for the CONFIG here, but we'll wait until we've sent our | |
641 * version of the config and then the toc_init_done message. we'll come back to | |
642 * the callback in a better state if we get CONFIG anyway */ | |
643 | |
644 tdt->state = STATE_ONLINE; | |
645 | |
646 account_online(gc); | |
647 serv_finish_login(gc); | |
648 | |
649 /* Client sends TOC toc_init_done message */ | |
650 debug_printf("* Client sends TOC toc_init_done message\n"); | |
651 g_snprintf(snd, sizeof snd, "toc_init_done"); | |
652 sflap_send(gc, snd, -1, TYPE_DATA); | |
653 | |
654 /* | |
655 g_snprintf(snd, sizeof snd, "toc_set_caps %s %s %s", | |
656 FILE_SEND_UID, FILE_GET_UID, B_ICON_UID); | |
657 */ | |
658 g_snprintf(snd, sizeof snd, "toc_set_caps %s %s", FILE_SEND_UID, FILE_GET_UID); | |
659 sflap_send(gc, snd, -1, TYPE_DATA); | |
660 | |
661 return; | |
662 } | |
663 | |
2334
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
664 debug_printf("TOC S: %s\n", buf + sizeof(struct sflap_hdr)); |
2086 | 665 |
666 c = strtok(buf + sizeof(struct sflap_hdr), ":"); /* Ditch the first part */ | |
667 | |
4793 | 668 if (!g_ascii_strcasecmp(c, "SIGN_ON")) { |
2086 | 669 /* we should only get here after a PAUSE */ |
670 if (tdt->state != STATE_PAUSE) | |
671 debug_printf("got SIGN_ON but not PAUSE!\n"); | |
672 else { | |
673 tdt->state = STATE_ONLINE; | |
674 g_snprintf(snd, sizeof snd, "toc_signon %s %d %s %s %s \"%s\"", | |
675 AUTH_HOST, AUTH_PORT, normalize(gc->username), | |
676 roast_password(gc->password), LANGUAGE, REVISION); | |
677 if (sflap_send(gc, snd, -1, TYPE_DATA) < 0) { | |
678 hide_login_progress(gc, _("Disconnected.")); | |
679 signoff(gc); | |
680 return; | |
681 } | |
682 g_snprintf(snd, sizeof snd, "toc_init_done"); | |
683 sflap_send(gc, snd, -1, TYPE_DATA); | |
684 do_error_dialog(_("TOC has come back from its pause. You may now send" | |
3427 | 685 " messages again."), NULL, GAIM_INFO); |
2086 | 686 } |
4793 | 687 } else if (!g_ascii_strcasecmp(c, "CONFIG")) { |
2086 | 688 c = strtok(NULL, ":"); |
4491 | 689 parse_toc_buddy_list(gc->account, c); |
4793 | 690 } else if (!g_ascii_strcasecmp(c, "NICK")) { |
2086 | 691 /* ignore NICK so that things get imported/exported properly |
692 c = strtok(NULL, ":"); | |
693 g_snprintf(gc->username, sizeof(gc->username), "%s", c); | |
694 */ | |
4793 | 695 } else if (!g_ascii_strcasecmp(c, "IM_IN")) { |
2086 | 696 char *away, *message; |
697 int a = 0; | |
698 | |
699 c = strtok(NULL, ":"); | |
700 away = strtok(NULL, ":"); | |
701 | |
702 message = away; | |
703 while (*message && (*message != ':')) | |
704 message++; | |
705 message++; | |
706 | |
2273
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2232
diff
changeset
|
707 a = (away && (*away == 'T')) ? IM_FLAG_AWAY : 0; |
2086 | 708 |
2856
b1e300a85678
[gaim-migrate @ 2869]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2853
diff
changeset
|
709 serv_got_im(gc, c, message, a, time(NULL), -1); |
4793 | 710 } else if (!g_ascii_strcasecmp(c, "UPDATE_BUDDY")) { |
2305
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
711 char *l, *uc, *tmp; |
2086 | 712 int logged, evil, idle, type = 0; |
713 time_t signon, time_idle; | |
714 | |
715 c = strtok(NULL, ":"); /* name */ | |
716 l = strtok(NULL, ":"); /* online */ | |
717 sscanf(strtok(NULL, ":"), "%d", &evil); | |
718 sscanf(strtok(NULL, ":"), "%ld", &signon); | |
719 sscanf(strtok(NULL, ":"), "%d", &idle); | |
720 uc = strtok(NULL, ":"); | |
721 | |
722 logged = (l && (*l == 'T')) ? 1 : 0; | |
723 | |
724 if (uc[0] == 'A') | |
725 type |= UC_AOL; | |
726 switch (uc[1]) { | |
727 case 'A': | |
728 type |= UC_ADMIN; | |
729 break; | |
730 case 'U': | |
731 type |= UC_UNCONFIRMED; | |
732 break; | |
733 case 'O': | |
734 type |= UC_NORMAL; | |
735 break; | |
3083 | 736 case 'C': |
737 type |= UC_WIRELESS; | |
738 break; | |
2086 | 739 default: |
740 break; | |
741 } | |
742 if (uc[2] == 'U') | |
743 type |= UC_UNAVAILABLE; | |
744 | |
745 if (idle) { | |
746 time(&time_idle); | |
747 time_idle -= idle * 60; | |
748 } else | |
749 time_idle = 0; | |
750 | |
2305
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
751 tmp = g_strdup(normalize(gc->username)); |
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
752 if (!strcmp(tmp, normalize(c))) |
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
753 g_snprintf(gc->displayname, sizeof(gc->displayname), "%s", c); |
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
754 g_free(tmp); |
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
755 |
4732 | 756 serv_got_update(gc, c, logged, evil, signon, time_idle, type); |
4793 | 757 } else if (!g_ascii_strcasecmp(c, "ERROR")) { |
3427 | 758 do_error_dialog(show_error_message(), NULL, GAIM_ERROR); |
4793 | 759 } else if (!g_ascii_strcasecmp(c, "EVILED")) { |
2086 | 760 int lev; |
761 char *name; | |
762 | |
763 sscanf(strtok(NULL, ":"), "%d", &lev); | |
764 name = strtok(NULL, ":"); | |
765 | |
766 serv_got_eviled(gc, name, lev); | |
4793 | 767 } else if (!g_ascii_strcasecmp(c, "CHAT_JOIN")) { |
2086 | 768 char *name; |
769 int id; | |
770 | |
771 sscanf(strtok(NULL, ":"), "%d", &id); | |
772 name = strtok(NULL, ":"); | |
773 | |
774 serv_got_joined_chat(gc, id, name); | |
4793 | 775 } else if (!g_ascii_strcasecmp(c, "CHAT_IN")) { |
2086 | 776 int id, w; |
777 char *m, *who, *whisper; | |
778 | |
779 sscanf(strtok(NULL, ":"), "%d", &id); | |
780 who = strtok(NULL, ":"); | |
781 whisper = strtok(NULL, ":"); | |
782 m = whisper; | |
783 while (*m && (*m != ':')) | |
784 m++; | |
785 m++; | |
786 | |
787 w = (whisper && (*whisper == 'T')) ? 1 : 0; | |
788 | |
789 serv_got_chat_in(gc, id, who, w, m, time((time_t)NULL)); | |
4793 | 790 } else if (!g_ascii_strcasecmp(c, "CHAT_UPDATE_BUDDY")) { |
2086 | 791 int id; |
792 char *in, *buddy; | |
793 GSList *bcs = gc->buddy_chats; | |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4349
diff
changeset
|
794 struct gaim_conversation *b = NULL; |
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4349
diff
changeset
|
795 struct gaim_chat *chat; |
2086 | 796 |
797 sscanf(strtok(NULL, ":"), "%d", &id); | |
798 in = strtok(NULL, ":"); | |
799 | |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4349
diff
changeset
|
800 chat = GAIM_CHAT(b); |
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4349
diff
changeset
|
801 |
2086 | 802 while (bcs) { |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4349
diff
changeset
|
803 b = (struct gaim_conversation *)bcs->data; |
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4349
diff
changeset
|
804 if (id == gaim_chat_get_id(chat)) |
2086 | 805 break; |
806 bcs = bcs->next; | |
807 b = NULL; | |
808 } | |
809 | |
810 if (!b) | |
811 return; | |
812 | |
813 if (in && (*in == 'T')) | |
814 while ((buddy = strtok(NULL, ":")) != NULL) | |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4349
diff
changeset
|
815 gaim_chat_add_user(chat, buddy, NULL); |
2086 | 816 else |
817 while ((buddy = strtok(NULL, ":")) != NULL) | |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4349
diff
changeset
|
818 gaim_chat_remove_user(chat, buddy, NULL); |
4793 | 819 } else if (!g_ascii_strcasecmp(c, "CHAT_INVITE")) { |
2086 | 820 char *name, *who, *message; |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
821 int *id = g_new0(int, 1); |
2086 | 822 |
823 name = strtok(NULL, ":"); | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
824 sscanf(strtok(NULL, ":"), "%d", id); |
2086 | 825 who = strtok(NULL, ":"); |
826 message = strtok(NULL, ":"); | |
827 | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
828 serv_got_chat_invite(gc, name, who, message, g_list_append(NULL, id)); |
4793 | 829 } else if (!g_ascii_strcasecmp(c, "CHAT_LEFT")) { |
2086 | 830 GSList *bcs = gc->buddy_chats; |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4349
diff
changeset
|
831 struct gaim_conversation *b = NULL; |
2086 | 832 int id; |
833 | |
834 sscanf(strtok(NULL, ":"), "%d", &id); | |
835 | |
836 while (bcs) { | |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4349
diff
changeset
|
837 b = (struct gaim_conversation *)bcs->data; |
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4349
diff
changeset
|
838 if (id == gaim_chat_get_id(GAIM_CHAT(b))) |
2086 | 839 break; |
840 b = NULL; | |
841 bcs = bcs->next; | |
842 } | |
843 | |
844 if (!b) | |
845 return; | |
846 | |
847 if (b->window) { | |
848 char error_buf[BUF_LONG]; | |
4491 | 849 gaim_conversation_set_account(b, NULL); |
2086 | 850 g_snprintf(error_buf, sizeof error_buf, _("You have been disconnected" |
851 " from chat room %s."), b->name); | |
3427 | 852 do_error_dialog(error_buf, NULL, GAIM_ERROR); |
2086 | 853 } else |
854 serv_got_chat_left(gc, id); | |
4793 | 855 } else if (!g_ascii_strcasecmp(c, "GOTO_URL")) { |
2086 | 856 char *name, *url, tmp[256]; |
857 | |
858 name = strtok(NULL, ":"); | |
859 url = strtok(NULL, ":"); | |
860 | |
4597 | 861 g_snprintf(tmp, sizeof(tmp), "http://%s:%d/%s", tdt->toc_ip, |
4491 | 862 gc->account->proto_opt[USEROPT_AUTHPORT][0] ? |
863 atoi(gc->account->proto_opt[USEROPT_AUTHPORT]) : TOC_PORT, | |
2086 | 864 url); |
2584
34812d648f72
[gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2526
diff
changeset
|
865 grab_url(tmp, FALSE, toc_got_info, NULL); |
4793 | 866 } else if (!g_ascii_strcasecmp(c, "DIR_STATUS")) { |
867 } else if (!g_ascii_strcasecmp(c, "ADMIN_NICK_STATUS")) { | |
868 } else if (!g_ascii_strcasecmp(c, "ADMIN_PASSWD_STATUS")) { | |
3427 | 869 do_error_dialog(_("Password Change Successful"), NULL, GAIM_INFO); |
4793 | 870 } else if (!g_ascii_strcasecmp(c, "PAUSE")) { |
2086 | 871 tdt->state = STATE_PAUSE; |
3427 | 872 do_error_dialog(_("TOC has sent a PAUSE command."), _("When this happens, TOC ignores" |
2086 | 873 " any messages sent to it, and may kick you off if you send a" |
874 " message. Gaim will prevent anything from going through. This" | |
3427 | 875 " is only temporary, please be patient."), GAIM_WARNING); |
4793 | 876 } else if (!g_ascii_strcasecmp(c, "RVOUS_PROPOSE")) { |
2086 | 877 char *user, *uuid, *cookie; |
878 int seq; | |
3159 | 879 char *rip, *pip, *vip, *trillian = NULL; |
2086 | 880 int port; |
3126 | 881 |
2086 | 882 user = strtok(NULL, ":"); |
883 uuid = strtok(NULL, ":"); | |
884 cookie = strtok(NULL, ":"); | |
885 sscanf(strtok(NULL, ":"), "%d", &seq); | |
886 rip = strtok(NULL, ":"); | |
887 pip = strtok(NULL, ":"); | |
888 vip = strtok(NULL, ":"); | |
889 sscanf(strtok(NULL, ":"), "%d", &port); | |
890 | |
891 if (!strcmp(uuid, FILE_SEND_UID)) { | |
892 /* they want us to get a file */ | |
893 int unk[4], i; | |
894 char *messages[4], *tmp, *name; | |
895 int subtype, files, totalsize = 0; | |
896 struct ft_request *ft; | |
897 | |
898 for (i = 0; i < 4; i++) { | |
3126 | 899 trillian = strtok(NULL, ":"); |
900 sscanf(trillian, "%d", &unk[i]); | |
2086 | 901 if (unk[i] == 10001) |
902 break; | |
3126 | 903 /* Trillian likes to send an empty token as a message, rather than |
904 no message at all. */ | |
905 if (*(trillian + strlen(trillian) +1) != ':') | |
906 frombase64(strtok(NULL, ":"), &messages[i], NULL); | |
2086 | 907 } |
3126 | 908 |
2086 | 909 frombase64(strtok(NULL, ":"), &tmp, NULL); |
910 | |
911 subtype = tmp[1]; | |
912 files = tmp[3]; | |
913 | |
914 totalsize |= (tmp[4] << 24) & 0xff000000; | |
915 totalsize |= (tmp[5] << 16) & 0x00ff0000; | |
916 totalsize |= (tmp[6] << 8) & 0x0000ff00; | |
917 totalsize |= (tmp[7] << 0) & 0x000000ff; | |
918 | |
919 if (!totalsize) { | |
920 g_free(tmp); | |
921 for (i--; i >= 0; i--) | |
922 g_free(messages[i]); | |
923 return; | |
924 } | |
925 | |
926 name = tmp + 8; | |
927 | |
928 ft = g_new0(struct ft_request, 1); | |
929 ft->cookie = g_strdup(cookie); | |
930 ft->ip = g_strdup(pip); | |
931 ft->port = port; | |
932 if (i) | |
933 ft->message = g_strdup(messages[0]); | |
934 else | |
935 ft->message = NULL; | |
936 ft->filename = g_strdup(name); | |
937 ft->user = g_strdup(user); | |
938 ft->size = totalsize; | |
939 ft->files = files; | |
940 g_snprintf(ft->UID, sizeof(ft->UID), "%s", FILE_SEND_UID); | |
941 ft->gc = gc; | |
942 | |
943 g_free(tmp); | |
944 for (i--; i >= 0; i--) | |
945 g_free(messages[i]); | |
946 | |
947 debug_printf("English translation of RVOUS_PROPOSE: %s requests Send File (i.e." | |
948 " send a file to you); %s:%d (verified_ip:port), %d files at" | |
4201
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
949 " total size of %d bytes.\n", user, vip, port, files, totalsize); |
2086 | 950 accept_file_dialog(ft); |
951 } else if (!strcmp(uuid, FILE_GET_UID)) { | |
952 /* they want us to send a file */ | |
953 int unk[4], i; | |
954 char *messages[4], *tmp; | |
955 struct ft_request *ft; | |
956 | |
957 for (i = 0; i < 4; i++) { | |
958 sscanf(strtok(NULL, ":"), "%d", unk + i); | |
959 if (unk[i] == 10001) | |
960 break; | |
3126 | 961 /* Trillian likes to send an empty token as a message, rather than |
962 no message at all. */ | |
963 if (*(trillian + strlen(trillian) +1) != ':') | |
964 frombase64(strtok(NULL, ":"), &messages[i], NULL); | |
2086 | 965 } |
966 frombase64(strtok(NULL, ":"), &tmp, NULL); | |
967 | |
968 ft = g_new0(struct ft_request, 1); | |
969 ft->cookie = g_strdup(cookie); | |
970 ft->ip = g_strdup(pip); | |
971 ft->port = port; | |
972 if (i) | |
973 ft->message = g_strdup(messages[0]); | |
974 else | |
975 ft->message = NULL; | |
976 ft->user = g_strdup(user); | |
977 g_snprintf(ft->UID, sizeof(ft->UID), "%s", FILE_GET_UID); | |
978 ft->gc = gc; | |
979 | |
980 g_free(tmp); | |
981 for (i--; i >= 0; i--) | |
982 g_free(messages[i]); | |
983 | |
984 accept_file_dialog(ft); | |
985 } else if (!strcmp(uuid, VOICE_UID)) { | |
986 /* oh goody. voice over ip. fun stuff. */ | |
987 } else if (!strcmp(uuid, B_ICON_UID)) { | |
988 /* | |
989 int unk[4], i; | |
990 char *messages[4]; | |
991 struct buddy_icon *icon; | |
992 | |
993 for (i = 0; i < 4; i++) { | |
994 sscanf(strtok(NULL, ":"), "%d", unk + i); | |
995 if (unk[i] == 10001) | |
996 break; | |
997 frombase64(strtok(NULL, ":"), &messages[i], NULL); | |
998 } | |
999 frombase64(strtok(NULL, ":"), (char **)&icon, NULL); | |
1000 | |
1001 debug_printf("received icon of length %d\n", icon->len); | |
1002 g_free(icon); | |
1003 for (i--; i >= 0; i--) | |
1004 g_free(messages[i]); | |
1005 */ | |
1006 } else if (!strcmp(uuid, IMAGE_UID)) { | |
1007 /* aka Direct IM */ | |
1008 } else { | |
1009 debug_printf("Don't know what to do with RVOUS UUID %s\n", uuid); | |
1010 /* do we have to do anything here? i think it just times out */ | |
1011 } | |
1012 } else { | |
1013 debug_printf("don't know what to do with %s\n", c); | |
1014 } | |
1015 } | |
1016 | |
3033 | 1017 static int toc_send_im(struct gaim_connection *gc, char *name, char *message, int len, int flags) |
2086 | 1018 { |
1019 char buf[BUF_LEN * 2]; | |
2343
29449a6b79e6
[gaim-migrate @ 2356]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2334
diff
changeset
|
1020 char *tmp = g_malloc(strlen(message) * 4 + 1); /* 4 because \n gets replaced with <BR> */ |
2086 | 1021 |
2136
73253b36c3cb
[gaim-migrate @ 2146]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2130
diff
changeset
|
1022 strcpy(tmp, message); |
73253b36c3cb
[gaim-migrate @ 2146]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2130
diff
changeset
|
1023 escape_text(tmp); |
73253b36c3cb
[gaim-migrate @ 2146]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2130
diff
changeset
|
1024 if (strlen(tmp) + 52 > MSG_LEN) { |
73253b36c3cb
[gaim-migrate @ 2146]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2130
diff
changeset
|
1025 g_free(tmp); |
2123
56c4382f2909
[gaim-migrate @ 2133]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
1026 return -E2BIG; |
2136
73253b36c3cb
[gaim-migrate @ 2146]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2130
diff
changeset
|
1027 } |
2086 | 1028 g_snprintf(buf, MSG_LEN - 8, "toc_send_im %s \"%s\"%s", normalize(name), |
2231
8c4ff1a368bd
[gaim-migrate @ 2241]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
1029 tmp, ((flags & IM_FLAG_AWAY) ? " auto" : "")); |
2086 | 1030 sflap_send(gc, buf, -1, TYPE_DATA); |
2123
56c4382f2909
[gaim-migrate @ 2133]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
1031 |
2136
73253b36c3cb
[gaim-migrate @ 2146]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2130
diff
changeset
|
1032 g_free(tmp); |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2281
diff
changeset
|
1033 return 1; |
2086 | 1034 } |
1035 | |
1036 static void toc_set_config(struct gaim_connection *gc) | |
1037 { | |
2281
cc462108c101
[gaim-migrate @ 2291]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1038 char *buf = g_malloc(MSG_LEN), snd[BUF_LEN * 2]; |
4491 | 1039 toc_build_config(gc->account, buf, MSG_LEN - strlen("toc_set_config \\{\\}"), FALSE); |
2086 | 1040 g_snprintf(snd, MSG_LEN, "toc_set_config {%s}", buf); |
1041 sflap_send(gc, snd, -1, TYPE_DATA); | |
2281
cc462108c101
[gaim-migrate @ 2291]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1042 g_free(buf); |
2086 | 1043 } |
1044 | |
1045 static void toc_get_info(struct gaim_connection *g, char *name) | |
1046 { | |
1047 char buf[BUF_LEN * 2]; | |
1048 g_snprintf(buf, MSG_LEN, "toc_get_info %s", normalize(name)); | |
1049 sflap_send(g, buf, -1, TYPE_DATA); | |
1050 } | |
1051 | |
1052 static void toc_get_dir(struct gaim_connection *g, char *name) | |
1053 { | |
1054 char buf[BUF_LEN * 2]; | |
1055 g_snprintf(buf, MSG_LEN, "toc_get_dir %s", normalize(name)); | |
1056 sflap_send(g, buf, -1, TYPE_DATA); | |
1057 } | |
1058 | |
3466 | 1059 static void toc_set_dir(struct gaim_connection *g, const char *first, const char *middle, const char *last, |
1060 const char *maiden, const char *city, const char *state, const char *country, int web) | |
2086 | 1061 { |
1062 char buf2[BUF_LEN * 4], buf[BUF_LEN]; | |
1063 g_snprintf(buf2, sizeof(buf2), "%s:%s:%s:%s:%s:%s:%s:%s", first, | |
1064 middle, last, maiden, city, state, country, (web == 1) ? "Y" : ""); | |
1065 escape_text(buf2); | |
1066 g_snprintf(buf, sizeof(buf), "toc_set_dir %s", buf2); | |
1067 sflap_send(g, buf, -1, TYPE_DATA); | |
1068 } | |
1069 | |
3466 | 1070 static void toc_dir_search(struct gaim_connection *g, const char *first, const char *middle, const char *last, |
1071 const char *maiden, const char *city, const char *state, const char *country, const char *email) | |
2086 | 1072 { |
1073 char buf[BUF_LONG]; | |
1074 g_snprintf(buf, sizeof(buf) / 2, "toc_dir_search %s:%s:%s:%s:%s:%s:%s:%s", first, middle, | |
1075 last, maiden, city, state, country, email); | |
1076 debug_printf("Searching for: %s,%s,%s,%s,%s,%s,%s\n", first, middle, last, maiden, | |
1077 city, state, country); | |
1078 sflap_send(g, buf, -1, TYPE_DATA); | |
1079 } | |
1080 | |
1081 static void toc_set_away(struct gaim_connection *g, char *state, char *message) | |
1082 { | |
1083 char buf[BUF_LEN * 2]; | |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
3867
diff
changeset
|
1084 if (g->away) { |
2086 | 1085 g_free (g->away); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
3867
diff
changeset
|
1086 g->away = NULL; |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
3867
diff
changeset
|
1087 } |
2086 | 1088 if (message) { |
3188 | 1089 char *tmp = g_malloc(strlen(message) * 4 + 1); |
1090 strcpy(tmp, message); | |
2086 | 1091 g->away = g_strdup (message); |
3188 | 1092 escape_text(tmp); |
1093 g_snprintf(buf, MSG_LEN, "toc_set_away \"%s\"", tmp); | |
1094 g_free(tmp); | |
2086 | 1095 } else |
1096 g_snprintf(buf, MSG_LEN, "toc_set_away \"\""); | |
1097 sflap_send(g, buf, -1, TYPE_DATA); | |
1098 } | |
1099 | |
1100 static void toc_set_info(struct gaim_connection *g, char *info) | |
1101 { | |
1102 char buf[BUF_LEN * 2], buf2[BUF_LEN * 2]; | |
1103 g_snprintf(buf2, sizeof buf2, "%s", info); | |
1104 escape_text(buf2); | |
1105 g_snprintf(buf, sizeof(buf), "toc_set_info \"%s\n\"", buf2); | |
1106 sflap_send(g, buf, -1, TYPE_DATA); | |
1107 } | |
1108 | |
3466 | 1109 static void toc_change_passwd(struct gaim_connection *g, const char *orig, const char *new) |
2086 | 1110 { |
1111 char buf[BUF_LEN * 2]; | |
1112 g_snprintf(buf, BUF_LONG, "toc_change_passwd %s %s", orig, new); | |
1113 sflap_send(g, buf, strlen(buf), TYPE_DATA); | |
1114 } | |
1115 | |
3466 | 1116 static void toc_add_buddy(struct gaim_connection *g, const char *name) |
2086 | 1117 { |
1118 char buf[BUF_LEN * 2]; | |
1119 g_snprintf(buf, sizeof(buf), "toc_add_buddy %s", normalize(name)); | |
1120 sflap_send(g, buf, -1, TYPE_DATA); | |
1121 toc_set_config(g); | |
1122 } | |
1123 | |
2334
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1124 static void toc_add_buddies(struct gaim_connection *g, GList *buddies) |
2086 | 1125 { |
1126 char buf[BUF_LEN * 2]; | |
1127 int n; | |
1128 | |
1129 n = g_snprintf(buf, sizeof(buf), "toc_add_buddy"); | |
1130 while (buddies) { | |
2130
50c7a704ee56
[gaim-migrate @ 2140]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2128
diff
changeset
|
1131 if (strlen(normalize(buddies->data)) + n + 32 > MSG_LEN) { |
2086 | 1132 sflap_send(g, buf, -1, TYPE_DATA); |
1133 n = g_snprintf(buf, sizeof(buf), "toc_add_buddy"); | |
1134 } | |
1135 n += g_snprintf(buf + n, sizeof(buf) - n, " %s", normalize(buddies->data)); | |
1136 buddies = buddies->next; | |
1137 } | |
1138 sflap_send(g, buf, -1, TYPE_DATA); | |
1139 } | |
1140 | |
2681
37d80035e77f
[gaim-migrate @ 2694]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2597
diff
changeset
|
1141 static void toc_remove_buddy(struct gaim_connection *g, char *name, char *group) |
2086 | 1142 { |
1143 char buf[BUF_LEN * 2]; | |
1144 g_snprintf(buf, sizeof(buf), "toc_remove_buddy %s", normalize(name)); | |
1145 sflap_send(g, buf, -1, TYPE_DATA); | |
1146 toc_set_config(g); | |
1147 } | |
1148 | |
3867 | 1149 static void toc_remove_buddies(struct gaim_connection *g, GList *buddies, const char *group) |
2334
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1150 { |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1151 char buf[BUF_LEN * 2]; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1152 int n; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1153 |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1154 n = g_snprintf(buf, sizeof(buf), "toc_remove_buddy"); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1155 while (buddies) { |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1156 if (strlen(normalize(buddies->data)) + n + 32 > MSG_LEN) { |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1157 sflap_send(g, buf, -1, TYPE_DATA); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1158 n = g_snprintf(buf, sizeof(buf), "toc_remove_buddy"); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1159 } |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1160 n += g_snprintf(buf + n, sizeof(buf) - n, " %s", normalize(buddies->data)); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1161 buddies = buddies->next; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1162 } |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1163 sflap_send(g, buf, -1, TYPE_DATA); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1164 toc_set_config(g); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1165 } |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1166 |
2086 | 1167 static void toc_set_idle(struct gaim_connection *g, int time) |
1168 { | |
1169 char buf[BUF_LEN * 2]; | |
1170 g_snprintf(buf, sizeof(buf), "toc_set_idle %d", time); | |
1171 sflap_send(g, buf, -1, TYPE_DATA); | |
1172 } | |
1173 | |
1174 static void toc_warn(struct gaim_connection *g, char *name, int anon) | |
1175 { | |
1176 char send[BUF_LEN * 2]; | |
1177 g_snprintf(send, 255, "toc_evil %s %s", name, ((anon) ? "anon" : "norm")); | |
1178 sflap_send(g, send, -1, TYPE_DATA); | |
1179 } | |
1180 | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1181 static GList *toc_chat_info(struct gaim_connection *gc) |
2086 | 1182 { |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1183 GList *m = NULL; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1184 struct proto_chat_entry *pce; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1185 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1186 pce = g_new0(struct proto_chat_entry, 1); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1187 pce->label = _("Join what group:"); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1188 m = g_list_append(m, pce); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1189 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1190 pce = g_new0(struct proto_chat_entry, 1); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1191 pce->label = _("Exchange:"); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1192 pce->is_int = TRUE; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1193 pce->min = 4; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1194 pce->max = 20; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1195 m = g_list_append(m, pce); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1196 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1197 return m; |
2086 | 1198 } |
1199 | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1200 static void toc_join_chat(struct gaim_connection *g, GList *data) |
2086 | 1201 { |
1202 char buf[BUF_LONG]; | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1203 int *exchange; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1204 char *name; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1205 int *i; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1206 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1207 if (!data) |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1208 return; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1209 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1210 if (!data->next) { |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1211 i = data->data; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1212 g_snprintf(buf, 255, "toc_chat_accept %d", *i); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1213 } else { |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1214 name = data->data; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1215 exchange = data->next->data; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1216 g_snprintf(buf, sizeof(buf) / 2, "toc_chat_join %d \"%s\"", *exchange, name); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1217 } |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1218 |
2086 | 1219 sflap_send(g, buf, -1, TYPE_DATA); |
1220 } | |
1221 | |
3466 | 1222 static void toc_chat_invite(struct gaim_connection *g, int id, const char *message, const char *name) |
2086 | 1223 { |
1224 char buf[BUF_LONG]; | |
2719
9747583279d1
[gaim-migrate @ 2732]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2706
diff
changeset
|
1225 g_snprintf(buf, sizeof(buf) / 2, "toc_chat_invite %d \"%s\" %s", id, |
9747583279d1
[gaim-migrate @ 2732]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2706
diff
changeset
|
1226 message ? message : "", normalize(name)); |
2086 | 1227 sflap_send(g, buf, -1, TYPE_DATA); |
1228 } | |
1229 | |
1230 static void toc_chat_leave(struct gaim_connection *g, int id) | |
1231 { | |
1232 GSList *bcs = g->buddy_chats; | |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4349
diff
changeset
|
1233 struct gaim_conversation *b = NULL; |
2086 | 1234 char buf[BUF_LEN * 2]; |
1235 | |
1236 while (bcs) { | |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4349
diff
changeset
|
1237 b = (struct gaim_conversation *)bcs->data; |
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4349
diff
changeset
|
1238 if (id == gaim_chat_get_id(GAIM_CHAT(b))) |
2086 | 1239 break; |
1240 b = NULL; | |
1241 bcs = bcs->next; | |
1242 } | |
1243 | |
1244 if (!b) | |
1245 return; /* can this happen? */ | |
1246 | |
4491 | 1247 if (gaim_conversation_get_account(b) == NULL) { |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4349
diff
changeset
|
1248 /* TOC already kicked us out of this room */ |
2086 | 1249 serv_got_chat_left(g, id); |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4349
diff
changeset
|
1250 } |
2086 | 1251 else { |
1252 g_snprintf(buf, 255, "toc_chat_leave %d", id); | |
1253 sflap_send(g, buf, -1, TYPE_DATA); | |
1254 } | |
1255 } | |
1256 | |
1257 static void toc_chat_whisper(struct gaim_connection *g, int id, char *who, char *message) | |
1258 { | |
1259 char buf2[BUF_LEN * 2]; | |
2371
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
1260 escape_text(message); |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
1261 g_snprintf(buf2, sizeof(buf2), "toc_chat_whisper %d %s \"%s\"", id, normalize(who), message); |
2086 | 1262 sflap_send(g, buf2, -1, TYPE_DATA); |
1263 } | |
1264 | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
1265 static int toc_chat_send(struct gaim_connection *g, int id, char *message) |
2086 | 1266 { |
1267 char buf[BUF_LEN * 2]; | |
1268 escape_text(message); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
1269 if (strlen(message) > 2000) |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
1270 return -E2BIG; |
2086 | 1271 g_snprintf(buf, sizeof(buf), "toc_chat_send %d \"%s\"", id, message); |
1272 sflap_send(g, buf, -1, TYPE_DATA); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
1273 return 0; |
2086 | 1274 } |
1275 | |
1276 static void toc_keepalive(struct gaim_connection *gc) | |
1277 { | |
1278 sflap_send(gc, "", 0, TYPE_KEEPALIVE); | |
1279 } | |
1280 | |
4687 | 1281 static const char *toc_list_icon(struct gaim_account *a, struct buddy *b) |
2086 | 1282 { |
4687 | 1283 return "aim"; |
1284 } | |
4916 | 1285 |
1286 static void oscar_list_emblems(struct buddy *b, char **se, char **sw, char **nw, char **ne) | |
1287 { | |
1288 char *emblems[4] = {NULL,NULL,NULL,NULL}; | |
1289 int i = 0; | |
1290 | |
1291 if (b->present == 0) { | |
1292 *se = "offline"; | |
1293 return; | |
1294 } else { | |
1295 if (b->uc & UC_UNAVAILABLE) | |
1296 emblems[i++] = "away"; | |
1297 if (b->uc & UC_AOL) | |
1298 emblems[i++] = "aol"; | |
1299 if (b->uc & UC_ADMIN) | |
1300 emblems[i++] = "admin"; | |
1301 if (b->uc & UC_WIRELESS) | |
1302 emblems[i++] = "wireless"; | |
1303 } | |
1304 *se = emblems[0]; | |
1305 *sw = emblems[1]; | |
1306 *nw = emblems[2]; | |
1307 *ne = emblems[3]; | |
1308 } | |
2086 | 1309 |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1310 static GList *toc_buddy_menu(struct gaim_connection *gc, char *who) |
2086 | 1311 { |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1312 GList *m = NULL; |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1313 struct proto_buddy_menu *pbm; |
2086 | 1314 |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1315 pbm = g_new0(struct proto_buddy_menu, 1); |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1316 pbm->label = _("Get Dir Info"); |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1317 pbm->callback = toc_get_dir; |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1318 pbm->gc = gc; |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1319 m = g_list_append(m, pbm); |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1320 |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1321 return m; |
2086 | 1322 } |
1323 | |
4349 | 1324 static void toc_add_permit(struct gaim_connection *gc, const char *who) |
2086 | 1325 { |
1326 char buf2[BUF_LEN * 2]; | |
4491 | 1327 if (gc->account->permdeny != 3) |
2086 | 1328 return; |
1329 g_snprintf(buf2, sizeof(buf2), "toc_add_permit %s", normalize(who)); | |
1330 sflap_send(gc, buf2, -1, TYPE_DATA); | |
1331 toc_set_config(gc); | |
1332 } | |
1333 | |
4349 | 1334 static void toc_add_deny(struct gaim_connection *gc, const char *who) |
2086 | 1335 { |
1336 char buf2[BUF_LEN * 2]; | |
4491 | 1337 if (gc->account->permdeny != 4) |
2086 | 1338 return; |
1339 g_snprintf(buf2, sizeof(buf2), "toc_add_deny %s", normalize(who)); | |
1340 sflap_send(gc, buf2, -1, TYPE_DATA); | |
1341 toc_set_config(gc); | |
1342 } | |
1343 | |
1344 static void toc_set_permit_deny(struct gaim_connection *gc) | |
1345 { | |
1346 char buf2[BUF_LEN * 2]; | |
1347 GSList *list; | |
1348 int at; | |
1349 | |
4491 | 1350 switch (gc->account->permdeny) { |
2086 | 1351 case 1: |
1352 /* permit all, deny none. to get here reliably we need to have been in permit | |
1353 * mode, and send an empty toc_add_deny message, which will switch us to deny none */ | |
1354 g_snprintf(buf2, sizeof(buf2), "toc_add_permit "); | |
1355 sflap_send(gc, buf2, -1, TYPE_DATA); | |
1356 g_snprintf(buf2, sizeof(buf2), "toc_add_deny "); | |
1357 sflap_send(gc, buf2, -1, TYPE_DATA); | |
1358 break; | |
1359 case 2: | |
1360 /* deny all, permit none. to get here reliably we need to have been in deny | |
1361 * mode, and send an empty toc_add_permit message, which will switch us to permit none */ | |
1362 g_snprintf(buf2, sizeof(buf2), "toc_add_deny "); | |
1363 sflap_send(gc, buf2, -1, TYPE_DATA); | |
1364 g_snprintf(buf2, sizeof(buf2), "toc_add_permit "); | |
1365 sflap_send(gc, buf2, -1, TYPE_DATA); | |
1366 break; | |
1367 case 3: | |
1368 /* permit some. we want to switch to deny mode first, then send the toc_add_permit | |
1369 * message, which will clear and set our permit list. toc sucks. */ | |
1370 g_snprintf(buf2, sizeof(buf2), "toc_add_deny "); | |
1371 sflap_send(gc, buf2, -1, TYPE_DATA); | |
1372 | |
1373 at = g_snprintf(buf2, sizeof(buf2), "toc_add_permit "); | |
4491 | 1374 list = gc->account->permit; |
2086 | 1375 while (list) { |
1376 at += g_snprintf(buf2 + at, sizeof(buf2) - at, "%s ", normalize(list->data)); | |
1377 if (at > MSG_LEN + 32) { /* from out my ass comes greatness */ | |
1378 sflap_send(gc, buf2, -1, TYPE_DATA); | |
1379 at = g_snprintf(buf2, sizeof(buf2), "toc_add_permit "); | |
1380 } | |
1381 list = list->next; | |
1382 } | |
1383 sflap_send(gc, buf2, -1, TYPE_DATA); | |
1384 break; | |
1385 case 4: | |
1386 /* deny some. we want to switch to permit mode first, then send the toc_add_deny | |
1387 * message, which will clear and set our deny list. toc sucks. */ | |
1388 g_snprintf(buf2, sizeof(buf2), "toc_add_permit "); | |
1389 sflap_send(gc, buf2, -1, TYPE_DATA); | |
1390 | |
1391 at = g_snprintf(buf2, sizeof(buf2), "toc_add_deny "); | |
4491 | 1392 list = gc->account->deny; |
2086 | 1393 while (list) { |
1394 at += g_snprintf(buf2 + at, sizeof(buf2) - at, "%s ", normalize(list->data)); | |
1395 if (at > MSG_LEN + 32) { /* from out my ass comes greatness */ | |
1396 sflap_send(gc, buf2, -1, TYPE_DATA); | |
1397 at = g_snprintf(buf2, sizeof(buf2), "toc_add_deny "); | |
1398 } | |
1399 list = list->next; | |
1400 } | |
1401 sflap_send(gc, buf2, -1, TYPE_DATA); | |
1402 break; | |
1403 default: | |
1404 break; | |
1405 } | |
1406 toc_set_config(gc); | |
1407 } | |
1408 | |
4349 | 1409 static void toc_rem_permit(struct gaim_connection *gc, const char *who) |
2086 | 1410 { |
4491 | 1411 if (gc->account->permdeny != 3) |
2086 | 1412 return; |
1413 toc_set_permit_deny(gc); | |
1414 } | |
1415 | |
4349 | 1416 static void toc_rem_deny(struct gaim_connection *gc, const char *who) |
2086 | 1417 { |
4491 | 1418 if (gc->account->permdeny != 4) |
2086 | 1419 return; |
1420 toc_set_permit_deny(gc); | |
1421 } | |
1422 | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2453
diff
changeset
|
1423 static GList *toc_away_states(struct gaim_connection *gc) |
2086 | 1424 { |
1425 return g_list_append(NULL, GAIM_AWAY_CUSTOM); | |
1426 } | |
1427 | |
4333 | 1428 static GList *toc_actions(struct gaim_connection *gc) |
2086 | 1429 { |
1430 GList *m = NULL; | |
4333 | 1431 struct proto_actions_menu *pam; |
2086 | 1432 |
4333 | 1433 pam = g_new0(struct proto_actions_menu, 1); |
1434 pam->label = _("Set User Info"); | |
1435 pam->callback = show_set_info; | |
1436 pam->gc = gc; | |
1437 m = g_list_append(m, pam); | |
1438 | |
1439 pam = g_new0(struct proto_actions_menu, 1); | |
1440 pam->label = _("Set Dir Info"); | |
1441 pam->callback = show_set_dir; | |
1442 pam->gc = gc; | |
1443 m = g_list_append(m, pam); | |
1444 | |
1445 pam = g_new0(struct proto_actions_menu, 1); | |
1446 pam->label = _("Change Password"); | |
1447 pam->callback = show_change_passwd; | |
1448 pam->gc = gc; | |
1449 m = g_list_append(m, pam); | |
2086 | 1450 |
1451 return m; | |
1452 } | |
1453 | |
3630 | 1454 G_MODULE_EXPORT void toc_init(struct prpl *ret) |
3572 | 1455 { |
1456 struct proto_user_opt *puo; | |
2086 | 1457 ret->protocol = PROTO_TOC; |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1458 ret->options = OPT_PROTO_CORRECT_TIME; |
3572 | 1459 ret->name = g_strdup("TOC"); |
2086 | 1460 ret->list_icon = toc_list_icon; |
1461 ret->away_states = toc_away_states; | |
1462 ret->actions = toc_actions; | |
1463 ret->buddy_menu = toc_buddy_menu; | |
1464 ret->login = toc_login; | |
1465 ret->close = toc_close; | |
1466 ret->send_im = toc_send_im; | |
1467 ret->set_info = toc_set_info; | |
1468 ret->get_info = toc_get_info; | |
1469 ret->set_away = toc_set_away; | |
1470 ret->set_dir = toc_set_dir; | |
1471 ret->get_dir = toc_get_dir; | |
1472 ret->dir_search = toc_dir_search; | |
1473 ret->set_idle = toc_set_idle; | |
1474 ret->change_passwd = toc_change_passwd; | |
1475 ret->add_buddy = toc_add_buddy; | |
1476 ret->add_buddies = toc_add_buddies; | |
1477 ret->remove_buddy = toc_remove_buddy; | |
2334
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1478 ret->remove_buddies = toc_remove_buddies; |
2086 | 1479 ret->add_permit = toc_add_permit; |
1480 ret->add_deny = toc_add_deny; | |
1481 ret->rem_permit = toc_rem_permit; | |
1482 ret->rem_deny = toc_rem_deny; | |
1483 ret->set_permit_deny = toc_set_permit_deny; | |
1484 ret->warn = toc_warn; | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1485 ret->chat_info = toc_chat_info; |
2086 | 1486 ret->join_chat = toc_join_chat; |
1487 ret->chat_invite = toc_chat_invite; | |
1488 ret->chat_leave = toc_chat_leave; | |
1489 ret->chat_whisper = toc_chat_whisper; | |
1490 ret->chat_send = toc_chat_send; | |
1491 ret->keepalive = toc_keepalive; | |
1492 | |
3572 | 1493 puo = g_new0(struct proto_user_opt, 1); |
4115 | 1494 puo->label = g_strdup(_("TOC Host:")); |
3572 | 1495 puo->def = g_strdup("toc.oscar.aol.com"); |
1496 puo->pos = USEROPT_AUTH; | |
1497 ret->user_opts = g_list_append(ret->user_opts, puo); | |
1498 | |
1499 puo = g_new0(struct proto_user_opt, 1); | |
4115 | 1500 puo->label = g_strdup(_("TOC Port:")); |
3572 | 1501 puo->def = g_strdup("9898"); |
1502 puo->pos = USEROPT_AUTHPORT; | |
1503 ret->user_opts = g_list_append(ret->user_opts, puo); | |
1504 | |
2086 | 1505 my_protocol = ret; |
1506 } | |
1507 | |
1508 #ifndef STATIC | |
1509 | |
3630 | 1510 G_MODULE_EXPORT void gaim_prpl_init(struct prpl *prpl) |
2086 | 1511 { |
3572 | 1512 toc_init(prpl); |
1513 prpl->plug->desc.api_version = PLUGIN_API_VERSION; | |
2086 | 1514 } |
1515 | |
1516 #endif | |
1517 | |
1518 /********* | |
1519 * RVOUS ACTIONS | |
1520 ********/ | |
1521 | |
1522 struct file_header { | |
1523 char magic[4]; /* 0 */ | |
1524 short hdrlen; /* 4 */ | |
1525 short hdrtype; /* 6 */ | |
1526 char bcookie[8]; /* 8 */ | |
1527 short encrypt; /* 16 */ | |
1528 short compress; /* 18 */ | |
1529 short totfiles; /* 20 */ | |
1530 short filesleft; /* 22 */ | |
1531 short totparts; /* 24 */ | |
1532 short partsleft; /* 26 */ | |
1533 long totsize; /* 28 */ | |
1534 long size; /* 32 */ | |
1535 long modtime; /* 36 */ | |
1536 long checksum; /* 40 */ | |
1537 long rfrcsum; /* 44 */ | |
1538 long rfsize; /* 48 */ | |
1539 long cretime; /* 52 */ | |
1540 long rfcsum; /* 56 */ | |
1541 long nrecvd; /* 60 */ | |
1542 long recvcsum; /* 64 */ | |
1543 char idstring[32]; /* 68 */ | |
1544 char flags; /* 100 */ | |
1545 char lnameoffset; /* 101 */ | |
1546 char lsizeoffset; /* 102 */ | |
1547 char dummy[69]; /* 103 */ | |
1548 char macfileinfo[16]; /* 172 */ | |
1549 short nencode; /* 188 */ | |
1550 short nlanguage; /* 190 */ | |
1551 char name[64]; /* 192 */ | |
1552 /* 256 */ | |
1553 }; | |
1554 | |
1555 struct file_transfer { | |
1556 struct file_header hdr; | |
1557 | |
1558 struct gaim_connection *gc; | |
1559 | |
1560 char *user; | |
1561 char *cookie; | |
1562 char *ip; | |
1563 int port; | |
1564 long size; | |
1565 struct stat st; | |
1566 | |
1567 GtkWidget *window; | |
1568 int files; | |
1569 char *filename; | |
1570 FILE *file; | |
1571 int recvsize; | |
1572 | |
1573 gint inpa; | |
1574 }; | |
1575 | |
1576 static void debug_header(struct file_transfer *ft) { | |
1577 struct file_header *f = (struct file_header *)ft; | |
1578 debug_printf("TOC FT HEADER:\n" | |
1579 "\t%s %d 0x%04x\n" | |
1580 "\t%s %d %d\n" | |
4201
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1581 "\t%d %d %d %d %d %d\n" |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1582 "\t%d %d %d %d %d %d %d %d\n" |
2086 | 1583 "\t%s\n" |
1584 "\t0x%02x, 0x%02x, 0x%02x\n" | |
1585 "\t%s %s\n" | |
1586 "\t%d %d\n" | |
1587 "\t%s\n", | |
1588 f->magic, ntohs(f->hdrlen), f->hdrtype, | |
1589 f->bcookie, ntohs(f->encrypt), ntohs(f->compress), | |
1590 ntohs(f->totfiles), ntohs(f->filesleft), ntohs(f->totparts), | |
1591 ntohs(f->partsleft), ntohl(f->totsize), ntohl(f->size), | |
1592 ntohl(f->modtime), ntohl(f->checksum), ntohl(f->rfrcsum), ntohl(f->rfsize), | |
1593 ntohl(f->cretime), ntohl(f->rfcsum), ntohl(f->nrecvd), | |
1594 ntohl(f->recvcsum), | |
1595 f->idstring, | |
1596 f->flags, f->lnameoffset, f->lsizeoffset, | |
1597 f->dummy, f->macfileinfo, | |
1598 ntohs(f->nencode), ntohs(f->nlanguage), | |
1599 f->name); | |
1600 } | |
1601 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1602 static void toc_send_file_callback(gpointer data, gint source, GaimInputCondition cond) |
2086 | 1603 { |
1604 char buf[BUF_LONG]; | |
1605 int rt, i; | |
1606 | |
1607 struct file_transfer *ft = data; | |
1608 | |
1609 if (ft->hdr.hdrtype != 0x202) { | |
1610 char *buf; | |
1611 frombase64(ft->cookie, &buf, NULL); | |
1612 | |
3630 | 1613 toc_read(source, ft, 8); |
1614 toc_read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); | |
2086 | 1615 debug_header(ft); |
1616 | |
1617 ft->hdr.hdrtype = 0x202; | |
1618 memcpy(ft->hdr.bcookie, buf, 8); | |
1619 g_free(buf); | |
1620 ft->hdr.encrypt = 0; ft->hdr.compress = 0; | |
1621 debug_header(ft); | |
3630 | 1622 toc_write(source, ft, 256); |
2086 | 1623 |
1624 if (ft->files == 1) { | |
1625 ft->file = fopen(ft->filename, "w"); | |
1626 if (!ft->file) { | |
4115 | 1627 buf = g_strdup_printf(_("Could not open %s for writing!"), ft->filename); |
3427 | 1628 do_error_dialog(buf, strerror(errno), GAIM_ERROR); |
2086 | 1629 g_free(buf); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1630 gaim_input_remove(ft->inpa); |
3630 | 1631 toc_soc_close(source); |
2086 | 1632 g_free(ft->filename); |
1633 g_free(ft->user); | |
1634 g_free(ft->ip); | |
1635 g_free(ft->cookie); | |
1636 g_free(ft); | |
1637 } | |
1638 } else { | |
1639 buf = g_strdup_printf("%s/%s", ft->filename, ft->hdr.name); | |
1640 ft->file = fopen(buf, "w"); | |
1641 g_free(buf); | |
1642 if (!ft->file) { | |
1643 buf = g_strdup_printf("Could not open %s/%s for writing!", ft->filename, | |
1644 ft->hdr.name); | |
3427 | 1645 do_error_dialog(buf, strerror(errno), GAIM_ERROR); |
2086 | 1646 g_free(buf); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1647 gaim_input_remove(ft->inpa); |
3630 | 1648 toc_soc_close(source); |
2086 | 1649 g_free(ft->filename); |
1650 g_free(ft->user); | |
1651 g_free(ft->ip); | |
1652 g_free(ft->cookie); | |
1653 g_free(ft); | |
1654 } | |
1655 } | |
1656 | |
1657 return; | |
1658 } | |
1659 | |
3630 | 1660 rt = toc_read(source, buf, MIN(ntohl(ft->hdr.size) - ft->recvsize, 1024)); |
2086 | 1661 if (rt < 0) { |
3427 | 1662 do_error_dialog("File transfer failed; other side probably canceled.", NULL, GAIM_ERROR); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1663 gaim_input_remove(ft->inpa); |
3630 | 1664 toc_soc_close(source); |
2086 | 1665 g_free(ft->user); |
1666 g_free(ft->ip); | |
1667 g_free(ft->cookie); | |
1668 if (ft->file) | |
1669 fclose(ft->file); | |
1670 g_free(ft); | |
1671 return; | |
1672 } | |
1673 ft->recvsize += rt; | |
1674 for (i = 0; i < rt; i++) | |
1675 fprintf(ft->file, "%c", buf[i]); | |
1676 | |
1677 if (ft->recvsize == ntohl(ft->hdr.size)) { | |
1678 ft->hdr.hdrtype = htons(0x0204); | |
1679 ft->hdr.filesleft = htons(ntohs(ft->hdr.filesleft) - 1); | |
1680 ft->hdr.partsleft = htons(ntohs(ft->hdr.partsleft) - 1); | |
1681 ft->hdr.recvcsum = ft->hdr.checksum; /* uh... */ | |
1682 ft->hdr.nrecvd = htons(ntohs(ft->hdr.nrecvd) + 1); | |
1683 ft->hdr.flags = 0; | |
3630 | 1684 toc_write(source, ft, 256); |
2086 | 1685 debug_header(ft); |
1686 ft->recvsize = 0; | |
1687 fclose(ft->file); | |
1688 if (ft->hdr.filesleft == 0) { | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1689 gaim_input_remove(ft->inpa); |
3630 | 1690 toc_soc_close(source); |
2086 | 1691 g_free(ft->filename); |
1692 g_free(ft->user); | |
1693 g_free(ft->ip); | |
1694 g_free(ft->cookie); | |
1695 g_free(ft); | |
1696 } | |
1697 } | |
1698 } | |
1699 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1700 static void toc_send_file_connect(gpointer data, gint src, GaimInputCondition cond) |
2086 | 1701 { |
1702 struct file_transfer *ft = data; | |
1703 | |
1704 if (src == -1) { | |
3427 | 1705 do_error_dialog(_("Could not connect for transfer."), NULL, GAIM_ERROR); |
2086 | 1706 g_free(ft->filename); |
1707 g_free(ft->cookie); | |
1708 g_free(ft->user); | |
1709 g_free(ft->ip); | |
1710 g_free(ft); | |
1711 return; | |
1712 } | |
1713 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1714 ft->inpa = gaim_input_add(src, GAIM_INPUT_READ, toc_send_file_callback, ft); |
2086 | 1715 } |
1716 | |
1717 static void toc_send_file(gpointer a, struct file_transfer *old_ft) | |
1718 { | |
1719 struct file_transfer *ft; | |
1720 const char *dirname = gtk_file_selection_get_filename(GTK_FILE_SELECTION(old_ft->window)); | |
4491 | 1721 struct gaim_account *account; |
2086 | 1722 char buf[BUF_LEN * 2]; |
1723 | |
1724 if (file_is_dir(dirname, old_ft->window)) | |
1725 return; | |
1726 ft = g_new0(struct file_transfer, 1); | |
1727 if (old_ft->files == 1) | |
1728 ft->filename = g_strdup(dirname); | |
1729 else | |
4793 | 1730 ft->filename = g_path_get_dirname(dirname); |
2086 | 1731 ft->cookie = g_strdup(old_ft->cookie); |
1732 ft->user = g_strdup(old_ft->user); | |
1733 ft->ip = g_strdup(old_ft->ip); | |
1734 ft->files = old_ft->files; | |
1735 ft->port = old_ft->port; | |
1736 ft->gc = old_ft->gc; | |
4491 | 1737 account = ft->gc->account; |
2086 | 1738 gtk_widget_destroy(old_ft->window); |
1739 | |
1740 g_snprintf(buf, sizeof(buf), "toc_rvous_accept %s %s %s", ft->user, ft->cookie, FILE_SEND_UID); | |
1741 sflap_send(ft->gc, buf, -1, TYPE_DATA); | |
1742 | |
4634 | 1743 if (proxy_connect(account, ft->ip, ft->port, toc_send_file_connect, ft) != 0) { |
3427 | 1744 do_error_dialog(_("Could not connect for transfer."), NULL, GAIM_ERROR); |
2086 | 1745 g_free(ft->filename); |
1746 g_free(ft->cookie); | |
1747 g_free(ft->user); | |
1748 g_free(ft->ip); | |
1749 g_free(ft); | |
1750 return; | |
1751 } | |
1752 } | |
1753 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1754 static void toc_get_file_callback(gpointer data, gint source, GaimInputCondition cond) |
2086 | 1755 { |
1756 char buf[BUF_LONG]; | |
1757 | |
1758 struct file_transfer *ft = data; | |
1759 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1760 if (cond & GAIM_INPUT_WRITE) { |
2086 | 1761 int remain = MIN(ntohl(ft->hdr.totsize) - ft->recvsize, 1024); |
1762 int i; | |
1763 for (i = 0; i < remain; i++) | |
1764 fscanf(ft->file, "%c", &buf[i]); | |
3630 | 1765 toc_write(source, buf, remain); |
2086 | 1766 ft->recvsize += remain; |
1767 if (ft->recvsize == ntohl(ft->hdr.totsize)) { | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1768 gaim_input_remove(ft->inpa); |
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1769 ft->inpa = gaim_input_add(source, GAIM_INPUT_READ, |
2086 | 1770 toc_get_file_callback, ft); |
1771 } | |
1772 return; | |
1773 } | |
1774 | |
1775 if (ft->hdr.hdrtype == htons(0x1108)) { | |
1776 struct tm *fortime; | |
1777 struct stat st; | |
4793 | 1778 char *basename; |
2086 | 1779 |
3630 | 1780 toc_read(source, ft, 8); |
1781 toc_read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); | |
2086 | 1782 debug_header(ft); |
1783 | |
1784 stat(ft->filename, &st); | |
1785 fortime = localtime(&st.st_mtime); | |
4793 | 1786 basename = g_path_get_basename(ft->filename); |
2086 | 1787 g_snprintf(buf, sizeof(buf), "%2d/%2d/%4d %2d:%2d %8ld %s\r\n", |
1788 fortime->tm_mon + 1, fortime->tm_mday, fortime->tm_year + 1900, | |
1789 fortime->tm_hour + 1, fortime->tm_min + 1, (long)st.st_size, | |
4793 | 1790 basename); |
3630 | 1791 toc_write(source, buf, ntohl(ft->hdr.size)); |
4793 | 1792 g_free(basename); |
2086 | 1793 return; |
1794 } | |
1795 | |
1796 if (ft->hdr.hdrtype == htons(0x1209)) { | |
3630 | 1797 toc_read(source, ft, 8); |
1798 toc_read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); | |
2086 | 1799 debug_header(ft); |
1800 return; | |
1801 } | |
1802 | |
1803 if (ft->hdr.hdrtype == htons(0x120b)) { | |
3630 | 1804 toc_read(source, ft, 8); |
1805 toc_read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); | |
2086 | 1806 debug_header(ft); |
1807 | |
1808 if (ft->hdr.hdrtype != htons(0x120c)) { | |
1809 g_snprintf(buf, sizeof(buf), "%s decided to cancel the transfer", ft->user); | |
3427 | 1810 do_error_dialog(buf, NULL, GAIM_ERROR); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1811 gaim_input_remove(ft->inpa); |
3630 | 1812 toc_soc_close(source); |
2086 | 1813 g_free(ft->filename); |
1814 g_free(ft->user); | |
1815 g_free(ft->ip); | |
1816 g_free(ft->cookie); | |
1817 if (ft->file) | |
1818 fclose(ft->file); | |
1819 g_free(ft); | |
1820 return; | |
1821 } | |
1822 | |
1823 ft->hdr.hdrtype = 0x0101; | |
1824 ft->hdr.totfiles = htons(1); ft->hdr.filesleft = htons(1); | |
1825 ft->hdr.flags = 0x20; | |
3630 | 1826 toc_write(source, ft, 256); |
2086 | 1827 return; |
1828 } | |
1829 | |
1830 if (ft->hdr.hdrtype == 0x0101) { | |
3630 | 1831 toc_read(source, ft, 8); |
1832 toc_read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); | |
2086 | 1833 debug_header(ft); |
1834 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1835 gaim_input_remove(ft->inpa); |
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1836 ft->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, |
2086 | 1837 toc_get_file_callback, ft); |
1838 return; | |
1839 } | |
1840 | |
1841 if (ft->hdr.hdrtype == 0x0202) { | |
3630 | 1842 toc_read(source, ft, 8); |
1843 toc_read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); | |
2086 | 1844 debug_header(ft); |
1845 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1846 gaim_input_remove(ft->inpa); |
3630 | 1847 toc_soc_close(source); |
2086 | 1848 g_free(ft->filename); |
1849 g_free(ft->user); | |
1850 g_free(ft->ip); | |
1851 g_free(ft->cookie); | |
1852 if (ft->file) | |
1853 fclose(ft->file); | |
1854 g_free(ft); | |
1855 return; | |
1856 } | |
1857 } | |
1858 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1859 static void toc_get_file_connect(gpointer data, gint src, GaimInputCondition cond) |
2086 | 1860 { |
1861 struct file_transfer *ft = data; | |
1862 struct file_header *hdr; | |
1863 char *buf; | |
4793 | 1864 char *basename; |
2086 | 1865 |
1866 if (src == -1) { | |
3427 | 1867 do_error_dialog(_("Could not connect for transfer!"), NULL, GAIM_ERROR); |
2086 | 1868 fclose(ft->file); |
1869 g_free(ft->filename); | |
1870 g_free(ft->cookie); | |
1871 g_free(ft->user); | |
1872 g_free(ft->ip); | |
1873 g_free(ft); | |
1874 return; | |
1875 } | |
1876 | |
1877 hdr = (struct file_header *)ft; | |
1878 hdr->magic[0] = 'O'; hdr->magic[1] = 'F'; hdr->magic[2] = 'T'; hdr->magic[3] = '2'; | |
1879 hdr->hdrlen = htons(256); | |
1880 hdr->hdrtype = htons(0x1108); | |
1881 frombase64(ft->cookie, &buf, NULL); | |
1882 g_snprintf(hdr->bcookie, 8, "%s", buf); | |
1883 g_free(buf); | |
1884 hdr->totfiles = htons(1); hdr->filesleft = htons(1); | |
1885 hdr->totparts = htons(1); hdr->partsleft = htons(1); | |
1886 hdr->totsize = htonl((long)ft->st.st_size); /* combined size of all files */ | |
1887 /* size = strlen("mm/dd/yyyy hh:mm sizesize 'name'\r\n") */ | |
4793 | 1888 basename = g_path_get_basename(ft->filename); |
1889 hdr->size = htonl(28 + strlen(basename)); /* size of listing.txt */ | |
1890 g_free(basename); | |
2086 | 1891 hdr->modtime = htonl(ft->st.st_mtime); |
1892 hdr->checksum = htonl(0x89f70000); /* uh... */ | |
1893 g_snprintf(hdr->idstring, 32, "OFT_Windows ICBMFT V1.1 32"); | |
1894 hdr->flags = 0x02; | |
1895 hdr->lnameoffset = 0x1A; | |
1896 hdr->lsizeoffset = 0x10; | |
1897 g_snprintf(hdr->name, 64, "listing.txt"); | |
3630 | 1898 if (toc_write(src, hdr, 256) < 0) { |
3427 | 1899 do_error_dialog(_("Could not write file header. The file will not be transferred."), NULL, GAIM_ERROR); |
2086 | 1900 fclose(ft->file); |
1901 g_free(ft->filename); | |
1902 g_free(ft->cookie); | |
1903 g_free(ft->user); | |
1904 g_free(ft->ip); | |
1905 g_free(ft); | |
1906 return; | |
1907 } | |
1908 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1909 ft->inpa = gaim_input_add(src, GAIM_INPUT_READ, toc_get_file_callback, ft); |
2086 | 1910 } |
1911 | |
1912 static void toc_get_file(gpointer a, struct file_transfer *old_ft) | |
1913 { | |
1914 struct file_transfer *ft; | |
1915 const char *dirname = gtk_file_selection_get_filename(GTK_FILE_SELECTION(old_ft->window)); | |
4491 | 1916 struct gaim_account *account; |
2086 | 1917 char *buf, buf2[BUF_LEN * 2]; |
1918 | |
1919 if (file_is_dir(dirname, old_ft->window)) | |
1920 return; | |
1921 ft = g_new0(struct file_transfer, 1); | |
1922 ft->filename = g_strdup(dirname); | |
1923 ft->file = fopen(ft->filename, "r"); | |
1924 if (!ft->file) { | |
3427 | 1925 buf = g_strdup_printf("Unable to open %s for transfer.", ft->filename); |
1926 do_error_dialog(buf, NULL, GAIM_ERROR); | |
2086 | 1927 g_free(buf); |
1928 g_free(ft->filename); | |
1929 g_free(ft); | |
1930 return; | |
1931 } | |
1932 if (stat(dirname, &ft->st)) { | |
3427 | 1933 buf = g_strdup_printf("Unable to examine %s.", dirname); |
1934 do_error_dialog(buf, NULL, GAIM_ERROR); | |
2086 | 1935 g_free(buf); |
1936 g_free(ft->filename); | |
1937 g_free(ft); | |
1938 return; | |
1939 } | |
1940 ft->cookie = g_strdup(old_ft->cookie); | |
1941 ft->user = g_strdup(old_ft->user); | |
1942 ft->ip = g_strdup(old_ft->ip); | |
1943 ft->port = old_ft->port; | |
1944 ft->gc = old_ft->gc; | |
4491 | 1945 account = ft->gc->account; |
2086 | 1946 gtk_widget_destroy(old_ft->window); |
1947 | |
1948 g_snprintf(buf2, sizeof(buf2), "toc_rvous_accept %s %s %s", ft->user, ft->cookie, FILE_GET_UID); | |
1949 sflap_send(ft->gc, buf2, -1, TYPE_DATA); | |
1950 | |
4634 | 1951 if (proxy_connect(account, ft->ip, ft->port, toc_get_file_connect, ft) < 0) { |
3427 | 1952 do_error_dialog(_("Could not connect for transfer."), NULL, GAIM_ERROR); |
2086 | 1953 fclose(ft->file); |
1954 g_free(ft->filename); | |
1955 g_free(ft->cookie); | |
1956 g_free(ft->user); | |
1957 g_free(ft->ip); | |
1958 g_free(ft); | |
1959 return; | |
1960 } | |
1961 } | |
1962 | |
1963 static void cancel_callback(gpointer a, struct file_transfer *ft) { | |
1964 gtk_widget_destroy(ft->window); | |
1965 if (a == ft->window) { | |
1966 g_free(ft->cookie); | |
1967 g_free(ft->user); | |
1968 g_free(ft->ip); | |
1969 g_free(ft); | |
1970 } | |
1971 } | |
1972 | |
3867 | 1973 static void toc_reject_ft(struct ft_request *ft) { |
1974 g_free(ft->user); | |
1975 g_free(ft->filename); | |
1976 g_free(ft->ip); | |
1977 g_free(ft->cookie); | |
1978 if (ft->message) | |
1979 g_free(ft->message); | |
1980 g_free(ft); | |
1981 } | |
1982 | |
1983 | |
3730 | 1984 static void toc_accept_ft(struct ft_request *fr) { |
4249 | 1985 if(g_slist_find(connections, fr->gc)) { |
1986 GtkWidget *window; | |
1987 char buf[BUF_LEN]; | |
2086 | 1988 |
4249 | 1989 struct file_transfer *ft = g_new0(struct file_transfer, 1); |
1990 ft->gc = fr->gc; | |
1991 ft->user = g_strdup(fr->user); | |
1992 ft->cookie = g_strdup(fr->cookie); | |
1993 ft->ip = g_strdup(fr->ip); | |
1994 ft->port = fr->port; | |
1995 ft->files = fr->files; | |
2086 | 1996 |
4249 | 1997 ft->window = window = gtk_file_selection_new(_("Gaim - Save As...")); |
1998 g_snprintf(buf, sizeof(buf), "%s/%s", gaim_home_dir(), fr->filename ? fr->filename : ""); | |
1999 gtk_file_selection_set_filename(GTK_FILE_SELECTION(window), buf); | |
4635 | 2000 g_signal_connect(G_OBJECT(window), "destroy", |
2001 G_CALLBACK(cancel_callback), ft); | |
2002 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(ft->window)->cancel_button), | |
2003 "clicked", G_CALLBACK(cancel_callback), ft); | |
2086 | 2004 |
4249 | 2005 if (!strcmp(fr->UID, FILE_SEND_UID)) |
4635 | 2006 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(window)->ok_button), |
2007 "clicked", G_CALLBACK(toc_send_file), ft); | |
4249 | 2008 else |
4635 | 2009 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(window)->ok_button), |
2010 "clicked", G_CALLBACK(toc_get_file), ft); | |
2086 | 2011 |
4249 | 2012 gtk_widget_show(window); |
2013 } | |
2014 | |
3867 | 2015 toc_reject_ft(fr); |
2086 | 2016 } |
2017 | |
2018 static void accept_file_dialog(struct ft_request *ft) { | |
2019 char buf[BUF_LONG]; | |
2020 if (!strcmp(ft->UID, FILE_SEND_UID)) { | |
2021 /* holy crap. who the fuck would transfer gigabytes through AIM?! */ | |
2022 static char *sizes[4] = { "bytes", "KB", "MB", "GB" }; | |
2023 float size = ft->size; | |
2024 int index = 0; | |
2025 while ((index < 4) && (size > 1024)) { | |
2026 size /= 1024; | |
2027 index++; | |
2028 } | |
2943 | 2029 g_snprintf(buf, sizeof(buf), |
4276 | 2030 ngettext( |
2031 "%s requests %s to accept %d file: %s (%.2f %s)%s%s", | |
2032 "%s requests %s to accept %d files: %s (%.2f %s)%s%s", | |
2033 ft->files), | |
2943 | 2034 ft->user, ft->gc->username, ft->files, |
2086 | 2035 ft->filename, size, sizes[index], (ft->message) ? "\n" : "", |
2036 (ft->message) ? ft->message : ""); | |
2037 } else { | |
2038 g_snprintf(buf, sizeof(buf), _("%s requests you to send them a file"), ft->user); | |
2039 } | |
4249 | 2040 do_ask_dialog(buf, NULL, ft, _("Accept"), toc_accept_ft, _("Cancel"), toc_reject_ft, my_protocol->plug ? my_protocol->plug->handle : NULL, FALSE); |
2086 | 2041 } |