Mercurial > pidgin.yaz
annotate src/protocols/toc/toc.c @ 9584:fe35f55ee984
[gaim-migrate @ 10427]
" When joining a jabber conference many jabber servers
send a recap of the last 20 or so messages. If you
have sounds enabled, this will result in either 20
sounds in row, or worse if mixing is available, a
horrible mix of 20 overlapping sounds. These recap
messages can be identifed be the presence of the
"jabber:x:delay". This patch identifies delayed
messages, passes that information through flags from
the prpl to the core, and then on to the gui. Detailed
changes:
Add GAIM_MESSAGE_DELAYED to GaimMessageFlags to
indicate a delayed message.
Change gtkconv.c to not play sounds when either
GAIM_MESSAGE_DELAYED or GAIM_MESSAGE_SYSTEM are set.
Add GaimConvChatFlags, parallel to GaimConvImFlags, to
pass flags from protocols to core. Currently contains
two flags:
GAIM_CONV_CHAT_WHISPER
GAIM_CONV_CHAT_DELAYED
Change fourth arg of serv_got_chat_in() from "int
whisper" to "GaimConvChatFlags chatflags".
Change jabber prpl to set delayed flag when the
"jabber:x:delay" element is present. Change toc
protocol since it uses the whisper flag." --Nathan Fredrickson
Date: 2004-07-24 00:49
Sender: marv_sfAccepting Donations
Logged In: YES
user_id=790708
I'm not sure I like naming the flags "DELAYED". I mean
that's okay inside jabber since that's what the jabber
protocol refers to it as, but for the the GAIM_*_DELAYED
flags, I think they should be named something else.
I thought about NOSOUND, but I decided that was wrong,
because the flag should say what kind of message it is, not
what to do with it, that's up to the UI to decide.
What's up with not playing sounds on GAIM_MESSAGE_SYSTEM?
This sounds unrelated to this. Are there times when we want
to play sounds on system messages?
Date: 2004-07-24 09:13
Sender: noif
Logged In: YES
user_id=365548
I purposely did not use a name that implied what the UI
should do with the flag. The only characteristic that makes
these messages unique is that they've been stored in the
server for some period of time and are not current. I'm
open to a better flag name than "DELAYED"... I thought about
"RECAP", but that seemed less generalized than "DELAYED".
As for not playing sounds on GAIM_MESSAGE_SYSTEM, that can
be removed if it's controversial. I think I slipped that
in since the setting of the topic was still playing a sound
every time you joined a jabber conference.
I think we can change the flag name ourselves if something else is better.
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Sat, 24 Jul 2004 15:18:32 +0000 |
parents | 8b2451878e26 |
children | db62420a53a2 |
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" |
9058 | 27 #include "multi.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
28 #include "notify.h" |
2086 | 29 #include "proxy.h" |
9058 | 30 #include "prpl.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
31 #include "request.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
32 #include "util.h" |
2086 | 33 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
34 static GaimPlugin *my_protocol = NULL; |
4249 | 35 |
2086 | 36 #define REVISION "penguin" |
37 | |
38 #define TYPE_SIGNON 1 | |
39 #define TYPE_DATA 2 | |
40 #define TYPE_ERROR 3 | |
41 #define TYPE_SIGNOFF 4 | |
42 #define TYPE_KEEPALIVE 5 | |
43 | |
44 #define FLAPON "FLAPON\r\n\r\n" | |
45 #define ROAST "Tic/Toc" | |
46 | |
47 #define TOC_HOST "toc.oscar.aol.com" | |
48 #define TOC_PORT 9898 | |
49 #define AUTH_HOST "login.oscar.aol.com" | |
50 #define AUTH_PORT 5190 | |
51 #define LANGUAGE "english" | |
52 | |
53 #define STATE_OFFLINE 0 | |
54 #define STATE_FLAPON 1 | |
55 #define STATE_SIGNON_REQUEST 2 | |
56 #define STATE_ONLINE 3 | |
57 #define STATE_PAUSE 4 | |
58 | |
59 #define VOICE_UID "09461341-4C7F-11D1-8222-444553540000" | |
60 #define FILE_SEND_UID "09461343-4C7F-11D1-8222-444553540000" | |
61 #define IMAGE_UID "09461345-4C7F-11D1-8222-444553540000" | |
62 #define B_ICON_UID "09461346-4C7F-11D1-8222-444553540000" | |
63 #define STOCKS_UID "09461347-4C7F-11D1-8222-444553540000" | |
64 #define FILE_GET_UID "09461348-4C7F-11D1-8222-444553540000" | |
65 #define GAMES_UID "0946134a-4C7F-11D1-8222-444553540000" | |
66 | |
6500 | 67 #define UC_AOL 0x02 |
68 #define UC_ADMIN 0x04 | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2453
diff
changeset
|
69 #define UC_UNCONFIRMED 0x08 |
6500 | 70 #define UC_NORMAL 0x10 |
71 #define UC_WIRELESS 0x20 | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2453
diff
changeset
|
72 |
2086 | 73 struct ft_request { |
5605 | 74 GaimConnection *gc; |
6500 | 75 char *user; |
2086 | 76 char UID[2048]; |
6500 | 77 char *cookie; |
78 char *ip; | |
79 int port; | |
80 char *message; | |
81 char *filename; | |
2086 | 82 int files; |
6500 | 83 int size; |
2086 | 84 }; |
85 | |
86 struct buddy_icon { | |
87 guint32 hash; | |
88 guint32 len; | |
89 time_t time; | |
90 void *data; | |
91 }; | |
92 | |
93 struct toc_data { | |
94 int toc_fd; | |
4597 | 95 char toc_ip[20]; |
2086 | 96 int seqno; |
97 int state; | |
98 }; | |
99 | |
100 struct sflap_hdr { | |
101 unsigned char ast; | |
102 unsigned char type; | |
103 unsigned short seqno; | |
104 unsigned short len; | |
105 }; | |
106 | |
107 struct signon { | |
108 unsigned int ver; | |
109 unsigned short tag; | |
110 unsigned short namelen; | |
111 char username[80]; | |
112 }; | |
113 | |
114 /* constants to identify proto_opts */ | |
115 #define USEROPT_AUTH 0 | |
116 #define USEROPT_AUTHPORT 1 | |
117 | |
9140 | 118 #define TOC_CONNECT_STEPS 3 |
5605 | 119 |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
120 static void toc_login_callback(gpointer, gint, GaimInputCondition); |
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
121 static void toc_callback(gpointer, gint, GaimInputCondition); |
2086 | 122 |
123 /* ok. this function used to take username/password, and return 0 on success. | |
124 * now, it takes username/password, and returns NULL on error or a new gaim_connection | |
125 * on success. */ | |
5605 | 126 static void toc_login(GaimAccount *account) |
2086 | 127 { |
5605 | 128 GaimConnection *gc; |
2086 | 129 struct toc_data *tdt; |
130 char buf[80]; | |
131 | |
5605 | 132 gc = gaim_account_get_connection(account); |
2086 | 133 gc->proto_data = tdt = g_new0(struct toc_data, 1); |
6622 | 134 gc->flags |= GAIM_CONNECTION_HTML; |
135 gc->flags |= GAIM_CONNECTION_AUTO_RESP; | |
2086 | 136 |
4834 | 137 g_snprintf(buf, sizeof buf, _("Looking up %s"), |
5605 | 138 gaim_account_get_string(account, "server", TOC_HOST)); |
9140 | 139 gaim_connection_update_progress(gc, buf, 0, TOC_CONNECT_STEPS); |
2086 | 140 |
6484
5ced8e111473
[gaim-migrate @ 6998]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
141 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
|
142 if (gaim_proxy_connect(account, |
5605 | 143 gaim_account_get_string(account, "server", TOC_HOST), |
144 gaim_account_get_int(account, "port", TOC_PORT), | |
4491 | 145 toc_login_callback, gc) != 0 || !account->gc) { |
6321 | 146 g_snprintf(buf, sizeof(buf), _("Connect to %s failed"), |
5605 | 147 gaim_account_get_string(account, "server", TOC_HOST)); |
148 gaim_connection_error(gc, buf); | |
2086 | 149 return; |
150 } | |
151 } | |
152 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
153 static void toc_login_callback(gpointer data, gint source, GaimInputCondition cond) |
2086 | 154 { |
5605 | 155 GaimConnection *gc = data; |
2086 | 156 struct toc_data *tdt; |
157 char buf[80]; | |
4597 | 158 struct sockaddr_in name; |
159 socklen_t namelen; | |
2086 | 160 |
5605 | 161 if (!g_list_find(gaim_connections_get_all(), data)) { |
9134 | 162 close(source); |
2086 | 163 return; |
164 } | |
165 | |
166 tdt = gc->proto_data; | |
167 | |
168 if (source == -1) { | |
169 /* we didn't successfully connect. tdt->toc_fd is valid here */ | |
6321 | 170 gaim_connection_error(gc, _("Unable to connect.")); |
2086 | 171 return; |
172 } | |
4452 | 173 tdt->toc_fd = source; |
2086 | 174 |
4597 | 175 /* |
176 * Copy the IP that we're connected to. We need this because "GOTO_URL"'s | |
177 * should open on the exact server we're connected to. toc.oscar.aol.com | |
178 * doesn't work because that hostname resolves to multiple IP addresses. | |
179 */ | |
180 if (getpeername(tdt->toc_fd, (struct sockaddr *)&name, &namelen) == 0) | |
181 strncpy(tdt->toc_ip, inet_ntoa(name.sin_addr), sizeof(tdt->toc_ip)); | |
182 else | |
5605 | 183 strncpy(tdt->toc_ip, gaim_account_get_string(gc->account, "server", TOC_HOST), sizeof(tdt->toc_ip)); |
4597 | 184 |
6484
5ced8e111473
[gaim-migrate @ 6998]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
185 gaim_debug(GAIM_DEBUG_INFO, "toc", |
5ced8e111473
[gaim-migrate @ 6998]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
186 "Client sends \"FLAPON\\r\\n\\r\\n\"\n"); |
9134 | 187 if (write(tdt->toc_fd, FLAPON, strlen(FLAPON)) < 0) { |
6321 | 188 gaim_connection_error(gc, _("Disconnected.")); |
2086 | 189 return; |
190 } | |
191 tdt->state = STATE_FLAPON; | |
192 | |
193 /* i know a lot of people like to look at gaim to see how TOC works. so i'll comment | |
194 * on what this does. it's really simple. when there's data ready to be read from the | |
195 * 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
|
196 gc->inpa = gaim_input_add(tdt->toc_fd, GAIM_INPUT_READ, toc_callback, gc); |
2086 | 197 |
5605 | 198 g_snprintf(buf, sizeof(buf), _("Signon: %s"), gaim_account_get_username(gc->account)); |
9140 | 199 gaim_connection_update_progress(gc, buf, 1, TOC_CONNECT_STEPS); |
2086 | 200 } |
201 | |
5605 | 202 static void toc_close(GaimConnection *gc) |
2086 | 203 { |
204 if (gc->inpa > 0) | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
205 gaim_input_remove(gc->inpa); |
2086 | 206 gc->inpa = 0; |
9134 | 207 close(((struct toc_data *)gc->proto_data)->toc_fd); |
2086 | 208 g_free(gc->proto_data); |
209 } | |
210 | |
5605 | 211 static void toc_build_config(GaimAccount *account, char *s, int len, gboolean show) |
4687 | 212 { |
6695 | 213 GaimBlistNode *gnode, *cnode, *bnode; |
214 GaimGroup *g; | |
215 GaimBuddy *b; | |
4687 | 216 GSList *plist = account->permit; |
217 GSList *dlist = account->deny; | |
218 | |
219 int pos = 0; | |
220 | |
5605 | 221 if (!account->perm_deny) |
222 account->perm_deny = 1; | |
4687 | 223 |
5605 | 224 pos += g_snprintf(&s[pos], len - pos, "m %d\n", account->perm_deny); |
4785 | 225 for(gnode = gaim_get_blist()->root; gnode && len > pos; gnode = gnode->next) { |
6695 | 226 g = (GaimGroup *)gnode; |
4785 | 227 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) |
228 continue; | |
4687 | 229 if(gaim_group_on_account(g, account)) { |
230 pos += g_snprintf(&s[pos], len - pos, "g %s\n", g->name); | |
6695 | 231 for(cnode = gnode->child; cnode; cnode = cnode->next) { |
232 if(!GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
4785 | 233 continue; |
6695 | 234 for(bnode = gnode->child; bnode && len > pos; bnode = bnode->next) { |
235 b = (GaimBuddy *)bnode; | |
236 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
237 continue; | |
238 if(b->account == account) { | |
239 pos += g_snprintf(&s[pos], len - pos, "b %s%s%s\n", | |
240 b->name, | |
241 (show && b->alias) ? ":" : "", | |
242 (show && b->alias) ? b->alias : ""); | |
243 } | |
4687 | 244 } |
245 } | |
246 } | |
247 } | |
248 | |
249 while (len > pos && plist) { | |
250 pos += g_snprintf(&s[pos], len - pos, "p %s\n", (char *)plist->data); | |
251 plist = plist->next; | |
252 } | |
253 | |
254 while (len > pos && dlist) { | |
255 pos += g_snprintf(&s[pos], len - pos, "d %s\n", (char *)dlist->data); | |
256 dlist = dlist->next; | |
257 } | |
258 } | |
259 | |
6306 | 260 char *escape_message(const char *msg) |
2371
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
261 { |
6306 | 262 char *ret; |
263 int i, j; | |
264 | |
265 if (!msg) | |
266 return NULL; | |
2371
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
267 |
6306 | 268 /* Calculate the length after escaping */ |
269 for (i=0, j=0; msg[i]; i++) | |
270 switch (msg[i]) { | |
271 case '$': | |
272 case '[': | |
273 case ']': | |
274 case '(': | |
275 case ')': | |
276 j++; | |
277 default: | |
278 j++; | |
2371
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
279 } |
6306 | 280 |
281 /* Allocate a string */ | |
7606 | 282 ret = (char *)g_malloc((j+1) * sizeof(char)); |
6306 | 283 |
284 /* Copy the string */ | |
285 for (i=0, j=0; msg[i]; i++) | |
286 switch (msg[i]) { | |
287 case '$': | |
288 case '[': | |
289 case ']': | |
290 case '(': | |
291 case ')': | |
292 ret[j++] = '\\'; | |
293 default: | |
294 ret[j++] = msg[i]; | |
295 } | |
296 ret[j] = '\0'; | |
297 | |
298 return ret; | |
2371
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
299 } |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
300 |
6059 | 301 /* |
302 * Duplicates the input string, replacing each \n with a <BR>, and | |
303 * escaping a few other characters. | |
304 */ | |
305 char *escape_text(const char *msg) | |
2371
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
306 { |
6059 | 307 char *ret; |
308 int i, j; | |
2371
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
309 |
6059 | 310 if (!msg) |
311 return NULL; | |
312 | |
313 /* Calculate the length after escaping */ | |
6306 | 314 for (i=0, j=0; msg[i]; i++) |
6059 | 315 switch (msg[i]) { |
6306 | 316 case '\n': |
317 j += 4; | |
318 break; | |
319 case '{': | |
320 case '}': | |
321 case '\\': | |
322 case '"': | |
323 j += 1; | |
324 default: | |
325 j += 1; | |
2371
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
326 } |
6059 | 327 |
328 /* Allocate a string */ | |
329 ret = (char *)malloc((j+1) * sizeof(char)); | |
330 | |
331 /* Copy the string */ | |
6306 | 332 for (i=0, j=0; msg[i]; i++) |
6059 | 333 switch (msg[i]) { |
6306 | 334 case '\n': |
335 ret[j++] = '<'; | |
336 ret[j++] = 'B'; | |
337 ret[j++] = 'R'; | |
338 ret[j++] = '>'; | |
339 break; | |
340 case '{': | |
341 case '}': | |
342 case '\\': | |
343 case '"': | |
344 ret[j++] = '\\'; | |
345 default: | |
346 ret[j++] = msg[i]; | |
6059 | 347 } |
348 ret[j] = '\0'; | |
349 | |
350 return ret; | |
2371
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
351 } |
db02399a9ad7
[gaim-migrate @ 2384]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2343
diff
changeset
|
352 |
6306 | 353 static int sflap_send(GaimConnection *gc, const char *buf, int olen, int type) |
2086 | 354 { |
6306 | 355 struct toc_data *tdt = (struct toc_data *)gc->proto_data; |
2086 | 356 int len; |
357 int slen = 0; | |
6306 | 358 int ret; |
2086 | 359 struct sflap_hdr hdr; |
6306 | 360 char *escaped, *obuf; |
2086 | 361 |
362 if (tdt->state == STATE_PAUSE) | |
363 /* TOC has given us the PAUSE message; sending could cause a disconnect | |
364 * so we just return here like everything went through fine */ | |
365 return 0; | |
366 | |
6306 | 367 if (olen < 0) { |
368 escaped = escape_message(buf); | |
6500 | 369 len = strlen(escaped); |
6306 | 370 } else { |
371 escaped = g_memdup(buf, olen); | |
2281
cc462108c101
[gaim-migrate @ 2291]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
372 len = olen; |
6306 | 373 } |
2281
cc462108c101
[gaim-migrate @ 2291]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
374 |
6306 | 375 /* |
376 * One _last_ 2048 check here! This shouldn't ever | |
377 * get hit though, hopefully. If it gets hit on an IM | |
378 * It'll lose the last " and the message won't go through, | |
379 * but this'll stop a segfault. | |
380 */ | |
2281
cc462108c101
[gaim-migrate @ 2291]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
381 if (len > MSG_LEN) { |
6484
5ced8e111473
[gaim-migrate @ 6998]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
382 gaim_debug(GAIM_DEBUG_WARNING, "toc", "message too long, truncating\n"); |
6306 | 383 escaped[MSG_LEN - 1] = '\0'; |
2281
cc462108c101
[gaim-migrate @ 2291]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2273
diff
changeset
|
384 len = MSG_LEN; |
2086 | 385 } |
386 | |
2334
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
387 if (olen < 0) |
6484
5ced8e111473
[gaim-migrate @ 6998]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
388 gaim_debug(GAIM_DEBUG_INFO, "toc", "C: %s\n", escaped); |
2334
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
389 |
2086 | 390 hdr.ast = '*'; |
391 hdr.type = type; | |
392 hdr.seqno = htons(tdt->seqno++ & 0xffff); | |
393 hdr.len = htons(len + (type == TYPE_SIGNON ? 0 : 1)); | |
394 | |
6306 | 395 obuf = (char *)malloc((sizeof(hdr)+len+1) * sizeof(char)); |
2086 | 396 memcpy(obuf, &hdr, sizeof(hdr)); |
397 slen += sizeof(hdr); | |
6306 | 398 |
399 memcpy(&obuf[slen], escaped, len); | |
2086 | 400 slen += len; |
6306 | 401 |
2086 | 402 if (type != TYPE_SIGNON) { |
403 obuf[slen] = '\0'; | |
404 slen += 1; | |
405 } | |
406 | |
9134 | 407 ret = write(tdt->toc_fd, obuf, slen); |
6306 | 408 free(obuf); |
7606 | 409 g_free(escaped); |
6306 | 410 |
411 return ret; | |
2086 | 412 } |
413 | |
5605 | 414 static int wait_reply(GaimConnection *gc, char *buffer, size_t buflen) |
2086 | 415 { |
416 struct toc_data *tdt = (struct toc_data *)gc->proto_data; | |
417 struct sflap_hdr *hdr; | |
418 int ret; | |
419 | |
9134 | 420 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
|
421 gaim_debug(GAIM_DEBUG_ERROR, "toc", "Couldn't read flap header\n"); |
2086 | 422 return -1; |
423 } | |
424 | |
425 hdr = (struct sflap_hdr *)buffer; | |
426 | |
427 if (buflen < ntohs(hdr->len)) { | |
428 /* fake like there's a read error */ | |
6484
5ced8e111473
[gaim-migrate @ 6998]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
429 gaim_debug(GAIM_DEBUG_ERROR, "toc", |
5ced8e111473
[gaim-migrate @ 6998]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
430 "buffer too small (have %d, need %d)\n", |
5ced8e111473
[gaim-migrate @ 6998]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
431 buflen, ntohs(hdr->len)); |
2086 | 432 return -1; |
433 } | |
434 | |
435 if (ntohs(hdr->len) > 0) { | |
436 int count = 0; | |
437 ret = 0; | |
438 do { | |
439 count += ret; | |
9134 | 440 ret = read(tdt->toc_fd, |
2086 | 441 buffer + sizeof(struct sflap_hdr) + count, ntohs(hdr->len) - count); |
442 } while (count + ret < ntohs(hdr->len) && ret > 0); | |
443 buffer[sizeof(struct sflap_hdr) + count + ret] = '\0'; | |
444 return ret; | |
445 } else | |
446 return 0; | |
447 } | |
448 | |
5605 | 449 static unsigned char *roast_password(const char *pass) |
2086 | 450 { |
451 /* Trivial "encryption" */ | |
452 static unsigned char rp[256]; | |
453 static char *roast = ROAST; | |
454 int pos = 2; | |
455 int x; | |
456 strcpy(rp, "0x"); | |
457 for (x = 0; (x < 150) && pass[x]; x++) | |
458 pos += sprintf(&rp[pos], "%02x", pass[x] ^ roast[x % strlen(roast)]); | |
459 rp[pos] = '\0'; | |
460 return rp; | |
461 } | |
462 | |
7094
2343c3aa1dec
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7084
diff
changeset
|
463 static void toc_got_info(void *data, const char *url_text, size_t len) |
2086 | 464 { |
465 if (!url_text) | |
466 return; | |
467 | |
7062
86ed8b2aa665
[gaim-migrate @ 7626]
Christian Hammond <chipx86@chipx86.com>
parents:
6982
diff
changeset
|
468 gaim_notify_formatted(data, NULL, _("Buddy Information"), NULL, |
86ed8b2aa665
[gaim-migrate @ 7626]
Christian Hammond <chipx86@chipx86.com>
parents:
6982
diff
changeset
|
469 url_text, NULL, NULL); |
2086 | 470 } |
471 | |
2453
b72143059ad4
[gaim-migrate @ 2466]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2382
diff
changeset
|
472 static char *show_error_message() |
2334
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
473 { |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
474 int no = atoi(strtok(NULL, ":")); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
475 char *w = strtok(NULL, ":"); |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
476 static char buf[256]; |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
477 |
6500 | 478 switch(no) { |
479 case 69: | |
480 g_snprintf(buf, sizeof(buf), _("Unable to write file %s."), w); | |
481 break; | |
482 case 169: | |
483 g_snprintf(buf, sizeof(buf), _("Unable to read file %s."), w); | |
484 break; | |
485 case 269: | |
486 g_snprintf(buf, sizeof(buf), _("Message too long, last %s bytes truncated."), w); | |
487 break; | |
488 case 901: | |
489 g_snprintf(buf, sizeof(buf), _("%s not currently logged in."), w); | |
490 break; | |
491 case 902: | |
492 g_snprintf(buf, sizeof(buf), _("Warning of %s not allowed."), w); | |
493 break; | |
494 case 903: | |
495 g_snprintf(buf, sizeof(buf), _("A message has been dropped, you are exceeding the server speed limit.")); | |
496 break; | |
497 case 950: | |
498 g_snprintf(buf, sizeof(buf), _("Chat in %s is not available."), w); | |
499 break; | |
500 case 960: | |
501 g_snprintf(buf, sizeof(buf), _("You are sending messages too fast to %s."), w); | |
502 break; | |
503 case 961: | |
504 g_snprintf(buf, sizeof(buf), _("You missed an IM from %s because it was too big."), w); | |
505 break; | |
506 case 962: | |
507 g_snprintf(buf, sizeof(buf), _("You missed an IM from %s because it was sent too fast."), w); | |
508 break; | |
509 case 970: | |
510 g_snprintf(buf, sizeof(buf), _("Failure.")); | |
511 break; | |
512 case 971: | |
513 g_snprintf(buf, sizeof(buf), _("Too many matches.")); | |
514 break; | |
515 case 972: | |
516 g_snprintf(buf, sizeof(buf), _("Need more qualifiers.")); | |
517 break; | |
518 case 973: | |
519 g_snprintf(buf, sizeof(buf), _("Dir service temporarily unavailable.")); | |
520 break; | |
521 case 974: | |
522 g_snprintf(buf, sizeof(buf), _("Email lookup restricted.")); | |
523 break; | |
524 case 975: | |
525 g_snprintf(buf, sizeof(buf), _("Keyword ignored.")); | |
526 break; | |
527 case 976: | |
528 g_snprintf(buf, sizeof(buf), _("No keywords.")); | |
529 break; | |
530 case 977: | |
531 g_snprintf(buf, sizeof(buf), _("User has no directory information.")); | |
532 /* g_snprintf(buf, sizeof(buf), _("Language not supported.")); */ | |
533 break; | |
534 case 978: | |
535 g_snprintf(buf, sizeof(buf), _("Country not supported.")); | |
536 break; | |
537 case 979: | |
538 g_snprintf(buf, sizeof(buf), _("Failure unknown: %s."), w); | |
539 break; | |
540 case 980: | |
541 g_snprintf(buf, sizeof(buf), _("Incorrect nickname or password.")); | |
542 break; | |
543 case 981: | |
544 g_snprintf(buf, sizeof(buf), _("The service is temporarily unavailable.")); | |
545 break; | |
546 case 982: | |
547 g_snprintf(buf, sizeof(buf), _("Your warning level is currently too high to log in.")); | |
548 break; | |
549 case 983: | |
550 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.")); | |
551 break; | |
552 g_snprintf(buf, sizeof(buf), _("An unknown signon error has occurred: %s."), w); | |
553 break; | |
554 default: | |
555 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
|
556 } |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
557 |
6500 | 558 return buf; |
2334
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
559 } |
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
560 |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
561 static void toc_callback(gpointer data, gint source, GaimInputCondition condition) |
2086 | 562 { |
5605 | 563 GaimConnection *gc = (GaimConnection *)data; |
9058 | 564 GaimAccount *account = gaim_connection_get_account(gc); |
2086 | 565 struct toc_data *tdt = (struct toc_data *)gc->proto_data; |
566 struct sflap_hdr *hdr; | |
567 struct signon so; | |
568 char buf[8 * 1024], *c; | |
569 char snd[BUF_LEN * 2]; | |
9058 | 570 const char *username = gaim_account_get_username(account); |
5605 | 571 char *password; |
9285 | 572 GaimBuddy *buddy; |
5605 | 573 |
2086 | 574 /* there's data waiting to be read, so read it. */ |
575 if (wait_reply(gc, buf, 8 * 1024) <= 0) { | |
5605 | 576 gaim_connection_error(gc, _("Connection Closed")); |
2086 | 577 return; |
578 } | |
579 | |
580 if (tdt->state == STATE_FLAPON) { | |
581 hdr = (struct sflap_hdr *)buf; | |
582 if (hdr->type != TYPE_SIGNON) | |
6484
5ced8e111473
[gaim-migrate @ 6998]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
583 gaim_debug(GAIM_DEBUG_ERROR, "toc", "hdr->type != TYPE_SIGNON\n"); |
2086 | 584 else |
6484
5ced8e111473
[gaim-migrate @ 6998]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
585 gaim_debug(GAIM_DEBUG_INFO, "toc", |
5ced8e111473
[gaim-migrate @ 6998]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
586 "TOC sends Client FLAP SIGNON\n"); |
2086 | 587 tdt->seqno = ntohs(hdr->seqno); |
588 tdt->state = STATE_SIGNON_REQUEST; | |
589 | |
6484
5ced8e111473
[gaim-migrate @ 6998]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
590 gaim_debug(GAIM_DEBUG_INFO, "toc", "Client sends TOC FLAP SIGNON\n"); |
5605 | 591 g_snprintf(so.username, sizeof(so.username), "%s", username); |
2086 | 592 so.ver = htonl(1); |
593 so.tag = htons(1); | |
594 so.namelen = htons(strlen(so.username)); | |
595 if (sflap_send(gc, (char *)&so, ntohs(so.namelen) + 8, TYPE_SIGNON) < 0) { | |
5605 | 596 gaim_connection_error(gc, _("Disconnected.")); |
2086 | 597 return; |
598 } | |
599 | |
6484
5ced8e111473
[gaim-migrate @ 6998]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
600 gaim_debug(GAIM_DEBUG_INFO, "toc", |
5ced8e111473
[gaim-migrate @ 6998]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
601 "Client sends TOC \"toc_signon\" message\n"); |
2853
f0633f458a1c
[gaim-migrate @ 2866]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
602 /* i hate icq. */ |
5605 | 603 if (username[0] >= '0' && username[0] <= '9') |
604 password = g_strndup(gaim_account_get_password(gc->account), 8); | |
605 else | |
606 password = g_strdup(gaim_account_get_password(gc->account)); | |
2086 | 607 g_snprintf(snd, sizeof snd, "toc_signon %s %d %s %s %s \"%s\"", |
7261 | 608 AUTH_HOST, AUTH_PORT, gaim_normalize(gc->account, username), |
5605 | 609 roast_password(password), LANGUAGE, REVISION); |
610 g_free(password); | |
2086 | 611 if (sflap_send(gc, snd, -1, TYPE_DATA) < 0) { |
5605 | 612 gaim_connection_error(gc, _("Disconnected.")); |
2086 | 613 return; |
614 } | |
615 | |
9140 | 616 gaim_connection_update_progress(gc, _("Waiting for reply..."), 2, TOC_CONNECT_STEPS); |
2086 | 617 return; |
618 } | |
619 | |
620 if (tdt->state == STATE_SIGNON_REQUEST) { | |
6484
5ced8e111473
[gaim-migrate @ 6998]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
621 gaim_debug(GAIM_DEBUG_INFO, "toc", "TOC sends client SIGN_ON reply\n"); |
4793 | 622 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
|
623 gaim_debug(GAIM_DEBUG_ERROR, "toc", |
5ced8e111473
[gaim-migrate @ 6998]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
624 "Didn't get SIGN_ON! buf was: %s\n", |
2086 | 625 buf + sizeof(struct sflap_hdr)); |
4793 | 626 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
|
627 strtok(buf + sizeof(struct sflap_hdr), ":"); |
5605 | 628 gaim_connection_error(gc, show_error_message()); |
2334
b53cd5b63a99
[gaim-migrate @ 2347]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
629 } else |
6623 | 630 gaim_connection_error(gc, _("Authentication failed")); |
2086 | 631 return; |
632 } | |
633 /* 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
|
634 gaim_debug(GAIM_DEBUG_INFO, "toc", |
5ced8e111473
[gaim-migrate @ 6998]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
635 "TOC version: %s\n", buf + sizeof(struct sflap_hdr) + 8); |
2086 | 636 |
637 /* we used to check for the CONFIG here, but we'll wait until we've sent our | |
638 * version of the config and then the toc_init_done message. we'll come back to | |
639 * the callback in a better state if we get CONFIG anyway */ | |
640 | |
641 tdt->state = STATE_ONLINE; | |
642 | |
5605 | 643 gaim_connection_set_state(gc, GAIM_CONNECTED); |
2086 | 644 serv_finish_login(gc); |
645 | |
9058 | 646 /* |
647 * Add me to my buddy list so that we know the time when | |
648 * the server thinks I signed on. | |
649 */ | |
9285 | 650 buddy = gaim_buddy_new(account, username, NULL); |
651 /* XXX - Pick a group to add to */ | |
652 /* gaim_blist_add(buddy, NULL, g, NULL); */ | |
653 serv_add_buddy(gc, buddy); | |
9058 | 654 |
2086 | 655 /* Client sends TOC toc_init_done message */ |
6484
5ced8e111473
[gaim-migrate @ 6998]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
656 gaim_debug(GAIM_DEBUG_INFO, "toc", |
5ced8e111473
[gaim-migrate @ 6998]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
657 "Client sends TOC toc_init_done message\n"); |
2086 | 658 g_snprintf(snd, sizeof snd, "toc_init_done"); |
659 sflap_send(gc, snd, -1, TYPE_DATA); | |
660 | |
661 /* | |
662 g_snprintf(snd, sizeof snd, "toc_set_caps %s %s %s", | |
663 FILE_SEND_UID, FILE_GET_UID, B_ICON_UID); | |
664 */ | |
665 g_snprintf(snd, sizeof snd, "toc_set_caps %s %s", FILE_SEND_UID, FILE_GET_UID); | |
666 sflap_send(gc, snd, -1, TYPE_DATA); | |
667 | |
668 return; | |
669 } | |
670 | |
6484
5ced8e111473
[gaim-migrate @ 6998]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
671 gaim_debug(GAIM_DEBUG_INFO, "toc", "S: %s\n", |
5ced8e111473
[gaim-migrate @ 6998]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
672 buf + sizeof(struct sflap_hdr)); |
2086 | 673 |
674 c = strtok(buf + sizeof(struct sflap_hdr), ":"); /* Ditch the first part */ | |
675 | |
4793 | 676 if (!g_ascii_strcasecmp(c, "SIGN_ON")) { |
2086 | 677 /* we should only get here after a PAUSE */ |
678 if (tdt->state != STATE_PAUSE) | |
6484
5ced8e111473
[gaim-migrate @ 6998]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
679 gaim_debug(GAIM_DEBUG_ERROR, "toc", |
5ced8e111473
[gaim-migrate @ 6998]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
680 "got SIGN_ON but not PAUSE!\n"); |
2086 | 681 else { |
682 tdt->state = STATE_ONLINE; | |
683 g_snprintf(snd, sizeof snd, "toc_signon %s %d %s %s %s \"%s\"", | |
5605 | 684 AUTH_HOST, AUTH_PORT, |
7261 | 685 gaim_normalize(gc->account, gaim_account_get_username(gc->account)), |
5605 | 686 roast_password(gaim_account_get_password(gc->account)), |
687 LANGUAGE, REVISION); | |
2086 | 688 if (sflap_send(gc, snd, -1, TYPE_DATA) < 0) { |
5605 | 689 gaim_connection_error(gc, _("Disconnected.")); |
2086 | 690 return; |
691 } | |
692 g_snprintf(snd, sizeof snd, "toc_init_done"); | |
693 sflap_send(gc, snd, -1, TYPE_DATA); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5234
diff
changeset
|
694 gaim_notify_info(gc, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5234
diff
changeset
|
695 _("TOC has come back from its pause. You may " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5234
diff
changeset
|
696 "now send messages again."), NULL); |
2086 | 697 } |
4793 | 698 } else if (!g_ascii_strcasecmp(c, "CONFIG")) { |
2086 | 699 c = strtok(NULL, ":"); |
7117
943085b0ff8b
[gaim-migrate @ 7684]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
700 gaim_blist_parse_toc_buddy_list(gc->account, c); |
4793 | 701 } else if (!g_ascii_strcasecmp(c, "NICK")) { |
2086 | 702 /* ignore NICK so that things get imported/exported properly |
703 c = strtok(NULL, ":"); | |
704 g_snprintf(gc->username, sizeof(gc->username), "%s", c); | |
705 */ | |
4793 | 706 } else if (!g_ascii_strcasecmp(c, "IM_IN")) { |
2086 | 707 char *away, *message; |
708 int a = 0; | |
709 | |
710 c = strtok(NULL, ":"); | |
711 away = strtok(NULL, ":"); | |
712 | |
713 message = away; | |
714 while (*message && (*message != ':')) | |
715 message++; | |
716 message++; | |
717 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
718 a = (away && (*away == 'T')) ? GAIM_CONV_IM_AUTO_RESP : 0; |
2086 | 719 |
6982 | 720 serv_got_im(gc, c, message, a, time(NULL)); |
4793 | 721 } else if (!g_ascii_strcasecmp(c, "UPDATE_BUDDY")) { |
2305
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
722 char *l, *uc, *tmp; |
2086 | 723 int logged, evil, idle, type = 0; |
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 | |
733 logged = (l && (*l == 'T')) ? 1 : 0; | |
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 |
4732 | 774 serv_got_update(gc, c, logged, 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) | |
9554 | 834 gaim_conv_chat_add_user(chat, buddy, NULL, GAIM_CBFLAGS_NONE); |
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 | |
5605 | 1282 static void toc_join_chat(GaimConnection *g, GHashTable *data) |
2086 | 1283 { |
1284 char buf[BUF_LONG]; | |
5234 | 1285 char *name, *exchange; |
1286 char *id; | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1287 |
5234 | 1288 name = g_hash_table_lookup(data, "room"); |
1289 exchange = g_hash_table_lookup(data, "exchange"); | |
1290 id = g_hash_table_lookup(data, "id"); | |
1291 | |
1292 if (id) { | |
1293 g_snprintf(buf, 255, "toc_chat_accept %d", atoi(id)); | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1294 } else { |
5234 | 1295 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
|
1296 } |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
1297 |
2086 | 1298 sflap_send(g, buf, -1, TYPE_DATA); |
1299 } | |
1300 | |
7261 | 1301 static void toc_chat_invite(GaimConnection *gc, int id, const char *message, const char *name) |
2086 | 1302 { |
1303 char buf[BUF_LONG]; | |
2719
9747583279d1
[gaim-migrate @ 2732]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2706
diff
changeset
|
1304 g_snprintf(buf, sizeof(buf) / 2, "toc_chat_invite %d \"%s\" %s", id, |
7261 | 1305 message ? message : "", gaim_normalize(gc->account, name)); |
1306 sflap_send(gc, buf, -1, TYPE_DATA); | |
2086 | 1307 } |
1308 | |
5605 | 1309 static void toc_chat_leave(GaimConnection *g, int id) |
2086 | 1310 { |
1311 GSList *bcs = g->buddy_chats; | |
5679 | 1312 GaimConversation *b = NULL; |
2086 | 1313 char buf[BUF_LEN * 2]; |
1314 | |
1315 while (bcs) { | |
5679 | 1316 b = (GaimConversation *)bcs->data; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1317 if (id == gaim_conv_chat_get_id(GAIM_CONV_CHAT(b))) |
2086 | 1318 break; |
1319 b = NULL; | |
1320 bcs = bcs->next; | |
1321 } | |
1322 | |
1323 if (!b) | |
1324 return; /* can this happen? */ | |
1325 | |
4491 | 1326 if (gaim_conversation_get_account(b) == NULL) { |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4349
diff
changeset
|
1327 /* TOC already kicked us out of this room */ |
2086 | 1328 serv_got_chat_left(g, id); |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4349
diff
changeset
|
1329 } |
2086 | 1330 else { |
1331 g_snprintf(buf, 255, "toc_chat_leave %d", id); | |
1332 sflap_send(g, buf, -1, TYPE_DATA); | |
1333 } | |
1334 } | |
1335 | |
7261 | 1336 static void toc_chat_whisper(GaimConnection *gc, int id, const char *who, const char *message) |
2086 | 1337 { |
6059 | 1338 char *buf1, *buf2; |
1339 buf1 = escape_text(message); | |
7261 | 1340 buf2 = g_strdup_printf("toc_chat_whisper %d %s \"%s\"", id, gaim_normalize(gc->account, who), buf1); |
6059 | 1341 g_free(buf1); |
7261 | 1342 sflap_send(gc, buf2, -1, TYPE_DATA); |
6059 | 1343 g_free(buf2); |
2086 | 1344 } |
1345 | |
6059 | 1346 static int toc_chat_send(GaimConnection *g, int id, const char *message) |
2086 | 1347 { |
6059 | 1348 char *buf1, *buf2; |
1349 buf1 = escape_text(message); | |
1350 if (strlen(buf1) > 2000) { | |
1351 g_free(buf1); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
1352 return -E2BIG; |
6059 | 1353 } |
1354 buf2 = g_strdup_printf("toc_chat_send %d \"%s\"", id, buf1); | |
1355 g_free(buf1); | |
1356 sflap_send(g, buf2, -1, TYPE_DATA); | |
1357 g_free(buf2); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
1358 return 0; |
2086 | 1359 } |
1360 | |
5605 | 1361 static void toc_keepalive(GaimConnection *gc) |
2086 | 1362 { |
1363 sflap_send(gc, "", 0, TYPE_KEEPALIVE); | |
1364 } | |
1365 | |
6695 | 1366 static const char *toc_list_icon(GaimAccount *a, GaimBuddy *b) |
2086 | 1367 { |
5971 | 1368 if (!b || (b && b->name && b->name[0] == '+')) { |
6695 | 1369 if (a != NULL && isdigit(*gaim_account_get_username(a))) |
5971 | 1370 return "icq"; |
1371 else | |
1372 return "aim"; | |
1373 } | |
1374 | |
1375 if (b && b->name && isdigit(b->name[0])) | |
1376 return "icq"; | |
4687 | 1377 return "aim"; |
1378 } | |
4916 | 1379 |
6695 | 1380 static void toc_list_emblems(GaimBuddy *b, char **se, char **sw, char **nw, char **ne) |
4916 | 1381 { |
1382 char *emblems[4] = {NULL,NULL,NULL,NULL}; | |
1383 int i = 0; | |
1384 | |
5971 | 1385 if (!GAIM_BUDDY_IS_ONLINE(b)) { |
4916 | 1386 *se = "offline"; |
1387 return; | |
1388 } else { | |
1389 if (b->uc & UC_UNAVAILABLE) | |
1390 emblems[i++] = "away"; | |
1391 if (b->uc & UC_AOL) | |
1392 emblems[i++] = "aol"; | |
1393 if (b->uc & UC_ADMIN) | |
1394 emblems[i++] = "admin"; | |
1395 if (b->uc & UC_WIRELESS) | |
1396 emblems[i++] = "wireless"; | |
1397 } | |
1398 *se = emblems[0]; | |
1399 *sw = emblems[1]; | |
1400 *nw = emblems[2]; | |
1401 *ne = emblems[3]; | |
1402 } | |
2086 | 1403 |
9030 | 1404 static GList *toc_blist_node_menu(GaimBlistNode *node) |
2086 | 1405 { |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1406 GList *m = NULL; |
9030 | 1407 GaimBlistNodeAction *act; |
2086 | 1408 |
9030 | 1409 if(GAIM_BLIST_NODE_IS_BUDDY(node)) { |
1410 act = gaim_blist_node_action_new(_("Get Dir Info"), | |
1411 toc_get_dir, NULL); | |
1412 m = g_list_append(m, act); | |
1413 } | |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1414 |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
1415 return m; |
2086 | 1416 } |
1417 | |
5605 | 1418 static void toc_add_permit(GaimConnection *gc, const char *who) |
2086 | 1419 { |
1420 char buf2[BUF_LEN * 2]; | |
5605 | 1421 if (gc->account->perm_deny != 3) |
2086 | 1422 return; |
7261 | 1423 g_snprintf(buf2, sizeof(buf2), "toc_add_permit %s", gaim_normalize(gc->account, who)); |
2086 | 1424 sflap_send(gc, buf2, -1, TYPE_DATA); |
1425 toc_set_config(gc); | |
1426 } | |
1427 | |
5605 | 1428 static void toc_add_deny(GaimConnection *gc, const char *who) |
2086 | 1429 { |
1430 char buf2[BUF_LEN * 2]; | |
5605 | 1431 if (gc->account->perm_deny != 4) |
2086 | 1432 return; |
7261 | 1433 g_snprintf(buf2, sizeof(buf2), "toc_add_deny %s", gaim_normalize(gc->account, who)); |
2086 | 1434 sflap_send(gc, buf2, -1, TYPE_DATA); |
1435 toc_set_config(gc); | |
1436 } | |
1437 | |
5605 | 1438 static void toc_set_permit_deny(GaimConnection *gc) |
2086 | 1439 { |
1440 char buf2[BUF_LEN * 2]; | |
1441 GSList *list; | |
1442 int at; | |
1443 | |
5605 | 1444 switch (gc->account->perm_deny) { |
2086 | 1445 case 1: |
1446 /* permit all, deny none. to get here reliably we need to have been in permit | |
1447 * mode, and send an empty toc_add_deny message, which will switch us to deny none */ | |
1448 g_snprintf(buf2, sizeof(buf2), "toc_add_permit "); | |
1449 sflap_send(gc, buf2, -1, TYPE_DATA); | |
1450 g_snprintf(buf2, sizeof(buf2), "toc_add_deny "); | |
1451 sflap_send(gc, buf2, -1, TYPE_DATA); | |
1452 break; | |
1453 case 2: | |
1454 /* deny all, permit none. to get here reliably we need to have been in deny | |
1455 * mode, and send an empty toc_add_permit message, which will switch us to permit none */ | |
1456 g_snprintf(buf2, sizeof(buf2), "toc_add_deny "); | |
1457 sflap_send(gc, buf2, -1, TYPE_DATA); | |
1458 g_snprintf(buf2, sizeof(buf2), "toc_add_permit "); | |
1459 sflap_send(gc, buf2, -1, TYPE_DATA); | |
1460 break; | |
1461 case 3: | |
1462 /* permit some. we want to switch to deny mode first, then send the toc_add_permit | |
1463 * message, which will clear and set our permit list. toc sucks. */ | |
1464 g_snprintf(buf2, sizeof(buf2), "toc_add_deny "); | |
1465 sflap_send(gc, buf2, -1, TYPE_DATA); | |
1466 | |
1467 at = g_snprintf(buf2, sizeof(buf2), "toc_add_permit "); | |
4491 | 1468 list = gc->account->permit; |
2086 | 1469 while (list) { |
7261 | 1470 at += g_snprintf(buf2 + at, sizeof(buf2) - at, "%s ", gaim_normalize(gc->account, list->data)); |
2086 | 1471 if (at > MSG_LEN + 32) { /* from out my ass comes greatness */ |
1472 sflap_send(gc, buf2, -1, TYPE_DATA); | |
1473 at = g_snprintf(buf2, sizeof(buf2), "toc_add_permit "); | |
1474 } | |
1475 list = list->next; | |
1476 } | |
1477 sflap_send(gc, buf2, -1, TYPE_DATA); | |
1478 break; | |
1479 case 4: | |
1480 /* deny some. we want to switch to permit mode first, then send the toc_add_deny | |
1481 * message, which will clear and set our deny list. toc sucks. */ | |
1482 g_snprintf(buf2, sizeof(buf2), "toc_add_permit "); | |
1483 sflap_send(gc, buf2, -1, TYPE_DATA); | |
1484 | |
1485 at = g_snprintf(buf2, sizeof(buf2), "toc_add_deny "); | |
4491 | 1486 list = gc->account->deny; |
2086 | 1487 while (list) { |
7261 | 1488 at += g_snprintf(buf2 + at, sizeof(buf2) - at, "%s ", gaim_normalize(gc->account, list->data)); |
2086 | 1489 if (at > MSG_LEN + 32) { /* from out my ass comes greatness */ |
1490 sflap_send(gc, buf2, -1, TYPE_DATA); | |
1491 at = g_snprintf(buf2, sizeof(buf2), "toc_add_deny "); | |
1492 } | |
1493 list = list->next; | |
1494 } | |
1495 sflap_send(gc, buf2, -1, TYPE_DATA); | |
1496 break; | |
1497 default: | |
1498 break; | |
1499 } | |
1500 toc_set_config(gc); | |
1501 } | |
1502 | |
5605 | 1503 static void toc_rem_permit(GaimConnection *gc, const char *who) |
2086 | 1504 { |
5605 | 1505 if (gc->account->perm_deny != 3) |
2086 | 1506 return; |
1507 toc_set_permit_deny(gc); | |
1508 } | |
1509 | |
5605 | 1510 static void toc_rem_deny(GaimConnection *gc, const char *who) |
2086 | 1511 { |
5605 | 1512 if (gc->account->perm_deny != 4) |
2086 | 1513 return; |
1514 toc_set_permit_deny(gc); | |
1515 } | |
1516 | |
5605 | 1517 static GList *toc_away_states(GaimConnection *gc) |
2086 | 1518 { |
1519 return g_list_append(NULL, GAIM_AWAY_CUSTOM); | |
1520 } | |
1521 | |
7063
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7062
diff
changeset
|
1522 static void |
9015 | 1523 show_set_info(GaimPluginAction *action) |
7067
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
1524 { |
9015 | 1525 GaimConnection *gc = (GaimConnection *) action->context; |
7067
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
1526 gaim_account_request_change_user_info(gaim_connection_get_account(gc)); |
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
1527 } |
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
1528 |
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
1529 static void |
9015 | 1530 change_pass(GaimPluginAction *action) |
7063
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7062
diff
changeset
|
1531 { |
9015 | 1532 GaimConnection *gc = (GaimConnection *) action->context; |
7063
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7062
diff
changeset
|
1533 gaim_account_request_change_password(gaim_connection_get_account(gc)); |
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7062
diff
changeset
|
1534 } |
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7062
diff
changeset
|
1535 |
9015 | 1536 static GList *toc_actions(GaimPlugin *plugin, gpointer context) |
2086 | 1537 { |
1538 GList *m = NULL; | |
9015 | 1539 GaimPluginAction *act; |
2086 | 1540 |
9015 | 1541 act = gaim_plugin_action_new(_("Set User Info"), |
1542 show_set_info); | |
1543 m = g_list_append(m, act); | |
4333 | 1544 |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
1545 #if 0 |
9015 | 1546 act = gaim_plugin_action_new(_("Set Dir Info"), |
1547 show_set_dir); | |
1548 m = g_list_append(m, act); | |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
1549 #endif |
4333 | 1550 |
9015 | 1551 act = gaim_plugin_action_new(_("Change Password"), |
1552 change_pass); | |
1553 m = g_list_append(m, act); | |
2086 | 1554 |
1555 return m; | |
1556 } | |
1557 | |
6867 | 1558 #if 0 |
2086 | 1559 /********* |
1560 * RVOUS ACTIONS | |
1561 ********/ | |
1562 | |
1563 struct file_header { | |
1564 char magic[4]; /* 0 */ | |
1565 short hdrlen; /* 4 */ | |
1566 short hdrtype; /* 6 */ | |
1567 char bcookie[8]; /* 8 */ | |
1568 short encrypt; /* 16 */ | |
1569 short compress; /* 18 */ | |
1570 short totfiles; /* 20 */ | |
1571 short filesleft; /* 22 */ | |
1572 short totparts; /* 24 */ | |
1573 short partsleft; /* 26 */ | |
1574 long totsize; /* 28 */ | |
1575 long size; /* 32 */ | |
1576 long modtime; /* 36 */ | |
1577 long checksum; /* 40 */ | |
1578 long rfrcsum; /* 44 */ | |
1579 long rfsize; /* 48 */ | |
1580 long cretime; /* 52 */ | |
1581 long rfcsum; /* 56 */ | |
1582 long nrecvd; /* 60 */ | |
1583 long recvcsum; /* 64 */ | |
1584 char idstring[32]; /* 68 */ | |
1585 char flags; /* 100 */ | |
1586 char lnameoffset; /* 101 */ | |
1587 char lsizeoffset; /* 102 */ | |
1588 char dummy[69]; /* 103 */ | |
1589 char macfileinfo[16]; /* 172 */ | |
1590 short nencode; /* 188 */ | |
1591 short nlanguage; /* 190 */ | |
1592 char name[64]; /* 192 */ | |
1593 /* 256 */ | |
1594 }; | |
1595 | |
1596 struct file_transfer { | |
1597 struct file_header hdr; | |
1598 | |
5605 | 1599 GaimConnection *gc; |
2086 | 1600 |
1601 char *user; | |
1602 char *cookie; | |
1603 char *ip; | |
1604 int port; | |
1605 long size; | |
1606 struct stat st; | |
1607 | |
1608 GtkWidget *window; | |
1609 int files; | |
1610 char *filename; | |
1611 FILE *file; | |
1612 int recvsize; | |
1613 | |
1614 gint inpa; | |
1615 }; | |
1616 | |
1617 static void debug_header(struct file_transfer *ft) { | |
1618 struct file_header *f = (struct file_header *)ft; | |
6484
5ced8e111473
[gaim-migrate @ 6998]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
1619 gaim_debug(GAIM_DEBUG_MISC, "toc", "FT HEADER:\n" |
2086 | 1620 "\t%s %d 0x%04x\n" |
1621 "\t%s %d %d\n" | |
4201
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1622 "\t%d %d %d %d %d %d\n" |
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
4115
diff
changeset
|
1623 "\t%d %d %d %d %d %d %d %d\n" |
2086 | 1624 "\t%s\n" |
1625 "\t0x%02x, 0x%02x, 0x%02x\n" | |
1626 "\t%s %s\n" | |
1627 "\t%d %d\n" | |
1628 "\t%s\n", | |
1629 f->magic, ntohs(f->hdrlen), f->hdrtype, | |
1630 f->bcookie, ntohs(f->encrypt), ntohs(f->compress), | |
1631 ntohs(f->totfiles), ntohs(f->filesleft), ntohs(f->totparts), | |
1632 ntohs(f->partsleft), ntohl(f->totsize), ntohl(f->size), | |
1633 ntohl(f->modtime), ntohl(f->checksum), ntohl(f->rfrcsum), ntohl(f->rfsize), | |
1634 ntohl(f->cretime), ntohl(f->rfcsum), ntohl(f->nrecvd), | |
1635 ntohl(f->recvcsum), | |
1636 f->idstring, | |
1637 f->flags, f->lnameoffset, f->lsizeoffset, | |
1638 f->dummy, f->macfileinfo, | |
1639 ntohs(f->nencode), ntohs(f->nlanguage), | |
1640 f->name); | |
1641 } | |
1642 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1643 static void toc_send_file_callback(gpointer data, gint source, GaimInputCondition cond) |
2086 | 1644 { |
1645 char buf[BUF_LONG]; | |
1646 int rt, i; | |
1647 | |
1648 struct file_transfer *ft = data; | |
1649 | |
1650 if (ft->hdr.hdrtype != 0x202) { | |
1651 char *buf; | |
1652 frombase64(ft->cookie, &buf, NULL); | |
1653 | |
9134 | 1654 read(source, ft, 8); |
1655 read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); | |
2086 | 1656 debug_header(ft); |
1657 | |
1658 ft->hdr.hdrtype = 0x202; | |
1659 memcpy(ft->hdr.bcookie, buf, 8); | |
1660 g_free(buf); | |
1661 ft->hdr.encrypt = 0; ft->hdr.compress = 0; | |
1662 debug_header(ft); | |
9134 | 1663 write(source, ft, 256); |
2086 | 1664 |
1665 if (ft->files == 1) { | |
1666 ft->file = fopen(ft->filename, "w"); | |
1667 if (!ft->file) { | |
4115 | 1668 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
|
1669 gaim_notify_error(ft->gc, NULL, buf, strerror(errno)); |
2086 | 1670 g_free(buf); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1671 gaim_input_remove(ft->inpa); |
9134 | 1672 close(source); |
2086 | 1673 g_free(ft->filename); |
1674 g_free(ft->user); | |
1675 g_free(ft->ip); | |
1676 g_free(ft->cookie); | |
1677 g_free(ft); | |
1678 } | |
1679 } else { | |
1680 buf = g_strdup_printf("%s/%s", ft->filename, ft->hdr.name); | |
1681 ft->file = fopen(buf, "w"); | |
1682 g_free(buf); | |
1683 if (!ft->file) { | |
1684 buf = g_strdup_printf("Could not open %s/%s for writing!", ft->filename, | |
1685 ft->hdr.name); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5234
diff
changeset
|
1686 gaim_notify_error(ft->gc, NULL, buf, strerror(errno)); |
2086 | 1687 g_free(buf); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1688 gaim_input_remove(ft->inpa); |
9134 | 1689 close(source); |
2086 | 1690 g_free(ft->filename); |
1691 g_free(ft->user); | |
1692 g_free(ft->ip); | |
1693 g_free(ft->cookie); | |
1694 g_free(ft); | |
1695 } | |
1696 } | |
1697 | |
1698 return; | |
1699 } | |
1700 | |
9134 | 1701 rt = read(source, buf, MIN(ntohl(ft->hdr.size) - ft->recvsize, 1024)); |
2086 | 1702 if (rt < 0) { |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5234
diff
changeset
|
1703 gaim_notify_error(ft->gc, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5234
diff
changeset
|
1704 _("File transfer failed; other side probably " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5234
diff
changeset
|
1705 "canceled."), NULL); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1706 gaim_input_remove(ft->inpa); |
9134 | 1707 close(source); |
2086 | 1708 g_free(ft->user); |
1709 g_free(ft->ip); | |
1710 g_free(ft->cookie); | |
1711 if (ft->file) | |
1712 fclose(ft->file); | |
1713 g_free(ft); | |
1714 return; | |
1715 } | |
1716 ft->recvsize += rt; | |
1717 for (i = 0; i < rt; i++) | |
1718 fprintf(ft->file, "%c", buf[i]); | |
1719 | |
1720 if (ft->recvsize == ntohl(ft->hdr.size)) { | |
1721 ft->hdr.hdrtype = htons(0x0204); | |
1722 ft->hdr.filesleft = htons(ntohs(ft->hdr.filesleft) - 1); | |
1723 ft->hdr.partsleft = htons(ntohs(ft->hdr.partsleft) - 1); | |
1724 ft->hdr.recvcsum = ft->hdr.checksum; /* uh... */ | |
1725 ft->hdr.nrecvd = htons(ntohs(ft->hdr.nrecvd) + 1); | |
1726 ft->hdr.flags = 0; | |
9134 | 1727 write(source, ft, 256); |
2086 | 1728 debug_header(ft); |
1729 ft->recvsize = 0; | |
1730 fclose(ft->file); | |
1731 if (ft->hdr.filesleft == 0) { | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1732 gaim_input_remove(ft->inpa); |
9134 | 1733 close(source); |
2086 | 1734 g_free(ft->filename); |
1735 g_free(ft->user); | |
1736 g_free(ft->ip); | |
1737 g_free(ft->cookie); | |
1738 g_free(ft); | |
1739 } | |
1740 } | |
1741 } | |
1742 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1743 static void toc_send_file_connect(gpointer data, gint src, GaimInputCondition cond) |
2086 | 1744 { |
1745 struct file_transfer *ft = data; | |
1746 | |
1747 if (src == -1) { | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5234
diff
changeset
|
1748 gaim_notify_error(ft->gc, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5234
diff
changeset
|
1749 _("Could not connect for transfer."), NULL); |
2086 | 1750 g_free(ft->filename); |
1751 g_free(ft->cookie); | |
1752 g_free(ft->user); | |
1753 g_free(ft->ip); | |
1754 g_free(ft); | |
1755 return; | |
1756 } | |
1757 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1758 ft->inpa = gaim_input_add(src, GAIM_INPUT_READ, toc_send_file_callback, ft); |
2086 | 1759 } |
1760 | |
1761 static void toc_send_file(gpointer a, struct file_transfer *old_ft) | |
1762 { | |
1763 struct file_transfer *ft; | |
1764 const char *dirname = gtk_file_selection_get_filename(GTK_FILE_SELECTION(old_ft->window)); | |
5605 | 1765 GaimAccount *account; |
2086 | 1766 char buf[BUF_LEN * 2]; |
1767 | |
5966 | 1768 if (gaim_gtk_check_if_dir(dirname, GTK_FILE_SELECTION(old_ft->window))) |
2086 | 1769 return; |
1770 ft = g_new0(struct file_transfer, 1); | |
1771 if (old_ft->files == 1) | |
1772 ft->filename = g_strdup(dirname); | |
1773 else | |
4793 | 1774 ft->filename = g_path_get_dirname(dirname); |
2086 | 1775 ft->cookie = g_strdup(old_ft->cookie); |
1776 ft->user = g_strdup(old_ft->user); | |
1777 ft->ip = g_strdup(old_ft->ip); | |
1778 ft->files = old_ft->files; | |
1779 ft->port = old_ft->port; | |
1780 ft->gc = old_ft->gc; | |
4491 | 1781 account = ft->gc->account; |
2086 | 1782 gtk_widget_destroy(old_ft->window); |
1783 | |
1784 g_snprintf(buf, sizeof(buf), "toc_rvous_accept %s %s %s", ft->user, ft->cookie, FILE_SEND_UID); | |
1785 sflap_send(ft->gc, buf, -1, TYPE_DATA); | |
1786 | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1787 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
|
1788 gaim_notify_error(ft->gc, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5234
diff
changeset
|
1789 _("Could not connect for transfer."), NULL); |
2086 | 1790 g_free(ft->filename); |
1791 g_free(ft->cookie); | |
1792 g_free(ft->user); | |
1793 g_free(ft->ip); | |
1794 g_free(ft); | |
1795 return; | |
1796 } | |
1797 } | |
1798 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1799 static void toc_get_file_callback(gpointer data, gint source, GaimInputCondition cond) |
2086 | 1800 { |
1801 char buf[BUF_LONG]; | |
1802 | |
1803 struct file_transfer *ft = data; | |
1804 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1805 if (cond & GAIM_INPUT_WRITE) { |
2086 | 1806 int remain = MIN(ntohl(ft->hdr.totsize) - ft->recvsize, 1024); |
1807 int i; | |
1808 for (i = 0; i < remain; i++) | |
1809 fscanf(ft->file, "%c", &buf[i]); | |
9134 | 1810 write(source, buf, remain); |
2086 | 1811 ft->recvsize += remain; |
1812 if (ft->recvsize == ntohl(ft->hdr.totsize)) { | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1813 gaim_input_remove(ft->inpa); |
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1814 ft->inpa = gaim_input_add(source, GAIM_INPUT_READ, |
2086 | 1815 toc_get_file_callback, ft); |
1816 } | |
1817 return; | |
1818 } | |
1819 | |
1820 if (ft->hdr.hdrtype == htons(0x1108)) { | |
1821 struct tm *fortime; | |
1822 struct stat st; | |
4793 | 1823 char *basename; |
2086 | 1824 |
9134 | 1825 read(source, ft, 8); |
1826 read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); | |
2086 | 1827 debug_header(ft); |
1828 | |
1829 stat(ft->filename, &st); | |
1830 fortime = localtime(&st.st_mtime); | |
4793 | 1831 basename = g_path_get_basename(ft->filename); |
2086 | 1832 g_snprintf(buf, sizeof(buf), "%2d/%2d/%4d %2d:%2d %8ld %s\r\n", |
1833 fortime->tm_mon + 1, fortime->tm_mday, fortime->tm_year + 1900, | |
1834 fortime->tm_hour + 1, fortime->tm_min + 1, (long)st.st_size, | |
4793 | 1835 basename); |
9134 | 1836 write(source, buf, ntohl(ft->hdr.size)); |
4793 | 1837 g_free(basename); |
2086 | 1838 return; |
1839 } | |
1840 | |
1841 if (ft->hdr.hdrtype == htons(0x1209)) { | |
9134 | 1842 read(source, ft, 8); |
1843 read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); | |
2086 | 1844 debug_header(ft); |
1845 return; | |
1846 } | |
1847 | |
1848 if (ft->hdr.hdrtype == htons(0x120b)) { | |
9134 | 1849 read(source, ft, 8); |
1850 read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); | |
2086 | 1851 debug_header(ft); |
1852 | |
1853 if (ft->hdr.hdrtype != htons(0x120c)) { | |
1854 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
|
1855 gaim_notify_error(ft->gc, NULL, buf, NULL); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1856 gaim_input_remove(ft->inpa); |
9134 | 1857 close(source); |
2086 | 1858 g_free(ft->filename); |
1859 g_free(ft->user); | |
1860 g_free(ft->ip); | |
1861 g_free(ft->cookie); | |
1862 if (ft->file) | |
1863 fclose(ft->file); | |
1864 g_free(ft); | |
1865 return; | |
1866 } | |
1867 | |
1868 ft->hdr.hdrtype = 0x0101; | |
1869 ft->hdr.totfiles = htons(1); ft->hdr.filesleft = htons(1); | |
1870 ft->hdr.flags = 0x20; | |
9134 | 1871 write(source, ft, 256); |
2086 | 1872 return; |
1873 } | |
1874 | |
1875 if (ft->hdr.hdrtype == 0x0101) { | |
9134 | 1876 read(source, ft, 8); |
1877 read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); | |
2086 | 1878 debug_header(ft); |
1879 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1880 gaim_input_remove(ft->inpa); |
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1881 ft->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, |
2086 | 1882 toc_get_file_callback, ft); |
1883 return; | |
1884 } | |
1885 | |
1886 if (ft->hdr.hdrtype == 0x0202) { | |
9134 | 1887 read(source, ft, 8); |
1888 read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); | |
2086 | 1889 debug_header(ft); |
1890 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1891 gaim_input_remove(ft->inpa); |
9134 | 1892 close(source); |
2086 | 1893 g_free(ft->filename); |
1894 g_free(ft->user); | |
1895 g_free(ft->ip); | |
1896 g_free(ft->cookie); | |
1897 if (ft->file) | |
1898 fclose(ft->file); | |
1899 g_free(ft); | |
1900 return; | |
1901 } | |
1902 } | |
1903 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1904 static void toc_get_file_connect(gpointer data, gint src, GaimInputCondition cond) |
2086 | 1905 { |
1906 struct file_transfer *ft = data; | |
1907 struct file_header *hdr; | |
1908 char *buf; | |
4793 | 1909 char *basename; |
2086 | 1910 |
1911 if (src == -1) { | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5234
diff
changeset
|
1912 gaim_notify_error(ft->gc, NULL, |
7981 | 1913 _("Could not connect for transfer."), NULL); |
2086 | 1914 fclose(ft->file); |
1915 g_free(ft->filename); | |
1916 g_free(ft->cookie); | |
1917 g_free(ft->user); | |
1918 g_free(ft->ip); | |
1919 g_free(ft); | |
1920 return; | |
1921 } | |
1922 | |
1923 hdr = (struct file_header *)ft; | |
1924 hdr->magic[0] = 'O'; hdr->magic[1] = 'F'; hdr->magic[2] = 'T'; hdr->magic[3] = '2'; | |
1925 hdr->hdrlen = htons(256); | |
1926 hdr->hdrtype = htons(0x1108); | |
1927 frombase64(ft->cookie, &buf, NULL); | |
1928 g_snprintf(hdr->bcookie, 8, "%s", buf); | |
1929 g_free(buf); | |
1930 hdr->totfiles = htons(1); hdr->filesleft = htons(1); | |
1931 hdr->totparts = htons(1); hdr->partsleft = htons(1); | |
1932 hdr->totsize = htonl((long)ft->st.st_size); /* combined size of all files */ | |
1933 /* size = strlen("mm/dd/yyyy hh:mm sizesize 'name'\r\n") */ | |
4793 | 1934 basename = g_path_get_basename(ft->filename); |
1935 hdr->size = htonl(28 + strlen(basename)); /* size of listing.txt */ | |
1936 g_free(basename); | |
2086 | 1937 hdr->modtime = htonl(ft->st.st_mtime); |
1938 hdr->checksum = htonl(0x89f70000); /* uh... */ | |
1939 g_snprintf(hdr->idstring, 32, "OFT_Windows ICBMFT V1.1 32"); | |
1940 hdr->flags = 0x02; | |
1941 hdr->lnameoffset = 0x1A; | |
1942 hdr->lsizeoffset = 0x10; | |
1943 g_snprintf(hdr->name, 64, "listing.txt"); | |
9134 | 1944 if (write(src, hdr, 256) < 0) { |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5234
diff
changeset
|
1945 gaim_notify_error(ft->gc, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5234
diff
changeset
|
1946 _("Could not write file header. The file will " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5234
diff
changeset
|
1947 "not be transferred."), NULL); |
2086 | 1948 fclose(ft->file); |
1949 g_free(ft->filename); | |
1950 g_free(ft->cookie); | |
1951 g_free(ft->user); | |
1952 g_free(ft->ip); | |
1953 g_free(ft); | |
1954 return; | |
1955 } | |
1956 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1957 ft->inpa = gaim_input_add(src, GAIM_INPUT_READ, toc_get_file_callback, ft); |
2086 | 1958 } |
1959 | |
1960 static void toc_get_file(gpointer a, struct file_transfer *old_ft) | |
1961 { | |
1962 struct file_transfer *ft; | |
1963 const char *dirname = gtk_file_selection_get_filename(GTK_FILE_SELECTION(old_ft->window)); | |
5605 | 1964 GaimAccount *account; |
2086 | 1965 char *buf, buf2[BUF_LEN * 2]; |
1966 | |
5966 | 1967 if (gaim_gtk_check_if_dir(dirname, GTK_FILE_SELECTION(old_ft->window))) |
2086 | 1968 return; |
1969 ft = g_new0(struct file_transfer, 1); | |
1970 ft->filename = g_strdup(dirname); | |
1971 ft->file = fopen(ft->filename, "r"); | |
1972 if (!ft->file) { | |
3427 | 1973 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
|
1974 gaim_notify_error(ft->gc, NULL, buf, NULL); |
2086 | 1975 g_free(buf); |
1976 g_free(ft->filename); | |
1977 g_free(ft); | |
1978 return; | |
1979 } | |
1980 if (stat(dirname, &ft->st)) { | |
3427 | 1981 buf = g_strdup_printf("Unable to examine %s.", dirname); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5234
diff
changeset
|
1982 gaim_notify_error(ft->gc, NULL, buf, NULL); |
2086 | 1983 g_free(buf); |
1984 g_free(ft->filename); | |
1985 g_free(ft); | |
1986 return; | |
1987 } | |
1988 ft->cookie = g_strdup(old_ft->cookie); | |
1989 ft->user = g_strdup(old_ft->user); | |
1990 ft->ip = g_strdup(old_ft->ip); | |
1991 ft->port = old_ft->port; | |
1992 ft->gc = old_ft->gc; | |
4491 | 1993 account = ft->gc->account; |
2086 | 1994 gtk_widget_destroy(old_ft->window); |
1995 | |
1996 g_snprintf(buf2, sizeof(buf2), "toc_rvous_accept %s %s %s", ft->user, ft->cookie, FILE_GET_UID); | |
1997 sflap_send(ft->gc, buf2, -1, TYPE_DATA); | |
1998 | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1999 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
|
2000 gaim_notify_error(ft->gc, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5234
diff
changeset
|
2001 _("Could not connect for transfer."), NULL); |
2086 | 2002 fclose(ft->file); |
2003 g_free(ft->filename); | |
2004 g_free(ft->cookie); | |
2005 g_free(ft->user); | |
2006 g_free(ft->ip); | |
2007 g_free(ft); | |
2008 return; | |
2009 } | |
2010 } | |
2011 | |
2012 static void cancel_callback(gpointer a, struct file_transfer *ft) { | |
2013 gtk_widget_destroy(ft->window); | |
2014 if (a == ft->window) { | |
2015 g_free(ft->cookie); | |
2016 g_free(ft->user); | |
2017 g_free(ft->ip); | |
2018 g_free(ft); | |
2019 } | |
2020 } | |
2021 | |
3867 | 2022 static void toc_reject_ft(struct ft_request *ft) { |
2023 g_free(ft->user); | |
2024 g_free(ft->filename); | |
2025 g_free(ft->ip); | |
2026 g_free(ft->cookie); | |
2027 if (ft->message) | |
2028 g_free(ft->message); | |
2029 g_free(ft); | |
2030 } | |
2031 | |
2032 | |
3730 | 2033 static void toc_accept_ft(struct ft_request *fr) { |
5605 | 2034 if(g_list_find(gaim_connections_get_all(), fr->gc)) { |
4249 | 2035 GtkWidget *window; |
2036 char buf[BUF_LEN]; | |
2086 | 2037 |
4249 | 2038 struct file_transfer *ft = g_new0(struct file_transfer, 1); |
2039 ft->gc = fr->gc; | |
2040 ft->user = g_strdup(fr->user); | |
2041 ft->cookie = g_strdup(fr->cookie); | |
2042 ft->ip = g_strdup(fr->ip); | |
2043 ft->port = fr->port; | |
2044 ft->files = fr->files; | |
2086 | 2045 |
4249 | 2046 ft->window = window = gtk_file_selection_new(_("Gaim - Save As...")); |
2047 g_snprintf(buf, sizeof(buf), "%s/%s", gaim_home_dir(), fr->filename ? fr->filename : ""); | |
2048 gtk_file_selection_set_filename(GTK_FILE_SELECTION(window), buf); | |
4635 | 2049 g_signal_connect(G_OBJECT(window), "destroy", |
2050 G_CALLBACK(cancel_callback), ft); | |
2051 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(ft->window)->cancel_button), | |
2052 "clicked", G_CALLBACK(cancel_callback), ft); | |
2086 | 2053 |
4249 | 2054 if (!strcmp(fr->UID, FILE_SEND_UID)) |
4635 | 2055 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(window)->ok_button), |
2056 "clicked", G_CALLBACK(toc_send_file), ft); | |
4249 | 2057 else |
4635 | 2058 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(window)->ok_button), |
2059 "clicked", G_CALLBACK(toc_get_file), ft); | |
2086 | 2060 |
4249 | 2061 gtk_widget_show(window); |
2062 } | |
2063 | |
3867 | 2064 toc_reject_ft(fr); |
2086 | 2065 } |
2066 | |
2067 static void accept_file_dialog(struct ft_request *ft) { | |
2068 char buf[BUF_LONG]; | |
2069 if (!strcmp(ft->UID, FILE_SEND_UID)) { | |
2070 /* holy crap. who the fuck would transfer gigabytes through AIM?! */ | |
2071 static char *sizes[4] = { "bytes", "KB", "MB", "GB" }; | |
2072 float size = ft->size; | |
2073 int index = 0; | |
2074 while ((index < 4) && (size > 1024)) { | |
2075 size /= 1024; | |
2076 index++; | |
2077 } | |
6500 | 2078 g_snprintf(buf, sizeof(buf), |
4276 | 2079 ngettext( |
2080 "%s requests %s to accept %d file: %s (%.2f %s)%s%s", | |
2081 "%s requests %s to accept %d files: %s (%.2f %s)%s%s", | |
2082 ft->files), | |
5605 | 2083 ft->user, gaim_account_get_username(ft->gc->account), ft->files, |
2086 | 2084 ft->filename, size, sizes[index], (ft->message) ? "\n" : "", |
2085 (ft->message) ? ft->message : ""); | |
2086 } else { | |
2087 g_snprintf(buf, sizeof(buf), _("%s requests you to send them a file"), ft->user); | |
2088 } | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2089 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2090 gaim_request_accept_cancel(ft->gc, NULL, buf, NULL, 0, ft, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2091 G_CALLBACK(toc_accept_ft), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2092 G_CALLBACK(toc_reject_ft)); |
2086 | 2093 } |
6867 | 2094 #endif |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2095 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2096 static GaimPluginProtocolInfo prpl_info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2097 { |
8751 | 2098 GAIM_PRPL_API_VERSION, |
9058 | 2099 0, |
9475 | 2100 NULL, /* user_splits */ |
2101 NULL, /* protocol_options */ | |
2102 NO_BUDDY_ICONS, /* icon_spec */ | |
2103 toc_list_icon, /* list_icon */ | |
2104 toc_list_emblems, /* list_emblems */ | |
2105 NULL, /* status_text */ | |
2106 NULL, /* tooltip_text */ | |
2107 toc_away_states, /* away_states */ | |
2108 toc_blist_node_menu, /* blist_node_menu */ | |
2109 toc_chat_info, /* chat_info */ | |
2110 toc_login, /* login */ | |
2111 toc_close, /* close */ | |
2112 toc_send_im, /* send_im */ | |
2113 toc_set_info, /* set_info */ | |
2114 NULL, /* send_typing */ | |
2115 toc_get_info, /* get_info */ | |
2116 toc_set_away, /* set_away */ | |
2117 toc_set_idle, /* set_idle */ | |
2118 toc_change_passwd, /* change_passwd */ | |
2119 toc_add_buddy, /* add_buddy */ | |
2120 toc_add_buddies, /* add_buddies */ | |
2121 toc_remove_buddy, /* remove_buddy */ | |
2122 toc_remove_buddies, /* remove_buddies */ | |
2123 toc_add_permit, /* add_permit */ | |
2124 toc_add_deny, /* add_deny */ | |
2125 toc_rem_permit, /* rem_permit */ | |
2126 toc_rem_deny, /* rem_deny */ | |
2127 toc_set_permit_deny, /* set_permit_deny */ | |
2128 toc_warn, /* warn */ | |
2129 toc_join_chat, /* join_chat */ | |
2130 NULL, /* reject_chat */ | |
2131 toc_chat_invite, /* chat_invite */ | |
2132 toc_chat_leave, /* chat_leave */ | |
2133 toc_chat_whisper, /* chat_whisper */ | |
2134 toc_chat_send, /* chat_send */ | |
2135 toc_keepalive, /* keepalive */ | |
2136 NULL, /* register_user */ | |
2137 NULL, /* get_cb_info */ | |
2138 NULL, /* get_cb_away */ | |
2139 NULL, /* alias_buddy */ | |
2140 NULL, /* group_buddy */ | |
2141 NULL, /* rename_group */ | |
2142 NULL, /* buddy_free */ | |
2143 NULL, /* convo_closed */ | |
2144 NULL, /* normalize */ | |
2145 NULL, /* set_buddy_icon */ | |
2146 NULL, /* remove_group */ | |
2147 NULL, /* get_cb_real_name */ | |
2148 NULL, /* set_chat_topic */ | |
2149 NULL, /* find_blist_chat */ | |
2150 NULL, /* roomlist_get_list */ | |
2151 NULL, /* roomlist_cancel */ | |
2152 NULL, /* roomlist_expand_category */ | |
2153 NULL, /* can_receive_file */ | |
2154 NULL /* send_file */ | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2155 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2156 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2157 static GaimPluginInfo info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2158 { |
8751 | 2159 GAIM_PLUGIN_API_VERSION, /**< api_version */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2160 GAIM_PLUGIN_PROTOCOL, /**< type */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2161 NULL, /**< ui_requirement */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2162 0, /**< flags */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2163 NULL, /**< dependencies */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2164 GAIM_PRIORITY_DEFAULT, /**< priority */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2165 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2166 "prpl-toc", /**< id */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2167 "TOC", /**< name */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2168 VERSION, /**< version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2169 /** summary */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2170 N_("TOC Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2171 /** description */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2172 N_("TOC Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2173 NULL, /**< author */ |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6321
diff
changeset
|
2174 GAIM_WEBSITE, /**< homepage */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2175 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2176 NULL, /**< load */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2177 NULL, /**< unload */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2178 NULL, /**< destroy */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2179 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2180 NULL, /**< ui_info */ |
8993 | 2181 &prpl_info, /**< extra_info */ |
2182 NULL, | |
9015 | 2183 toc_actions |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2184 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2185 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2186 static void |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
2187 init_plugin(GaimPlugin *plugin) |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2188 { |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5605
diff
changeset
|
2189 GaimAccountOption *option; |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2190 |
5685
43ea75092684
[gaim-migrate @ 6106]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
2191 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
|
2192 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5605
diff
changeset
|
2193 option); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2194 |
5685
43ea75092684
[gaim-migrate @ 6106]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
2195 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
|
2196 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5605
diff
changeset
|
2197 option); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2198 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2199 my_protocol = plugin; |
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 |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
2202 GAIM_INIT_PLUGIN(toc, init_plugin, info); |