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