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