Mercurial > pidgin
annotate src/protocols/toc/toc.c @ 4343:36cb0bb95b9c
[gaim-migrate @ 4608]
HR works again. Thanks, KingAnt (Mark Doliner). This is rather hackish (The 5000 width) but hey.. it seems to work okay. Let me know if you have any problems with it. If someone wants to do this The Right Way (tm) then please feel free to do so..
committer: Tailor Script <tailor@pidgin.im>
| author | Rob Flynn <gaim@robflynn.com> |
|---|---|
| date | Sun, 19 Jan 2003 03:29:00 +0000 |
| parents | cc2f780c0505 |
| children | 0c68d402f59f |
| 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 case 989: |
|
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
517 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
|
518 break; |
|
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
519 default: |
| 3100 | 520 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
|
521 } |
|
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
522 |
|
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
523 return buf; |
|
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
524 } |
|
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
525 |
|
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
526 static void toc_callback(gpointer data, gint source, GaimInputCondition condition) |
| 2086 | 527 { |
| 528 struct gaim_connection *gc = (struct gaim_connection *)data; | |
| 529 struct toc_data *tdt = (struct toc_data *)gc->proto_data; | |
| 530 struct sflap_hdr *hdr; | |
| 531 struct signon so; | |
| 532 char buf[8 * 1024], *c; | |
| 533 char snd[BUF_LEN * 2]; | |
| 534 | |
| 535 /* there's data waiting to be read, so read it. */ | |
| 536 if (wait_reply(gc, buf, 8 * 1024) <= 0) { | |
| 3074 | 537 hide_login_progress_error(gc, _("Connection Closed")); |
| 2086 | 538 signoff(gc); |
| 539 return; | |
| 540 } | |
| 541 | |
| 542 if (tdt->state == STATE_FLAPON) { | |
| 543 hdr = (struct sflap_hdr *)buf; | |
| 544 if (hdr->type != TYPE_SIGNON) | |
| 545 debug_printf("problem, hdr->type != TYPE_SIGNON\n"); | |
| 546 else | |
| 547 debug_printf("* TOC sends Client FLAP SIGNON\n"); | |
| 548 tdt->seqno = ntohs(hdr->seqno); | |
| 549 tdt->state = STATE_SIGNON_REQUEST; | |
| 550 | |
| 551 debug_printf("* Client sends TOC FLAP SIGNON\n"); | |
| 552 g_snprintf(so.username, sizeof(so.username), "%s", gc->username); | |
| 553 so.ver = htonl(1); | |
| 554 so.tag = htons(1); | |
| 555 so.namelen = htons(strlen(so.username)); | |
| 556 if (sflap_send(gc, (char *)&so, ntohs(so.namelen) + 8, TYPE_SIGNON) < 0) { | |
| 557 hide_login_progress(gc, _("Disconnected.")); | |
| 558 signoff(gc); | |
| 559 return; | |
| 560 } | |
| 561 | |
| 562 debug_printf("* Client sends TOC \"toc_signon\" message\n"); | |
|
2853
f0633f458a1c
[gaim-migrate @ 2866]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
563 /* i hate icq. */ |
|
f0633f458a1c
[gaim-migrate @ 2866]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
564 if (gc->username[0] >= '0' && gc->username[0] <= '9') |
|
f0633f458a1c
[gaim-migrate @ 2866]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
565 gc->password[9] = '\0'; |
| 2086 | 566 g_snprintf(snd, sizeof snd, "toc_signon %s %d %s %s %s \"%s\"", |
| 567 AUTH_HOST, AUTH_PORT, normalize(gc->username), | |
| 568 roast_password(gc->password), LANGUAGE, REVISION); | |
| 569 if (sflap_send(gc, snd, -1, TYPE_DATA) < 0) { | |
| 570 hide_login_progress(gc, _("Disconnected.")); | |
| 571 signoff(gc); | |
| 572 return; | |
| 573 } | |
| 574 | |
| 575 set_login_progress(gc, 3, _("Waiting for reply...")); | |
| 576 return; | |
| 577 } | |
| 578 | |
| 579 if (tdt->state == STATE_SIGNON_REQUEST) { | |
| 580 debug_printf("* TOC sends client SIGN_ON reply\n"); | |
| 581 if (g_strncasecmp(buf + sizeof(struct sflap_hdr), "SIGN_ON", strlen("SIGN_ON"))) { | |
| 582 debug_printf("Didn't get SIGN_ON! buf was: %s\n", | |
| 583 buf + sizeof(struct sflap_hdr)); | |
|
2334
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
584 if (!g_strncasecmp(buf + sizeof(struct sflap_hdr), "ERROR", 5)) { |
|
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
585 strtok(buf + sizeof(struct sflap_hdr), ":"); |
|
2453
b72143059ad4
[gaim-migrate @ 2466]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2382
diff
changeset
|
586 hide_login_progress(gc, show_error_message()); |
|
2334
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
587 } else |
|
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
588 hide_login_progress(gc, _("Authentication Failed")); |
| 2086 | 589 signoff(gc); |
| 590 return; | |
| 591 } | |
| 592 /* 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
|
593 debug_printf("TOC version: %s\n", buf + sizeof(struct sflap_hdr) + 8); |
| 2086 | 594 |
| 595 /* we used to check for the CONFIG here, but we'll wait until we've sent our | |
| 596 * version of the config and then the toc_init_done message. we'll come back to | |
| 597 * the callback in a better state if we get CONFIG anyway */ | |
| 598 | |
| 599 tdt->state = STATE_ONLINE; | |
| 600 | |
| 601 account_online(gc); | |
| 602 serv_finish_login(gc); | |
| 603 | |
|
2518
e7478176e760
[gaim-migrate @ 2531]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
604 if (bud_list_cache_exists(gc)) |
|
e7478176e760
[gaim-migrate @ 2531]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
605 do_import(gc, NULL); |
| 2086 | 606 |
| 607 /* Client sends TOC toc_init_done message */ | |
| 608 debug_printf("* Client sends TOC toc_init_done message\n"); | |
| 609 g_snprintf(snd, sizeof snd, "toc_init_done"); | |
| 610 sflap_send(gc, snd, -1, TYPE_DATA); | |
| 611 | |
| 612 /* | |
| 613 g_snprintf(snd, sizeof snd, "toc_set_caps %s %s %s", | |
| 614 FILE_SEND_UID, FILE_GET_UID, B_ICON_UID); | |
| 615 */ | |
| 616 g_snprintf(snd, sizeof snd, "toc_set_caps %s %s", FILE_SEND_UID, FILE_GET_UID); | |
| 617 sflap_send(gc, snd, -1, TYPE_DATA); | |
| 618 | |
| 619 return; | |
| 620 } | |
| 621 | |
|
2334
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
622 debug_printf("TOC S: %s\n", buf + sizeof(struct sflap_hdr)); |
| 2086 | 623 |
| 624 c = strtok(buf + sizeof(struct sflap_hdr), ":"); /* Ditch the first part */ | |
| 625 | |
| 626 if (!g_strcasecmp(c, "SIGN_ON")) { | |
| 627 /* we should only get here after a PAUSE */ | |
| 628 if (tdt->state != STATE_PAUSE) | |
| 629 debug_printf("got SIGN_ON but not PAUSE!\n"); | |
| 630 else { | |
| 631 tdt->state = STATE_ONLINE; | |
| 632 g_snprintf(snd, sizeof snd, "toc_signon %s %d %s %s %s \"%s\"", | |
| 633 AUTH_HOST, AUTH_PORT, normalize(gc->username), | |
| 634 roast_password(gc->password), LANGUAGE, REVISION); | |
| 635 if (sflap_send(gc, snd, -1, TYPE_DATA) < 0) { | |
| 636 hide_login_progress(gc, _("Disconnected.")); | |
| 637 signoff(gc); | |
| 638 return; | |
| 639 } | |
|
2518
e7478176e760
[gaim-migrate @ 2531]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
640 if (bud_list_cache_exists(gc)) |
|
e7478176e760
[gaim-migrate @ 2531]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
641 do_import(gc, NULL); |
| 2086 | 642 g_snprintf(snd, sizeof snd, "toc_init_done"); |
| 643 sflap_send(gc, snd, -1, TYPE_DATA); | |
| 644 do_error_dialog(_("TOC has come back from its pause. You may now send" | |
| 3427 | 645 " messages again."), NULL, GAIM_INFO); |
| 2086 | 646 } |
| 647 } else if (!strcasecmp(c, "CONFIG")) { | |
| 648 c = strtok(NULL, ":"); | |
|
2526
413a81136e3a
[gaim-migrate @ 2539]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2518
diff
changeset
|
649 parse_toc_buddy_list(gc, c); |
| 2086 | 650 } else if (!strcasecmp(c, "NICK")) { |
| 651 /* ignore NICK so that things get imported/exported properly | |
| 652 c = strtok(NULL, ":"); | |
| 653 g_snprintf(gc->username, sizeof(gc->username), "%s", c); | |
| 654 */ | |
| 655 } else if (!strcasecmp(c, "IM_IN")) { | |
| 656 char *away, *message; | |
| 657 int a = 0; | |
| 658 | |
| 659 c = strtok(NULL, ":"); | |
| 660 away = strtok(NULL, ":"); | |
| 661 | |
| 662 message = away; | |
| 663 while (*message && (*message != ':')) | |
| 664 message++; | |
| 665 message++; | |
| 666 | |
|
2273
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2232
diff
changeset
|
667 a = (away && (*away == 'T')) ? IM_FLAG_AWAY : 0; |
| 2086 | 668 |
|
2856
b1e300a85678
[gaim-migrate @ 2869]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2853
diff
changeset
|
669 serv_got_im(gc, c, message, a, time(NULL), -1); |
| 2086 | 670 } else if (!strcasecmp(c, "UPDATE_BUDDY")) { |
|
2305
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
671 char *l, *uc, *tmp; |
| 2086 | 672 int logged, evil, idle, type = 0; |
| 673 time_t signon, time_idle; | |
| 674 | |
| 675 c = strtok(NULL, ":"); /* name */ | |
| 676 l = strtok(NULL, ":"); /* online */ | |
| 677 sscanf(strtok(NULL, ":"), "%d", &evil); | |
| 678 sscanf(strtok(NULL, ":"), "%ld", &signon); | |
| 679 sscanf(strtok(NULL, ":"), "%d", &idle); | |
| 680 uc = strtok(NULL, ":"); | |
| 681 | |
| 682 logged = (l && (*l == 'T')) ? 1 : 0; | |
| 683 | |
| 684 if (uc[0] == 'A') | |
| 685 type |= UC_AOL; | |
| 686 switch (uc[1]) { | |
| 687 case 'A': | |
| 688 type |= UC_ADMIN; | |
| 689 break; | |
| 690 case 'U': | |
| 691 type |= UC_UNCONFIRMED; | |
| 692 break; | |
| 693 case 'O': | |
| 694 type |= UC_NORMAL; | |
| 695 break; | |
| 3083 | 696 case 'C': |
| 697 type |= UC_WIRELESS; | |
| 698 break; | |
| 2086 | 699 default: |
| 700 break; | |
| 701 } | |
| 702 if (uc[2] == 'U') | |
| 703 type |= UC_UNAVAILABLE; | |
| 704 | |
| 705 if (idle) { | |
| 706 time(&time_idle); | |
| 707 time_idle -= idle * 60; | |
| 708 } else | |
| 709 time_idle = 0; | |
| 710 | |
|
2305
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
711 tmp = g_strdup(normalize(gc->username)); |
|
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
712 if (!strcmp(tmp, normalize(c))) |
|
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
713 g_snprintf(gc->displayname, sizeof(gc->displayname), "%s", c); |
|
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
714 g_free(tmp); |
|
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
715 |
| 2086 | 716 serv_got_update(gc, c, logged, evil, signon, time_idle, type, 0); |
| 717 } else if (!strcasecmp(c, "ERROR")) { | |
| 3427 | 718 do_error_dialog(show_error_message(), NULL, GAIM_ERROR); |
| 2086 | 719 } else if (!strcasecmp(c, "EVILED")) { |
| 720 int lev; | |
| 721 char *name; | |
| 722 | |
| 723 sscanf(strtok(NULL, ":"), "%d", &lev); | |
| 724 name = strtok(NULL, ":"); | |
| 725 | |
| 726 serv_got_eviled(gc, name, lev); | |
| 727 } else if (!strcasecmp(c, "CHAT_JOIN")) { | |
| 728 char *name; | |
| 729 int id; | |
| 730 | |
| 731 sscanf(strtok(NULL, ":"), "%d", &id); | |
| 732 name = strtok(NULL, ":"); | |
| 733 | |
| 734 serv_got_joined_chat(gc, id, name); | |
| 735 } else if (!strcasecmp(c, "CHAT_IN")) { | |
| 736 int id, w; | |
| 737 char *m, *who, *whisper; | |
| 738 | |
| 739 sscanf(strtok(NULL, ":"), "%d", &id); | |
| 740 who = strtok(NULL, ":"); | |
| 741 whisper = strtok(NULL, ":"); | |
| 742 m = whisper; | |
| 743 while (*m && (*m != ':')) | |
| 744 m++; | |
| 745 m++; | |
| 746 | |
| 747 w = (whisper && (*whisper == 'T')) ? 1 : 0; | |
| 748 | |
| 749 serv_got_chat_in(gc, id, who, w, m, time((time_t)NULL)); | |
| 750 } else if (!strcasecmp(c, "CHAT_UPDATE_BUDDY")) { | |
| 751 int id; | |
| 752 char *in, *buddy; | |
| 753 GSList *bcs = gc->buddy_chats; | |
| 754 struct conversation *b = NULL; | |
| 755 | |
| 756 sscanf(strtok(NULL, ":"), "%d", &id); | |
| 757 in = strtok(NULL, ":"); | |
| 758 | |
| 759 while (bcs) { | |
| 760 b = (struct conversation *)bcs->data; | |
| 761 if (id == b->id) | |
| 762 break; | |
| 763 bcs = bcs->next; | |
| 764 b = NULL; | |
| 765 } | |
| 766 | |
| 767 if (!b) | |
| 768 return; | |
| 769 | |
| 770 if (in && (*in == 'T')) | |
| 771 while ((buddy = strtok(NULL, ":")) != NULL) | |
| 3708 | 772 add_chat_buddy(b, buddy, NULL); |
| 2086 | 773 else |
| 774 while ((buddy = strtok(NULL, ":")) != NULL) | |
|
2820
b917845dad3c
[gaim-migrate @ 2833]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
775 remove_chat_buddy(b, buddy, NULL); |
| 2086 | 776 } else if (!strcasecmp(c, "CHAT_INVITE")) { |
| 777 char *name, *who, *message; | |
|
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
778 int *id = g_new0(int, 1); |
| 2086 | 779 |
| 780 name = strtok(NULL, ":"); | |
|
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
781 sscanf(strtok(NULL, ":"), "%d", id); |
| 2086 | 782 who = strtok(NULL, ":"); |
| 783 message = strtok(NULL, ":"); | |
| 784 | |
|
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
785 serv_got_chat_invite(gc, name, who, message, g_list_append(NULL, id)); |
| 2086 | 786 } else if (!strcasecmp(c, "CHAT_LEFT")) { |
| 787 GSList *bcs = gc->buddy_chats; | |
| 788 struct conversation *b = NULL; | |
| 789 int id; | |
| 790 | |
| 791 sscanf(strtok(NULL, ":"), "%d", &id); | |
| 792 | |
| 793 while (bcs) { | |
| 794 b = (struct conversation *)bcs->data; | |
| 795 if (id == b->id) | |
| 796 break; | |
| 797 b = NULL; | |
| 798 bcs = bcs->next; | |
| 799 } | |
| 800 | |
| 801 if (!b) | |
| 802 return; | |
| 803 | |
| 804 if (b->window) { | |
| 805 char error_buf[BUF_LONG]; | |
| 806 b->gc = NULL; | |
| 807 g_snprintf(error_buf, sizeof error_buf, _("You have been disconnected" | |
| 808 " from chat room %s."), b->name); | |
| 3427 | 809 do_error_dialog(error_buf, NULL, GAIM_ERROR); |
| 2086 | 810 } else |
| 811 serv_got_chat_left(gc, id); | |
| 812 } else if (!strcasecmp(c, "GOTO_URL")) { | |
| 813 char *name, *url, tmp[256]; | |
| 814 | |
| 815 name = strtok(NULL, ":"); | |
| 816 url = strtok(NULL, ":"); | |
| 817 | |
| 818 g_snprintf(tmp, sizeof(tmp), "http://%s:%d/%s", | |
| 819 gc->user->proto_opt[USEROPT_AUTH][0] ? | |
| 820 gc->user->proto_opt[USEROPT_AUTH] : TOC_HOST, | |
| 821 gc->user->proto_opt[USEROPT_AUTHPORT][0] ? | |
| 822 atoi(gc->user->proto_opt[USEROPT_AUTHPORT]) : TOC_PORT, | |
| 823 url); | |
|
2584
34812d648f72
[gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2526
diff
changeset
|
824 grab_url(tmp, FALSE, toc_got_info, NULL); |
| 2086 | 825 } else if (!strcasecmp(c, "DIR_STATUS")) { |
| 826 } else if (!strcasecmp(c, "ADMIN_NICK_STATUS")) { | |
| 827 } else if (!strcasecmp(c, "ADMIN_PASSWD_STATUS")) { | |
| 3427 | 828 do_error_dialog(_("Password Change Successful"), NULL, GAIM_INFO); |
| 2086 | 829 } else if (!strcasecmp(c, "PAUSE")) { |
| 830 tdt->state = STATE_PAUSE; | |
| 3427 | 831 do_error_dialog(_("TOC has sent a PAUSE command."), _("When this happens, TOC ignores" |
| 2086 | 832 " any messages sent to it, and may kick you off if you send a" |
| 833 " message. Gaim will prevent anything from going through. This" | |
| 3427 | 834 " is only temporary, please be patient."), GAIM_WARNING); |
| 2086 | 835 } else if (!strcasecmp(c, "RVOUS_PROPOSE")) { |
| 836 char *user, *uuid, *cookie; | |
| 837 int seq; | |
| 3159 | 838 char *rip, *pip, *vip, *trillian = NULL; |
| 2086 | 839 int port; |
| 3126 | 840 |
| 2086 | 841 user = strtok(NULL, ":"); |
| 842 uuid = strtok(NULL, ":"); | |
| 843 cookie = strtok(NULL, ":"); | |
| 844 sscanf(strtok(NULL, ":"), "%d", &seq); | |
| 845 rip = strtok(NULL, ":"); | |
| 846 pip = strtok(NULL, ":"); | |
| 847 vip = strtok(NULL, ":"); | |
| 848 sscanf(strtok(NULL, ":"), "%d", &port); | |
| 849 | |
| 850 if (!strcmp(uuid, FILE_SEND_UID)) { | |
| 851 /* they want us to get a file */ | |
| 852 int unk[4], i; | |
| 853 char *messages[4], *tmp, *name; | |
| 854 int subtype, files, totalsize = 0; | |
| 855 struct ft_request *ft; | |
| 856 | |
| 857 for (i = 0; i < 4; i++) { | |
| 3126 | 858 trillian = strtok(NULL, ":"); |
| 859 sscanf(trillian, "%d", &unk[i]); | |
| 2086 | 860 if (unk[i] == 10001) |
| 861 break; | |
| 3126 | 862 /* Trillian likes to send an empty token as a message, rather than |
| 863 no message at all. */ | |
| 864 if (*(trillian + strlen(trillian) +1) != ':') | |
| 865 frombase64(strtok(NULL, ":"), &messages[i], NULL); | |
| 2086 | 866 } |
| 3126 | 867 |
| 2086 | 868 frombase64(strtok(NULL, ":"), &tmp, NULL); |
| 869 | |
| 870 subtype = tmp[1]; | |
| 871 files = tmp[3]; | |
| 872 | |
| 873 totalsize |= (tmp[4] << 24) & 0xff000000; | |
| 874 totalsize |= (tmp[5] << 16) & 0x00ff0000; | |
| 875 totalsize |= (tmp[6] << 8) & 0x0000ff00; | |
| 876 totalsize |= (tmp[7] << 0) & 0x000000ff; | |
| 877 | |
| 878 if (!totalsize) { | |
| 879 g_free(tmp); | |
| 880 for (i--; i >= 0; i--) | |
| 881 g_free(messages[i]); | |
| 882 return; | |
| 883 } | |
| 884 | |
| 885 name = tmp + 8; | |
| 886 | |
| 887 ft = g_new0(struct ft_request, 1); | |
| 888 ft->cookie = g_strdup(cookie); | |
| 889 ft->ip = g_strdup(pip); | |
| 890 ft->port = port; | |
| 891 if (i) | |
| 892 ft->message = g_strdup(messages[0]); | |
| 893 else | |
| 894 ft->message = NULL; | |
| 895 ft->filename = g_strdup(name); | |
| 896 ft->user = g_strdup(user); | |
| 897 ft->size = totalsize; | |
| 898 ft->files = files; | |
| 899 g_snprintf(ft->UID, sizeof(ft->UID), "%s", FILE_SEND_UID); | |
| 900 ft->gc = gc; | |
| 901 | |
| 902 g_free(tmp); | |
| 903 for (i--; i >= 0; i--) | |
| 904 g_free(messages[i]); | |
| 905 | |
| 906 debug_printf("English translation of RVOUS_PROPOSE: %s requests Send File (i.e." | |
| 907 " 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
|
908 " total size of %d bytes.\n", user, vip, port, files, totalsize); |
| 2086 | 909 accept_file_dialog(ft); |
| 910 } else if (!strcmp(uuid, FILE_GET_UID)) { | |
| 911 /* they want us to send a file */ | |
| 912 int unk[4], i; | |
| 913 char *messages[4], *tmp; | |
| 914 struct ft_request *ft; | |
| 915 | |
| 916 for (i = 0; i < 4; i++) { | |
| 917 sscanf(strtok(NULL, ":"), "%d", unk + i); | |
| 918 if (unk[i] == 10001) | |
| 919 break; | |
| 3126 | 920 /* Trillian likes to send an empty token as a message, rather than |
| 921 no message at all. */ | |
| 922 if (*(trillian + strlen(trillian) +1) != ':') | |
| 923 frombase64(strtok(NULL, ":"), &messages[i], NULL); | |
| 2086 | 924 } |
| 925 frombase64(strtok(NULL, ":"), &tmp, NULL); | |
| 926 | |
| 927 ft = g_new0(struct ft_request, 1); | |
| 928 ft->cookie = g_strdup(cookie); | |
| 929 ft->ip = g_strdup(pip); | |
| 930 ft->port = port; | |
| 931 if (i) | |
| 932 ft->message = g_strdup(messages[0]); | |
| 933 else | |
| 934 ft->message = NULL; | |
| 935 ft->user = g_strdup(user); | |
| 936 g_snprintf(ft->UID, sizeof(ft->UID), "%s", FILE_GET_UID); | |
| 937 ft->gc = gc; | |
| 938 | |
| 939 g_free(tmp); | |
| 940 for (i--; i >= 0; i--) | |
| 941 g_free(messages[i]); | |
| 942 | |
| 943 accept_file_dialog(ft); | |
| 944 } else if (!strcmp(uuid, VOICE_UID)) { | |
| 945 /* oh goody. voice over ip. fun stuff. */ | |
| 946 } else if (!strcmp(uuid, B_ICON_UID)) { | |
| 947 /* | |
| 948 int unk[4], i; | |
| 949 char *messages[4]; | |
| 950 struct buddy_icon *icon; | |
| 951 | |
| 952 for (i = 0; i < 4; i++) { | |
| 953 sscanf(strtok(NULL, ":"), "%d", unk + i); | |
| 954 if (unk[i] == 10001) | |
| 955 break; | |
| 956 frombase64(strtok(NULL, ":"), &messages[i], NULL); | |
| 957 } | |
| 958 frombase64(strtok(NULL, ":"), (char **)&icon, NULL); | |
| 959 | |
| 960 debug_printf("received icon of length %d\n", icon->len); | |
| 961 g_free(icon); | |
| 962 for (i--; i >= 0; i--) | |
| 963 g_free(messages[i]); | |
| 964 */ | |
| 965 } else if (!strcmp(uuid, IMAGE_UID)) { | |
| 966 /* aka Direct IM */ | |
| 967 } else { | |
| 968 debug_printf("Don't know what to do with RVOUS UUID %s\n", uuid); | |
| 969 /* do we have to do anything here? i think it just times out */ | |
| 970 } | |
| 971 } else { | |
| 972 debug_printf("don't know what to do with %s\n", c); | |
| 973 } | |
| 974 } | |
| 975 | |
| 3033 | 976 static int toc_send_im(struct gaim_connection *gc, char *name, char *message, int len, int flags) |
| 2086 | 977 { |
| 978 char buf[BUF_LEN * 2]; | |
|
2343
29449a6b79e6
[gaim-migrate @ 2356]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2334
diff
changeset
|
979 char *tmp = g_malloc(strlen(message) * 4 + 1); /* 4 because \n gets replaced with <BR> */ |
| 2086 | 980 |
|
2136
73253b36c3cb
[gaim-migrate @ 2146]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2130
diff
changeset
|
981 strcpy(tmp, message); |
|
73253b36c3cb
[gaim-migrate @ 2146]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2130
diff
changeset
|
982 escape_text(tmp); |
|
73253b36c3cb
[gaim-migrate @ 2146]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2130
diff
changeset
|
983 if (strlen(tmp) + 52 > MSG_LEN) { |
|
73253b36c3cb
[gaim-migrate @ 2146]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2130
diff
changeset
|
984 g_free(tmp); |
|
2123
56c4382f2909
[gaim-migrate @ 2133]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
985 return -E2BIG; |
|
2136
73253b36c3cb
[gaim-migrate @ 2146]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2130
diff
changeset
|
986 } |
| 2086 | 987 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
|
988 tmp, ((flags & IM_FLAG_AWAY) ? " auto" : "")); |
| 2086 | 989 sflap_send(gc, buf, -1, TYPE_DATA); |
|
2123
56c4382f2909
[gaim-migrate @ 2133]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
990 |
|
2136
73253b36c3cb
[gaim-migrate @ 2146]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2130
diff
changeset
|
991 g_free(tmp); |
|
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2281
diff
changeset
|
992 return 1; |
| 2086 | 993 } |
| 994 | |
| 995 static void toc_set_config(struct gaim_connection *gc) | |
| 996 { | |
|
2281
cc462108c101
[gaim-migrate @ 2291]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
997 char *buf = g_malloc(MSG_LEN), snd[BUF_LEN * 2]; |
|
cc462108c101
[gaim-migrate @ 2291]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
998 toc_build_config(gc, buf, MSG_LEN - strlen("toc_set_config \\{\\}"), FALSE); |
| 2086 | 999 g_snprintf(snd, MSG_LEN, "toc_set_config {%s}", buf); |
| 1000 sflap_send(gc, snd, -1, TYPE_DATA); | |
|
2281
cc462108c101
[gaim-migrate @ 2291]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
1001 g_free(buf); |
| 2086 | 1002 } |
| 1003 | |
| 1004 static void toc_get_info(struct gaim_connection *g, char *name) | |
| 1005 { | |
| 1006 char buf[BUF_LEN * 2]; | |
| 1007 g_snprintf(buf, MSG_LEN, "toc_get_info %s", normalize(name)); | |
| 1008 sflap_send(g, buf, -1, TYPE_DATA); | |
| 1009 } | |
| 1010 | |
| 1011 static void toc_get_dir(struct gaim_connection *g, char *name) | |
| 1012 { | |
| 1013 char buf[BUF_LEN * 2]; | |
| 1014 g_snprintf(buf, MSG_LEN, "toc_get_dir %s", normalize(name)); | |
| 1015 sflap_send(g, buf, -1, TYPE_DATA); | |
| 1016 } | |
| 1017 | |
| 3466 | 1018 static void toc_set_dir(struct gaim_connection *g, const char *first, const char *middle, const char *last, |
| 1019 const char *maiden, const char *city, const char *state, const char *country, int web) | |
| 2086 | 1020 { |
| 1021 char buf2[BUF_LEN * 4], buf[BUF_LEN]; | |
| 1022 g_snprintf(buf2, sizeof(buf2), "%s:%s:%s:%s:%s:%s:%s:%s", first, | |
| 1023 middle, last, maiden, city, state, country, (web == 1) ? "Y" : ""); | |
| 1024 escape_text(buf2); | |
| 1025 g_snprintf(buf, sizeof(buf), "toc_set_dir %s", buf2); | |
| 1026 sflap_send(g, buf, -1, TYPE_DATA); | |
| 1027 } | |
| 1028 | |
| 3466 | 1029 static void toc_dir_search(struct gaim_connection *g, const char *first, const char *middle, const char *last, |
| 1030 const char *maiden, const char *city, const char *state, const char *country, const char *email) | |
| 2086 | 1031 { |
| 1032 char buf[BUF_LONG]; | |
| 1033 g_snprintf(buf, sizeof(buf) / 2, "toc_dir_search %s:%s:%s:%s:%s:%s:%s:%s", first, middle, | |
| 1034 last, maiden, city, state, country, email); | |
| 1035 debug_printf("Searching for: %s,%s,%s,%s,%s,%s,%s\n", first, middle, last, maiden, | |
| 1036 city, state, country); | |
| 1037 sflap_send(g, buf, -1, TYPE_DATA); | |
| 1038 } | |
| 1039 | |
| 1040 static void toc_set_away(struct gaim_connection *g, char *state, char *message) | |
| 1041 { | |
| 1042 char buf[BUF_LEN * 2]; | |
|
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
3867
diff
changeset
|
1043 if (g->away) { |
| 2086 | 1044 g_free (g->away); |
|
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
3867
diff
changeset
|
1045 g->away = NULL; |
|
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
3867
diff
changeset
|
1046 } |
| 2086 | 1047 if (message) { |
| 3188 | 1048 char *tmp = g_malloc(strlen(message) * 4 + 1); |
| 1049 strcpy(tmp, message); | |
| 2086 | 1050 g->away = g_strdup (message); |
| 3188 | 1051 escape_text(tmp); |
| 1052 g_snprintf(buf, MSG_LEN, "toc_set_away \"%s\"", tmp); | |
| 1053 g_free(tmp); | |
| 2086 | 1054 } else |
| 1055 g_snprintf(buf, MSG_LEN, "toc_set_away \"\""); | |
| 1056 sflap_send(g, buf, -1, TYPE_DATA); | |
| 1057 } | |
| 1058 | |
| 1059 static void toc_set_info(struct gaim_connection *g, char *info) | |
| 1060 { | |
| 1061 char buf[BUF_LEN * 2], buf2[BUF_LEN * 2]; | |
| 1062 g_snprintf(buf2, sizeof buf2, "%s", info); | |
| 1063 escape_text(buf2); | |
| 1064 g_snprintf(buf, sizeof(buf), "toc_set_info \"%s\n\"", buf2); | |
| 1065 sflap_send(g, buf, -1, TYPE_DATA); | |
| 1066 } | |
| 1067 | |
| 3466 | 1068 static void toc_change_passwd(struct gaim_connection *g, const char *orig, const char *new) |
| 2086 | 1069 { |
| 1070 char buf[BUF_LEN * 2]; | |
| 1071 g_snprintf(buf, BUF_LONG, "toc_change_passwd %s %s", orig, new); | |
| 1072 sflap_send(g, buf, strlen(buf), TYPE_DATA); | |
| 1073 } | |
| 1074 | |
| 3466 | 1075 static void toc_add_buddy(struct gaim_connection *g, const char *name) |
| 2086 | 1076 { |
| 1077 char buf[BUF_LEN * 2]; | |
| 1078 g_snprintf(buf, sizeof(buf), "toc_add_buddy %s", normalize(name)); | |
| 1079 sflap_send(g, buf, -1, TYPE_DATA); | |
| 1080 toc_set_config(g); | |
| 1081 } | |
| 1082 | |
|
2334
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1083 static void toc_add_buddies(struct gaim_connection *g, GList *buddies) |
| 2086 | 1084 { |
| 1085 char buf[BUF_LEN * 2]; | |
| 1086 int n; | |
| 1087 | |
| 1088 n = g_snprintf(buf, sizeof(buf), "toc_add_buddy"); | |
| 1089 while (buddies) { | |
|
2130
50c7a704ee56
[gaim-migrate @ 2140]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2128
diff
changeset
|
1090 if (strlen(normalize(buddies->data)) + n + 32 > MSG_LEN) { |
| 2086 | 1091 sflap_send(g, buf, -1, TYPE_DATA); |
| 1092 n = g_snprintf(buf, sizeof(buf), "toc_add_buddy"); | |
| 1093 } | |
| 1094 n += g_snprintf(buf + n, sizeof(buf) - n, " %s", normalize(buddies->data)); | |
| 1095 buddies = buddies->next; | |
| 1096 } | |
| 1097 sflap_send(g, buf, -1, TYPE_DATA); | |
| 1098 } | |
| 1099 | |
|
2681
37d80035e77f
[gaim-migrate @ 2694]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2597
diff
changeset
|
1100 static void toc_remove_buddy(struct gaim_connection *g, char *name, char *group) |
| 2086 | 1101 { |
| 1102 char buf[BUF_LEN * 2]; | |
| 1103 g_snprintf(buf, sizeof(buf), "toc_remove_buddy %s", normalize(name)); | |
| 1104 sflap_send(g, buf, -1, TYPE_DATA); | |
| 1105 toc_set_config(g); | |
| 1106 } | |
| 1107 | |
| 3867 | 1108 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
|
1109 { |
|
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1110 char buf[BUF_LEN * 2]; |
|
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1111 int n; |
|
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1112 |
|
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1113 n = g_snprintf(buf, sizeof(buf), "toc_remove_buddy"); |
|
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1114 while (buddies) { |
|
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1115 if (strlen(normalize(buddies->data)) + n + 32 > MSG_LEN) { |
|
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1116 sflap_send(g, buf, -1, TYPE_DATA); |
|
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1117 n = g_snprintf(buf, sizeof(buf), "toc_remove_buddy"); |
|
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1118 } |
|
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1119 n += g_snprintf(buf + n, sizeof(buf) - n, " %s", normalize(buddies->data)); |
|
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1120 buddies = buddies->next; |
|
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 sflap_send(g, buf, -1, TYPE_DATA); |
|
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1123 toc_set_config(g); |
|
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1124 } |
|
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1125 |
| 2086 | 1126 static void toc_set_idle(struct gaim_connection *g, int time) |
| 1127 { | |
| 1128 char buf[BUF_LEN * 2]; | |
| 1129 g_snprintf(buf, sizeof(buf), "toc_set_idle %d", time); | |
| 1130 sflap_send(g, buf, -1, TYPE_DATA); | |
| 1131 } | |
| 1132 | |
| 1133 static void toc_warn(struct gaim_connection *g, char *name, int anon) | |
| 1134 { | |
| 1135 char send[BUF_LEN * 2]; | |
| 1136 g_snprintf(send, 255, "toc_evil %s %s", name, ((anon) ? "anon" : "norm")); | |
| 1137 sflap_send(g, send, -1, TYPE_DATA); | |
| 1138 } | |
| 1139 | |
|
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1140 static GList *toc_chat_info(struct gaim_connection *gc) |
| 2086 | 1141 { |
|
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1142 GList *m = NULL; |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1143 struct proto_chat_entry *pce; |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1144 |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1145 pce = g_new0(struct proto_chat_entry, 1); |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1146 pce->label = _("Join what group:"); |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1147 m = g_list_append(m, pce); |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1148 |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1149 pce = g_new0(struct proto_chat_entry, 1); |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1150 pce->label = _("Exchange:"); |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1151 pce->is_int = TRUE; |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1152 pce->min = 4; |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1153 pce->max = 20; |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1154 m = g_list_append(m, pce); |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1155 |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1156 return m; |
| 2086 | 1157 } |
| 1158 | |
|
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1159 static void toc_join_chat(struct gaim_connection *g, GList *data) |
| 2086 | 1160 { |
| 1161 char buf[BUF_LONG]; | |
|
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1162 int *exchange; |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1163 char *name; |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1164 int *i; |
|
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) |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1167 return; |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1168 |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1169 if (!data->next) { |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1170 i = data->data; |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1171 g_snprintf(buf, 255, "toc_chat_accept %d", *i); |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1172 } else { |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1173 name = data->data; |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1174 exchange = data->next->data; |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1175 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
|
1176 } |
|
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1177 |
| 2086 | 1178 sflap_send(g, buf, -1, TYPE_DATA); |
| 1179 } | |
| 1180 | |
| 3466 | 1181 static void toc_chat_invite(struct gaim_connection *g, int id, const char *message, const char *name) |
| 2086 | 1182 { |
| 1183 char buf[BUF_LONG]; | |
|
2719
9747583279d1
[gaim-migrate @ 2732]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2706
diff
changeset
|
1184 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
|
1185 message ? message : "", normalize(name)); |
| 2086 | 1186 sflap_send(g, buf, -1, TYPE_DATA); |
| 1187 } | |
| 1188 | |
| 1189 static void toc_chat_leave(struct gaim_connection *g, int id) | |
| 1190 { | |
| 1191 GSList *bcs = g->buddy_chats; | |
| 1192 struct conversation *b = NULL; | |
| 1193 char buf[BUF_LEN * 2]; | |
| 1194 | |
| 1195 while (bcs) { | |
| 1196 b = (struct conversation *)bcs->data; | |
| 1197 if (id == b->id) | |
| 1198 break; | |
| 1199 b = NULL; | |
| 1200 bcs = bcs->next; | |
| 1201 } | |
| 1202 | |
| 1203 if (!b) | |
| 1204 return; /* can this happen? */ | |
| 1205 | |
| 1206 if (!b->gc) /* TOC already kicked us out of this room */ | |
| 1207 serv_got_chat_left(g, id); | |
| 1208 else { | |
| 1209 g_snprintf(buf, 255, "toc_chat_leave %d", id); | |
| 1210 sflap_send(g, buf, -1, TYPE_DATA); | |
| 1211 } | |
| 1212 } | |
| 1213 | |
| 1214 static void toc_chat_whisper(struct gaim_connection *g, int id, char *who, char *message) | |
| 1215 { | |
| 1216 char buf2[BUF_LEN * 2]; | |
|
2371
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
1217 escape_text(message); |
|
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
1218 g_snprintf(buf2, sizeof(buf2), "toc_chat_whisper %d %s \"%s\"", id, normalize(who), message); |
| 2086 | 1219 sflap_send(g, buf2, -1, TYPE_DATA); |
| 1220 } | |
| 1221 | |
|
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
1222 static int toc_chat_send(struct gaim_connection *g, int id, char *message) |
| 2086 | 1223 { |
| 1224 char buf[BUF_LEN * 2]; | |
| 1225 escape_text(message); | |
|
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
1226 if (strlen(message) > 2000) |
|
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
1227 return -E2BIG; |
| 2086 | 1228 g_snprintf(buf, sizeof(buf), "toc_chat_send %d \"%s\"", id, message); |
| 1229 sflap_send(g, buf, -1, TYPE_DATA); | |
|
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
1230 return 0; |
| 2086 | 1231 } |
| 1232 | |
| 1233 static void toc_keepalive(struct gaim_connection *gc) | |
| 1234 { | |
| 1235 sflap_send(gc, "", 0, TYPE_KEEPALIVE); | |
| 1236 } | |
| 1237 | |
| 1238 static char **toc_list_icon(int uc) | |
| 1239 { | |
| 1240 if (uc & UC_UNAVAILABLE) | |
| 1241 return (char **)away_icon_xpm; | |
| 1242 if (uc & UC_AOL) | |
| 1243 return (char **)aol_icon_xpm; | |
| 1244 if (uc & UC_NORMAL) | |
| 1245 return (char **)free_icon_xpm; | |
| 1246 if (uc & UC_ADMIN) | |
| 1247 return (char **)admin_icon_xpm; | |
| 1248 if (uc & UC_UNCONFIRMED) | |
| 1249 return (char **)dt_icon_xpm; | |
| 3083 | 1250 if (uc & UC_WIRELESS) |
| 1251 return (char **)wireless_icon_xpm; | |
| 2086 | 1252 return NULL; |
| 1253 } | |
| 1254 | |
|
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1255 static GList *toc_buddy_menu(struct gaim_connection *gc, char *who) |
| 2086 | 1256 { |
|
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1257 GList *m = NULL; |
|
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1258 struct proto_buddy_menu *pbm; |
| 2086 | 1259 |
|
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1260 pbm = g_new0(struct proto_buddy_menu, 1); |
|
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1261 pbm->label = _("Get Info"); |
|
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1262 pbm->callback = toc_get_info; |
|
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1263 pbm->gc = gc; |
|
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1264 m = g_list_append(m, pbm); |
| 2086 | 1265 |
|
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1266 pbm = g_new0(struct proto_buddy_menu, 1); |
|
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1267 pbm->label = _("Get Dir Info"); |
|
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1268 pbm->callback = toc_get_dir; |
|
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1269 pbm->gc = gc; |
|
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1270 m = g_list_append(m, pbm); |
|
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1271 |
|
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1272 return m; |
| 2086 | 1273 } |
| 1274 | |
| 1275 static void toc_add_permit(struct gaim_connection *gc, char *who) | |
| 1276 { | |
| 1277 char buf2[BUF_LEN * 2]; | |
| 1278 if (gc->permdeny != 3) | |
| 1279 return; | |
| 1280 g_snprintf(buf2, sizeof(buf2), "toc_add_permit %s", normalize(who)); | |
| 1281 sflap_send(gc, buf2, -1, TYPE_DATA); | |
| 1282 toc_set_config(gc); | |
|
2597
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2584
diff
changeset
|
1283 signoff_blocked(gc); |
| 2086 | 1284 } |
| 1285 | |
| 1286 static void toc_add_deny(struct gaim_connection *gc, char *who) | |
| 1287 { | |
| 1288 char buf2[BUF_LEN * 2]; | |
| 1289 if (gc->permdeny != 4) | |
| 1290 return; | |
| 1291 g_snprintf(buf2, sizeof(buf2), "toc_add_deny %s", normalize(who)); | |
| 1292 sflap_send(gc, buf2, -1, TYPE_DATA); | |
| 1293 toc_set_config(gc); | |
|
2597
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2584
diff
changeset
|
1294 signoff_blocked(gc); |
| 2086 | 1295 } |
| 1296 | |
| 1297 static void toc_set_permit_deny(struct gaim_connection *gc) | |
| 1298 { | |
| 1299 char buf2[BUF_LEN * 2]; | |
| 1300 GSList *list; | |
| 1301 int at; | |
| 1302 | |
| 1303 switch (gc->permdeny) { | |
| 1304 case 1: | |
| 1305 /* permit all, deny none. to get here reliably we need to have been in permit | |
| 1306 * mode, and send an empty toc_add_deny message, which will switch us to deny none */ | |
| 1307 g_snprintf(buf2, sizeof(buf2), "toc_add_permit "); | |
| 1308 sflap_send(gc, buf2, -1, TYPE_DATA); | |
| 1309 g_snprintf(buf2, sizeof(buf2), "toc_add_deny "); | |
| 1310 sflap_send(gc, buf2, -1, TYPE_DATA); | |
| 1311 break; | |
| 1312 case 2: | |
| 1313 /* deny all, permit none. to get here reliably we need to have been in deny | |
| 1314 * mode, and send an empty toc_add_permit message, which will switch us to permit none */ | |
| 1315 g_snprintf(buf2, sizeof(buf2), "toc_add_deny "); | |
| 1316 sflap_send(gc, buf2, -1, TYPE_DATA); | |
| 1317 g_snprintf(buf2, sizeof(buf2), "toc_add_permit "); | |
| 1318 sflap_send(gc, buf2, -1, TYPE_DATA); | |
| 1319 break; | |
| 1320 case 3: | |
| 1321 /* permit some. we want to switch to deny mode first, then send the toc_add_permit | |
| 1322 * message, which will clear and set our permit list. toc sucks. */ | |
| 1323 g_snprintf(buf2, sizeof(buf2), "toc_add_deny "); | |
| 1324 sflap_send(gc, buf2, -1, TYPE_DATA); | |
| 1325 | |
| 1326 at = g_snprintf(buf2, sizeof(buf2), "toc_add_permit "); | |
| 1327 list = gc->permit; | |
| 1328 while (list) { | |
| 1329 at += g_snprintf(buf2 + at, sizeof(buf2) - at, "%s ", normalize(list->data)); | |
| 1330 if (at > MSG_LEN + 32) { /* from out my ass comes greatness */ | |
| 1331 sflap_send(gc, buf2, -1, TYPE_DATA); | |
| 1332 at = g_snprintf(buf2, sizeof(buf2), "toc_add_permit "); | |
| 1333 } | |
| 1334 list = list->next; | |
| 1335 } | |
| 1336 sflap_send(gc, buf2, -1, TYPE_DATA); | |
| 1337 break; | |
| 1338 case 4: | |
| 1339 /* deny some. we want to switch to permit mode first, then send the toc_add_deny | |
| 1340 * message, which will clear and set our deny list. toc sucks. */ | |
| 1341 g_snprintf(buf2, sizeof(buf2), "toc_add_permit "); | |
| 1342 sflap_send(gc, buf2, -1, TYPE_DATA); | |
| 1343 | |
| 1344 at = g_snprintf(buf2, sizeof(buf2), "toc_add_deny "); | |
| 1345 list = gc->deny; | |
| 1346 while (list) { | |
| 1347 at += g_snprintf(buf2 + at, sizeof(buf2) - at, "%s ", normalize(list->data)); | |
| 1348 if (at > MSG_LEN + 32) { /* from out my ass comes greatness */ | |
| 1349 sflap_send(gc, buf2, -1, TYPE_DATA); | |
| 1350 at = g_snprintf(buf2, sizeof(buf2), "toc_add_deny "); | |
| 1351 } | |
| 1352 list = list->next; | |
| 1353 } | |
| 1354 sflap_send(gc, buf2, -1, TYPE_DATA); | |
| 1355 break; | |
| 1356 default: | |
| 1357 break; | |
| 1358 } | |
| 1359 toc_set_config(gc); | |
|
2597
2ced57c58653
[gaim-migrate @ 2610]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2584
diff
changeset
|
1360 signoff_blocked(gc); |
| 2086 | 1361 } |
| 1362 | |
| 1363 static void toc_rem_permit(struct gaim_connection *gc, char *who) | |
| 1364 { | |
| 1365 if (gc->permdeny != 3) | |
| 1366 return; | |
| 1367 toc_set_permit_deny(gc); | |
| 1368 } | |
| 1369 | |
| 1370 static void toc_rem_deny(struct gaim_connection *gc, char *who) | |
| 1371 { | |
| 1372 if (gc->permdeny != 4) | |
| 1373 return; | |
| 1374 toc_set_permit_deny(gc); | |
| 1375 } | |
| 1376 | |
|
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2453
diff
changeset
|
1377 static GList *toc_away_states(struct gaim_connection *gc) |
| 2086 | 1378 { |
| 1379 return g_list_append(NULL, GAIM_AWAY_CUSTOM); | |
| 1380 } | |
| 1381 | |
| 4333 | 1382 static GList *toc_actions(struct gaim_connection *gc) |
| 2086 | 1383 { |
| 1384 GList *m = NULL; | |
| 4333 | 1385 struct proto_actions_menu *pam; |
| 2086 | 1386 |
| 4333 | 1387 pam = g_new0(struct proto_actions_menu, 1); |
| 1388 pam->label = _("Set User Info"); | |
| 1389 pam->callback = show_set_info; | |
| 1390 pam->gc = gc; | |
| 1391 m = g_list_append(m, pam); | |
| 1392 | |
| 1393 pam = g_new0(struct proto_actions_menu, 1); | |
| 1394 pam->label = _("Set Dir Info"); | |
| 1395 pam->callback = show_set_dir; | |
| 1396 pam->gc = gc; | |
| 1397 m = g_list_append(m, pam); | |
| 1398 | |
| 1399 pam = g_new0(struct proto_actions_menu, 1); | |
| 1400 pam->label = _("Change Password"); | |
| 1401 pam->callback = show_change_passwd; | |
| 1402 pam->gc = gc; | |
| 1403 m = g_list_append(m, pam); | |
| 2086 | 1404 |
| 1405 return m; | |
| 1406 } | |
| 1407 | |
| 3630 | 1408 G_MODULE_EXPORT void toc_init(struct prpl *ret) |
| 3572 | 1409 { |
| 1410 struct proto_user_opt *puo; | |
| 2086 | 1411 ret->protocol = PROTO_TOC; |
|
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
1412 ret->options = OPT_PROTO_CORRECT_TIME; |
| 3572 | 1413 ret->name = g_strdup("TOC"); |
| 2086 | 1414 ret->list_icon = toc_list_icon; |
| 1415 ret->away_states = toc_away_states; | |
| 1416 ret->actions = toc_actions; | |
| 1417 ret->buddy_menu = toc_buddy_menu; | |
| 1418 ret->login = toc_login; | |
| 1419 ret->close = toc_close; | |
| 1420 ret->send_im = toc_send_im; | |
| 1421 ret->set_info = toc_set_info; | |
| 1422 ret->get_info = toc_get_info; | |
| 1423 ret->set_away = toc_set_away; | |
| 1424 ret->set_dir = toc_set_dir; | |
| 1425 ret->get_dir = toc_get_dir; | |
| 1426 ret->dir_search = toc_dir_search; | |
| 1427 ret->set_idle = toc_set_idle; | |
| 1428 ret->change_passwd = toc_change_passwd; | |
| 1429 ret->add_buddy = toc_add_buddy; | |
| 1430 ret->add_buddies = toc_add_buddies; | |
| 1431 ret->remove_buddy = toc_remove_buddy; | |
|
2334
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
1432 ret->remove_buddies = toc_remove_buddies; |
| 2086 | 1433 ret->add_permit = toc_add_permit; |
| 1434 ret->add_deny = toc_add_deny; | |
| 1435 ret->rem_permit = toc_rem_permit; | |
| 1436 ret->rem_deny = toc_rem_deny; | |
| 1437 ret->set_permit_deny = toc_set_permit_deny; | |
| 1438 ret->warn = toc_warn; | |
|
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1439 ret->chat_info = toc_chat_info; |
| 2086 | 1440 ret->join_chat = toc_join_chat; |
| 1441 ret->chat_invite = toc_chat_invite; | |
| 1442 ret->chat_leave = toc_chat_leave; | |
| 1443 ret->chat_whisper = toc_chat_whisper; | |
| 1444 ret->chat_send = toc_chat_send; | |
| 1445 ret->keepalive = toc_keepalive; | |
| 1446 | |
| 3572 | 1447 puo = g_new0(struct proto_user_opt, 1); |
| 4115 | 1448 puo->label = g_strdup(_("TOC Host:")); |
| 3572 | 1449 puo->def = g_strdup("toc.oscar.aol.com"); |
| 1450 puo->pos = USEROPT_AUTH; | |
| 1451 ret->user_opts = g_list_append(ret->user_opts, puo); | |
| 1452 | |
| 1453 puo = g_new0(struct proto_user_opt, 1); | |
| 4115 | 1454 puo->label = g_strdup(_("TOC Port:")); |
| 3572 | 1455 puo->def = g_strdup("9898"); |
| 1456 puo->pos = USEROPT_AUTHPORT; | |
| 1457 ret->user_opts = g_list_append(ret->user_opts, puo); | |
| 1458 | |
| 2086 | 1459 my_protocol = ret; |
| 1460 } | |
| 1461 | |
| 1462 #ifndef STATIC | |
| 1463 | |
| 3630 | 1464 G_MODULE_EXPORT void gaim_prpl_init(struct prpl *prpl) |
| 2086 | 1465 { |
| 3572 | 1466 toc_init(prpl); |
| 1467 prpl->plug->desc.api_version = PLUGIN_API_VERSION; | |
| 2086 | 1468 } |
| 1469 | |
| 1470 #endif | |
| 1471 | |
| 1472 /********* | |
| 1473 * RVOUS ACTIONS | |
| 1474 ********/ | |
| 1475 | |
| 1476 struct file_header { | |
| 1477 char magic[4]; /* 0 */ | |
| 1478 short hdrlen; /* 4 */ | |
| 1479 short hdrtype; /* 6 */ | |
| 1480 char bcookie[8]; /* 8 */ | |
| 1481 short encrypt; /* 16 */ | |
| 1482 short compress; /* 18 */ | |
| 1483 short totfiles; /* 20 */ | |
| 1484 short filesleft; /* 22 */ | |
| 1485 short totparts; /* 24 */ | |
| 1486 short partsleft; /* 26 */ | |
| 1487 long totsize; /* 28 */ | |
| 1488 long size; /* 32 */ | |
| 1489 long modtime; /* 36 */ | |
| 1490 long checksum; /* 40 */ | |
| 1491 long rfrcsum; /* 44 */ | |
| 1492 long rfsize; /* 48 */ | |
| 1493 long cretime; /* 52 */ | |
| 1494 long rfcsum; /* 56 */ | |
| 1495 long nrecvd; /* 60 */ | |
| 1496 long recvcsum; /* 64 */ | |
| 1497 char idstring[32]; /* 68 */ | |
| 1498 char flags; /* 100 */ | |
| 1499 char lnameoffset; /* 101 */ | |
| 1500 char lsizeoffset; /* 102 */ | |
| 1501 char dummy[69]; /* 103 */ | |
| 1502 char macfileinfo[16]; /* 172 */ | |
| 1503 short nencode; /* 188 */ | |
| 1504 short nlanguage; /* 190 */ | |
| 1505 char name[64]; /* 192 */ | |
| 1506 /* 256 */ | |
| 1507 }; | |
| 1508 | |
| 1509 struct file_transfer { | |
| 1510 struct file_header hdr; | |
| 1511 | |
| 1512 struct gaim_connection *gc; | |
| 1513 | |
| 1514 char *user; | |
| 1515 char *cookie; | |
| 1516 char *ip; | |
| 1517 int port; | |
| 1518 long size; | |
| 1519 struct stat st; | |
| 1520 | |
| 1521 GtkWidget *window; | |
| 1522 int files; | |
| 1523 char *filename; | |
| 1524 FILE *file; | |
| 1525 int recvsize; | |
| 1526 | |
| 1527 gint inpa; | |
| 1528 }; | |
| 1529 | |
| 1530 static void debug_header(struct file_transfer *ft) { | |
| 1531 struct file_header *f = (struct file_header *)ft; | |
| 1532 debug_printf("TOC FT HEADER:\n" | |
| 1533 "\t%s %d 0x%04x\n" | |
| 1534 "\t%s %d %d\n" | |
|
4201
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1535 "\t%d %d %d %d %d %d\n" |
|
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1536 "\t%d %d %d %d %d %d %d %d\n" |
| 2086 | 1537 "\t%s\n" |
| 1538 "\t0x%02x, 0x%02x, 0x%02x\n" | |
| 1539 "\t%s %s\n" | |
| 1540 "\t%d %d\n" | |
| 1541 "\t%s\n", | |
| 1542 f->magic, ntohs(f->hdrlen), f->hdrtype, | |
| 1543 f->bcookie, ntohs(f->encrypt), ntohs(f->compress), | |
| 1544 ntohs(f->totfiles), ntohs(f->filesleft), ntohs(f->totparts), | |
| 1545 ntohs(f->partsleft), ntohl(f->totsize), ntohl(f->size), | |
| 1546 ntohl(f->modtime), ntohl(f->checksum), ntohl(f->rfrcsum), ntohl(f->rfsize), | |
| 1547 ntohl(f->cretime), ntohl(f->rfcsum), ntohl(f->nrecvd), | |
| 1548 ntohl(f->recvcsum), | |
| 1549 f->idstring, | |
| 1550 f->flags, f->lnameoffset, f->lsizeoffset, | |
| 1551 f->dummy, f->macfileinfo, | |
| 1552 ntohs(f->nencode), ntohs(f->nlanguage), | |
| 1553 f->name); | |
| 1554 } | |
| 1555 | |
|
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1556 static void toc_send_file_callback(gpointer data, gint source, GaimInputCondition cond) |
| 2086 | 1557 { |
| 1558 char buf[BUF_LONG]; | |
| 1559 int rt, i; | |
| 1560 | |
| 1561 struct file_transfer *ft = data; | |
| 1562 | |
| 1563 if (ft->hdr.hdrtype != 0x202) { | |
| 1564 char *buf; | |
| 1565 frombase64(ft->cookie, &buf, NULL); | |
| 1566 | |
| 3630 | 1567 toc_read(source, ft, 8); |
| 1568 toc_read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); | |
| 2086 | 1569 debug_header(ft); |
| 1570 | |
| 1571 ft->hdr.hdrtype = 0x202; | |
| 1572 memcpy(ft->hdr.bcookie, buf, 8); | |
| 1573 g_free(buf); | |
| 1574 ft->hdr.encrypt = 0; ft->hdr.compress = 0; | |
| 1575 debug_header(ft); | |
| 3630 | 1576 toc_write(source, ft, 256); |
| 2086 | 1577 |
| 1578 if (ft->files == 1) { | |
| 1579 ft->file = fopen(ft->filename, "w"); | |
| 1580 if (!ft->file) { | |
| 4115 | 1581 buf = g_strdup_printf(_("Could not open %s for writing!"), ft->filename); |
| 3427 | 1582 do_error_dialog(buf, strerror(errno), GAIM_ERROR); |
| 2086 | 1583 g_free(buf); |
|
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1584 gaim_input_remove(ft->inpa); |
| 3630 | 1585 toc_soc_close(source); |
| 2086 | 1586 g_free(ft->filename); |
| 1587 g_free(ft->user); | |
| 1588 g_free(ft->ip); | |
| 1589 g_free(ft->cookie); | |
| 1590 g_free(ft); | |
| 1591 } | |
| 1592 } else { | |
| 1593 buf = g_strdup_printf("%s/%s", ft->filename, ft->hdr.name); | |
| 1594 ft->file = fopen(buf, "w"); | |
| 1595 g_free(buf); | |
| 1596 if (!ft->file) { | |
| 1597 buf = g_strdup_printf("Could not open %s/%s for writing!", ft->filename, | |
| 1598 ft->hdr.name); | |
| 3427 | 1599 do_error_dialog(buf, strerror(errno), GAIM_ERROR); |
| 2086 | 1600 g_free(buf); |
|
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1601 gaim_input_remove(ft->inpa); |
| 3630 | 1602 toc_soc_close(source); |
| 2086 | 1603 g_free(ft->filename); |
| 1604 g_free(ft->user); | |
| 1605 g_free(ft->ip); | |
| 1606 g_free(ft->cookie); | |
| 1607 g_free(ft); | |
| 1608 } | |
| 1609 } | |
| 1610 | |
| 1611 return; | |
| 1612 } | |
| 1613 | |
| 3630 | 1614 rt = toc_read(source, buf, MIN(ntohl(ft->hdr.size) - ft->recvsize, 1024)); |
| 2086 | 1615 if (rt < 0) { |
| 3427 | 1616 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
|
1617 gaim_input_remove(ft->inpa); |
| 3630 | 1618 toc_soc_close(source); |
| 2086 | 1619 g_free(ft->user); |
| 1620 g_free(ft->ip); | |
| 1621 g_free(ft->cookie); | |
| 1622 if (ft->file) | |
| 1623 fclose(ft->file); | |
| 1624 g_free(ft); | |
| 1625 return; | |
| 1626 } | |
| 1627 ft->recvsize += rt; | |
| 1628 for (i = 0; i < rt; i++) | |
| 1629 fprintf(ft->file, "%c", buf[i]); | |
| 1630 | |
| 1631 if (ft->recvsize == ntohl(ft->hdr.size)) { | |
| 1632 ft->hdr.hdrtype = htons(0x0204); | |
| 1633 ft->hdr.filesleft = htons(ntohs(ft->hdr.filesleft) - 1); | |
| 1634 ft->hdr.partsleft = htons(ntohs(ft->hdr.partsleft) - 1); | |
| 1635 ft->hdr.recvcsum = ft->hdr.checksum; /* uh... */ | |
| 1636 ft->hdr.nrecvd = htons(ntohs(ft->hdr.nrecvd) + 1); | |
| 1637 ft->hdr.flags = 0; | |
| 3630 | 1638 toc_write(source, ft, 256); |
| 2086 | 1639 debug_header(ft); |
| 1640 ft->recvsize = 0; | |
| 1641 fclose(ft->file); | |
| 1642 if (ft->hdr.filesleft == 0) { | |
|
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1643 gaim_input_remove(ft->inpa); |
| 3630 | 1644 toc_soc_close(source); |
| 2086 | 1645 g_free(ft->filename); |
| 1646 g_free(ft->user); | |
| 1647 g_free(ft->ip); | |
| 1648 g_free(ft->cookie); | |
| 1649 g_free(ft); | |
| 1650 } | |
| 1651 } | |
| 1652 } | |
| 1653 | |
|
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1654 static void toc_send_file_connect(gpointer data, gint src, GaimInputCondition cond) |
| 2086 | 1655 { |
| 1656 struct file_transfer *ft = data; | |
| 1657 | |
| 1658 if (src == -1) { | |
| 3427 | 1659 do_error_dialog(_("Could not connect for transfer."), NULL, GAIM_ERROR); |
| 2086 | 1660 g_free(ft->filename); |
| 1661 g_free(ft->cookie); | |
| 1662 g_free(ft->user); | |
| 1663 g_free(ft->ip); | |
| 1664 g_free(ft); | |
| 1665 return; | |
| 1666 } | |
| 1667 | |
|
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1668 ft->inpa = gaim_input_add(src, GAIM_INPUT_READ, toc_send_file_callback, ft); |
| 2086 | 1669 } |
| 1670 | |
| 1671 static void toc_send_file(gpointer a, struct file_transfer *old_ft) | |
| 1672 { | |
| 1673 struct file_transfer *ft; | |
| 1674 const char *dirname = gtk_file_selection_get_filename(GTK_FILE_SELECTION(old_ft->window)); | |
| 1675 int fd; | |
| 1676 struct aim_user *user; | |
| 1677 char buf[BUF_LEN * 2]; | |
| 1678 | |
| 1679 if (file_is_dir(dirname, old_ft->window)) | |
| 1680 return; | |
| 1681 ft = g_new0(struct file_transfer, 1); | |
| 1682 if (old_ft->files == 1) | |
| 1683 ft->filename = g_strdup(dirname); | |
| 1684 else | |
| 1685 ft->filename = g_dirname(dirname); | |
| 1686 ft->cookie = g_strdup(old_ft->cookie); | |
| 1687 ft->user = g_strdup(old_ft->user); | |
| 1688 ft->ip = g_strdup(old_ft->ip); | |
| 1689 ft->files = old_ft->files; | |
| 1690 ft->port = old_ft->port; | |
| 1691 ft->gc = old_ft->gc; | |
| 1692 user = ft->gc->user; | |
| 1693 gtk_widget_destroy(old_ft->window); | |
| 1694 | |
| 1695 g_snprintf(buf, sizeof(buf), "toc_rvous_accept %s %s %s", ft->user, ft->cookie, FILE_SEND_UID); | |
| 1696 sflap_send(ft->gc, buf, -1, TYPE_DATA); | |
| 1697 | |
| 1698 fd = | |
| 1699 proxy_connect(ft->ip, ft->port, toc_send_file_connect, ft); | |
| 1700 if (fd < 0) { | |
| 3427 | 1701 do_error_dialog(_("Could not connect for transfer."), NULL, GAIM_ERROR); |
| 2086 | 1702 g_free(ft->filename); |
| 1703 g_free(ft->cookie); | |
| 1704 g_free(ft->user); | |
| 1705 g_free(ft->ip); | |
| 1706 g_free(ft); | |
| 1707 return; | |
| 1708 } | |
| 1709 } | |
| 1710 | |
|
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1711 static void toc_get_file_callback(gpointer data, gint source, GaimInputCondition cond) |
| 2086 | 1712 { |
| 1713 char buf[BUF_LONG]; | |
| 1714 | |
| 1715 struct file_transfer *ft = data; | |
| 1716 | |
|
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1717 if (cond & GAIM_INPUT_WRITE) { |
| 2086 | 1718 int remain = MIN(ntohl(ft->hdr.totsize) - ft->recvsize, 1024); |
| 1719 int i; | |
| 1720 for (i = 0; i < remain; i++) | |
| 1721 fscanf(ft->file, "%c", &buf[i]); | |
| 3630 | 1722 toc_write(source, buf, remain); |
| 2086 | 1723 ft->recvsize += remain; |
| 1724 if (ft->recvsize == ntohl(ft->hdr.totsize)) { | |
|
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1725 gaim_input_remove(ft->inpa); |
|
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1726 ft->inpa = gaim_input_add(source, GAIM_INPUT_READ, |
| 2086 | 1727 toc_get_file_callback, ft); |
| 1728 } | |
| 1729 return; | |
| 1730 } | |
| 1731 | |
| 1732 if (ft->hdr.hdrtype == htons(0x1108)) { | |
| 1733 struct tm *fortime; | |
| 1734 struct stat st; | |
| 1735 | |
| 3630 | 1736 toc_read(source, ft, 8); |
| 1737 toc_read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); | |
| 2086 | 1738 debug_header(ft); |
| 1739 | |
| 1740 stat(ft->filename, &st); | |
| 1741 fortime = localtime(&st.st_mtime); | |
| 1742 g_snprintf(buf, sizeof(buf), "%2d/%2d/%4d %2d:%2d %8ld %s\r\n", | |
| 1743 fortime->tm_mon + 1, fortime->tm_mday, fortime->tm_year + 1900, | |
| 1744 fortime->tm_hour + 1, fortime->tm_min + 1, (long)st.st_size, | |
| 1745 g_basename(ft->filename)); | |
| 3630 | 1746 toc_write(source, buf, ntohl(ft->hdr.size)); |
| 2086 | 1747 return; |
| 1748 } | |
| 1749 | |
| 1750 if (ft->hdr.hdrtype == htons(0x1209)) { | |
| 3630 | 1751 toc_read(source, ft, 8); |
| 1752 toc_read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); | |
| 2086 | 1753 debug_header(ft); |
| 1754 return; | |
| 1755 } | |
| 1756 | |
| 1757 if (ft->hdr.hdrtype == htons(0x120b)) { | |
| 3630 | 1758 toc_read(source, ft, 8); |
| 1759 toc_read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); | |
| 2086 | 1760 debug_header(ft); |
| 1761 | |
| 1762 if (ft->hdr.hdrtype != htons(0x120c)) { | |
| 1763 g_snprintf(buf, sizeof(buf), "%s decided to cancel the transfer", ft->user); | |
| 3427 | 1764 do_error_dialog(buf, NULL, GAIM_ERROR); |
|
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1765 gaim_input_remove(ft->inpa); |
| 3630 | 1766 toc_soc_close(source); |
| 2086 | 1767 g_free(ft->filename); |
| 1768 g_free(ft->user); | |
| 1769 g_free(ft->ip); | |
| 1770 g_free(ft->cookie); | |
| 1771 if (ft->file) | |
| 1772 fclose(ft->file); | |
| 1773 g_free(ft); | |
| 1774 return; | |
| 1775 } | |
| 1776 | |
| 1777 ft->hdr.hdrtype = 0x0101; | |
| 1778 ft->hdr.totfiles = htons(1); ft->hdr.filesleft = htons(1); | |
| 1779 ft->hdr.flags = 0x20; | |
| 3630 | 1780 toc_write(source, ft, 256); |
| 2086 | 1781 return; |
| 1782 } | |
| 1783 | |
| 1784 if (ft->hdr.hdrtype == 0x0101) { | |
| 3630 | 1785 toc_read(source, ft, 8); |
| 1786 toc_read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); | |
| 2086 | 1787 debug_header(ft); |
| 1788 | |
|
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1789 gaim_input_remove(ft->inpa); |
|
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1790 ft->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, |
| 2086 | 1791 toc_get_file_callback, ft); |
| 1792 return; | |
| 1793 } | |
| 1794 | |
| 1795 if (ft->hdr.hdrtype == 0x0202) { | |
| 3630 | 1796 toc_read(source, ft, 8); |
| 1797 toc_read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); | |
| 2086 | 1798 debug_header(ft); |
| 1799 | |
|
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1800 gaim_input_remove(ft->inpa); |
| 3630 | 1801 toc_soc_close(source); |
| 2086 | 1802 g_free(ft->filename); |
| 1803 g_free(ft->user); | |
| 1804 g_free(ft->ip); | |
| 1805 g_free(ft->cookie); | |
| 1806 if (ft->file) | |
| 1807 fclose(ft->file); | |
| 1808 g_free(ft); | |
| 1809 return; | |
| 1810 } | |
| 1811 } | |
| 1812 | |
|
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1813 static void toc_get_file_connect(gpointer data, gint src, GaimInputCondition cond) |
| 2086 | 1814 { |
| 1815 struct file_transfer *ft = data; | |
| 1816 struct file_header *hdr; | |
| 1817 char *buf; | |
| 1818 | |
| 1819 if (src == -1) { | |
| 3427 | 1820 do_error_dialog(_("Could not connect for transfer!"), NULL, GAIM_ERROR); |
| 2086 | 1821 fclose(ft->file); |
| 1822 g_free(ft->filename); | |
| 1823 g_free(ft->cookie); | |
| 1824 g_free(ft->user); | |
| 1825 g_free(ft->ip); | |
| 1826 g_free(ft); | |
| 1827 return; | |
| 1828 } | |
| 1829 | |
| 1830 hdr = (struct file_header *)ft; | |
| 1831 hdr->magic[0] = 'O'; hdr->magic[1] = 'F'; hdr->magic[2] = 'T'; hdr->magic[3] = '2'; | |
| 1832 hdr->hdrlen = htons(256); | |
| 1833 hdr->hdrtype = htons(0x1108); | |
| 1834 frombase64(ft->cookie, &buf, NULL); | |
| 1835 g_snprintf(hdr->bcookie, 8, "%s", buf); | |
| 1836 g_free(buf); | |
| 1837 hdr->totfiles = htons(1); hdr->filesleft = htons(1); | |
| 1838 hdr->totparts = htons(1); hdr->partsleft = htons(1); | |
| 1839 hdr->totsize = htonl((long)ft->st.st_size); /* combined size of all files */ | |
| 1840 /* size = strlen("mm/dd/yyyy hh:mm sizesize 'name'\r\n") */ | |
| 1841 hdr->size = htonl(28 + strlen(g_basename(ft->filename))); /* size of listing.txt */ | |
| 1842 hdr->modtime = htonl(ft->st.st_mtime); | |
| 1843 hdr->checksum = htonl(0x89f70000); /* uh... */ | |
| 1844 g_snprintf(hdr->idstring, 32, "OFT_Windows ICBMFT V1.1 32"); | |
| 1845 hdr->flags = 0x02; | |
| 1846 hdr->lnameoffset = 0x1A; | |
| 1847 hdr->lsizeoffset = 0x10; | |
| 1848 g_snprintf(hdr->name, 64, "listing.txt"); | |
| 3630 | 1849 if (toc_write(src, hdr, 256) < 0) { |
| 3427 | 1850 do_error_dialog(_("Could not write file header. The file will not be transferred."), NULL, GAIM_ERROR); |
| 2086 | 1851 fclose(ft->file); |
| 1852 g_free(ft->filename); | |
| 1853 g_free(ft->cookie); | |
| 1854 g_free(ft->user); | |
| 1855 g_free(ft->ip); | |
| 1856 g_free(ft); | |
| 1857 return; | |
| 1858 } | |
| 1859 | |
|
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1860 ft->inpa = gaim_input_add(src, GAIM_INPUT_READ, toc_get_file_callback, ft); |
| 2086 | 1861 } |
| 1862 | |
| 1863 static void toc_get_file(gpointer a, struct file_transfer *old_ft) | |
| 1864 { | |
| 1865 struct file_transfer *ft; | |
| 1866 const char *dirname = gtk_file_selection_get_filename(GTK_FILE_SELECTION(old_ft->window)); | |
| 1867 int fd; | |
| 1868 struct aim_user *user; | |
| 1869 char *buf, buf2[BUF_LEN * 2]; | |
| 1870 | |
| 1871 if (file_is_dir(dirname, old_ft->window)) | |
| 1872 return; | |
| 1873 ft = g_new0(struct file_transfer, 1); | |
| 1874 ft->filename = g_strdup(dirname); | |
| 1875 ft->file = fopen(ft->filename, "r"); | |
| 1876 if (!ft->file) { | |
| 3427 | 1877 buf = g_strdup_printf("Unable to open %s for transfer.", ft->filename); |
| 1878 do_error_dialog(buf, NULL, GAIM_ERROR); | |
| 2086 | 1879 g_free(buf); |
| 1880 g_free(ft->filename); | |
| 1881 g_free(ft); | |
| 1882 return; | |
| 1883 } | |
| 1884 if (stat(dirname, &ft->st)) { | |
| 3427 | 1885 buf = g_strdup_printf("Unable to examine %s.", dirname); |
| 1886 do_error_dialog(buf, NULL, GAIM_ERROR); | |
| 2086 | 1887 g_free(buf); |
| 1888 g_free(ft->filename); | |
| 1889 g_free(ft); | |
| 1890 return; | |
| 1891 } | |
| 1892 ft->cookie = g_strdup(old_ft->cookie); | |
| 1893 ft->user = g_strdup(old_ft->user); | |
| 1894 ft->ip = g_strdup(old_ft->ip); | |
| 1895 ft->port = old_ft->port; | |
| 1896 ft->gc = old_ft->gc; | |
| 1897 user = ft->gc->user; | |
| 1898 gtk_widget_destroy(old_ft->window); | |
| 1899 | |
| 1900 g_snprintf(buf2, sizeof(buf2), "toc_rvous_accept %s %s %s", ft->user, ft->cookie, FILE_GET_UID); | |
| 1901 sflap_send(ft->gc, buf2, -1, TYPE_DATA); | |
| 1902 | |
| 1903 fd = | |
| 1904 proxy_connect(ft->ip, ft->port, toc_get_file_connect, ft); | |
| 1905 if (fd < 0) { | |
| 3427 | 1906 do_error_dialog(_("Could not connect for transfer."), NULL, GAIM_ERROR); |
| 2086 | 1907 fclose(ft->file); |
| 1908 g_free(ft->filename); | |
| 1909 g_free(ft->cookie); | |
| 1910 g_free(ft->user); | |
| 1911 g_free(ft->ip); | |
| 1912 g_free(ft); | |
| 1913 return; | |
| 1914 } | |
| 1915 } | |
| 1916 | |
| 1917 static void cancel_callback(gpointer a, struct file_transfer *ft) { | |
| 1918 gtk_widget_destroy(ft->window); | |
| 1919 if (a == ft->window) { | |
| 1920 g_free(ft->cookie); | |
| 1921 g_free(ft->user); | |
| 1922 g_free(ft->ip); | |
| 1923 g_free(ft); | |
| 1924 } | |
| 1925 } | |
| 1926 | |
| 3867 | 1927 static void toc_reject_ft(struct ft_request *ft) { |
| 1928 g_free(ft->user); | |
| 1929 g_free(ft->filename); | |
| 1930 g_free(ft->ip); | |
| 1931 g_free(ft->cookie); | |
| 1932 if (ft->message) | |
| 1933 g_free(ft->message); | |
| 1934 g_free(ft); | |
| 1935 } | |
| 1936 | |
| 1937 | |
| 3730 | 1938 static void toc_accept_ft(struct ft_request *fr) { |
| 4249 | 1939 if(g_slist_find(connections, fr->gc)) { |
| 1940 GtkWidget *window; | |
| 1941 char buf[BUF_LEN]; | |
| 2086 | 1942 |
| 4249 | 1943 struct file_transfer *ft = g_new0(struct file_transfer, 1); |
| 1944 ft->gc = fr->gc; | |
| 1945 ft->user = g_strdup(fr->user); | |
| 1946 ft->cookie = g_strdup(fr->cookie); | |
| 1947 ft->ip = g_strdup(fr->ip); | |
| 1948 ft->port = fr->port; | |
| 1949 ft->files = fr->files; | |
| 2086 | 1950 |
| 4249 | 1951 ft->window = window = gtk_file_selection_new(_("Gaim - Save As...")); |
| 1952 g_snprintf(buf, sizeof(buf), "%s/%s", gaim_home_dir(), fr->filename ? fr->filename : ""); | |
| 1953 gtk_file_selection_set_filename(GTK_FILE_SELECTION(window), buf); | |
| 1954 gtk_signal_connect(GTK_OBJECT(window), "destroy", | |
| 1955 GTK_SIGNAL_FUNC(cancel_callback), ft); | |
| 1956 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(ft->window)->cancel_button), "clicked", | |
| 1957 GTK_SIGNAL_FUNC(cancel_callback), ft); | |
| 2086 | 1958 |
| 4249 | 1959 if (!strcmp(fr->UID, FILE_SEND_UID)) |
| 1960 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(window)->ok_button), "clicked", | |
| 1961 GTK_SIGNAL_FUNC(toc_send_file), ft); | |
| 1962 else | |
| 1963 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(window)->ok_button), "clicked", | |
| 1964 GTK_SIGNAL_FUNC(toc_get_file), ft); | |
| 2086 | 1965 |
| 4249 | 1966 gtk_widget_show(window); |
| 1967 } | |
| 1968 | |
| 3867 | 1969 toc_reject_ft(fr); |
| 2086 | 1970 } |
| 1971 | |
| 1972 static void accept_file_dialog(struct ft_request *ft) { | |
| 1973 char buf[BUF_LONG]; | |
| 1974 if (!strcmp(ft->UID, FILE_SEND_UID)) { | |
| 1975 /* holy crap. who the fuck would transfer gigabytes through AIM?! */ | |
| 1976 static char *sizes[4] = { "bytes", "KB", "MB", "GB" }; | |
| 1977 float size = ft->size; | |
| 1978 int index = 0; | |
| 1979 while ((index < 4) && (size > 1024)) { | |
| 1980 size /= 1024; | |
| 1981 index++; | |
| 1982 } | |
| 2943 | 1983 g_snprintf(buf, sizeof(buf), |
| 4276 | 1984 ngettext( |
| 1985 "%s requests %s to accept %d file: %s (%.2f %s)%s%s", | |
| 1986 "%s requests %s to accept %d files: %s (%.2f %s)%s%s", | |
| 1987 ft->files), | |
| 2943 | 1988 ft->user, ft->gc->username, ft->files, |
| 2086 | 1989 ft->filename, size, sizes[index], (ft->message) ? "\n" : "", |
| 1990 (ft->message) ? ft->message : ""); | |
| 1991 } else { | |
| 1992 g_snprintf(buf, sizeof(buf), _("%s requests you to send them a file"), ft->user); | |
| 1993 } | |
| 4249 | 1994 do_ask_dialog(buf, NULL, ft, _("Accept"), toc_accept_ft, _("Cancel"), toc_reject_ft, my_protocol->plug ? my_protocol->plug->handle : NULL, FALSE); |
| 2086 | 1995 } |
