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