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