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