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