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