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