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