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