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