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