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