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