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