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