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