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