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