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