Mercurial > pidgin
annotate src/protocols/oscar/oscar.c @ 3752:b32474e522fa
[gaim-migrate @ 3890]
From: "William T. Mahan" <wtm2@duke.edu>
This patch, against CVS HEAD, fixes three bugs in Oscar File Transfer
support. I can split it up further if desired.
* Send a null checksum when initiating a file transfer, which fixes
"files don't match" warnings produced by some versions of WinAIM; add
a compile-time option to actually compute the checksum, which is
slow but necessary when sending to some Mac clients.
* Don't allow sending files to oneself, because it causes all kinds of
subtle problems and it's not useful.
* Don't crash when there is an error writing to the output file when
receiving.
From: "William T. Mahan" <wtm2@duke.edu>
This patch 2 of 3, which applies on top of the first, adds support for
reverse connections for Oscar File Transfer, the lack of which has
been the biggest complaint so far. Reverse connections are used by
newer AIM clients when there is difficulty verifying the IP of the
sender.
From: "William T. Mahan" <wtm2@duke.edu>
This patch 3 of 3, which applies on top of the first 2, removes the
alarm() and sigaction() calls that were added by my original FT patch
to detect transfer timeouts. Besides apparently not working on
Windows, they involved a lot of ugly code to handle a special case.
My new approach is to add destructors that can called when SNACs are
freed; a timeout is detected when a request SNAC is cleaned up before
the transfer is accepted. Although this touches several files, it is
more generic than the old method. I tried to implement this in an
unintrusive manner, so that there is little preformance penalty for
SNACs that do not use destructors.
My first two patches should work fine without this. If there are any
objections to the third patch, I ask that the first two patches be
applied, in which case I will set up a SourceForge page for this one.
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Sat, 19 Oct 2002 05:22:30 +0000 |
parents | a20bf3d247ff |
children | f53370197bb9 |
rev | line source |
---|---|
3453 | 1 |
2086 | 2 /* |
3 * gaim | |
4 * | |
5 * Some code copyright (C) 1998-1999, Mark Spencer <markster@marko.net> | |
6 * libfaim code copyright 1998, 1999 Adam Fritzler <afritz@auk.cx> | |
7 * | |
8 * This program is free software; you can redistribute it and/or modify | |
9 * it under the terms of the GNU General Public License as published by | |
10 * the Free Software Foundation; either version 2 of the License, or | |
11 * (at your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 * GNU General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU General Public License | |
19 * along with this program; if not, write to the Free Software | |
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
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 | |
3664 | 28 #include <sys/types.h> |
29 /*this must happen before sys/socket.h or freebsd won't compile*/ | |
30 | |
3630 | 31 #ifndef _WIN32 |
2086 | 32 #include <netdb.h> |
33 #include <netinet/in.h> | |
34 #include <arpa/inet.h> | |
3630 | 35 #include <sys/socket.h> |
36 #include <unistd.h> | |
37 #endif | |
38 | |
39 #include <errno.h> | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
40 #include <ctype.h> |
2086 | 41 #include <string.h> |
42 #include <stdlib.h> | |
43 #include <stdio.h> | |
44 #include <time.h> | |
45 #include <sys/stat.h> | |
3630 | 46 #include <signal.h> |
47 | |
2086 | 48 #include "multi.h" |
49 #include "prpl.h" | |
50 #include "gaim.h" | |
51 #include "aim.h" | |
52 #include "proxy.h" | |
53 | |
3630 | 54 #ifdef _WIN32 |
55 #include "win32dep.h" | |
3666
ae72be911db5
[gaim-migrate @ 3795]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3664
diff
changeset
|
56 #define NOSIGALARM |
3630 | 57 #endif |
58 | |
3490 | 59 #include "pixmaps/protocols/oscar/ab.xpm" |
60 #include "pixmaps/protocols/oscar/admin_icon.xpm" | |
61 #include "pixmaps/protocols/oscar/aol_icon.xpm" | |
62 #include "pixmaps/protocols/oscar/away_icon.xpm" | |
63 #include "pixmaps/protocols/oscar/dt_icon.xpm" | |
64 #include "pixmaps/protocols/oscar/free_icon.xpm" | |
65 #include "pixmaps/protocols/oscar/wireless_icon.xpm" | |
2086 | 66 |
3579 | 67 #include "pixmaps/protocols/icq/gnomeicu-online.xpm" |
68 #include "pixmaps/protocols/icq/gnomeicu-offline.xpm" | |
69 #include "pixmaps/protocols/icq/gnomeicu-away.xpm" | |
70 #include "pixmaps/protocols/icq/gnomeicu-dnd.xpm" | |
71 #include "pixmaps/protocols/icq/gnomeicu-na.xpm" | |
72 #include "pixmaps/protocols/icq/gnomeicu-occ.xpm" | |
73 #include "pixmaps/protocols/icq/gnomeicu-ffc.xpm" | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
74 |
2086 | 75 /* constants to identify proto_opts */ |
76 #define USEROPT_AUTH 0 | |
77 #define USEROPT_AUTHPORT 1 | |
78 | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
79 #define UC_AOL 0x02 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
80 #define UC_ADMIN 0x04 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
81 #define UC_UNCONFIRMED 0x08 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
82 #define UC_NORMAL 0x10 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
83 #define UC_AB 0x20 |
3079 | 84 #define UC_WIRELESS 0x40 |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
85 |
2086 | 86 #define AIMHASHDATA "http://gaim.sourceforge.net/aim_data.php3" |
87 | |
3630 | 88 /* For win32 compatability */ |
89 G_MODULE_IMPORT GSList *connections; | |
90 G_MODULE_IMPORT int report_idle; | |
91 | |
92 static int caps_aim = AIM_CAPS_CHAT | AIM_CAPS_BUDDYICON | | |
93 AIM_CAPS_IMIMAGE | AIM_CAPS_SENDFILE; | |
3458 | 94 |
95 /* Set AIM caps, because Gaim can still do them over ICQ and | |
96 * Winicq doesn't mind. */ | |
97 static int caps_icq = AIM_CAPS_CHAT | AIM_CAPS_BUDDYICON | AIM_CAPS_IMIMAGE; | |
3595 | 98 /* static int caps_icq = AIM_CAPS_ICQ; */ |
99 /* What does AIM_CAPS_ICQ actually mean? -SE */ | |
3458 | 100 |
2308
a90be9567452
[gaim-migrate @ 2318]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2305
diff
changeset
|
101 static fu8_t gaim_features[] = {0x01, 0x01, 0x01, 0x02}; |
2086 | 102 |
103 struct oscar_data { | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
104 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
105 aim_conn_t *conn; |
2086 | 106 |
107 guint cnpa; | |
108 guint paspa; | |
3694 | 109 guint emlpa; |
2086 | 110 |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
111 GSList *create_rooms; |
2086 | 112 |
113 gboolean conf; | |
114 gboolean reqemail; | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
115 gboolean setemail; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
116 char *email; |
2979 | 117 gboolean setnick; |
118 char *newsn; | |
2086 | 119 gboolean chpass; |
120 char *oldp; | |
121 char *newp; | |
122 | |
123 GSList *oscar_chats; | |
124 GSList *direct_ims; | |
3630 | 125 GSList *file_transfers; |
2086 | 126 GSList *hasicons; |
3600 | 127 GHashTable *supports_tn; |
2086 | 128 |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
129 gboolean killme; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
130 gboolean icq; |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
131 GSList *evilhack; |
2993 | 132 |
133 struct { | |
134 guint maxbuddies; /* max users you can watch */ | |
135 guint maxwatchers; /* max users who can watch you */ | |
136 guint maxpermits; /* max users on permit list */ | |
137 guint maxdenies; /* max users on deny list */ | |
138 guint maxsiglen; /* max size (bytes) of profile */ | |
139 guint maxawaymsglen; /* max size (bytes) of posted away message */ | |
140 } rights; | |
2086 | 141 }; |
142 | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
143 struct create_room { |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
144 char *name; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
145 int exchange; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
146 }; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
147 |
2086 | 148 struct chat_connection { |
149 char *name; | |
150 char *show; /* AOL did something funny to us */ | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
151 fu16_t exchange; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
152 fu16_t instance; |
2086 | 153 int fd; /* this is redundant since we have the conn below */ |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
154 aim_conn_t *conn; |
2086 | 155 int inpa; |
156 int id; | |
157 struct gaim_connection *gc; /* i hate this. */ | |
158 struct conversation *cnv; /* bah. */ | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
159 int maxlen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
160 int maxvis; |
2086 | 161 }; |
162 | |
163 struct direct_im { | |
164 struct gaim_connection *gc; | |
165 char name[80]; | |
166 int watcher; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
167 aim_conn_t *conn; |
3008 | 168 gboolean connected; |
2086 | 169 }; |
170 | |
171 struct ask_direct { | |
172 struct gaim_connection *gc; | |
173 char *sn; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
174 char ip[64]; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
175 fu8_t cookie[8]; |
2086 | 176 }; |
177 | |
3630 | 178 struct oscar_file_transfer { |
179 enum { OFT_SENDFILE_IN, OFT_SENDFILE_OUT } type; | |
180 aim_conn_t *conn; | |
181 struct file_transfer *xfer; | |
182 char *sn; | |
183 char ip[64]; | |
184 fu16_t port; | |
185 fu8_t cookie[8]; | |
186 int totsize; | |
187 int filesdone; | |
188 int totfiles; | |
189 int watcher; | |
190 }; | |
191 | |
2086 | 192 struct icon_req { |
193 char *user; | |
194 time_t timestamp; | |
2196
016c5307f26b
[gaim-migrate @ 2206]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2194
diff
changeset
|
195 unsigned long length; |
2191
657dbe515608
[gaim-migrate @ 2201]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2172
diff
changeset
|
196 unsigned long checksum; |
2086 | 197 gboolean request; |
198 }; | |
199 | |
3453 | 200 struct channel4_data { |
3141 | 201 struct gaim_connection *gc; |
3453 | 202 gchar *uin; |
203 gchar *nick; | |
3141 | 204 }; |
205 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
206 static struct direct_im *find_direct_im(struct oscar_data *od, const char *who) { |
2086 | 207 GSList *d = od->direct_ims; |
208 char *n = g_strdup(normalize(who)); | |
209 struct direct_im *m = NULL; | |
210 | |
211 while (d) { | |
212 m = (struct direct_im *)d->data; | |
213 if (!strcmp(n, normalize(m->name))) | |
214 break; | |
215 m = NULL; | |
216 d = d->next; | |
217 } | |
218 | |
219 g_free(n); | |
220 return m; | |
221 } | |
222 | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
223 static char *extract_name(const char *name) { |
2086 | 224 char *tmp; |
225 int i, j; | |
226 char *x = strchr(name, '-'); | |
227 if (!x) return NULL; | |
228 x = strchr(++x, '-'); | |
229 if (!x) return NULL; | |
230 tmp = g_strdup(++x); | |
231 | |
232 for (i = 0, j = 0; x[i]; i++) { | |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
233 char hex[3]; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
234 if (x[i] != '%') { |
2086 | 235 tmp[j++] = x[i]; |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
236 continue; |
2086 | 237 } |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
238 strncpy(hex, x + ++i, 2); hex[2] = 0; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
239 i++; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
240 tmp[j++] = strtol(hex, NULL, 16); |
2086 | 241 } |
242 | |
243 tmp[j] = 0; | |
244 return tmp; | |
245 } | |
246 | |
247 static struct chat_connection *find_oscar_chat(struct gaim_connection *gc, int id) { | |
248 GSList *g = ((struct oscar_data *)gc->proto_data)->oscar_chats; | |
249 struct chat_connection *c = NULL; | |
250 | |
251 while (g) { | |
252 c = (struct chat_connection *)g->data; | |
253 if (c->id == id) | |
254 break; | |
255 g = g->next; | |
256 c = NULL; | |
257 } | |
258 | |
259 return c; | |
260 } | |
261 | |
262 static struct chat_connection *find_oscar_chat_by_conn(struct gaim_connection *gc, | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
263 aim_conn_t *conn) { |
2086 | 264 GSList *g = ((struct oscar_data *)gc->proto_data)->oscar_chats; |
265 struct chat_connection *c = NULL; | |
266 | |
267 while (g) { | |
268 c = (struct chat_connection *)g->data; | |
269 if (c->conn == conn) | |
270 break; | |
271 g = g->next; | |
272 c = NULL; | |
273 } | |
274 | |
275 return c; | |
276 } | |
277 | |
3630 | 278 /* XXX there must be a better way than this.... -- wtm */ |
279 static struct oscar_file_transfer *find_oft_by_conn(struct gaim_connection *gc, | |
280 aim_conn_t *conn) { | |
281 GSList *g = ((struct oscar_data *)gc->proto_data)->file_transfers; | |
282 struct oscar_file_transfer *f = NULL; | |
283 | |
284 while (g) { | |
285 f = (struct oscar_file_transfer *)g->data; | |
286 if (f->conn == conn) | |
287 break; | |
288 g = g->next; | |
289 f = NULL; | |
290 } | |
291 | |
292 return f; | |
293 } | |
294 | |
295 static struct oscar_file_transfer *find_oft_by_xfer(struct gaim_connection *gc, | |
296 struct file_transfer *xfer) { | |
297 GSList *g = ((struct oscar_data *)gc->proto_data)->file_transfers; | |
298 struct oscar_file_transfer *f = NULL; | |
299 | |
300 while (g) { | |
301 f = (struct oscar_file_transfer *)g->data; | |
302 if (f->xfer == xfer) | |
303 break; | |
304 g = g->next; | |
305 f = NULL; | |
306 } | |
307 | |
308 return f; | |
309 } | |
310 | |
311 static struct oscar_file_transfer *find_oft_by_cookie(struct gaim_connection *gc, | |
312 const char *cookie) { | |
313 GSList *g = ((struct oscar_data *)gc->proto_data)->file_transfers; | |
314 struct oscar_file_transfer *f = NULL; | |
315 | |
316 while (g) { | |
317 f = (struct oscar_file_transfer *)g->data; | |
318 if (!strncmp(f->cookie, cookie, 8)) | |
319 break; | |
320 g = g->next; | |
321 f = NULL; | |
322 } | |
323 | |
324 return f; | |
325 } | |
326 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
327 static int gaim_parse_auth_resp (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
328 static int gaim_parse_login (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
329 static int gaim_handle_redirect (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
330 static int gaim_info_change (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
331 static int gaim_account_confirm (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
332 static int gaim_parse_oncoming (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
333 static int gaim_parse_offgoing (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
334 static int gaim_parse_incoming_im(aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
335 static int gaim_parse_misses (aim_session_t *, aim_frame_t *, ...); |
3212 | 336 static int gaim_parse_clientauto (aim_session_t *, aim_frame_t *, ...); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
337 static int gaim_parse_user_info (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
338 static int gaim_parse_motd (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
339 static int gaim_chatnav_info (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
340 static int gaim_chat_join (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
341 static int gaim_chat_leave (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
342 static int gaim_chat_info_update (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
343 static int gaim_chat_incoming_msg(aim_session_t *, aim_frame_t *, ...); |
3694 | 344 static int gaim_email_parseupdate(aim_session_t *, aim_frame_t *, ...); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
345 static int gaim_parse_msgack (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
346 static int gaim_parse_ratechange (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
347 static int gaim_parse_evilnotify (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
348 static int gaim_parse_searcherror(aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
349 static int gaim_parse_searchreply(aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
350 static int gaim_bosrights (aim_session_t *, aim_frame_t *, ...); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
351 static int conninitdone_bos (aim_session_t *, aim_frame_t *, ...); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
352 static int conninitdone_admin (aim_session_t *, aim_frame_t *, ...); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
353 static int conninitdone_chat (aim_session_t *, aim_frame_t *, ...); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
354 static int conninitdone_chatnav (aim_session_t *, aim_frame_t *, ...); |
3694 | 355 static int conninitdone_email (aim_session_t *, aim_frame_t *, ...); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
356 static int gaim_parse_msgerr (aim_session_t *, aim_frame_t *, ...); |
3595 | 357 static int gaim_parse_mtn (aim_session_t *, aim_frame_t *, ...); |
2993 | 358 static int gaim_parse_locaterights(aim_session_t *, aim_frame_t *, ...); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
359 static int gaim_parse_buddyrights(aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
360 static int gaim_parse_locerr (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
361 static int gaim_icbm_param_info (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
362 static int gaim_parse_genericerr (aim_session_t *, aim_frame_t *, ...); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
363 static int gaim_memrequest (aim_session_t *, aim_frame_t *, ...); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
364 static int gaim_selfinfo (aim_session_t *, aim_frame_t *, ...); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
365 static int gaim_offlinemsg (aim_session_t *, aim_frame_t *, ...); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
366 static int gaim_offlinemsgdone (aim_session_t *, aim_frame_t *, ...); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
367 static int gaim_simpleinfo (aim_session_t *, aim_frame_t *, ...); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
368 static int gaim_popup (aim_session_t *, aim_frame_t *, ...); |
2991 | 369 static int gaim_ssi_parserights (aim_session_t *, aim_frame_t *, ...); |
370 static int gaim_ssi_parselist (aim_session_t *, aim_frame_t *, ...); | |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
371 |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
372 static int gaim_directim_initiate(aim_session_t *, aim_frame_t *, ...); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
373 static int gaim_directim_incoming(aim_session_t *, aim_frame_t *, ...); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
374 static int gaim_directim_typing (aim_session_t *, aim_frame_t *, ...); |
2993 | 375 static int gaim_update_ui (aim_session_t *, aim_frame_t *, ...); |
2086 | 376 |
3630 | 377 static int oscar_file_transfer_do(aim_session_t *, aim_frame_t *, ...); |
378 static void oscar_file_transfer_disconnect(aim_session_t *, | |
379 aim_conn_t *); | |
380 static void oscar_cancel_transfer(struct gaim_connection *, | |
381 struct file_transfer *); | |
382 static int oscar_sendfile_request(aim_session_t *sess, | |
383 struct oscar_file_transfer *oft); | |
3752 | 384 static int oscar_sendfile_timeout(aim_session_t *sess, aim_frame_t *fr, ...); |
3630 | 385 |
2086 | 386 static char *msgerrreason[] = { |
387 "Invalid error", | |
388 "Invalid SNAC", | |
389 "Rate to host", | |
390 "Rate to client", | |
391 "Not logged in", | |
392 "Service unavailable", | |
393 "Service not defined", | |
394 "Obsolete SNAC", | |
395 "Not supported by host", | |
396 "Not supported by client", | |
397 "Refused by client", | |
398 "Reply too big", | |
399 "Responses lost", | |
400 "Request denied", | |
401 "Busted SNAC payload", | |
402 "Insufficient rights", | |
403 "In local permit/deny", | |
404 "Too evil (sender)", | |
405 "Too evil (receiver)", | |
406 "User temporarily unavailable", | |
407 "No match", | |
408 "List overflow", | |
409 "Request ambiguous", | |
410 "Queue full", | |
411 "Not while on AOL" | |
412 }; | |
413 static int msgerrreasonlen = 25; | |
414 | |
3630 | 415 static void oscar_file_transfer_disconnect(aim_session_t *sess, |
416 aim_conn_t *conn) { | |
417 struct gaim_connection *gc = sess->aux_data; | |
418 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
419 struct oscar_file_transfer *oft = find_oft_by_conn(gc, | |
420 conn); | |
421 | |
422 od->file_transfers = g_slist_remove(od->file_transfers, oft); | |
423 | |
424 if (oft->watcher) { | |
425 gaim_input_remove(oft->watcher); | |
426 oft->watcher = 0; | |
427 } | |
428 | |
429 aim_conn_kill(sess, &conn); | |
430 | |
431 g_free(oft->sn); | |
432 g_free(oft); | |
433 } | |
434 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
435 static void gaim_directim_disconnect(aim_session_t *sess, aim_conn_t *conn) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
436 struct gaim_connection *gc = sess->aux_data; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
437 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
438 struct conversation *cnv; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
439 struct direct_im *dim; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
440 char *sn; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
441 char buf[256]; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
442 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
443 sn = g_strdup(aim_directim_getsn(conn)); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
444 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
445 debug_printf("%s disconnected Direct IM.\n", sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
446 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
447 dim = find_direct_im(od, sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
448 od->direct_ims = g_slist_remove(od->direct_ims, dim); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
449 gaim_input_remove(dim->watcher); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
450 |
3008 | 451 if (dim->connected) |
452 g_snprintf(buf, sizeof buf, _("Direct IM with %s closed"), sn); | |
453 else | |
454 g_snprintf(buf, sizeof buf, _("Direct IM with %s failed"), sn); | |
455 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
456 if ((cnv = find_conversation(sn))) |
2856
b1e300a85678
[gaim-migrate @ 2869]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2833
diff
changeset
|
457 write_to_conv(cnv, buf, WFLAG_SYSTEM, NULL, time(NULL), -1); |
2993 | 458 update_progress(cnv, 100); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
459 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
460 g_free(dim); /* I guess? I don't see it anywhere else... -- mid */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
461 g_free(sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
462 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
463 return; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
464 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
465 |
2086 | 466 static void oscar_callback(gpointer data, gint source, |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
467 GaimInputCondition condition) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
468 aim_conn_t *conn = (aim_conn_t *)data; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
469 aim_session_t *sess = aim_conn_getsess(conn); |
2086 | 470 struct gaim_connection *gc = sess ? sess->aux_data : NULL; |
471 struct oscar_data *odata; | |
472 | |
473 if (!gc) { | |
474 /* gc is null. we return, else we seg SIGSEG on next line. */ | |
475 debug_printf("oscar callback for closed connection (1).\n"); | |
476 return; | |
477 } | |
478 | |
479 odata = (struct oscar_data *)gc->proto_data; | |
480 | |
481 if (!g_slist_find(connections, gc)) { | |
482 /* oh boy. this is probably bad. i guess the only thing we | |
483 * can really do is return? */ | |
484 debug_printf("oscar callback for closed connection (2).\n"); | |
485 return; | |
486 } | |
487 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
488 if (condition & GAIM_INPUT_READ) { |
2086 | 489 if (conn->type == AIM_CONN_TYPE_RENDEZVOUS_OUT) { |
490 debug_printf("got information on rendezvous\n"); | |
491 if (aim_handlerendconnect(odata->sess, conn) < 0) { | |
492 debug_printf(_("connection error (rend)\n")); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
493 aim_conn_kill(odata->sess, &conn); |
2086 | 494 } |
495 } else { | |
496 if (aim_get_command(odata->sess, conn) >= 0) { | |
497 aim_rxdispatch(odata->sess); | |
498 if (odata->killme) | |
499 signoff(gc); | |
500 } else { | |
501 if ((conn->type == AIM_CONN_TYPE_BOS) || | |
502 !(aim_getconn_type(odata->sess, AIM_CONN_TYPE_BOS))) { | |
503 debug_printf(_("major connection error\n")); | |
3074 | 504 hide_login_progress_error(gc, _("Disconnected.")); |
2086 | 505 signoff(gc); |
506 } else if (conn->type == AIM_CONN_TYPE_CHAT) { | |
507 struct chat_connection *c = find_oscar_chat_by_conn(gc, conn); | |
508 char buf[BUF_LONG]; | |
509 debug_printf("disconnected from chat room %s\n", c->name); | |
510 c->conn = NULL; | |
511 if (c->inpa > 0) | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
512 gaim_input_remove(c->inpa); |
2086 | 513 c->inpa = 0; |
514 c->fd = -1; | |
515 aim_conn_kill(odata->sess, &conn); | |
3574 | 516 snprintf(buf, sizeof(buf), _("You have been disconnected from chat room %s."), c->name); |
3427 | 517 do_error_dialog(buf, NULL, GAIM_ERROR); |
2086 | 518 } else if (conn->type == AIM_CONN_TYPE_CHATNAV) { |
519 if (odata->cnpa > 0) | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
520 gaim_input_remove(odata->cnpa); |
2086 | 521 odata->cnpa = 0; |
522 debug_printf("removing chatnav input watcher\n"); | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
523 while (odata->create_rooms) { |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
524 struct create_room *cr = odata->create_rooms->data; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
525 g_free(cr->name); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
526 odata->create_rooms = |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
527 g_slist_remove(odata->create_rooms, cr); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
528 g_free(cr); |
3427 | 529 do_error_dialog(_("Chat is currently unavailable"), NULL, GAIM_ERROR); |
2086 | 530 } |
531 aim_conn_kill(odata->sess, &conn); | |
532 } else if (conn->type == AIM_CONN_TYPE_AUTH) { | |
533 if (odata->paspa > 0) | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
534 gaim_input_remove(odata->paspa); |
2086 | 535 odata->paspa = 0; |
536 debug_printf("removing authconn input watcher\n"); | |
537 aim_conn_kill(odata->sess, &conn); | |
3694 | 538 } else if (conn->type == AIM_CONN_TYPE_EMAIL) { |
539 if (odata->emlpa > 0) | |
540 gaim_input_remove(odata->emlpa); | |
541 odata->emlpa = 0; | |
542 debug_printf("removing email input watcher\n"); | |
543 aim_conn_kill(odata->sess, &conn); | |
2086 | 544 } else if (conn->type == AIM_CONN_TYPE_RENDEZVOUS) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
545 if (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
546 gaim_directim_disconnect(odata->sess, conn); |
3630 | 547 else if (conn->subtype == AIM_CONN_SUBTYPE_OFT_SENDFILE) { |
548 struct oscar_file_transfer *oft = find_oft_by_conn(gc, conn); | |
549 if (oft) { | |
550 transfer_abort(oft->xfer, _("Buddy canceled transfer")); | |
551 } | |
552 oscar_file_transfer_disconnect(odata->sess, conn); | |
553 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
554 else { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
555 debug_printf("No handler for rendezvous disconnect (%d).\n", |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
556 source); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
557 } |
2086 | 558 aim_conn_kill(odata->sess, &conn); |
559 } else { | |
560 debug_printf("holy crap! generic connection error! %d\n", | |
561 conn->type); | |
562 aim_conn_kill(odata->sess, &conn); | |
563 } | |
564 } | |
565 } | |
566 } | |
567 } | |
568 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
569 static void oscar_debug(aim_session_t *sess, int level, const char *format, va_list va) { |
2086 | 570 char *s = g_strdup_vprintf(format, va); |
571 char buf[256]; | |
572 char *t; | |
573 struct gaim_connection *gc = sess->aux_data; | |
574 | |
575 g_snprintf(buf, sizeof(buf), "%s %d: ", gc->username, level); | |
576 t = g_strconcat(buf, s, NULL); | |
577 debug_printf(t); | |
578 if (t[strlen(t)-1] != '\n') | |
579 debug_printf("\n"); | |
580 g_free(t); | |
581 g_free(s); | |
582 } | |
583 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
584 static void oscar_login_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 585 { |
586 struct gaim_connection *gc = data; | |
587 struct oscar_data *odata; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
588 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
589 aim_conn_t *conn; |
2086 | 590 |
591 if (!g_slist_find(connections, gc)) { | |
592 close(source); | |
593 return; | |
594 } | |
595 | |
596 odata = gc->proto_data; | |
597 sess = odata->sess; | |
598 conn = aim_getconn_type_all(sess, AIM_CONN_TYPE_AUTH); | |
599 | |
600 if (source < 0) { | |
601 hide_login_progress(gc, _("Couldn't connect to host")); | |
602 signoff(gc); | |
603 return; | |
604 } | |
605 | |
606 aim_conn_completeconnect(sess, conn); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
607 gc->inpa = gaim_input_add(conn->fd, GAIM_INPUT_READ, |
2086 | 608 oscar_callback, conn); |
609 debug_printf(_("Password sent, waiting for response\n")); | |
610 } | |
611 | |
612 static void oscar_login(struct aim_user *user) { | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
613 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
614 aim_conn_t *conn; |
2086 | 615 char buf[256]; |
616 struct gaim_connection *gc = new_gaim_conn(user); | |
617 struct oscar_data *odata = gc->proto_data = g_new0(struct oscar_data, 1); | |
618 | |
2589
4e149a0b9665
[gaim-migrate @ 2602]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2507
diff
changeset
|
619 if (isdigit(*user->username)) { |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
620 odata->icq = TRUE; |
2589
4e149a0b9665
[gaim-migrate @ 2602]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2507
diff
changeset
|
621 /* this is odd but it's necessary for a proper do_import and do_export */ |
4e149a0b9665
[gaim-migrate @ 2602]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2507
diff
changeset
|
622 gc->protocol = PROTO_ICQ; |
3064 | 623 gc->password[8] = 0; |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
624 } else { |
2590
2dd86a1af92b
[gaim-migrate @ 2603]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2589
diff
changeset
|
625 gc->protocol = PROTO_TOC; |
2918
4df759d607f3
[gaim-migrate @ 2931]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2916
diff
changeset
|
626 gc->flags |= OPT_CONN_HTML; |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
627 } |
3600 | 628 odata->supports_tn = g_hash_table_new(g_str_hash, g_str_equal); |
2086 | 629 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
630 sess = g_new0(aim_session_t, 1); |
2086 | 631 |
632 aim_session_init(sess, AIM_SESS_FLAGS_NONBLOCKCONNECT, 0); | |
633 aim_setdebuggingcb(sess, oscar_debug); | |
634 | |
635 /* we need an immediate queue because we don't use a while-loop to | |
636 * see if things need to be sent. */ | |
637 aim_tx_setenqueue(sess, AIM_TX_IMMEDIATE, NULL); | |
638 odata->sess = sess; | |
639 sess->aux_data = gc; | |
640 | |
641 conn = aim_newconn(sess, AIM_CONN_TYPE_AUTH, NULL); | |
642 if (conn == NULL) { | |
643 debug_printf(_("internal connection error\n")); | |
644 hide_login_progress(gc, _("Unable to login to AIM")); | |
645 signoff(gc); | |
646 return; | |
647 } | |
648 | |
649 g_snprintf(buf, sizeof(buf), _("Signon: %s"), gc->username); | |
650 set_login_progress(gc, 2, buf); | |
651 | |
652 aim_conn_addhandler(sess, conn, 0x0017, 0x0007, gaim_parse_login, 0); | |
653 aim_conn_addhandler(sess, conn, 0x0017, 0x0003, gaim_parse_auth_resp, 0); | |
654 | |
655 conn->status |= AIM_CONN_STATUS_INPROGRESS; | |
656 conn->fd = proxy_connect(user->proto_opt[USEROPT_AUTH][0] ? | |
657 user->proto_opt[USEROPT_AUTH] : FAIM_LOGIN_SERVER, | |
658 user->proto_opt[USEROPT_AUTHPORT][0] ? | |
659 atoi(user->proto_opt[USEROPT_AUTHPORT]) : FAIM_LOGIN_PORT, | |
660 oscar_login_connect, gc); | |
661 if (conn->fd < 0) { | |
662 hide_login_progress(gc, _("Couldn't connect to host")); | |
663 signoff(gc); | |
664 return; | |
665 } | |
666 aim_request_login(sess, conn, gc->username); | |
667 } | |
668 | |
669 static void oscar_close(struct gaim_connection *gc) { | |
670 struct oscar_data *odata = (struct oscar_data *)gc->proto_data; | |
671 | |
672 while (odata->oscar_chats) { | |
673 struct chat_connection *n = odata->oscar_chats->data; | |
674 if (n->inpa > 0) | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
675 gaim_input_remove(n->inpa); |
2086 | 676 g_free(n->name); |
677 g_free(n->show); | |
678 odata->oscar_chats = g_slist_remove(odata->oscar_chats, n); | |
679 g_free(n); | |
680 } | |
681 while (odata->direct_ims) { | |
682 struct direct_im *n = odata->direct_ims->data; | |
683 if (n->watcher > 0) | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
684 gaim_input_remove(n->watcher); |
2086 | 685 odata->direct_ims = g_slist_remove(odata->direct_ims, n); |
686 g_free(n); | |
687 } | |
3630 | 688 while (odata->file_transfers) { |
689 struct oscar_file_transfer *n = odata->file_transfers->data; | |
690 if (n->watcher > 0) | |
691 gaim_input_remove(n->watcher); | |
692 odata->file_transfers = g_slist_remove(odata->file_transfers, n); | |
693 g_free(n); | |
694 } | |
2086 | 695 while (odata->hasicons) { |
696 struct icon_req *n = odata->hasicons->data; | |
697 g_free(n->user); | |
698 odata->hasicons = g_slist_remove(odata->hasicons, n); | |
699 g_free(n); | |
700 } | |
3600 | 701 g_hash_table_destroy(odata->supports_tn); |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
702 while (odata->evilhack) { |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
703 g_free(odata->evilhack->data); |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
704 odata->evilhack = g_slist_remove(odata->evilhack, odata->evilhack->data); |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
705 } |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
706 while (odata->create_rooms) { |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
707 struct create_room *cr = odata->create_rooms->data; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
708 g_free(cr->name); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
709 odata->create_rooms = g_slist_remove(odata->create_rooms, cr); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
710 g_free(cr); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
711 } |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
712 if (odata->email) |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
713 g_free(odata->email); |
2754
642413968b03
[gaim-migrate @ 2767]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2742
diff
changeset
|
714 if (odata->newp) |
642413968b03
[gaim-migrate @ 2767]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2742
diff
changeset
|
715 g_free(odata->newp); |
642413968b03
[gaim-migrate @ 2767]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2742
diff
changeset
|
716 if (odata->oldp) |
642413968b03
[gaim-migrate @ 2767]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2742
diff
changeset
|
717 g_free(odata->oldp); |
2086 | 718 if (gc->inpa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
719 gaim_input_remove(gc->inpa); |
2086 | 720 if (odata->cnpa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
721 gaim_input_remove(odata->cnpa); |
2086 | 722 if (odata->paspa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
723 gaim_input_remove(odata->paspa); |
3694 | 724 if (odata->emlpa > 0) |
725 gaim_input_remove(odata->emlpa); | |
2086 | 726 aim_session_kill(odata->sess); |
727 g_free(odata->sess); | |
728 odata->sess = NULL; | |
729 g_free(gc->proto_data); | |
730 gc->proto_data = NULL; | |
731 debug_printf(_("Signed off.\n")); | |
732 } | |
733 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
734 static void oscar_bos_connect(gpointer data, gint source, GaimInputCondition cond) { |
2086 | 735 struct gaim_connection *gc = data; |
736 struct oscar_data *odata; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
737 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
738 aim_conn_t *bosconn; |
2086 | 739 |
740 if (!g_slist_find(connections, gc)) { | |
741 close(source); | |
742 return; | |
743 } | |
744 | |
745 odata = gc->proto_data; | |
746 sess = odata->sess; | |
747 bosconn = odata->conn; | |
748 | |
749 if (source < 0) { | |
750 hide_login_progress(gc, _("Could Not Connect")); | |
751 signoff(gc); | |
752 return; | |
753 } | |
754 | |
755 aim_conn_completeconnect(sess, bosconn); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
756 gc->inpa = gaim_input_add(bosconn->fd, GAIM_INPUT_READ, |
2086 | 757 oscar_callback, bosconn); |
758 set_login_progress(gc, 4, _("Connection established, cookie sent")); | |
759 } | |
760 | |
3630 | 761 static void oscar_ask_send_file(struct gaim_connection *gc, char *destsn) { |
762 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
3752 | 763 |
764 struct oscar_file_transfer *oft = g_new0(struct oscar_file_transfer, | |
765 1); | |
766 | |
767 oft->type = OFT_SENDFILE_OUT; | |
768 oft->sn = g_strdup(destsn); | |
769 | |
770 od->file_transfers = g_slist_append(od->file_transfers, oft); | |
771 | |
772 oft->xfer = transfer_out_add(gc, oft->sn); | |
3630 | 773 } |
774 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
775 static int gaim_parse_auth_resp(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 776 va_list ap; |
2704 | 777 struct aim_authresp_info *info; |
2086 | 778 int i; char *host; int port; |
779 struct aim_user *user; | |
2704 | 780 aim_conn_t *bosconn; |
2086 | 781 |
782 struct gaim_connection *gc = sess->aux_data; | |
783 struct oscar_data *od = gc->proto_data; | |
784 user = gc->user; | |
785 port = user->proto_opt[USEROPT_AUTHPORT][0] ? | |
786 atoi(user->proto_opt[USEROPT_AUTHPORT]) : FAIM_LOGIN_PORT, | |
787 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
788 va_start(ap, fr); |
2704 | 789 info = va_arg(ap, struct aim_authresp_info *); |
2086 | 790 va_end(ap); |
791 | |
2704 | 792 debug_printf("inside auth_resp (Screen name: %s)\n", info->sn); |
793 | |
794 if (info->errorcode || !info->bosip || !info->cookie) { | |
795 switch (info->errorcode) { | |
2086 | 796 case 0x05: |
797 /* Incorrect nick/password */ | |
798 hide_login_progress(gc, _("Incorrect nickname or password.")); | |
799 plugin_event(event_error, (void *)980, 0, 0, 0); | |
800 break; | |
801 case 0x11: | |
802 /* Suspended account */ | |
803 hide_login_progress(gc, _("Your account is currently suspended.")); | |
804 break; | |
3498 | 805 case 0x14: |
806 /* service temporarily unavailable */ | |
807 hide_login_progress(gc, _("The AOL Instant Messenger service is temporarily unavailable.")); | |
808 break; | |
2086 | 809 case 0x18: |
810 /* connecting too frequently */ | |
811 hide_login_progress(gc, _("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.")); | |
812 plugin_event(event_error, (void *)983, 0, 0, 0); | |
813 break; | |
814 case 0x1c: | |
815 /* client too old */ | |
816 hide_login_progress(gc, _("The client version you are using is too old. Please upgrade at " WEBSITE)); | |
817 plugin_event(event_error, (void *)989, 0, 0, 0); | |
818 break; | |
819 default: | |
820 hide_login_progress(gc, _("Authentication Failed")); | |
821 break; | |
822 } | |
2704 | 823 debug_printf("Login Error Code 0x%04x\n", info->errorcode); |
824 debug_printf("Error URL: %s\n", info->errorurl); | |
2086 | 825 od->killme = TRUE; |
826 return 1; | |
827 } | |
828 | |
829 | |
2704 | 830 debug_printf("Reg status: %d\n", info->regstatus); |
831 if (info->email) { | |
832 debug_printf("Email: %s\n", info->email); | |
2086 | 833 } else { |
834 debug_printf("Email is NULL\n"); | |
835 } | |
2704 | 836 debug_printf("BOSIP: %s\n", info->bosip); |
2086 | 837 debug_printf("Closing auth connection...\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
838 aim_conn_kill(sess, &fr->conn); |
2086 | 839 |
840 bosconn = aim_newconn(sess, AIM_CONN_TYPE_BOS, NULL); | |
841 if (bosconn == NULL) { | |
842 hide_login_progress(gc, _("Internal Error")); | |
843 od->killme = TRUE; | |
844 return 0; | |
845 } | |
846 | |
2675 | 847 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_bos, 0); |
2086 | 848 aim_conn_addhandler(sess, bosconn, 0x0009, 0x0003, gaim_bosrights, 0); |
849 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ACK, AIM_CB_ACK_ACK, NULL, 0); | |
850 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_REDIRECT, gaim_handle_redirect, 0); | |
2993 | 851 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_RIGHTSINFO, gaim_parse_locaterights, 0); |
2086 | 852 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_RIGHTSINFO, gaim_parse_buddyrights, 0); |
853 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_ONCOMING, gaim_parse_oncoming, 0); | |
854 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_OFFGOING, gaim_parse_offgoing, 0); | |
855 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_INCOMING, gaim_parse_incoming_im, 0); | |
856 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_ERROR, gaim_parse_locerr, 0); | |
857 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_MISSEDCALL, gaim_parse_misses, 0); | |
3212 | 858 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_CLIENTAUTORESP, gaim_parse_clientauto, 0); |
2086 | 859 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_RATECHANGE, gaim_parse_ratechange, 0); |
860 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_EVIL, gaim_parse_evilnotify, 0); | |
861 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOK, AIM_CB_LOK_ERROR, gaim_parse_searcherror, 0); | |
862 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOK, 0x0003, gaim_parse_searchreply, 0); | |
863 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ERROR, gaim_parse_msgerr, 0); | |
3595 | 864 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_MTN, gaim_parse_mtn, 0); |
2086 | 865 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_USERINFO, gaim_parse_user_info, 0); |
866 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ACK, gaim_parse_msgack, 0); | |
867 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_MOTD, gaim_parse_motd, 0); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
868 aim_conn_addhandler(sess, bosconn, 0x0004, 0x0005, gaim_icbm_param_info, 0); |
2086 | 869 aim_conn_addhandler(sess, bosconn, 0x0001, 0x0001, gaim_parse_genericerr, 0); |
870 aim_conn_addhandler(sess, bosconn, 0x0003, 0x0001, gaim_parse_genericerr, 0); | |
871 aim_conn_addhandler(sess, bosconn, 0x0009, 0x0001, gaim_parse_genericerr, 0); | |
872 aim_conn_addhandler(sess, bosconn, 0x0001, 0x001f, gaim_memrequest, 0); | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
873 aim_conn_addhandler(sess, bosconn, 0x0001, 0x000f, gaim_selfinfo, 0); |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
874 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_OFFLINEMSG, gaim_offlinemsg, 0); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
875 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_OFFLINEMSGCOMPLETE, gaim_offlinemsgdone, 0); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
876 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_POP, 0x0002, gaim_popup, 0); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
877 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_SIMPLEINFO, gaim_simpleinfo, 0); |
2991 | 878 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RIGHTSINFO, gaim_ssi_parserights, 0); |
879 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_LIST, gaim_ssi_parselist, 0); | |
880 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_NOLIST, gaim_ssi_parselist, 0); | |
3752 | 881 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_MSGTIMEOUT, oscar_sendfile_timeout, 0); |
2086 | 882 |
883 ((struct oscar_data *)gc->proto_data)->conn = bosconn; | |
2704 | 884 for (i = 0; i < (int)strlen(info->bosip); i++) { |
885 if (info->bosip[i] == ':') { | |
886 port = atoi(&(info->bosip[i+1])); | |
2086 | 887 break; |
888 } | |
889 } | |
2704 | 890 host = g_strndup(info->bosip, i); |
2086 | 891 bosconn->status |= AIM_CONN_STATUS_INPROGRESS; |
892 bosconn->fd = proxy_connect(host, port, oscar_bos_connect, gc); | |
893 g_free(host); | |
894 if (bosconn->fd < 0) { | |
895 hide_login_progress(gc, _("Could Not Connect")); | |
896 od->killme = TRUE; | |
897 return 0; | |
898 } | |
2704 | 899 aim_sendcookie(sess, bosconn, info->cookie); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
900 gaim_input_remove(gc->inpa); |
2704 | 901 |
2086 | 902 return 1; |
903 } | |
904 | |
905 struct pieceofcrap { | |
906 struct gaim_connection *gc; | |
907 unsigned long offset; | |
908 unsigned long len; | |
909 char *modname; | |
910 int fd; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
911 aim_conn_t *conn; |
2086 | 912 unsigned int inpa; |
913 }; | |
914 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
915 static void damn_you(gpointer data, gint source, GaimInputCondition c) |
2086 | 916 { |
917 struct pieceofcrap *pos = data; | |
918 struct oscar_data *od = pos->gc->proto_data; | |
919 char in = '\0'; | |
920 int x = 0; | |
921 unsigned char m[17]; | |
922 | |
923 while (read(pos->fd, &in, 1) == 1) { | |
924 if (in == '\n') | |
925 x++; | |
926 else if (in != '\r') | |
927 x = 0; | |
928 if (x == 2) | |
929 break; | |
930 in = '\0'; | |
931 } | |
932 if (in != '\n') { | |
3427 | 933 do_error_dialog(_("Gaim was Unable to get a valid AIM login hash."), |
934 _("You may be disconnected shortly. You may want to use TOC until " | |
935 "this is fixed. Check " WEBSITE " for updates."), GAIM_WARNING); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
936 gaim_input_remove(pos->inpa); |
2086 | 937 close(pos->fd); |
938 g_free(pos); | |
939 return; | |
940 } | |
941 read(pos->fd, m, 16); | |
942 m[16] = '\0'; | |
943 debug_printf("Sending hash: "); | |
944 for (x = 0; x < 16; x++) | |
945 debug_printf("%02x ", (unsigned char)m[x]); | |
946 debug_printf("\n"); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
947 gaim_input_remove(pos->inpa); |
2086 | 948 close(pos->fd); |
949 aim_sendmemblock(od->sess, pos->conn, 0, 16, m, AIM_SENDMEMBLOCK_FLAG_ISHASH); | |
950 g_free(pos); | |
951 } | |
952 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
953 static void straight_to_hell(gpointer data, gint source, GaimInputCondition cond) { |
2086 | 954 struct pieceofcrap *pos = data; |
955 char buf[BUF_LONG]; | |
956 | |
957 if (source < 0) { | |
3427 | 958 do_error_dialog(_("Gaim was Unable to get a valid AIM login hash."), |
959 _("You may be disconnected shortly. You may want to use TOC until " | |
960 "this is fixed. Check " WEBSITE " for updates."), GAIM_WARNING); | |
2086 | 961 if (pos->modname) |
962 g_free(pos->modname); | |
963 g_free(pos); | |
964 return; | |
965 } | |
966 | |
967 g_snprintf(buf, sizeof(buf), "GET " AIMHASHDATA | |
968 "?offset=%ld&len=%ld&modname=%s HTTP/1.0\n\n", | |
969 pos->offset, pos->len, pos->modname ? pos->modname : ""); | |
970 write(pos->fd, buf, strlen(buf)); | |
971 if (pos->modname) | |
972 g_free(pos->modname); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
973 pos->inpa = gaim_input_add(pos->fd, GAIM_INPUT_READ, damn_you, pos); |
2086 | 974 return; |
975 } | |
976 | |
977 /* size of icbmui.ocm, the largest module in AIM 3.5 */ | |
978 #define AIM_MAX_FILE_SIZE 98304 | |
979 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
980 int gaim_memrequest(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 981 va_list ap; |
982 struct pieceofcrap *pos; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
983 fu32_t offset, len; |
2086 | 984 char *modname; |
985 int fd; | |
986 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
987 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
988 offset = (fu32_t)va_arg(ap, unsigned long); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
989 len = (fu32_t)va_arg(ap, unsigned long); |
2086 | 990 modname = va_arg(ap, char *); |
991 va_end(ap); | |
992 | |
993 debug_printf("offset: %d, len: %d, file: %s\n", offset, len, modname ? modname : "aim.exe"); | |
994 if (len == 0) { | |
995 debug_printf("len is 0, hashing NULL\n"); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
996 aim_sendmemblock(sess, fr->conn, offset, len, NULL, |
2086 | 997 AIM_SENDMEMBLOCK_FLAG_ISREQUEST); |
998 return 1; | |
999 } | |
1000 /* uncomment this when you're convinced it's right. remember, it's been wrong before. | |
1001 if (offset > AIM_MAX_FILE_SIZE || len > AIM_MAX_FILE_SIZE) { | |
1002 char *buf; | |
1003 int i = 8; | |
1004 if (modname) | |
1005 i += strlen(modname); | |
1006 buf = g_malloc(i); | |
1007 i = 0; | |
1008 if (modname) { | |
1009 memcpy(buf, modname, strlen(modname)); | |
1010 i += strlen(modname); | |
1011 } | |
1012 buf[i++] = offset & 0xff; | |
1013 buf[i++] = (offset >> 8) & 0xff; | |
1014 buf[i++] = (offset >> 16) & 0xff; | |
1015 buf[i++] = (offset >> 24) & 0xff; | |
1016 buf[i++] = len & 0xff; | |
1017 buf[i++] = (len >> 8) & 0xff; | |
1018 buf[i++] = (len >> 16) & 0xff; | |
1019 buf[i++] = (len >> 24) & 0xff; | |
1020 debug_printf("len + offset is invalid, hashing request\n"); | |
1021 aim_sendmemblock(sess, command->conn, offset, i, buf, AIM_SENDMEMBLOCK_FLAG_ISREQUEST); | |
1022 g_free(buf); | |
1023 return 1; | |
1024 } | |
1025 */ | |
1026 | |
1027 pos = g_new0(struct pieceofcrap, 1); | |
1028 pos->gc = sess->aux_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1029 pos->conn = fr->conn; |
2086 | 1030 |
1031 pos->offset = offset; | |
1032 pos->len = len; | |
1033 pos->modname = modname ? g_strdup(modname) : NULL; | |
1034 | |
1035 fd = proxy_connect("gaim.sourceforge.net", 80, straight_to_hell, pos); | |
1036 if (fd < 0) { | |
1037 if (pos->modname) | |
1038 g_free(pos->modname); | |
1039 g_free(pos); | |
3427 | 1040 do_error_dialog(_("Gaim was Unable to get valid login hash."), |
1041 _("You may be disconnected shortly. You may want to use TOC until " | |
1042 "this is fixed. Check " WEBSITE " for updates."), GAIM_WARNING); | |
2086 | 1043 } |
1044 pos->fd = fd; | |
1045 | |
1046 return 1; | |
1047 } | |
1048 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1049 static int gaim_parse_login(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 1050 char *key; |
1051 va_list ap; | |
1052 struct gaim_connection *gc = sess->aux_data; | |
3458 | 1053 struct oscar_data *odata = gc->proto_data; |
2086 | 1054 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1055 va_start(ap, fr); |
2086 | 1056 key = va_arg(ap, char *); |
1057 va_end(ap); | |
1058 | |
3458 | 1059 if (odata->icq) { |
1060 struct client_info_s info = CLIENTINFO_ICQ_KNOWNGOOD; | |
1061 aim_send_login(sess, fr->conn, gc->username, gc->password, &info, key); | |
1062 } else { | |
1063 #if 0 | |
1064 struct client_info_s info = {"gaim", 4, 1, 2010, "us", "en", 0x0004, 0x0000, 0x04b}; | |
1065 #endif | |
1066 struct client_info_s info = CLIENTINFO_AIM_KNOWNGOOD; | |
1067 aim_send_login(sess, fr->conn, gc->username, gc->password, &info, key); | |
1068 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1069 |
2086 | 1070 return 1; |
1071 } | |
1072 | |
2675 | 1073 static int conninitdone_chat(aim_session_t *sess, aim_frame_t *fr, ...) { |
2647 | 1074 struct gaim_connection *gc = sess->aux_data; |
1075 struct chat_connection *chatcon; | |
1076 static int id = 1; | |
1077 | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1078 aim_conn_addhandler(sess, fr->conn, 0x000e, 0x0001, gaim_parse_genericerr, 0); |
2675 | 1079 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERJOIN, gaim_chat_join, 0); |
1080 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERLEAVE, gaim_chat_leave, 0); | |
1081 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_ROOMINFOUPDATE, gaim_chat_info_update, 0); | |
1082 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_INCOMINGMSG, gaim_chat_incoming_msg, 0); | |
1083 | |
2672 | 1084 aim_clientready(sess, fr->conn); |
2675 | 1085 |
2647 | 1086 chatcon = find_oscar_chat_by_conn(gc, fr->conn); |
1087 chatcon->id = id; | |
1088 chatcon->cnv = serv_got_joined_chat(gc, id++, chatcon->show); | |
1089 | |
1090 return 1; | |
1091 } | |
1092 | |
2675 | 1093 static int conninitdone_chatnav(aim_session_t *sess, aim_frame_t *fr, ...) { |
1094 | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1095 aim_conn_addhandler(sess, fr->conn, 0x000d, 0x0001, gaim_parse_genericerr, 0); |
2647 | 1096 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CTN, AIM_CB_CTN_INFO, gaim_chatnav_info, 0); |
2675 | 1097 |
1098 aim_clientready(sess, fr->conn); | |
1099 | |
1100 aim_chatnav_reqrights(sess, fr->conn); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1101 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1102 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1103 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1104 |
3694 | 1105 static int conninitdone_email(aim_session_t *sess, aim_frame_t *fr, ...) { |
1106 | |
1107 aim_conn_addhandler(sess, fr->conn, 0x0018, 0x0001, gaim_parse_genericerr, 0); | |
1108 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_EML, AIM_CB_EML_MAILSTATUS, gaim_email_parseupdate, 0); | |
1109 | |
1110 aim_email_sendcookies(sess, fr->conn); | |
1111 aim_email_activate(sess, fr->conn); | |
1112 aim_clientready(sess, fr->conn); | |
1113 | |
1114 return 1; | |
1115 } | |
1116 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1117 static void oscar_chatnav_connect(gpointer data, gint source, GaimInputCondition cond) { |
2086 | 1118 struct gaim_connection *gc = data; |
1119 struct oscar_data *odata; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1120 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1121 aim_conn_t *tstconn; |
2086 | 1122 |
1123 if (!g_slist_find(connections, gc)) { | |
1124 close(source); | |
1125 return; | |
1126 } | |
1127 | |
1128 odata = gc->proto_data; | |
1129 sess = odata->sess; | |
1130 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_CHATNAV); | |
1131 | |
1132 if (source < 0) { | |
1133 aim_conn_kill(sess, &tstconn); | |
1134 debug_printf("unable to connect to chatnav server\n"); | |
1135 return; | |
1136 } | |
1137 | |
1138 aim_conn_completeconnect(sess, tstconn); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1139 odata->cnpa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1140 oscar_callback, tstconn); |
2086 | 1141 debug_printf("chatnav: connected\n"); |
1142 } | |
1143 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1144 static void oscar_auth_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 1145 { |
1146 struct gaim_connection *gc = data; | |
1147 struct oscar_data *odata; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1148 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1149 aim_conn_t *tstconn; |
2086 | 1150 |
1151 if (!g_slist_find(connections, gc)) { | |
1152 close(source); | |
1153 return; | |
1154 } | |
1155 | |
1156 odata = gc->proto_data; | |
1157 sess = odata->sess; | |
1158 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_AUTH); | |
1159 | |
1160 if (source < 0) { | |
1161 aim_conn_kill(sess, &tstconn); | |
1162 debug_printf("unable to connect to authorizer\n"); | |
1163 return; | |
1164 } | |
1165 | |
1166 aim_conn_completeconnect(sess, tstconn); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1167 odata->paspa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, |
2086 | 1168 oscar_callback, tstconn); |
1169 debug_printf("chatnav: connected\n"); | |
1170 } | |
1171 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1172 static void oscar_chat_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 1173 { |
1174 struct chat_connection *ccon = data; | |
1175 struct gaim_connection *gc = ccon->gc; | |
1176 struct oscar_data *odata; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1177 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1178 aim_conn_t *tstconn; |
2086 | 1179 |
1180 if (!g_slist_find(connections, gc)) { | |
1181 close(source); | |
1182 g_free(ccon->show); | |
1183 g_free(ccon->name); | |
1184 g_free(ccon); | |
1185 return; | |
1186 } | |
1187 | |
1188 odata = gc->proto_data; | |
1189 sess = odata->sess; | |
1190 tstconn = ccon->conn; | |
1191 | |
1192 if (source < 0) { | |
1193 aim_conn_kill(sess, &tstconn); | |
1194 g_free(ccon->show); | |
1195 g_free(ccon->name); | |
1196 g_free(ccon); | |
1197 return; | |
1198 } | |
1199 | |
1200 aim_conn_completeconnect(sess, ccon->conn); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1201 ccon->inpa = gaim_input_add(tstconn->fd, |
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1202 GAIM_INPUT_READ, |
2086 | 1203 oscar_callback, tstconn); |
1204 odata->oscar_chats = g_slist_append(odata->oscar_chats, ccon); | |
1205 } | |
1206 | |
3694 | 1207 static void oscar_email_connect(gpointer data, gint source, GaimInputCondition cond) { |
1208 struct gaim_connection *gc = data; | |
1209 struct oscar_data *odata; | |
1210 aim_session_t *sess; | |
1211 aim_conn_t *tstconn; | |
1212 | |
1213 if (!g_slist_find(connections, gc)) { | |
1214 close(source); | |
1215 return; | |
1216 } | |
1217 | |
1218 odata = gc->proto_data; | |
1219 sess = odata->sess; | |
1220 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_EMAIL); | |
1221 | |
1222 if (source < 0) { | |
1223 aim_conn_kill(sess, &tstconn); | |
1224 debug_printf("unable to connect to email server\n"); | |
1225 return; | |
1226 } | |
1227 | |
1228 aim_conn_completeconnect(sess, tstconn); | |
1229 odata->emlpa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); | |
1230 debug_printf("email: connected\n"); | |
1231 } | |
1232 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1233 /* Hrmph. I don't know how to make this look better. --mid */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1234 static int gaim_handle_redirect(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 1235 va_list ap; |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1236 struct aim_redirect_data *redir; |
2086 | 1237 struct gaim_connection *gc = sess->aux_data; |
1238 struct aim_user *user = gc->user; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1239 aim_conn_t *tstconn; |
2086 | 1240 int i; |
1241 char *host; | |
1242 int port; | |
1243 | |
1244 port = user->proto_opt[USEROPT_AUTHPORT][0] ? | |
1245 atoi(user->proto_opt[USEROPT_AUTHPORT]) : FAIM_LOGIN_PORT, | |
1246 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1247 va_start(ap, fr); |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1248 redir = va_arg(ap, struct aim_redirect_data *); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1249 va_end(ap); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1250 |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1251 for (i = 0; i < (int)strlen(redir->ip); i++) { |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1252 if (redir->ip[i] == ':') { |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1253 port = atoi(&(redir->ip[i+1])); |
2086 | 1254 break; |
1255 } | |
1256 } | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1257 host = g_strndup(redir->ip, i); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1258 |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1259 switch(redir->group) { |
2086 | 1260 case 0x7: /* Authorizer */ |
1261 debug_printf("Reconnecting with authorizor...\n"); | |
1262 tstconn = aim_newconn(sess, AIM_CONN_TYPE_AUTH, NULL); | |
1263 if (tstconn == NULL) { | |
1264 debug_printf("unable to reconnect with authorizer\n"); | |
1265 g_free(host); | |
1266 return 1; | |
1267 } | |
2675 | 1268 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_admin, 0); |
2086 | 1269 aim_conn_addhandler(sess, tstconn, 0x0007, 0x0003, gaim_info_change, 0); |
1270 aim_conn_addhandler(sess, tstconn, 0x0007, 0x0005, gaim_info_change, 0); | |
1271 aim_conn_addhandler(sess, tstconn, 0x0007, 0x0007, gaim_account_confirm, 0); | |
1272 | |
1273 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
1274 tstconn->fd = proxy_connect(host, port, oscar_auth_connect, gc); | |
1275 if (tstconn->fd < 0) { | |
1276 aim_conn_kill(sess, &tstconn); | |
1277 debug_printf("unable to reconnect with authorizer\n"); | |
1278 g_free(host); | |
1279 return 1; | |
1280 } | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1281 aim_sendcookie(sess, tstconn, redir->cookie); |
2086 | 1282 break; |
1283 case 0xd: /* ChatNav */ | |
1284 tstconn = aim_newconn(sess, AIM_CONN_TYPE_CHATNAV, NULL); | |
1285 if (tstconn == NULL) { | |
1286 debug_printf("unable to connect to chatnav server\n"); | |
1287 g_free(host); | |
1288 return 1; | |
1289 } | |
2675 | 1290 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_chatnav, 0); |
2086 | 1291 |
1292 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
1293 tstconn->fd = proxy_connect(host, port, oscar_chatnav_connect, gc); | |
1294 if (tstconn->fd < 0) { | |
1295 aim_conn_kill(sess, &tstconn); | |
1296 debug_printf("unable to connect to chatnav server\n"); | |
1297 g_free(host); | |
1298 return 1; | |
1299 } | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1300 aim_sendcookie(sess, tstconn, redir->cookie); |
2086 | 1301 break; |
1302 case 0xe: /* Chat */ | |
1303 { | |
1304 struct chat_connection *ccon; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1305 |
2086 | 1306 tstconn = aim_newconn(sess, AIM_CONN_TYPE_CHAT, NULL); |
1307 if (tstconn == NULL) { | |
1308 debug_printf("unable to connect to chat server\n"); | |
1309 g_free(host); | |
1310 return 1; | |
1311 } | |
1312 | |
2675 | 1313 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_chat, 0); |
1314 | |
2086 | 1315 ccon = g_new0(struct chat_connection, 1); |
1316 ccon->conn = tstconn; | |
1317 ccon->gc = gc; | |
1318 ccon->fd = -1; | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1319 ccon->name = g_strdup(redir->chat.room); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1320 ccon->exchange = redir->chat.exchange; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1321 ccon->instance = redir->chat.instance; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1322 ccon->show = extract_name(redir->chat.room); |
2086 | 1323 |
1324 ccon->conn->status |= AIM_CONN_STATUS_INPROGRESS; | |
1325 ccon->conn->fd = proxy_connect(host, port, oscar_chat_connect, ccon); | |
1326 if (ccon->conn->fd < 0) { | |
1327 aim_conn_kill(sess, &tstconn); | |
1328 debug_printf("unable to connect to chat server\n"); | |
1329 g_free(host); | |
1330 g_free(ccon->show); | |
1331 g_free(ccon->name); | |
1332 g_free(ccon); | |
1333 return 1; | |
1334 } | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1335 aim_sendcookie(sess, tstconn, redir->cookie); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1336 debug_printf("Connected to chat room %s exchange %d\n", ccon->name, ccon->exchange); |
2086 | 1337 } |
1338 break; | |
3694 | 1339 |
1340 case 0x0018: { /* email */ | |
1341 if (!(tstconn = aim_newconn(sess, AIM_CONN_TYPE_EMAIL, NULL))) { | |
1342 debug_printf("unable to connect to email server\n"); | |
1343 g_free(host); | |
1344 return 1; | |
1345 } | |
1346 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_email, 0); | |
1347 | |
1348 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
1349 tstconn->fd = proxy_connect(host, port, oscar_email_connect, gc); | |
1350 if (tstconn->fd < 0) { | |
1351 aim_conn_kill(sess, &tstconn); | |
1352 debug_printf("unable to connect to email server\n"); | |
1353 g_free(host); | |
1354 return 1; | |
1355 } | |
1356 aim_sendcookie(sess, tstconn, redir->cookie); | |
1357 } break; | |
1358 | |
2086 | 1359 default: /* huh? */ |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1360 debug_printf("got redirect for unknown service 0x%04x\n", redir->group); |
2086 | 1361 break; |
1362 } | |
1363 | |
1364 g_free(host); | |
1365 return 1; | |
1366 } | |
1367 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1368 static int gaim_parse_oncoming(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 1369 struct gaim_connection *gc = sess->aux_data; |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
1370 struct oscar_data *od = gc->proto_data; |
2993 | 1371 aim_userinfo_t *info; |
1372 time_t time_idle = 0, signon = 0; | |
1373 int type = 0; | |
1374 int caps = 0; | |
2305
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
1375 char *tmp; |
2086 | 1376 |
1377 va_list ap; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1378 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
1379 info = va_arg(ap, aim_userinfo_t *); |
2086 | 1380 va_end(ap); |
1381 | |
2993 | 1382 if (info->present & AIM_USERINFO_PRESENT_CAPABILITIES) |
1383 caps = info->capabilities; | |
3267 | 1384 if (info->flags & AIM_FLAG_ACTIVEBUDDY) |
1385 type |= UC_AB; | |
1386 | |
1387 if ((!od->icq) && (info->present & AIM_USERINFO_PRESENT_FLAGS)) { | |
1388 if (info->flags & AIM_FLAG_UNCONFIRMED) | |
1389 type |= UC_UNCONFIRMED; | |
1390 if (info->flags & AIM_FLAG_ADMINISTRATOR) | |
1391 type |= UC_ADMIN; | |
1392 if (info->flags & AIM_FLAG_AOL) | |
1393 type |= UC_AOL; | |
1394 if (info->flags & AIM_FLAG_FREE) | |
1395 type |= UC_NORMAL; | |
1396 if (info->flags & AIM_FLAG_AWAY) | |
1397 type |= UC_UNAVAILABLE; | |
1398 if (info->flags & AIM_FLAG_WIRELESS) | |
1399 type |= UC_WIRELESS; | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
1400 } |
2993 | 1401 if (info->present & AIM_USERINFO_PRESENT_ICQEXTSTATUS) { |
3595 | 1402 type = (info->icqinfo.status << 16); |
3013 | 1403 if (!(info->icqinfo.status & AIM_ICQ_STATE_CHAT) && |
1404 (info->icqinfo.status != AIM_ICQ_STATE_NORMAL)) { | |
2993 | 1405 type |= UC_UNAVAILABLE; |
3013 | 1406 } |
2993 | 1407 } |
1408 | |
1409 if (caps & AIM_CAPS_ICQ) | |
1410 caps ^= AIM_CAPS_ICQ; | |
1411 | |
1412 if (info->present & AIM_USERINFO_PRESENT_IDLE) { | |
2086 | 1413 time(&time_idle); |
1414 time_idle -= info->idletime*60; | |
2993 | 1415 } |
1416 | |
1417 if (info->present & AIM_USERINFO_PRESENT_SESSIONLEN) | |
1418 signon = time(NULL) - info->sessionlen; | |
2086 | 1419 |
2305
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
1420 tmp = g_strdup(normalize(gc->username)); |
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
1421 if (!strcmp(tmp, normalize(info->sn))) |
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
1422 g_snprintf(gc->displayname, sizeof(gc->displayname), "%s", info->sn); |
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
1423 g_free(tmp); |
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
1424 |
2993 | 1425 serv_got_update(gc, info->sn, 1, info->warnlevel/10, signon, |
2713
34ddcb44a4d2
[gaim-migrate @ 2726]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2706
diff
changeset
|
1426 time_idle, type, caps); |
2086 | 1427 |
1428 return 1; | |
1429 } | |
1430 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1431 static int gaim_parse_offgoing(aim_session_t *sess, aim_frame_t *fr, ...) { |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
1432 aim_userinfo_t *info; |
2086 | 1433 va_list ap; |
1434 struct gaim_connection *gc = sess->aux_data; | |
1435 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1436 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
1437 info = va_arg(ap, aim_userinfo_t *); |
2086 | 1438 va_end(ap); |
1439 | |
1440 serv_got_update(gc, info->sn, 0, 0, 0, 0, 0, 0); | |
1441 | |
1442 return 1; | |
1443 } | |
1444 | |
3730 | 1445 static void cancel_direct_im(struct ask_direct *d) { |
2086 | 1446 debug_printf("Freeing DirectIM prompts.\n"); |
1447 | |
1448 g_free(d->sn); | |
1449 g_free(d); | |
1450 } | |
1451 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1452 static void oscar_directim_callback(gpointer data, gint source, GaimInputCondition condition) { |
2086 | 1453 struct direct_im *dim = data; |
1454 struct gaim_connection *gc = dim->gc; | |
1455 struct oscar_data *od = gc->proto_data; | |
2235
5d8b6100a9cc
[gaim-migrate @ 2245]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2232
diff
changeset
|
1456 struct conversation *cnv; |
2086 | 1457 char buf[256]; |
3008 | 1458 struct sockaddr name; |
1459 socklen_t name_len = 1; | |
1460 | |
2086 | 1461 if (!g_slist_find(connections, gc)) { |
1462 g_free(dim); | |
1463 return; | |
1464 } | |
1465 | |
1466 if (source < 0) { | |
1467 g_free(dim); | |
1468 return; | |
1469 } | |
1470 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1471 if (dim->conn->fd != source) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1472 dim->conn->fd = source; |
2086 | 1473 aim_conn_completeconnect(od->sess, dim->conn); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1474 if (!(cnv = find_conversation(dim->name))) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1475 cnv = new_conversation(dim->name); |
3008 | 1476 |
1477 /* This is the best way to see if we're connected or not */ | |
1478 if (getpeername(source, &name, &name_len) == 0) { | |
1479 g_snprintf(buf, sizeof buf, _("Direct IM with %s established"), dim->name); | |
1480 dim->connected = TRUE; | |
1481 write_to_conv(cnv, buf, WFLAG_SYSTEM, NULL, time(NULL), -1); | |
1482 } | |
2086 | 1483 od->direct_ims = g_slist_append(od->direct_ims, dim); |
3008 | 1484 |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1485 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, |
3008 | 1486 oscar_callback, dim->conn); |
2086 | 1487 } |
1488 | |
3630 | 1489 static int oscar_sendfile_out_done(aim_session_t *sess, aim_frame_t *fr, ...) { |
1490 struct gaim_connection *gc = sess->aux_data; | |
1491 va_list ap; | |
1492 aim_conn_t *conn; | |
1493 const char *cook; | |
1494 struct oscar_file_transfer *oft; | |
1495 | |
1496 va_start(ap, fr); | |
1497 conn = va_arg(ap, aim_conn_t *); | |
1498 cook = va_arg(ap, const char *); | |
1499 va_end(ap); | |
1500 | |
1501 oft = find_oft_by_cookie(gc, cook); | |
1502 if (oft->filesdone == oft->totfiles) | |
1503 oscar_file_transfer_disconnect(sess, conn); | |
1504 else | |
1505 /* Send header for next file */ | |
1506 oscar_sendfile_request(sess, oft); | |
1507 | |
1508 return 0; | |
1509 } | |
1510 | |
1511 /* Called once for each file before sending the raw data. */ | |
1512 static int oscar_sendfile_request(aim_session_t *sess, | |
1513 struct oscar_file_transfer *oft) { | |
1514 char *name; | |
1515 int size; | |
1516 | |
1517 transfer_get_file_info(oft->xfer, &size, &name); | |
1518 aim_oft_sendfile_request(sess, oft->conn, name, oft->filesdone, | |
1519 oft->totfiles, size, oft->totsize); | |
1520 | |
1521 return 0; | |
1522 } | |
1523 | |
1524 static int oscar_sendfile_accepted(aim_session_t *sess, aim_frame_t *fr, ...) { | |
1525 struct gaim_connection *gc = sess->aux_data; | |
1526 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
1527 struct oscar_file_transfer *oft; | |
1528 va_list ap; | |
1529 aim_conn_t *conn, *listenerconn; | |
3752 | 1530 |
3630 | 1531 va_start(ap, fr); |
1532 conn = va_arg(ap, aim_conn_t *); | |
1533 listenerconn = va_arg(ap, aim_conn_t *); | |
1534 va_end(ap); | |
1535 | |
1536 oft = find_oft_by_conn(gc, listenerconn); | |
1537 oft->conn = conn; | |
1538 /* Stop watching listener conn; watch transfer conn instead */ | |
1539 gaim_input_remove(oft->watcher); | |
1540 aim_conn_kill(sess, &listenerconn); | |
1541 | |
1542 aim_conn_addhandler(od->sess, oft->conn, AIM_CB_FAM_OFT, | |
1543 AIM_CB_OFT_GETFILEFILESEND, | |
1544 oscar_file_transfer_do, | |
1545 0); | |
1546 aim_conn_addhandler(sess, conn, | |
1547 AIM_CB_FAM_OFT, | |
1548 AIM_CB_OFT_GETFILECOMPLETE, | |
1549 oscar_sendfile_out_done, | |
1550 0); | |
1551 oft->watcher = gaim_input_add(oft->conn->fd, GAIM_INPUT_READ, | |
1552 oscar_callback, oft->conn); | |
1553 | |
1554 oscar_sendfile_request(sess, oft); | |
1555 | |
1556 return 0; | |
1557 } | |
1558 | |
3752 | 1559 static int oscar_sendfile_timeout(aim_session_t *sess, aim_frame_t *fr, ...) { |
1560 struct gaim_connection *gc = sess->aux_data; | |
1561 va_list ap; | |
1562 struct oscar_file_transfer *oft; | |
1563 char *cookie; | |
1564 aim_conn_t *bosconn; | |
1565 | |
1566 va_start(ap, fr); | |
1567 bosconn = va_arg(ap, aim_conn_t *); | |
1568 cookie = va_arg(ap, char *); | |
1569 va_end(ap); | |
1570 | |
1571 if ((oft = find_oft_by_cookie(gc, cookie))) { | |
3630 | 1572 aim_canceltransfer(sess, bosconn, oft->cookie, |
1573 oft->sn, AIM_CAPS_SENDFILE); | |
1574 | |
1575 transfer_abort(oft->xfer, _("Transfer timed out")); | |
1576 oscar_file_transfer_disconnect(sess, oft->conn); | |
1577 } | |
3752 | 1578 |
1579 return 1; /* success */ | |
3630 | 1580 } |
1581 | |
1582 /* Called once at the beginning of an outgoing transfer session. */ | |
1583 static void oscar_start_transfer_out(struct gaim_connection *gc, | |
1584 struct file_transfer *xfer, const char *name, int totfiles, | |
1585 int totsize) { | |
1586 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
1587 struct oscar_file_transfer *oft = find_oft_by_xfer(gc, xfer); | |
1588 | |
1589 oft->xfer = xfer; | |
1590 oft->totsize = totsize; | |
1591 oft->totfiles = totfiles; | |
1592 oft->filesdone = 0; | |
1593 | |
1594 oft->conn = aim_sendfile_initiate(od->sess, oft->sn, | |
1595 name, totfiles, oft->totsize, oft->cookie); | |
1596 if (!oft->conn) { | |
1597 do_error_dialog(_("Couldn't open listener to send file"), | |
1598 _("File transfer aborted"), | |
1599 GAIM_ERROR); | |
1600 return; | |
1601 } | |
3752 | 1602 |
3630 | 1603 aim_conn_addhandler(od->sess, oft->conn, AIM_CB_FAM_OFT, |
1604 AIM_CB_OFT_GETFILEINITIATE, | |
1605 oscar_sendfile_accepted, | |
1606 0); | |
1607 oft->watcher = gaim_input_add(oft->conn->fd, GAIM_INPUT_READ, | |
1608 oscar_callback, oft->conn); | |
1609 } | |
1610 | |
1611 static void oscar_transfer_data_chunk(struct gaim_connection *gc, | |
1612 struct file_transfer *xfer, const char *buf, int len) | |
1613 { | |
1614 struct oscar_file_transfer *oft = find_oft_by_xfer(gc, xfer); | |
1615 aim_session_t *sess = aim_conn_getsess(oft->conn); | |
1616 | |
1617 if (oft->type == OFT_SENDFILE_IN) | |
1618 aim_update_checksum(sess, oft->conn, buf, len); | |
1619 } | |
1620 | |
1621 static void oscar_start_transfer_in(struct gaim_connection *gc, | |
1622 struct file_transfer *xfer, int offset) { | |
1623 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
1624 struct oscar_file_transfer *oft = find_oft_by_xfer(gc, xfer); | |
1625 | |
1626 oft->xfer = xfer; | |
1627 oft->conn = aim_accepttransfer(od->sess, od->conn, oft->sn, | |
1628 oft->cookie, oft->ip, | |
1629 oft->port, | |
1630 AIM_CAPS_SENDFILE); | |
1631 if (!oft->conn) { | |
1632 char *buf = g_strdup_printf("Couldn't connect to remote host"); | |
1633 do_error_dialog(buf, NULL, GAIM_ERROR); | |
1634 g_free(buf); | |
1635 return; | |
1636 } | |
1637 | |
1638 aim_conn_addhandler(od->sess, oft->conn, AIM_CB_FAM_OFT, | |
1639 AIM_CB_OFT_GETFILEFILEREQ, oscar_file_transfer_do, | |
1640 0); | |
1641 | |
1642 oft->watcher = gaim_input_add(oft->conn->fd, GAIM_INPUT_READ, | |
1643 oscar_callback, oft->conn); | |
1644 } | |
1645 | |
1646 static void oscar_cancel_transfer(struct gaim_connection *gc, | |
1647 struct file_transfer *xfer) { | |
1648 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
1649 struct oscar_file_transfer *oft = find_oft_by_xfer(gc, xfer); | |
1650 | |
1651 if (oft->type == OFT_SENDFILE_IN) | |
1652 aim_denytransfer(od->sess, oft->sn, oft->cookie, | |
1653 AIM_TRANSFER_DENY_DECLINE); | |
1654 | |
1655 od->file_transfers = g_slist_remove(od->file_transfers, oft); | |
1656 aim_conn_kill(od->sess, &oft->conn); | |
1657 g_free(oft->sn); | |
1658 g_free(oft); | |
1659 } | |
1660 | |
3730 | 1661 static int accept_direct_im(struct ask_direct *d) { |
2086 | 1662 struct gaim_connection *gc = d->gc; |
1663 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
1664 struct direct_im *dim; | |
2945 | 1665 char *host; int port = 4443; |
2086 | 1666 int i; |
1667 | |
1668 debug_printf("Accepted DirectIM.\n"); | |
1669 | |
1670 dim = find_direct_im(od, d->sn); | |
1671 if (dim) { | |
3730 | 1672 cancel_direct_im(d); /* 40 */ |
2086 | 1673 return TRUE; |
1674 } | |
1675 dim = g_new0(struct direct_im, 1); | |
1676 dim->gc = d->gc; | |
1677 g_snprintf(dim->name, sizeof dim->name, "%s", d->sn); | |
1678 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1679 dim->conn = aim_directim_connect(od->sess, d->sn, NULL, d->cookie); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1680 if (!dim->conn) { |
2086 | 1681 g_free(dim); |
3730 | 1682 cancel_direct_im(d); |
2086 | 1683 return TRUE; |
1684 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1685 |
2086 | 1686 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, |
1687 gaim_directim_incoming, 0); | |
1688 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, | |
1689 gaim_directim_typing, 0); | |
3033 | 1690 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER, |
2993 | 1691 gaim_update_ui, 0); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1692 for (i = 0; i < (int)strlen(d->ip); i++) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1693 if (d->ip[i] == ':') { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1694 port = atoi(&(d->ip[i+1])); |
2086 | 1695 break; |
1696 } | |
1697 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1698 host = g_strndup(d->ip, i); |
2086 | 1699 dim->conn->status |= AIM_CONN_STATUS_INPROGRESS; |
1700 dim->conn->fd = proxy_connect(host, port, oscar_directim_callback, dim); | |
1701 g_free(host); | |
1702 if (dim->conn->fd < 0) { | |
1703 aim_conn_kill(od->sess, &dim->conn); | |
1704 g_free(dim); | |
3730 | 1705 cancel_direct_im(d); |
2086 | 1706 return TRUE; |
1707 } | |
1708 | |
3730 | 1709 cancel_direct_im(d); |
2086 | 1710 |
1711 return TRUE; | |
1712 } | |
1713 | |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
1714 static int incomingim_chan1(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch1_args *args) { |
3642 | 1715 char *tmp; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1716 struct gaim_connection *gc = sess->aux_data; |
3600 | 1717 struct oscar_data *od = gc->proto_data; |
2273
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
1718 int flags = 0; |
3659 | 1719 int convlen; |
1720 GError *err = NULL; | |
2273
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
1721 |
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
1722 if (args->icbmflags & AIM_IMFLAGS_AWAY) |
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
1723 flags |= IM_FLAG_AWAY; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1724 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1725 if (args->icbmflags & AIM_IMFLAGS_HASICON) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1726 struct icon_req *ir = NULL; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1727 GSList *h = od->hasicons; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1728 char *who = normalize(userinfo->sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1729 debug_printf("%s has an icon\n", userinfo->sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1730 while (h) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1731 ir = h->data; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1732 if (!strcmp(ir->user, who)) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1733 break; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1734 h = h->next; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1735 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1736 if (!h) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1737 ir = g_new0(struct icon_req, 1); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1738 ir->user = g_strdup(who); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1739 od->hasicons = g_slist_append(od->hasicons, ir); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1740 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1741 if ((args->iconlen != ir->length) || |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1742 (args->iconsum != ir->checksum) || |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1743 (args->iconstamp != ir->timestamp)) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1744 ir->request = TRUE; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1745 ir->length = args->iconlen; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1746 ir->checksum = args->iconsum; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1747 ir->timestamp = args->iconstamp; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1748 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1749 |
2336
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
1750 if (gc->user->iconfile[0] && (args->icbmflags & AIM_IMFLAGS_BUDDYREQ)) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1751 FILE *file; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1752 struct stat st; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1753 |
2248
cef6d4e81aec
[gaim-migrate @ 2258]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
1754 if (!stat(gc->user->iconfile, &st)) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1755 char *buf = g_malloc(st.st_size); |
2248
cef6d4e81aec
[gaim-migrate @ 2258]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
1756 file = fopen(gc->user->iconfile, "r"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1757 if (file) { |
2603
24664768a739
[gaim-migrate @ 2616]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2597
diff
changeset
|
1758 int len = fread(buf, 1, st.st_size, file); |
24664768a739
[gaim-migrate @ 2616]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2597
diff
changeset
|
1759 debug_printf("Sending buddy icon to %s (%d bytes, %d reported)\n", |
24664768a739
[gaim-migrate @ 2616]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2597
diff
changeset
|
1760 userinfo->sn, len, st.st_size); |
2673
81d658e6ac1e
[gaim-migrate @ 2686]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2672
diff
changeset
|
1761 aim_send_icon(sess, userinfo->sn, buf, st.st_size, |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1762 st.st_mtime, aim_iconsum(buf, st.st_size)); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1763 fclose(file); |
2336
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
1764 } else |
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
1765 debug_printf("Can't open buddy icon file!\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1766 g_free(buf); |
2336
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
1767 } else |
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
1768 debug_printf("Can't stat buddy icon file!\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1769 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1770 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1771 if (args->icbmflags & AIM_IMFLAGS_UNICODE) { |
3722 | 1772 /* This message is marked as UNICODE, so we have to |
1773 * convert it to utf-8 before handing it to the gaim core. | |
1774 * This conversion should *never* fail, if it does it | |
1775 * means that either the incoming ICBM is corrupted or | |
1776 * there is something we don't understand about it. */ | |
1777 /* For the record, AIM Unicode is big-endian UCS-2 */ | |
3659 | 1778 tmp = g_convert(args->msg, args->msglen, "UTF-8", "UCS-2BE", NULL, &convlen, &err); |
1779 if (err) { | |
1780 debug_printf("Unicode IM conversion: %s\n", err->message); | |
1781 tmp = strdup(_("(There was an error receiving this message)")); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1782 } |
3722 | 1783 } else { |
1784 /* This will get executed for both AIM_IMFLAGS_UNICODE and | |
1785 * unflagged messages, which are ASCII. That's OK because | |
1786 * ASCII is a strict subset of ISO-8859-1; this should | |
1787 * help with compatibility with old, broken versions of | |
1788 * gaim (everything before 0.60) and other broken clients | |
1789 * that will happily send ISO-8859-1 without marking it as | |
1790 * such */ | |
3659 | 1791 tmp = g_convert(args->msg, args->msglen, "UTF-8", "ISO-8859-1", NULL, &convlen, &err); |
1792 if (err) { | |
1793 debug_printf("ISO-8859-1 IM conversion: %s\n", err->message); | |
1794 tmp = strdup(_("(There was an error receiving this message)")); | |
1795 } | |
3642 | 1796 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1797 |
3595 | 1798 if (args->icbmflags & AIM_IMFLAGS_TYPINGNOT) { |
3600 | 1799 char *who = normalize(userinfo->sn); |
1800 if (!g_hash_table_lookup(od->supports_tn, who)) | |
1801 g_hash_table_insert(od->supports_tn, who, who); | |
3595 | 1802 } |
1803 | |
3642 | 1804 //strip_linefeed(tmp); |
2856
b1e300a85678
[gaim-migrate @ 2869]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2833
diff
changeset
|
1805 serv_got_im(gc, userinfo->sn, tmp, flags, time(NULL), -1); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1806 g_free(tmp); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1807 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1808 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1809 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1810 |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
1811 static int incomingim_chan2(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1812 struct gaim_connection *gc = sess->aux_data; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1813 |
2869 | 1814 debug_printf("rendezvous status %d (%s)\n", args->status, userinfo->sn); |
1815 | |
3630 | 1816 |
1817 if (args->status == AIM_RENDEZVOUS_CANCEL) { | |
1818 struct oscar_file_transfer *oft; | |
1819 oft = find_oft_by_cookie(gc, args->cookie); | |
1820 if (oft) { | |
1821 transfer_abort(oft->xfer, _("Buddy canceled transfer")); | |
1822 oscar_file_transfer_disconnect(sess, oft->conn); | |
1823 } | |
1824 return 0; | |
1825 } | |
1826 else if (args->status == AIM_RENDEZVOUS_ACCEPT) { | |
1827 /* The user accepted our transfer request, but we don't | |
1828 * really need to do anything yet. | |
1829 * -- wtm | |
1830 */ | |
1831 return 0; | |
1832 } | |
1833 else if (args->status != AIM_RENDEZVOUS_PROPOSE) { | |
3752 | 1834 debug_printf("unknown rendezvous status\n"); |
2869 | 1835 return 1; |
3630 | 1836 } |
2869 | 1837 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1838 if (args->reqclass & AIM_CAPS_CHAT) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1839 char *name = extract_name(args->info.chat.roominfo.name); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1840 int *exch = g_new0(int, 1); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1841 GList *m = NULL; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1842 m = g_list_append(m, g_strdup(name ? name : args->info.chat.roominfo.name)); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1843 *exch = args->info.chat.roominfo.exchange; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1844 m = g_list_append(m, exch); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1845 serv_got_chat_invite(gc, |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1846 name ? name : args->info.chat.roominfo.name, |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1847 userinfo->sn, |
2869 | 1848 (char *)args->msg, |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1849 m); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1850 if (name) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1851 g_free(name); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1852 } else if (args->reqclass & AIM_CAPS_SENDFILE) { |
3630 | 1853 struct oscar_file_transfer *oft; |
3752 | 1854 struct oscar_data *od = gc->proto_data; |
1855 | |
1856 if ((oft = find_oft_by_cookie(sess->aux_data, args->cookie))) | |
1857 { | |
1858 /* This is a request for a reverse connection, | |
1859 * which is used by newer clients when for some | |
1860 * reason they are unable to connect to our listener | |
1861 * (e.g. they are behind a firewall). | |
1862 */ | |
1863 if (oft->type != OFT_SENDFILE_OUT) | |
1864 return -1; | |
1865 | |
1866 /* It seems that Trillian sends some weird | |
1867 * packets. Sanity check. | |
1868 */ | |
1869 if (!args->verifiedip) | |
1870 return -1; | |
1871 | |
1872 /* This connection isn't used for anything, since | |
1873 * we're using a reverse connection instead. | |
3630 | 1874 */ |
3752 | 1875 gaim_input_remove(oft->watcher); |
1876 aim_conn_kill(sess, &oft->conn); | |
1877 | |
1878 debug_printf("sendfile: doing reverse connection to %s:%d\n", args->verifiedip, args->port); | |
1879 | |
1880 oft->conn = aim_accepttransfer(sess, od->conn, | |
1881 userinfo->sn, | |
1882 args->cookie, args->verifiedip, | |
1883 args->port, | |
1884 AIM_CAPS_SENDFILE); | |
1885 | |
1886 /* XXX: this is a bit of a hack: ideally | |
1887 * we should wait on GAIM_INPUT_WRITE. -- wtm | |
1888 */ | |
1889 aim_conn_completeconnect(sess, oft->conn); | |
1890 | |
1891 oscar_sendfile_request(sess, oft); | |
1892 | |
1893 aim_conn_addhandler(sess, oft->conn, | |
1894 AIM_CB_FAM_OFT, | |
1895 AIM_CB_OFT_GETFILECOMPLETE, | |
1896 oscar_sendfile_out_done, | |
1897 0); | |
1898 aim_conn_addhandler(sess, oft->conn, | |
1899 AIM_CB_FAM_OFT, | |
1900 AIM_CB_OFT_GETFILEFILESEND, | |
1901 oscar_file_transfer_do, | |
1902 0); | |
1903 oft->watcher = gaim_input_add(oft->conn->fd, | |
1904 GAIM_INPUT_READ, oscar_callback, | |
1905 oft->conn); | |
1906 return 0; | |
3630 | 1907 } |
1908 | |
1909 debug_printf("%s (%s) requests to send a file to %s\n", | |
1910 userinfo->sn, args->verifiedip, gc->username); | |
3752 | 1911 |
1912 oft = g_new0(struct oscar_file_transfer, 1); | |
3630 | 1913 |
1914 oft->type = OFT_SENDFILE_IN; | |
1915 oft->sn = g_strdup(userinfo->sn); | |
1916 strncpy(oft->ip, args->verifiedip, sizeof(oft->ip)); | |
1917 oft->port = args->port; | |
1918 memcpy(oft->cookie, args->cookie, 8); | |
1919 | |
3752 | 1920 od->file_transfers = g_slist_append(od->file_transfers, oft); |
3630 | 1921 |
1922 oft->xfer = transfer_in_add(gc, userinfo->sn, | |
1923 args->info.sendfile.filename, | |
1924 args->info.sendfile.totsize, | |
1925 args->info.sendfile.totfiles, | |
1926 args->msg); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1927 } else if (args->reqclass & AIM_CAPS_GETFILE) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1928 } else if (args->reqclass & AIM_CAPS_VOICE) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1929 } else if (args->reqclass & AIM_CAPS_BUDDYICON) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1930 set_icon_data(gc, normalize(userinfo->sn), args->info.icon.icon, |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1931 args->info.icon.length); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1932 } else if (args->reqclass & AIM_CAPS_IMIMAGE) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1933 struct ask_direct *d = g_new0(struct ask_direct, 1); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1934 char buf[256]; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1935 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1936 debug_printf("%s received direct im request from %s (%s)\n", |
2869 | 1937 gc->username, userinfo->sn, args->verifiedip); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1938 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1939 d->gc = gc; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1940 d->sn = g_strdup(userinfo->sn); |
2869 | 1941 strncpy(d->ip, args->verifiedip, sizeof(d->ip)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1942 memcpy(d->cookie, args->cookie, 8); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1943 g_snprintf(buf, sizeof buf, "%s has just asked to directly connect to %s.", |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1944 userinfo->sn, gc->username); |
3730 | 1945 do_ask_dialog(buf, _("This requires a direct connection between the two computers and is necessary for IM Images. Because your IP address will be revealed, this may be considered a privacy risk."), d, _("Connect"), accept_direct_im, _("Cancel"), cancel_direct_im); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1946 } else { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1947 debug_printf("Unknown reqclass %d\n", args->reqclass); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1948 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1949 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1950 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1951 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1952 |
3453 | 1953 /* |
1954 * Next 2 functions are for when other people ask you for authorization | |
1955 */ | |
3730 | 1956 static void gaim_icq_authgrant(struct channel4_data *data) { |
3453 | 1957 char message; |
3141 | 1958 struct oscar_data *od = (struct oscar_data *)data->gc->proto_data; |
1959 message = 0; | |
3453 | 1960 aim_send_im_ch4(od->sess, data->uin, AIM_ICQMSG_AUTHGRANTED, &message); |
1961 show_got_added(data->gc, NULL, data->uin, NULL, NULL); | |
1962 g_free(data->uin); | |
3730 | 1963 g_free(data); |
3141 | 1964 } |
1965 | |
3730 | 1966 static void gaim_icq_authdeny(struct channel4_data *data) { |
1967 gchar *message; | |
1968 struct oscar_data *od = (struct oscar_data *)data->gc->proto_data; | |
1969 message = g_strdup_printf("No reason given."); | |
1970 aim_send_im_ch4(od->sess, data->uin, AIM_ICQMSG_AUTHDENIED, message); | |
1971 g_free(data->uin); | |
1972 g_free(message); | |
3141 | 1973 g_free(data); |
1974 } | |
1975 | |
1976 /* | |
1977 * For when other people ask you for authorization | |
1978 */ | |
1979 static void gaim_icq_authask(struct gaim_connection *gc, fu32_t uin, char *msg) { | |
3453 | 1980 struct channel4_data *data = g_new(struct channel4_data, 1); |
3141 | 1981 /* The first 6 chars of the message are some type of alien gibberish, so skip them */ |
3730 | 1982 char *dialog_msg = g_strdup_printf("The user %lu wants to add you to their buddy list for the following reason:", uin, (msg && strlen(msg)>6) ? msg+6 : "No reason given."); |
3159 | 1983 debug_printf("Received an authorization request from UIN %lu\n", uin); |
3141 | 1984 data->gc = gc; |
3453 | 1985 data->uin = g_strdup_printf("%lu", uin); |
3730 | 1986 do_ask_dialog(dialog_msg, (msg && strlen(msg) > 6) ? msg+6 : _("No reason given."), data, _("Authorize"), gaim_icq_authgrant, _("Deny"), gaim_icq_authdeny); |
3141 | 1987 g_free(dialog_msg); |
1988 } | |
1989 | |
3453 | 1990 /* |
1991 * Next 2 functions are for when someone sends you contacts | |
1992 */ | |
3730 | 1993 static void gaim_icq_contactadd(struct channel4_data *data) { |
3453 | 1994 show_add_buddy(data->gc, data->uin, NULL, data->nick); |
3730 | 1995 free(data->uin); |
1996 free(data->nick); | |
1997 g_free(data); | |
3453 | 1998 } |
1999 | |
3730 | 2000 static void gaim_icq_contactdontadd(struct channel4_data *data) { |
3453 | 2001 free(data->uin); |
2002 free(data->nick); | |
2003 g_free(data); | |
2004 } | |
2005 | |
3141 | 2006 static int incomingim_chan4(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch4_args *args) { |
2007 struct gaim_connection *gc = sess->aux_data; | |
2008 | |
3453 | 2009 switch (args->type) |
2010 { | |
3316 | 2011 case 0x0001: { /* An almost-normal instant message. Mac ICQ sends this. It's peculiar. */ |
3453 | 2012 gchar *uin, *message; |
3316 | 2013 uin = g_strdup_printf("%lu", args->uin); |
2014 message = g_strdup(args->msg); | |
2015 strip_linefeed(message); | |
2016 serv_got_im(gc, uin, message, 0, time(NULL), -1); | |
2017 g_free(uin); | |
2018 g_free(message); | |
2019 } break; | |
2020 | |
3453 | 2021 case 0x0004: { /* Someone sent you a URL */ |
2022 gchar **text, *uin, *message; | |
2023 text = g_strsplit(args->msg, "þ", 2); | |
2024 if (text) { | |
2025 uin = g_strdup_printf("%lu", args->uin); | |
2026 message = g_strdup_printf("<A HREF=\"%s\">%s</A>", text[1], text[0]); | |
2027 strip_linefeed(message); | |
2028 serv_got_im(gc, uin, message, 0, time(NULL), -1); | |
2029 g_strfreev(text); | |
2030 g_free(uin); | |
2031 g_free(message); | |
2032 } | |
2033 } break; | |
2034 | |
3141 | 2035 case 0x0006: { /* Someone requested authorization */ |
2036 gaim_icq_authask(gc, args->uin, args->msg); | |
2037 } break; | |
2038 | |
2039 case 0x0007: { /* Someone has denied you authorization */ | |
2040 char *dialog_msg; | |
3159 | 2041 dialog_msg = g_strdup_printf(_("The user %lu has denied your request to add them to your contact list for the following reason:\n%s"), args->uin, args->msg ? args->msg : _("No reason given.")); |
3427 | 2042 do_error_dialog(_("ICQ authorization denied."), dialog_msg, GAIM_ERROR); |
3141 | 2043 g_free(dialog_msg); |
2044 } break; | |
2045 | |
2046 case 0x0008: { /* Someone has granted you authorization */ | |
2047 char *dialog_msg; | |
3159 | 2048 dialog_msg = g_strdup_printf(_("The user %lu has granted your request to add them to your contact list."), args->uin); |
3427 | 2049 do_error_dialog("ICQ authorization accepted.", dialog_msg, GAIM_INFO); |
3141 | 2050 g_free(dialog_msg); |
2051 } break; | |
2052 | |
2053 case 0x0012: { | |
2054 /* Ack for authorizing/denying someone. Or possibly an ack for sending any system notice */ | |
2055 } break; | |
2056 | |
3453 | 2057 case 0x0013: { /* Someone has sent you some ICQ contacts */ |
2058 int i, num; | |
2059 gchar **text; | |
2060 text = g_strsplit(args->msg, "þ", 0); | |
2061 if (text) { | |
2062 num = 0; | |
2063 for (i=0; i<strlen(text[0]); i++) | |
2064 num = num*10 + text[0][i]-48; | |
2065 for (i=0; i<num; i++) { | |
2066 struct channel4_data *data = g_new(struct channel4_data, 1); | |
3730 | 2067 gchar *message = g_strdup_printf(_("ICQ user %lu has sent you a contact: %s (%s)"), args->uin, text[i*2+2], text[i*2+1]); |
3453 | 2068 data->gc = gc; |
2069 data->uin = g_strdup(text[i*2+2]); | |
2070 data->nick = g_strdup(text[i*2+1]); | |
3730 | 2071 do_ask_dialog(message, "Do you want to add this contact to your Buddy List?", data, _("Add"), gaim_icq_contactadd, _("Deny"), gaim_icq_contactdontadd); |
3453 | 2072 g_free(message); |
2073 } | |
2074 g_strfreev(text); | |
2075 } | |
2076 } break; | |
2077 | |
2078 case 0x001a: { /* Someone has requested that you send them from ICQ contacts */ | |
2079 /* This is boring and silly. */ | |
2080 } break; | |
2081 | |
3141 | 2082 default: { |
2083 debug_printf("Received a channel 4 message of unknown type (type 0x%04d).\n", args->type); | |
2084 } break; | |
2085 } | |
2086 | |
2087 return 1; | |
2088 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2089 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2090 static int gaim_parse_incoming_im(aim_session_t *sess, aim_frame_t *fr, ...) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2091 int channel, ret = 0; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2092 aim_userinfo_t *userinfo; |
2086 | 2093 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2094 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2095 va_start(ap, fr); |
2086 | 2096 channel = va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2097 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 2098 |
3141 | 2099 switch (channel) { |
2100 case 1: { /* standard message */ | |
2101 struct aim_incomingim_ch1_args *args; | |
2102 args = va_arg(ap, struct aim_incomingim_ch1_args *); | |
2103 ret = incomingim_chan1(sess, fr->conn, userinfo, args); | |
2104 } break; | |
2105 | |
2106 case 2: { /* rendevous */ | |
2107 struct aim_incomingim_ch2_args *args; | |
2108 args = va_arg(ap, struct aim_incomingim_ch2_args *); | |
2109 ret = incomingim_chan2(sess, fr->conn, userinfo, args); | |
2110 } break; | |
2111 | |
2112 case 4: { /* ICQ */ | |
2113 struct aim_incomingim_ch4_args *args; | |
2114 args = va_arg(ap, struct aim_incomingim_ch4_args *); | |
2115 ret = incomingim_chan4(sess, fr->conn, userinfo, args); | |
2116 } break; | |
2117 | |
2118 default: { | |
2119 debug_printf("ICBM received on unsupported channel (channel 0x%04d).", channel); | |
2120 } break; | |
2086 | 2121 } |
2122 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2123 va_end(ap); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2124 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2125 return ret; |
2086 | 2126 } |
2127 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2128 static int gaim_parse_misses(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2129 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2130 fu16_t chan, nummissed, reason; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2131 aim_userinfo_t *userinfo; |
2086 | 2132 char buf[1024]; |
2133 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2134 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2135 chan = (fu16_t)va_arg(ap, unsigned int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2136 userinfo = va_arg(ap, aim_userinfo_t *); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2137 nummissed = (fu16_t)va_arg(ap, unsigned int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2138 reason = (fu16_t)va_arg(ap, unsigned int); |
2086 | 2139 va_end(ap); |
2140 | |
2141 switch(reason) { | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2142 case 0: |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2143 /* Invalid (0) */ |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2144 g_snprintf(buf, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2145 sizeof(buf), |
2946 | 2146 nummissed == 1 ? |
2947 | 2147 _("You missed %d message from %s because it was invalid.") : |
2148 _("You missed %d messages from %s because they were invalid."), | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2149 nummissed, |
2947 | 2150 userinfo->sn); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2151 break; |
2086 | 2152 case 1: |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2153 /* Message too large */ |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2154 g_snprintf(buf, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2155 sizeof(buf), |
2943 | 2156 nummissed == 1 ? |
2157 _("You missed %d message from %s because it was too large.") : | |
2946 | 2158 _("You missed %d messages from %s because they were too large."), |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2159 nummissed, |
2943 | 2160 userinfo->sn); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2161 break; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2162 case 2: |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2163 /* Rate exceeded */ |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2164 g_snprintf(buf, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2165 sizeof(buf), |
2943 | 2166 nummissed == 1 ? |
2167 _("You missed %d message from %s because the rate limit has been exceeded.") : | |
2168 _("You missed %d messages from %s because the rate limit has been exceeded."), | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2169 nummissed, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2170 userinfo->sn); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2171 break; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2172 case 3: |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2173 /* Evil Sender */ |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2174 g_snprintf(buf, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2175 sizeof(buf), |
2943 | 2176 nummissed == 1 ? |
2947 | 2177 _("You missed %d message from %s because it was too evil.") : |
2943 | 2178 _("You missed %d messages from %s because they are too evil."), |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2179 nummissed, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2180 userinfo->sn); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2181 break; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2182 case 4: |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2183 /* Evil Receiver */ |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2184 g_snprintf(buf, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2185 sizeof(buf), |
2943 | 2186 nummissed == 1 ? |
2187 _("You missed %d message from %s because you are too evil.") : | |
2188 _("You missed %d messages from %s because you are too evil."), | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2189 nummissed, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2190 userinfo->sn); |
2086 | 2191 break; |
2192 default: | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2193 g_snprintf(buf, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2194 sizeof(buf), |
2943 | 2195 nummissed == 1 ? |
2196 _("You missed %d message from %s for unknown reasons.") : | |
2197 _("You missed %d messages from %s for unknown reasons."), | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2198 nummissed, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2199 userinfo->sn); |
2086 | 2200 break; |
2201 } | |
3427 | 2202 do_error_dialog(buf, NULL, GAIM_ERROR); |
2086 | 2203 |
2204 return 1; | |
2205 } | |
2206 | |
3212 | 2207 static char *gaim_icq_status(int state) { |
2208 /* Make a cute little string that shows the status of the dude or dudet */ | |
2209 if (state & AIM_ICQ_STATE_CHAT) | |
2210 return g_strdup_printf("Free For Chat"); | |
2211 else if (state & AIM_ICQ_STATE_DND) | |
2212 return g_strdup_printf("Do Not Disturb"); | |
2213 else if (state & AIM_ICQ_STATE_OUT) | |
2214 return g_strdup_printf("Not Available"); | |
2215 else if (state & AIM_ICQ_STATE_BUSY) | |
2216 return g_strdup_printf("Occupied"); | |
2217 else if (state & AIM_ICQ_STATE_AWAY) | |
2218 return g_strdup_printf("Away"); | |
2219 else if (state & AIM_ICQ_STATE_WEBAWARE) | |
2220 return g_strdup_printf("Web Aware"); | |
2221 else if (state & AIM_ICQ_STATE_INVISIBLE) | |
2222 return g_strdup_printf("Invisible"); | |
2223 else | |
2224 return g_strdup_printf("Online"); | |
2225 } | |
2226 | |
3630 | 2227 static int gaim_parse_clientauto_rend(aim_session_t *sess, |
2228 const char *who, int reason, const char *cookie) { | |
2229 struct gaim_connection *gc = sess->aux_data; | |
2230 struct oscar_file_transfer *oft; | |
2231 char *buf; | |
2232 | |
2233 switch (reason) { | |
2234 case 3: /* Decline sendfile. */ | |
2235 oft = find_oft_by_cookie(gc, cookie); | |
2236 | |
2237 if (oft) { | |
2238 buf = g_strdup_printf(_("%s has declined to receive a file from %s.\n"), | |
2239 who, gc->username); | |
2240 transfer_abort(oft->xfer, buf); | |
2241 g_free(buf); | |
2242 oscar_file_transfer_disconnect(sess, oft->conn); | |
2243 } | |
2244 break; | |
2245 default: | |
2246 debug_printf("Received an unknown rendezvous client auto-response from %s. Type 0x%04x\n", who, reason); | |
2247 | |
2248 } | |
2249 | |
2250 return 0; | |
2251 } | |
2252 | |
3212 | 2253 static int gaim_parse_clientauto(aim_session_t *sess, aim_frame_t *fr, ...) { |
2254 struct gaim_connection *gc = sess->aux_data; | |
2255 va_list ap; | |
2256 fu16_t chan, reason; | |
2257 char *who; | |
2258 | |
2259 va_start(ap, fr); | |
2260 chan = (fu16_t)va_arg(ap, unsigned int); | |
2261 who = va_arg(ap, char *); | |
2262 reason = (fu16_t)va_arg(ap, unsigned int); | |
2263 | |
3630 | 2264 if (chan == 2) { |
2265 char *cookie = va_arg(ap, char *); | |
3637 | 2266 va_end(ap); |
3630 | 2267 |
2268 return gaim_parse_clientauto_rend(sess, who, reason, | |
2269 cookie); | |
2270 } | |
2271 | |
3212 | 2272 switch(reason) { |
2273 case 0x0003: { /* Reply from an ICQ status message request */ | |
2274 int state = (int)va_arg(ap, fu32_t); | |
2275 char *msg = va_arg(ap, char *); | |
2276 char *status_msg = gaim_icq_status(state); | |
2277 char *dialog_msg, **splitmsg; | |
2278 struct oscar_data *od = gc->proto_data; | |
2279 GSList *l = od->evilhack; | |
2280 gboolean evilhack = FALSE; | |
2281 | |
2282 /* Split at (carriage return/newline)'s, then rejoin later with BRs between. */ | |
2283 splitmsg = g_strsplit(msg, "\r\n", 0); | |
2284 | |
2285 /* If who is in od->evilhack, then we're just getting the away message, otherwise this | |
2286 * will just get appended to the info box (which is already showing). */ | |
2287 while (l) { | |
2288 char *x = l->data; | |
2289 if (!strcmp(x, normalize(who))) { | |
2290 evilhack = TRUE; | |
2291 g_free(x); | |
2292 od->evilhack = g_slist_remove(od->evilhack, x); | |
2293 break; | |
2294 } | |
2295 l = l->next; | |
2296 } | |
2297 | |
2298 if (evilhack) | |
2299 dialog_msg = g_strdup_printf(_("<B>UIN:</B> %s<BR><B>Status:</B> %s<BR><HR><BR>%s<BR>"), who, status_msg, g_strjoinv("<BR>", splitmsg)); | |
2300 else | |
2301 dialog_msg = g_strdup_printf(_("<B>Status:</B> %s<BR><HR><BR>%s<BR>"), status_msg, g_strjoinv("<BR>", splitmsg)); | |
2302 g_show_info_text(gc, who, 2, dialog_msg, NULL); | |
2303 | |
2304 g_free(status_msg); | |
2305 g_free(dialog_msg); | |
2306 g_strfreev(splitmsg); | |
2307 } break; | |
2308 | |
2309 default: { | |
2310 debug_printf("Received an unknown client auto-response from %s. Type 0x%04x\n", who, reason); | |
2311 } break; | |
2312 } | |
2313 va_end(ap); | |
2314 | |
2315 return 1; | |
2316 } | |
2317 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2318 static int gaim_parse_genericerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2319 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2320 fu16_t reason; |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
2321 char *m; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2322 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2323 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2324 reason = (fu16_t)va_arg(ap, unsigned int); |
2086 | 2325 va_end(ap); |
2326 | |
2864
e22c09351e67
[gaim-migrate @ 2877]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2856
diff
changeset
|
2327 debug_printf("snac threw error (reason 0x%04x: %s)\n", reason, |
2086 | 2328 (reason < msgerrreasonlen) ? msgerrreason[reason] : "unknown"); |
2329 | |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
2330 m = g_strdup_printf(_("SNAC threw error: %s\n"), |
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
2331 reason < msgerrreasonlen ? msgerrreason[reason] : "Unknown error"); |
3427 | 2332 do_error_dialog(m, NULL, GAIM_ERROR); |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
2333 g_free(m); |
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
2334 |
2086 | 2335 return 1; |
2336 } | |
2337 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2338 static int gaim_parse_msgerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2339 va_list ap; |
3752 | 2340 char *data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2341 fu16_t reason; |
2086 | 2342 char buf[1024]; |
3752 | 2343 struct gaim_connection *gc = sess->aux_data; |
2344 struct oscar_file_transfer *oft; | |
2345 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2346 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2347 reason = (fu16_t)va_arg(ap, unsigned int); |
3752 | 2348 data = va_arg(ap, char *); |
2086 | 2349 va_end(ap); |
2350 | |
3752 | 2351 /* If this was a file transfer request, data is a cookie. */ |
2352 if ((oft = find_oft_by_cookie(gc, data))) { | |
3630 | 2353 transfer_abort(oft->xfer, |
2354 (reason < msgerrreasonlen) ? msgerrreason[reason] : _("No reason was given.")); | |
2355 | |
2356 oscar_file_transfer_disconnect(sess, oft->conn); | |
2357 return 1; | |
2358 } | |
2359 | |
3752 | 2360 /* Data is assumed to be the destination sn. */ |
2361 snprintf(buf, sizeof(buf), _("Your message to %s did not get sent:"), data); | |
3427 | 2362 do_error_dialog(buf, (reason < msgerrreasonlen) ? msgerrreason[reason] : _("No reason was given."), GAIM_ERROR); |
2086 | 2363 |
2364 return 1; | |
2365 } | |
2366 | |
3595 | 2367 static int gaim_parse_mtn(aim_session_t *sess, aim_frame_t *fr, ...) { |
2368 struct gaim_connection *gc = sess->aux_data; | |
2369 va_list ap; | |
2370 fu16_t type1, type2; | |
2371 char *sn; | |
2372 | |
2373 va_start(ap, fr); | |
2374 type1 = (fu16_t)va_arg(ap, unsigned int); | |
2375 sn = va_arg(ap, char *); | |
2376 type2 = (fu16_t)va_arg(ap, unsigned int); | |
2377 va_end(ap); | |
2378 | |
2379 debug_printf("Received an mtn from %s. Type1 is 0x%04d and type2 is 0x%04d.\n", sn, type1, type2); | |
2380 | |
2381 switch (type2) { | |
2382 case 0x0000: { /* Text has been cleared */ | |
2383 serv_got_typing_stopped(gc, sn); | |
2384 } break; | |
2385 | |
2386 case 0x0001: { /* Paused typing */ | |
2387 serv_got_typing_stopped(gc, sn); | |
2388 } break; | |
2389 | |
2390 case 0x0002: { /* Typing */ | |
2391 serv_got_typing(gc, sn, 0); | |
2392 } break; | |
2393 | |
2394 default: { | |
2395 printf("Received unknown typing notification type.\n"); | |
2396 } break; | |
2397 } | |
2398 | |
2399 return 1; | |
2400 } | |
2401 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2402 static int gaim_parse_locerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2403 va_list ap; |
2404 char *destn; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2405 fu16_t reason; |
2086 | 2406 char buf[1024]; |
2407 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2408 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2409 reason = (fu16_t)va_arg(ap, unsigned int); |
2086 | 2410 destn = va_arg(ap, char *); |
2411 va_end(ap); | |
2412 | |
3574 | 2413 snprintf(buf, sizeof(buf), _("User information for %s unavailable:"), destn); |
3427 | 2414 do_error_dialog(buf, (reason < msgerrreasonlen) ? msgerrreason[reason] : _("No reason was given."), GAIM_ERROR); |
2086 | 2415 |
2416 return 1; | |
2417 } | |
2418 | |
2419 static char *images(int flags) { | |
2420 static char buf[1024]; | |
3101 | 2421 g_snprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s", |
2679 | 2422 (flags & AIM_FLAG_ACTIVEBUDDY) ? "<IMG SRC=\"ab_icon.gif\">" : "", |
2086 | 2423 (flags & AIM_FLAG_UNCONFIRMED) ? "<IMG SRC=\"dt_icon.gif\">" : "", |
2424 (flags & AIM_FLAG_AOL) ? "<IMG SRC=\"aol_icon.gif\">" : "", | |
3101 | 2425 (flags & AIM_FLAG_ICQ) ? "<IMG SRC=\"icq_icon.gif\">" : "", |
2086 | 2426 (flags & AIM_FLAG_ADMINISTRATOR) ? "<IMG SRC=\"admin_icon.gif\">" : "", |
3079 | 2427 (flags & AIM_FLAG_FREE) ? "<IMG SRC=\"free_icon.gif\">" : "", |
2428 (flags & AIM_FLAG_WIRELESS) ? "<IMG SRC=\"wireless_icon.gif\">" : ""); | |
2086 | 2429 return buf; |
2430 } | |
2431 | |
3101 | 2432 |
2920 | 2433 /* XXX This is horribly copied from ../../buddy.c. */ |
2434 static char *caps_string(guint caps) | |
2435 { | |
2436 static char buf[512], *tmp; | |
2437 int count = 0, i = 0; | |
2438 guint bit = 1; | |
2439 while (bit <= 0x10000) { | |
2440 if (bit & caps) { | |
2441 switch (bit) { | |
2442 case 0x1: | |
2443 tmp = _("Buddy Icon"); | |
2444 break; | |
2445 case 0x2: | |
2446 tmp = _("Voice"); | |
2447 break; | |
2448 case 0x4: | |
2449 tmp = _("IM Image"); | |
2450 break; | |
2451 case 0x8: | |
2452 tmp = _("Chat"); | |
2453 break; | |
2454 case 0x10: | |
2455 tmp = _("Get File"); | |
2456 break; | |
2457 case 0x20: | |
2458 tmp = _("Send File"); | |
2459 break; | |
2460 case 0x40: | |
2461 case 0x200: | |
2462 tmp = _("Games"); | |
2463 break; | |
2464 case 0x80: | |
2465 tmp = _("Stocks"); | |
2466 break; | |
2467 case 0x100: | |
2468 tmp = _("Send Buddy List"); | |
2469 break; | |
2470 case 0x400: | |
2471 tmp = _("EveryBuddy Bug"); | |
2472 break; | |
2473 case 0x800: | |
2474 tmp = _("AP User"); | |
2475 break; | |
2476 case 0x1000: | |
2477 tmp = _("ICQ RTF"); | |
2478 break; | |
2479 case 0x2000: | |
2480 tmp = _("Nihilist"); | |
2481 break; | |
2482 case 0x4000: | |
2483 tmp = _("ICQ Server Relay"); | |
2484 break; | |
2485 case 0x8000: | |
2486 tmp = _("ICQ Unknown"); | |
2487 break; | |
2488 case 0x10000: | |
2489 tmp = _("Trillian Encryption"); | |
2490 break; | |
2491 default: | |
2492 tmp = NULL; | |
2493 break; | |
2494 } | |
2495 if (tmp) | |
2496 i += g_snprintf(buf + i, sizeof(buf) - i, "%s%s", (count ? ", " : ""), | |
2497 tmp); | |
2498 count++; | |
2499 } | |
2500 bit <<= 1; | |
2501 } | |
2502 return buf; | |
2503 } | |
2504 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2505 static int gaim_parse_user_info(aim_session_t *sess, aim_frame_t *fr, ...) { |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2506 aim_userinfo_t *info; |
2086 | 2507 char *prof_enc = NULL, *prof = NULL; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2508 fu16_t infotype; |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2509 char header[BUF_LONG]; |
2137
18722ae5b882
[gaim-migrate @ 2147]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2131
diff
changeset
|
2510 char legend[BUF_LONG]; |
2086 | 2511 struct gaim_connection *gc = sess->aux_data; |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2512 struct oscar_data *od = gc->proto_data; |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2513 GSList *l = od->evilhack; |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2514 gboolean evilhack = FALSE; |
2086 | 2515 va_list ap; |
2993 | 2516 gchar *membersince = NULL, *onlinesince = NULL, *idle = NULL; |
2086 | 2517 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2518 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2519 info = va_arg(ap, aim_userinfo_t *); |
2920 | 2520 infotype = (fu16_t)va_arg(ap, unsigned int); |
2086 | 2521 prof_enc = va_arg(ap, char *); |
2522 prof = va_arg(ap, char *); | |
2523 va_end(ap); | |
2524 | |
3101 | 2525 if (!od->icq) { |
2526 g_snprintf(legend, sizeof legend, | |
2527 _("<br><BODY BGCOLOR=WHITE><hr><I>Legend:</I><br><br>" | |
2528 "<IMG SRC=\"free_icon.gif\"> : Normal AIM User<br>" | |
2529 "<IMG SRC=\"aol_icon.gif\"> : AOL User <br>" | |
2530 "<IMG SRC=\"dt_icon.gif\"> : Trial AIM User <br>" | |
2531 "<IMG SRC=\"admin_icon.gif\"> : Administrator <br>" | |
2532 "<IMG SRC=\"ab_icon.gif\"> : ActiveBuddy Interactive Agent<br>" | |
2533 "<IMG SRC=\"wireless_icon.gif\"> : Wireless Device User<br>")); | |
3106 | 2534 } else { |
2535 legend[0] = 0; | |
3101 | 2536 } |
2537 | |
2993 | 2538 if (info->present & AIM_USERINFO_PRESENT_ONLINESINCE) { |
2539 onlinesince = g_strdup_printf("Online Since : <B>%s</B><BR>\n", | |
2540 asctime(localtime(&info->onlinesince))); | |
2541 } | |
2542 | |
2543 if (info->present & AIM_USERINFO_PRESENT_MEMBERSINCE) { | |
2544 membersince = g_strdup_printf("Member Since : <B>%s</B><BR>\n", | |
2545 asctime(localtime(&info->membersince))); | |
2546 } | |
2547 | |
2548 if (info->present & AIM_USERINFO_PRESENT_IDLE) { | |
2549 idle = g_strdup_printf("Idle : <B>%d minutes</B>", | |
2550 info->idletime); | |
2551 } else | |
2552 idle = g_strdup("Idle: <B>Active</B>"); | |
2553 | |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2554 g_snprintf(header, sizeof header, |
2086 | 2555 _("Username : <B>%s</B> %s <BR>\n" |
2993 | 2556 "Warning Level : <B>%d %%</B><BR>\n" |
2086 | 2557 "%s" |
2993 | 2558 "%s" |
2559 "%s<BR>\n" | |
2560 "<HR><BR>\n"), | |
2086 | 2561 info->sn, images(info->flags), |
2562 info->warnlevel/10, | |
2993 | 2563 onlinesince ? onlinesince : "", |
2564 membersince ? membersince : "", | |
2565 idle ? idle : ""); | |
2566 | |
2567 g_free(onlinesince); | |
2568 g_free(membersince); | |
2569 g_free(idle); | |
2773
a0fd8f91e294
[gaim-migrate @ 2786]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2768
diff
changeset
|
2570 |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2571 while (l) { |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2572 char *x = l->data; |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2573 if (!strcmp(x, normalize(info->sn))) { |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2574 evilhack = TRUE; |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2575 g_free(x); |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2576 od->evilhack = g_slist_remove(od->evilhack, x); |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2577 break; |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2578 } |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2579 l = l->next; |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2580 } |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2581 |
2920 | 2582 if (infotype == AIM_GETINFO_AWAYMESSAGE) { |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2583 if (evilhack) { |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2584 g_show_info_text(gc, info->sn, 2, |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2585 header, |
2797
ccb5b2f05d16
[gaim-migrate @ 2810]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
2586 (prof && *prof) ? away_subs(prof, gc->username) : |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2587 _("<i>User has no away message</i>"), |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2588 legend, NULL); |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2589 } else { |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2590 g_show_info_text(gc, info->sn, 0, |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2591 header, |
2797
ccb5b2f05d16
[gaim-migrate @ 2810]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
2592 (prof && *prof) ? away_subs(prof, gc->username) : NULL, |
2799
72357bddb0f3
[gaim-migrate @ 2812]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2797
diff
changeset
|
2593 (prof && *prof) ? "<BR><HR><BR>" : NULL, |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2594 NULL); |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2595 } |
2920 | 2596 } else if (infotype == AIM_GETINFO_CAPABILITIES) { |
2597 g_show_info_text(gc, info->sn, 2, | |
2598 header, | |
2599 "<i>", _("Client Capabilities: "), | |
2600 caps_string(info->capabilities), | |
2601 "</i>", | |
2602 legend, | |
2603 NULL); | |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2604 } else { |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2605 g_show_info_text(gc, info->sn, 1, |
2797
ccb5b2f05d16
[gaim-migrate @ 2810]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
2606 (prof && *prof) ? away_subs(prof, gc->username) : |
ccb5b2f05d16
[gaim-migrate @ 2810]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
2607 _("<i>No Information Provided</i>"), |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2608 legend, |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2609 NULL); |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2610 } |
2086 | 2611 |
2612 return 1; | |
2613 } | |
2614 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2615 static int gaim_parse_motd(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2616 char *msg; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2617 fu16_t id; |
2086 | 2618 va_list ap; |
2619 char buildbuf[150]; | |
2620 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2621 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2622 id = (fu16_t)va_arg(ap, unsigned int); |
2086 | 2623 msg = va_arg(ap, char *); |
2624 va_end(ap); | |
2625 | |
2626 aim_getbuildstring(buildbuf, sizeof(buildbuf)); | |
2627 | |
2628 debug_printf("MOTD: %s (%d)\n", msg ? msg : "Unknown", id); | |
2092
59b0377d18aa
[gaim-migrate @ 2102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
2629 if (id < 4) |
3427 | 2630 do_error_dialog(_("Your AIM connection may be lost."), NULL, GAIM_WARNING); |
2086 | 2631 |
2632 return 1; | |
2633 } | |
2634 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2635 static int gaim_chatnav_info(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2636 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2637 fu16_t type; |
2086 | 2638 struct gaim_connection *gc = sess->aux_data; |
2639 struct oscar_data *odata = (struct oscar_data *)gc->proto_data; | |
2640 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2641 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2642 type = (fu16_t)va_arg(ap, unsigned int); |
2086 | 2643 |
2644 switch(type) { | |
2645 case 0x0002: { | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2646 fu8_t maxrooms; |
2086 | 2647 struct aim_chat_exchangeinfo *exchanges; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2648 int exchangecount, i; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2649 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2650 maxrooms = (fu8_t)va_arg(ap, unsigned int); |
2086 | 2651 exchangecount = va_arg(ap, int); |
2652 exchanges = va_arg(ap, struct aim_chat_exchangeinfo *); | |
2653 va_end(ap); | |
2654 | |
2655 debug_printf("chat info: Chat Rights:\n"); | |
2656 debug_printf("chat info: \tMax Concurrent Rooms: %d\n", maxrooms); | |
2657 debug_printf("chat info: \tExchange List: (%d total)\n", exchangecount); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2658 for (i = 0; i < exchangecount; i++) |
2931 | 2659 debug_printf("chat info: \t\t%d %s\n", exchanges[i].number, exchanges[i].name ? exchanges[i].name : ""); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
2660 while (odata->create_rooms) { |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
2661 struct create_room *cr = odata->create_rooms->data; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
2662 debug_printf("creating room %s\n", cr->name); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
2663 aim_chatnav_createroom(sess, fr->conn, cr->name, cr->exchange); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
2664 g_free(cr->name); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
2665 odata->create_rooms = g_slist_remove(odata->create_rooms, cr); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
2666 g_free(cr); |
2086 | 2667 } |
2668 } | |
2669 break; | |
2670 case 0x0008: { | |
2671 char *fqcn, *name, *ck; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2672 fu16_t instance, flags, maxmsglen, maxoccupancy, unknown, exchange; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2673 fu8_t createperms; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2674 fu32_t createtime; |
2086 | 2675 |
2676 fqcn = va_arg(ap, char *); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2677 instance = (fu16_t)va_arg(ap, unsigned int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2678 exchange = (fu16_t)va_arg(ap, unsigned int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2679 flags = (fu16_t)va_arg(ap, unsigned int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2680 createtime = va_arg(ap, fu32_t); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2681 maxmsglen = (fu16_t)va_arg(ap, unsigned int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2682 maxoccupancy = (fu16_t)va_arg(ap, unsigned int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2683 createperms = (fu8_t)va_arg(ap, int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2684 unknown = (fu16_t)va_arg(ap, unsigned int); |
2086 | 2685 name = va_arg(ap, char *); |
2686 ck = va_arg(ap, char *); | |
2687 va_end(ap); | |
2688 | |
2689 debug_printf("created room: %s %d %d %d %lu %d %d %d %d %s %s\n", | |
2690 fqcn, | |
2691 exchange, instance, flags, | |
2692 createtime, | |
2693 maxmsglen, maxoccupancy, createperms, unknown, | |
2694 name, ck); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2695 aim_chat_join(odata->sess, odata->conn, exchange, ck, instance); |
2086 | 2696 } |
2697 break; | |
2698 default: | |
2699 va_end(ap); | |
2700 debug_printf("chatnav info: unknown type (%04x)\n", type); | |
2701 break; | |
2702 } | |
2703 return 1; | |
2704 } | |
2705 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2706 static int gaim_chat_join(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2707 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2708 int count, i; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2709 aim_userinfo_t *info; |
2086 | 2710 struct gaim_connection *g = sess->aux_data; |
2711 | |
2712 struct chat_connection *c = NULL; | |
2713 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2714 va_start(ap, fr); |
2086 | 2715 count = va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2716 info = va_arg(ap, aim_userinfo_t *); |
2086 | 2717 va_end(ap); |
2718 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2719 c = find_oscar_chat_by_conn(g, fr->conn); |
2086 | 2720 if (!c) |
2721 return 1; | |
2722 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2723 for (i = 0; i < count; i++) |
3708 | 2724 add_chat_buddy(c->cnv, info[i].sn, NULL); |
2086 | 2725 |
2726 return 1; | |
2727 } | |
2728 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2729 static int gaim_chat_leave(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2730 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2731 int count, i; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2732 aim_userinfo_t *info; |
2086 | 2733 struct gaim_connection *g = sess->aux_data; |
2734 | |
2735 struct chat_connection *c = NULL; | |
2736 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2737 va_start(ap, fr); |
2086 | 2738 count = va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2739 info = va_arg(ap, aim_userinfo_t *); |
2086 | 2740 va_end(ap); |
2741 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2742 c = find_oscar_chat_by_conn(g, fr->conn); |
2086 | 2743 if (!c) |
2744 return 1; | |
2745 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2746 for (i = 0; i < count; i++) |
2820
b917845dad3c
[gaim-migrate @ 2833]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2817
diff
changeset
|
2747 remove_chat_buddy(c->cnv, info[i].sn, NULL); |
2086 | 2748 |
2749 return 1; | |
2750 } | |
2751 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2752 static int gaim_chat_info_update(aim_session_t *sess, aim_frame_t *fr, ...) { |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2753 va_list ap; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2754 aim_userinfo_t *userinfo; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2755 struct aim_chat_roominfo *roominfo; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2756 char *roomname; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2757 int usercount; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2758 char *roomdesc; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2759 fu16_t unknown_c9, unknown_d2, unknown_d5, maxmsglen, maxvisiblemsglen; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2760 fu32_t creationtime; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2761 struct gaim_connection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2762 struct chat_connection *ccon = find_oscar_chat_by_conn(gc, fr->conn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2763 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2764 va_start(ap, fr); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2765 roominfo = va_arg(ap, struct aim_chat_roominfo *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2766 roomname = va_arg(ap, char *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2767 usercount= va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2768 userinfo = va_arg(ap, aim_userinfo_t *); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2769 roomdesc = va_arg(ap, char *); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2770 unknown_c9 = (fu16_t)va_arg(ap, int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2771 creationtime = (fu32_t)va_arg(ap, unsigned long); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2772 maxmsglen = (fu16_t)va_arg(ap, int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2773 unknown_d2 = (fu16_t)va_arg(ap, int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2774 unknown_d5 = (fu16_t)va_arg(ap, int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2775 maxvisiblemsglen = (fu16_t)va_arg(ap, int); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2776 va_end(ap); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2777 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2778 debug_printf("inside chat_info_update (maxmsglen = %d, maxvislen = %d)\n", |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2779 maxmsglen, maxvisiblemsglen); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2780 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2781 ccon->maxlen = maxmsglen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2782 ccon->maxvis = maxvisiblemsglen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2783 |
2086 | 2784 return 1; |
2785 } | |
2786 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2787 static int gaim_chat_incoming_msg(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2788 va_list ap; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2789 aim_userinfo_t *info; |
2086 | 2790 char *msg; |
2791 struct gaim_connection *gc = sess->aux_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2792 struct chat_connection *ccon = find_oscar_chat_by_conn(gc, fr->conn); |
2086 | 2793 char *tmp; |
2794 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2795 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2796 info = va_arg(ap, aim_userinfo_t *); |
2086 | 2797 msg = va_arg(ap, char *); |
2798 | |
2799 tmp = g_malloc(BUF_LONG); | |
2800 g_snprintf(tmp, BUF_LONG, "%s", msg); | |
2801 serv_got_chat_in(gc, ccon->id, info->sn, 0, tmp, time((time_t)NULL)); | |
2802 g_free(tmp); | |
2803 | |
2804 return 1; | |
2805 } | |
2806 | |
3694 | 2807 static int gaim_email_parseupdate(aim_session_t *sess, aim_frame_t *fr, ...) { |
2808 va_list ap; | |
2809 struct gaim_connection *gc = sess->aux_data; | |
2810 struct aim_emailinfo *emailinfo; | |
3725 | 2811 int havenewmail; |
3694 | 2812 |
2813 va_start(ap, fr); | |
2814 emailinfo = va_arg(ap, struct aim_emailinfo *); | |
3725 | 2815 havenewmail = va_arg(ap, int); |
3694 | 2816 va_end(ap); |
2817 | |
3725 | 2818 if (emailinfo) { |
2819 debug_printf("Got email info. webmail address for screenname@%s is %s, new email: %hd, number new: %d, flag is %d, havenewmail is %d\n", emailinfo->domain, emailinfo->url, emailinfo->unread, emailinfo->nummsgs, emailinfo->flag, havenewmail); | |
2820 if (emailinfo->unread) { | |
2821 if (havenewmail) | |
2822 connection_has_mail(gc, emailinfo->nummsgs ? emailinfo->nummsgs : -1, NULL, NULL, emailinfo->url); | |
2823 } else | |
3694 | 2824 connection_has_mail(gc, 0, NULL, NULL, emailinfo->url); |
2825 } | |
2826 | |
2827 return 1; | |
2828 } | |
2829 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2830 /* |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2831 * Recieved in response to an IM sent with the AIM_IMFLAGS_ACK option. |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2832 */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2833 static int gaim_parse_msgack(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2834 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2835 fu16_t type; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2836 char *sn; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2837 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2838 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2839 type = (fu16_t)va_arg(ap, unsigned int); |
2086 | 2840 sn = va_arg(ap, char *); |
2841 va_end(ap); | |
2842 | |
2843 debug_printf("Sent message to %s.\n", sn); | |
2844 | |
2845 return 1; | |
2846 } | |
2847 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2848 static int gaim_parse_ratechange(aim_session_t *sess, aim_frame_t *fr, ...) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2849 static const char *codes[5] = { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2850 "invalid", |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2851 "change", |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2852 "warning", |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2853 "limit", |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2854 "limit cleared", |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2855 }; |
2086 | 2856 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2857 fu16_t code, rateclass; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2858 fu32_t windowsize, clear, alert, limit, disconnect, currentavg, maxavg; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2859 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2860 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2861 code = (fu16_t)va_arg(ap, unsigned int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2862 rateclass= (fu16_t)va_arg(ap, unsigned int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2863 windowsize = (fu32_t)va_arg(ap, unsigned long); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2864 clear = (fu32_t)va_arg(ap, unsigned long); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2865 alert = (fu32_t)va_arg(ap, unsigned long); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2866 limit = (fu32_t)va_arg(ap, unsigned long); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2867 disconnect = (fu32_t)va_arg(ap, unsigned long); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2868 currentavg = (fu32_t)va_arg(ap, unsigned long); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2869 maxavg = (fu32_t)va_arg(ap, unsigned long); |
2086 | 2870 va_end(ap); |
2871 | |
2872 debug_printf("rate %s (paramid 0x%04lx): curavg = %ld, maxavg = %ld, alert at %ld, " | |
2873 "clear warning at %ld, limit at %ld, disconnect at %ld (window size = %ld)\n", | |
2874 (code < 5) ? codes[code] : codes[0], | |
2875 rateclass, | |
2876 currentavg, maxavg, | |
2877 alert, clear, | |
2878 limit, disconnect, | |
2879 windowsize); | |
2880 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2881 /* XXX fix these values */ |
2086 | 2882 if (code == AIM_RATE_CODE_CHANGE) { |
2883 if (currentavg >= clear) | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2884 aim_conn_setlatency(fr->conn, 0); |
2086 | 2885 } else if (code == AIM_RATE_CODE_WARNING) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2886 aim_conn_setlatency(fr->conn, windowsize/4); |
2909
48ec70928d7f
[gaim-migrate @ 2922]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2906
diff
changeset
|
2887 } else if (code == AIM_RATE_CODE_LIMIT) { |
3427 | 2888 do_error_dialog(_("Rate limiting error."), |
2889 _("The last message was not sent because you are over the rate limit. " | |
2890 "Please wait 10 seconds and try again."), GAIM_ERROR); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2891 aim_conn_setlatency(fr->conn, windowsize/2); |
2086 | 2892 } else if (code == AIM_RATE_CODE_CLEARLIMIT) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2893 aim_conn_setlatency(fr->conn, 0); |
2086 | 2894 } |
2895 | |
2896 return 1; | |
2897 } | |
2898 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2899 static int gaim_parse_evilnotify(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2900 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2901 fu16_t newevil; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2902 aim_userinfo_t *userinfo; |
2086 | 2903 struct gaim_connection *gc = sess->aux_data; |
2904 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2905 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2906 newevil = (fu16_t)va_arg(ap, unsigned int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2907 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 2908 va_end(ap); |
2909 | |
2910 serv_got_eviled(gc, (userinfo && userinfo->sn[0]) ? userinfo->sn : NULL, newevil / 10); | |
2911 | |
2912 return 1; | |
2913 } | |
2914 | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2915 static int gaim_selfinfo(aim_session_t *sess, aim_frame_t *fr, ...) { |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2916 va_list ap; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2917 aim_userinfo_t *info; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2918 struct gaim_connection *gc = sess->aux_data; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2919 |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2920 va_start(ap, fr); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2921 info = va_arg(ap, aim_userinfo_t *); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2922 va_end(ap); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2923 |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2924 gc->evil = info->warnlevel/10; |
2698
e80f4b4f840f
[gaim-migrate @ 2711]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2689
diff
changeset
|
2925 /* gc->correction_time = (info->onlinesince - gc->login_time); */ |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2926 |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2927 return 1; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2928 } |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2929 |
2675 | 2930 static int conninitdone_bos(aim_session_t *sess, aim_frame_t *fr, ...) { |
3458 | 2931 struct gaim_connection *gc = sess->aux_data; |
2932 struct oscar_data *od = gc->proto_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2933 |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
2934 aim_reqpersonalinfo(sess, fr->conn); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2935 aim_bos_reqlocaterights(sess, fr->conn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2936 aim_bos_reqbuddyrights(sess, fr->conn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2937 |
2673
81d658e6ac1e
[gaim-migrate @ 2686]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2672
diff
changeset
|
2938 aim_reqicbmparams(sess); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2939 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2940 aim_bos_reqrights(sess, fr->conn); |
3458 | 2941 if (od->icq) { |
2942 aim_bos_setgroupperm(sess, fr->conn, AIM_FLAG_ALLUSERS); | |
2943 aim_bos_setprivacyflags(sess, fr->conn, AIM_PRIVFLAGS_ALLOWIDLE | | |
2944 AIM_PRIVFLAGS_ALLOWMEMBERSINCE); | |
2945 } | |
2086 | 2946 |
2947 return 1; | |
2948 } | |
2949 | |
2675 | 2950 static int conninitdone_admin(aim_session_t *sess, aim_frame_t *fr, ...) { |
2647 | 2951 struct gaim_connection *gc = sess->aux_data; |
2952 struct oscar_data *od = gc->proto_data; | |
2953 | |
2672 | 2954 aim_clientready(sess, fr->conn); |
2675 | 2955 debug_printf("connected to admin\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2956 |
2647 | 2957 if (od->chpass) { |
2958 debug_printf("changing password\n"); | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
2959 aim_admin_changepasswd(sess, fr->conn, od->newp, od->oldp); |
2647 | 2960 g_free(od->oldp); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
2961 od->oldp = NULL; |
2647 | 2962 g_free(od->newp); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
2963 od->newp = NULL; |
2647 | 2964 od->chpass = FALSE; |
2965 } | |
2979 | 2966 if (od->setnick) { |
2967 debug_printf("formatting screenname\n"); | |
2968 aim_admin_setnick(sess, fr->conn, od->newsn); | |
2969 g_free(od->newsn); | |
2970 od->newsn = NULL; | |
2971 od->setnick = FALSE; | |
2972 } | |
2647 | 2973 if (od->conf) { |
2974 debug_printf("confirming account\n"); | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
2975 aim_admin_reqconfirm(sess, fr->conn); |
2647 | 2976 od->conf = FALSE; |
2977 } | |
2978 if (od->reqemail) { | |
2979 debug_printf("requesting email\n"); | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
2980 aim_admin_getinfo(sess, fr->conn, 0x0011); |
2647 | 2981 od->reqemail = FALSE; |
2982 } | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
2983 if (od->setemail) { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
2984 debug_printf("setting email\n"); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
2985 aim_admin_setemail(sess, fr->conn, od->email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
2986 g_free(od->email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
2987 od->setemail = FALSE; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
2988 } |
2647 | 2989 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2990 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2991 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2992 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2993 static int gaim_icbm_param_info(aim_session_t *sess, aim_frame_t *fr, ...) { |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2994 struct aim_icbmparameters *params; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2995 va_list ap; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2996 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2997 va_start(ap, fr); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2998 params = va_arg(ap, struct aim_icbmparameters *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2999 va_end(ap); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3000 |
2427
5bc3b39fc0a5
[gaim-migrate @ 2440]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2421
diff
changeset
|
3001 /* evidently this crashes on solaris. i have no clue why |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3002 debug_printf("ICBM Parameters: maxchannel = %d, default flags = 0x%08lx, max msg len = %d, " |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3003 "max sender evil = %f, max receiver evil = %f, min msg interval = %ld\n", |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3004 params->maxchan, params->flags, params->maxmsglen, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3005 ((float)params->maxsenderwarn)/10.0, ((float)params->maxrecverwarn)/10.0, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3006 params->minmsginterval); |
2427
5bc3b39fc0a5
[gaim-migrate @ 2440]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2421
diff
changeset
|
3007 */ |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3008 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3009 /* Maybe senderwarn and recverwarn should be user preferences... */ |
3595 | 3010 params->flags = 0x0000000b; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3011 params->maxmsglen = 8000; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3012 params->minmsginterval = 0; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3013 |
2673
81d658e6ac1e
[gaim-migrate @ 2686]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2672
diff
changeset
|
3014 aim_seticbmparam(sess, params); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3015 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3016 return 1; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3017 } |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3018 |
2993 | 3019 static int gaim_parse_locaterights(aim_session_t *sess, aim_frame_t *fr, ...) |
3020 { | |
3021 va_list ap; | |
3022 fu16_t maxsiglen; | |
3023 struct gaim_connection *gc = sess->aux_data; | |
3024 struct oscar_data *odata = (struct oscar_data *)gc->proto_data; | |
3025 | |
3026 va_start(ap, fr); | |
3027 maxsiglen = va_arg(ap, int); | |
3028 va_end(ap); | |
3029 | |
3030 debug_printf("locate rights: max sig len = %d\n", maxsiglen); | |
3031 | |
3032 odata->rights.maxsiglen = odata->rights.maxawaymsglen = (guint)maxsiglen; | |
3033 | |
3458 | 3034 if (odata->icq) |
3035 aim_bos_setprofile(sess, fr->conn, NULL, NULL, caps_icq); | |
3036 else | |
3037 aim_bos_setprofile(sess, fr->conn, gc->user->user_info, NULL, caps_aim); | |
2993 | 3038 |
3039 return 1; | |
3040 } | |
3041 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3042 static int gaim_parse_buddyrights(aim_session_t *sess, aim_frame_t *fr, ...) { |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3043 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3044 fu16_t maxbuddies, maxwatchers; |
2993 | 3045 struct gaim_connection *gc = sess->aux_data; |
3046 struct oscar_data *odata = (struct oscar_data *)gc->proto_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3047 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3048 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3049 maxbuddies = (fu16_t)va_arg(ap, unsigned int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3050 maxwatchers = (fu16_t)va_arg(ap, unsigned int); |
2086 | 3051 va_end(ap); |
3052 | |
3053 debug_printf("buddy list rights: Max buddies = %d / Max watchers = %d\n", maxbuddies, maxwatchers); | |
3054 | |
2993 | 3055 odata->rights.maxbuddies = (guint)maxbuddies; |
3056 odata->rights.maxwatchers = (guint)maxwatchers; | |
3057 | |
2086 | 3058 return 1; |
3059 } | |
3060 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3061 static int gaim_bosrights(aim_session_t *sess, aim_frame_t *fr, ...) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3062 fu16_t maxpermits, maxdenies; |
2086 | 3063 va_list ap; |
2993 | 3064 struct gaim_connection *gc = sess->aux_data; |
3065 struct oscar_data *odata = (struct oscar_data *)gc->proto_data; | |
2086 | 3066 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3067 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3068 maxpermits = (fu16_t)va_arg(ap, unsigned int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3069 maxdenies = (fu16_t)va_arg(ap, unsigned int); |
2086 | 3070 va_end(ap); |
3071 | |
3072 debug_printf("BOS rights: Max permit = %d / Max deny = %d\n", maxpermits, maxdenies); | |
3073 | |
2993 | 3074 odata->rights.maxpermits = (guint)maxpermits; |
3075 odata->rights.maxdenies = (guint)maxdenies; | |
3076 | |
3077 account_online(gc); | |
3078 serv_finish_login(gc); | |
3079 | |
3080 if (bud_list_cache_exists(gc)) | |
3081 do_import(gc, NULL); | |
3082 | |
3083 debug_printf("buddy list loaded\n"); | |
3084 | |
2672 | 3085 aim_clientready(sess, fr->conn); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3086 |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3087 aim_icq_reqofflinemsgs(sess); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3088 |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3089 aim_reqservice(sess, fr->conn, AIM_CONN_TYPE_CHATNAV); |
3694 | 3090 aim_reqservice(sess, fr->conn, AIM_CONN_TYPE_EMAIL); |
2086 | 3091 |
3109 | 3092 if (!odata->icq) { |
3093 debug_printf("ssi: requesting ssi list\n"); | |
3092 | 3094 aim_ssi_reqrights(sess, fr->conn); |
3109 | 3095 aim_ssi_reqdata(sess, fr->conn, sess->ssi.timestamp, sess->ssi.revision); |
3096 } | |
2991 | 3097 |
2086 | 3098 return 1; |
3099 } | |
3100 | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3101 static int gaim_offlinemsg(aim_session_t *sess, aim_frame_t *fr, ...) { |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3102 va_list ap; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3103 struct aim_icq_offlinemsg *msg; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3104 struct gaim_connection *gc = sess->aux_data; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3105 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3106 va_start(ap, fr); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3107 msg = va_arg(ap, struct aim_icq_offlinemsg *); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3108 va_end(ap); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3109 |
3141 | 3110 debug_printf("Received offline message of type 0x%04x\n", msg->type); |
3111 | |
3112 switch (msg->type) { | |
3113 case 0x0001: { /* Basic offline message */ | |
3114 char sender[32]; | |
3115 char *dialog_msg = g_strdup(msg->msg); | |
3116 time_t t = get_time(msg->year, msg->month, msg->day, msg->hour, msg->minute, 0); | |
3117 g_snprintf(sender, sizeof(sender), "%lu", msg->sender); | |
3118 strip_linefeed(dialog_msg); | |
3119 serv_got_im(gc, sender, dialog_msg, 0, t, -1); | |
3120 g_free(dialog_msg); | |
3121 } break; | |
3122 | |
3123 case 0x0006: { /* Authorization request */ | |
3124 gaim_icq_authask(gc, msg->sender, msg->msg); | |
3125 } break; | |
3126 | |
3127 case 0x0007: { /* Someone has denied you authorization */ | |
3128 char *dialog_msg; | |
3159 | 3129 dialog_msg = g_strdup_printf(_("The user %lu has denied your request to add them to your contact list for the following reason:\n%s"), msg->sender, msg->msg ? msg->msg : _("No reason given.")); |
3427 | 3130 do_error_dialog(_("ICQ Authorization denied"), dialog_msg, GAIM_ERROR); |
3141 | 3131 g_free(dialog_msg); |
3132 } break; | |
3133 | |
3134 case 0x0008: { /* Someone has granted you authorization */ | |
3135 char *dialog_msg; | |
3159 | 3136 dialog_msg = g_strdup_printf(_("The user %lu has granted your request to add them to your contact list."), msg->sender); |
3427 | 3137 do_error_dialog(_("ICQ Authorization Granted"), dialog_msg, GAIM_INFO); |
3141 | 3138 g_free(dialog_msg); |
3139 } break; | |
3140 | |
3141 case 0x0012: { | |
3142 /* Ack for authorizing/denying someone. Or possibly an ack for sending any system notice */ | |
3143 } break; | |
3144 | |
3145 default: { | |
3146 debug_printf("unknown offline message type 0x%04x\n", msg->type); | |
3147 } | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3148 } |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3149 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3150 return 1; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3151 } |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3152 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3153 static int gaim_offlinemsgdone(aim_session_t *sess, aim_frame_t *fr, ...) |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3154 { |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3155 aim_icq_ackofflinemsgs(sess); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3156 return 1; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3157 } |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3158 |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3159 static int gaim_simpleinfo(aim_session_t *sess, aim_frame_t *fr, ...) |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3160 { |
2773
a0fd8f91e294
[gaim-migrate @ 2786]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2768
diff
changeset
|
3161 struct gaim_connection *gc = sess->aux_data; |
3212 | 3162 struct buddy *budlight; |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3163 va_list ap; |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3164 struct aim_icq_simpleinfo *info; |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3165 char buf[16 * 1024]; |
2773
a0fd8f91e294
[gaim-migrate @ 2786]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2768
diff
changeset
|
3166 char who[16]; |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3167 |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3168 va_start(ap, fr); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3169 info = va_arg(ap, struct aim_icq_simpleinfo *); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3170 va_end(ap); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3171 |
2773
a0fd8f91e294
[gaim-migrate @ 2786]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2768
diff
changeset
|
3172 g_snprintf(who, sizeof who, "%lu", info->uin); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3173 g_snprintf(buf, sizeof buf, |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3174 "<B>UIN:</B> %lu<BR>" |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3175 "<B>Nick:</B> %s<BR>" |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3176 "<B>Name:</B> %s %s<BR>" |
3212 | 3177 "<B>Email:</B> %s<BR>\n", |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3178 info->uin, |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3179 info->nick, |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3180 info->first, info->last, |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3181 info->email); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3182 |
3212 | 3183 /* If the contact is away, then we also want to get their status message |
3184 * and show it in the same window as info. g_show_info_text gets the status | |
3185 * message if the third arg is 0 (this seems really gross to me). The | |
3186 * parse-icq-status-message function knows if it is putting it's message in | |
3187 * an info window because the name will _not_ be in od->evilhack. For getting | |
3188 * only the away message the contact's UIN is put in od->evilhack. */ | |
3279 | 3189 if ((budlight = find_buddy(gc, who))) { |
3595 | 3190 if ((budlight->uc >> 16) & (AIM_ICQ_STATE_AWAY || AIM_ICQ_STATE_DND || AIM_ICQ_STATE_OUT || AIM_ICQ_STATE_BUSY || AIM_ICQ_STATE_CHAT)) { |
3270 | 3191 if (budlight->caps & AIM_CAPS_ICQSERVERRELAY) |
3192 g_show_info_text(gc, who, 0, buf, NULL); | |
3193 else { | |
3595 | 3194 char *state_msg = gaim_icq_status((budlight->uc & 0xffff0000) >> 16); |
3270 | 3195 g_show_info_text(gc, who, 2, buf, "<B>Status:</B> ", state_msg, "<BR>\n<HR><BR><I>Remote client does not support sending status messages.</I><BR>\n", NULL); |
3196 free(state_msg); | |
3197 } | |
3198 } else { | |
3595 | 3199 char *state_msg = gaim_icq_status((budlight->uc & 0xffff0000) >> 16); |
3270 | 3200 g_show_info_text(gc, who, 2, buf, "<B>Status:</B> ", state_msg, NULL); |
3212 | 3201 free(state_msg); |
3202 } | |
3270 | 3203 } else |
3204 g_show_info_text(gc, who, 2, buf, NULL); | |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3205 |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3206 return 1; |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3207 } |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3208 |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3209 static int gaim_popup(aim_session_t *sess, aim_frame_t *fr, ...) |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3210 { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3211 char *msg, *url; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3212 fu16_t wid, hei, delay; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3213 va_list ap; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3214 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3215 va_start(ap, fr); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3216 msg = va_arg(ap, char *); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3217 url = va_arg(ap, char *); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3218 wid = (fu16_t)va_arg(ap, int); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3219 hei = (fu16_t)va_arg(ap, int); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3220 delay = (fu16_t)va_arg(ap, int); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3221 va_end(ap); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3222 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3223 serv_got_popup(msg, url, wid, hei); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3224 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3225 return 1; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3226 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3227 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3228 static int gaim_parse_searchreply(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3229 va_list ap; |
3230 char *address, *SNs; | |
3231 int i, num; | |
3232 char *buf; | |
3233 int at = 0, len; | |
3234 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3235 va_start(ap, fr); |
2086 | 3236 address = va_arg(ap, char *); |
3237 num = va_arg(ap, int); | |
3238 SNs = va_arg(ap, char *); | |
3239 va_end(ap); | |
3240 | |
3241 len = num * (MAXSNLEN + 1) + 1024; | |
3242 buf = g_malloc(len); | |
3243 at += g_snprintf(buf + at, len - at, "<B>%s has the following screen names:</B><BR>", address); | |
3244 for (i = 0; i < num; i++) | |
3245 at += g_snprintf(buf + at, len - at, "%s<BR>", &SNs[i * (MAXSNLEN + 1)]); | |
3212 | 3246 g_show_info_text(NULL, NULL, 2, buf, NULL); |
2086 | 3247 g_free(buf); |
3248 | |
3249 return 1; | |
3250 } | |
3251 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3252 static int gaim_parse_searcherror(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3253 va_list ap; |
3254 char *address; | |
3255 char buf[BUF_LONG]; | |
3256 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3257 va_start(ap, fr); |
2086 | 3258 address = va_arg(ap, char *); |
3259 va_end(ap); | |
3260 | |
3261 g_snprintf(buf, sizeof(buf), "No results found for email address %s", address); | |
3427 | 3262 do_error_dialog(buf, NULL, GAIM_ERROR); |
2086 | 3263 |
3264 return 1; | |
3265 } | |
3266 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3267 static int gaim_account_confirm(aim_session_t *sess, aim_frame_t *fr, ...) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3268 fu16_t status; |
2086 | 3269 va_list ap; |
3270 char msg[256]; | |
3271 struct gaim_connection *gc = sess->aux_data; | |
3272 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3273 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3274 status = (fu16_t)va_arg(ap, unsigned int); /* status code of confirmation request */ |
2086 | 3275 va_end(ap); |
3276 | |
3277 debug_printf("account confirmation returned status 0x%04x (%s)\n", status, | |
3278 status ? "email sent" : "unknown"); | |
3279 if (status) { | |
3280 g_snprintf(msg, sizeof(msg), "You should receive an email asking to confirm %s.", | |
3281 gc->username); | |
3427 | 3282 do_error_dialog("Account confirmation requested.", msg, GAIM_INFO); |
2086 | 3283 } |
3284 | |
3285 return 1; | |
3286 } | |
3287 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3288 static int gaim_info_change(aim_session_t *sess, aim_frame_t *fr, ...) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3289 int change, str; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3290 fu16_t perms, type, length; |
2086 | 3291 char *val; |
3292 va_list ap; | |
3293 char buf[BUF_LONG]; | |
3294 struct gaim_connection *gc = sess->aux_data; | |
3295 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3296 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3297 change = va_arg(ap, int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3298 perms = (fu16_t)va_arg(ap, unsigned int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3299 type = (fu16_t)va_arg(ap, unsigned int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3300 length = (fu16_t)va_arg(ap, unsigned int); |
2086 | 3301 val = va_arg(ap, char *); |
3302 str = va_arg(ap, int); | |
3303 va_end(ap); | |
3304 | |
3305 debug_printf("info%s: perms = %d, type = %x, length = %d, val = %s\n", | |
3306 change ? " change" : "", perms, type, length, str ? val : "(not string)"); | |
3307 | |
3186 | 3308 /* XXX Do something for other types too. */ |
3309 if ((type == 0x0011) && str && length) { | |
2086 | 3310 g_snprintf(buf, sizeof(buf), "The email address for %s is %s", gc->username, val); |
3427 | 3311 do_error_dialog(buf, NULL, GAIM_INFO); |
2086 | 3312 } |
3313 | |
3314 return 1; | |
3315 } | |
3316 | |
3317 static void oscar_keepalive(struct gaim_connection *gc) { | |
3318 struct oscar_data *odata = (struct oscar_data *)gc->proto_data; | |
3319 aim_flap_nop(odata->sess, odata->conn); | |
3320 } | |
3321 | |
3001 | 3322 static int oscar_send_typing(struct gaim_connection *gc, char *name, int typing) { |
2993 | 3323 struct oscar_data *odata = (struct oscar_data *)gc->proto_data; |
3324 struct direct_im *dim = find_direct_im(odata, name); | |
3595 | 3325 if (dim) |
3326 aim_send_typing(odata->sess, dim->conn, typing); | |
3327 else { | |
3600 | 3328 char *who = normalize(name); |
3329 if (g_hash_table_lookup(odata->supports_tn, who)) { | |
3596 | 3330 if (typing == TYPING) |
3595 | 3331 aim_mtn_send(odata->sess, 0x0001, name, 0x0002); |
3596 | 3332 else if (typing == TYPED) |
3333 aim_mtn_send(odata->sess, 0x0001, name, 0x0001); | |
3595 | 3334 else |
3335 aim_mtn_send(odata->sess, 0x0001, name, 0x0000); | |
3336 } | |
3337 } | |
2993 | 3338 return 0; |
3339 } | |
3048 | 3340 static void oscar_ask_direct_im(struct gaim_connection *gc, char *name); |
2993 | 3341 |
3033 | 3342 static int oscar_send_im(struct gaim_connection *gc, char *name, char *message, int len, int imflags) { |
2086 | 3343 struct oscar_data *odata = (struct oscar_data *)gc->proto_data; |
3344 struct direct_im *dim = find_direct_im(odata, name); | |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
3345 int ret = 0; |
3659 | 3346 GError *err = NULL; |
3458 | 3347 |
2086 | 3348 if (dim) { |
3009 | 3349 if (dim->connected) { /* If we're not connected yet, send through server */ |
3034 | 3350 ret = aim_send_im_direct(odata->sess, dim->conn, message, len == -1 ? strlen(message) : len); |
3009 | 3351 if (ret == 0) |
3352 return 1; | |
3353 else return ret; | |
3354 } | |
3008 | 3355 debug_printf("Direct IM pending, but not connected; sending through server\n"); |
3044 | 3356 } else if (len != -1) { |
3357 /* Trying to send an IM image outside of a direct connection. */ | |
3358 oscar_ask_direct_im(gc, name); | |
3359 return -ENOTCONN; | |
3360 } | |
3008 | 3361 if (imflags & IM_FLAG_AWAY) { |
3362 ret = aim_send_im(odata->sess, name, AIM_IMFLAGS_AWAY, message); | |
2086 | 3363 } else { |
3008 | 3364 struct aim_sendimext_args args; |
3365 GSList *h = odata->hasicons; | |
3366 struct icon_req *ir = NULL; | |
3367 char *who = normalize(name); | |
3368 struct stat st; | |
3642 | 3369 int i, len; |
3008 | 3370 |
3371 args.flags = AIM_IMFLAGS_ACK | AIM_IMFLAGS_CUSTOMFEATURES; | |
3372 if (odata->icq) | |
3373 args.flags |= AIM_IMFLAGS_OFFLINE; | |
3374 | |
3375 args.features = gaim_features; | |
3376 args.featureslen = sizeof(gaim_features); | |
3377 | |
3378 while (h) { | |
3379 ir = h->data; | |
3380 if (ir->request && !strcmp(who, ir->user)) | |
3381 break; | |
3382 h = h->next; | |
2086 | 3383 } |
3008 | 3384 if (h) { |
3385 ir->request = FALSE; | |
3386 args.flags |= AIM_IMFLAGS_BUDDYREQ; | |
3387 debug_printf("sending buddy icon request with message\n"); | |
3388 } | |
3389 | |
3390 if (gc->user->iconfile[0] && !stat(gc->user->iconfile, &st)) { | |
3391 FILE *file = fopen(gc->user->iconfile, "r"); | |
3392 if (file) { | |
3393 char *buf = g_malloc(st.st_size); | |
3394 fread(buf, 1, st.st_size, file); | |
3395 | |
3396 args.iconlen = st.st_size; | |
3397 args.iconsum = aim_iconsum(buf, st.st_size); | |
3398 args.iconstamp = st.st_mtime; | |
3399 | |
3400 args.flags |= AIM_IMFLAGS_HASICON; | |
3401 debug_printf("Claiming to have an icon.\n"); | |
3402 | |
3403 fclose(file); | |
3404 g_free(buf); | |
2086 | 3405 } |
3406 } | |
3008 | 3407 |
3408 args.destsn = name; | |
3642 | 3409 |
3410 /* Determine how we can send this message. Per the | |
3411 * warnings elsewhere in this file, these little | |
3412 * checks determine the simplest encoding we can use | |
3413 * for a given message send using it. */ | |
3414 len = strlen(message); | |
3415 i = 0; | |
3416 while (message[i]) { | |
3417 if ((unsigned char)message[i] > 0x7f) { | |
3418 /* not ASCII! */ | |
3419 args.flags |= AIM_IMFLAGS_ISO_8859_1; | |
3420 break; | |
3421 } | |
3422 i++; | |
3423 } | |
3424 while (message[i]) { | |
3425 /* ISO-8859-1 is 0x00-0xbf in the first byte | |
3426 * followed by 0xc0-0xc3 in the second */ | |
3659 | 3427 if ((unsigned char)message[i] < 0x80 || |
3660 | 3428 (((unsigned char)message[i] & 0xc0) == 0x80 && |
3429 ((unsigned char)message[i + 1] & 0xfc) == 0xc0)) { | |
3659 | 3430 i++; |
3431 continue; | |
3642 | 3432 } |
3659 | 3433 args.flags ^= AIM_IMFLAGS_ISO_8859_1; |
3434 args.flags |= AIM_IMFLAGS_UNICODE; | |
3435 break; | |
3642 | 3436 } |
3437 if (args.flags & AIM_IMFLAGS_UNICODE) { | |
3659 | 3438 args.msg = g_convert(message, len, "UCS-2BE", "UTF-8", NULL, &len, &err); |
3439 if (err) { | |
3440 debug_printf("Error converting a unicode message: %s\n", err->message); | |
3441 debug_printf("This really shouldn't happen!\n"); | |
3442 /* We really shouldn't try to send the | |
3443 * IM now, but I'm not sure what to do */ | |
3444 } | |
3642 | 3445 } else if (args.flags & AIM_IMFLAGS_UNICODE) { |
3659 | 3446 args.msg = g_convert(message, len, "ISO-8859-1", "UTF-8", NULL, &len, &err); |
3447 if (err) { | |
3448 debug_printf("conversion error: %s\n", err->message); | |
3642 | 3449 debug_printf("Someone tell Ethan his 8859-1 detection is wrong\n"); |
3450 args.flags ^= AIM_IMFLAGS_ISO_8859_1 | AIM_IMFLAGS_UNICODE; | |
3451 len = strlen(message); | |
3659 | 3452 args.msg = g_convert(message, len, "UCS-2BE", "UTF8", NULL, &len, &err); |
3453 if (err) { | |
3454 debug_printf ("Error in unicode fallback: %s\n", err->message); | |
3455 } | |
3642 | 3456 } |
3457 } else { | |
3458 args.msg = message; | |
3459 } | |
3460 args.msglen = len; | |
3008 | 3461 |
3462 ret = aim_send_im_ext(odata->sess, &args); | |
2086 | 3463 } |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
3464 if (ret >= 0) |
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
3465 return 1; |
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
3466 return ret; |
2086 | 3467 } |
3468 | |
3469 static void oscar_get_info(struct gaim_connection *g, char *name) { | |
3470 struct oscar_data *odata = (struct oscar_data *)g->proto_data; | |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3471 if (odata->icq) |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3472 aim_icq_getsimpleinfo(odata->sess, name); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3473 else |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3474 /* people want the away message on the top, so we get the away message |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3475 * first and then get the regular info, since it's too difficult to |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3476 * insert in the middle. i hate people. */ |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3477 aim_getinfo(odata->sess, odata->conn, name, AIM_GETINFO_AWAYMESSAGE); |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3478 } |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3479 |
3212 | 3480 static void oscar_get_away(struct gaim_connection *g, char *who) { |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3481 struct oscar_data *odata = (struct oscar_data *)g->proto_data; |
3212 | 3482 if (odata->icq) { |
3483 struct buddy *budlight = find_buddy(g, who); | |
3484 if (budlight) | |
3595 | 3485 if ((budlight->uc & 0xffff0000) >> 16) |
3212 | 3486 if (budlight->caps & AIM_CAPS_ICQSERVERRELAY) |
3595 | 3487 aim_send_im_ch2_geticqmessage(odata->sess, who, (budlight->uc & 0xffff0000) >> 16); |
3212 | 3488 else |
3489 debug_printf("Error: Remote client does not support retrieval of status messages.\n"); | |
3490 else | |
3491 debug_printf("Error: The user %s has no status message, therefore not requesting.\n", who); | |
3492 else | |
3493 debug_printf("Error: Could not find %s in local contact list, therefore unable to request status message.\n", who); | |
3494 } else | |
3495 aim_getinfo(odata->sess, odata->conn, who, AIM_GETINFO_GENERALINFO); | |
2086 | 3496 } |
3497 | |
2920 | 3498 static void oscar_get_caps(struct gaim_connection *g, char *name) { |
3499 struct oscar_data *odata = (struct oscar_data *)g->proto_data; | |
3500 aim_getinfo(odata->sess, odata->conn, name, AIM_GETINFO_CAPABILITIES); | |
3501 } | |
3502 | |
3466 | 3503 static void oscar_set_dir(struct gaim_connection *g, const char *first, const char *middle, const char *last, |
3504 const char *maiden, const char *city, const char *state, const char *country, int web) { | |
2086 | 3505 /* FIXME : some of these things are wrong, but i'm lazy */ |
3506 struct oscar_data *odata = (struct oscar_data *)g->proto_data; | |
3507 aim_setdirectoryinfo(odata->sess, odata->conn, first, middle, last, | |
3508 maiden, NULL, NULL, city, state, NULL, 0, web); | |
3509 } | |
3510 | |
3511 | |
3512 static void oscar_set_idle(struct gaim_connection *g, int time) { | |
3513 struct oscar_data *odata = (struct oscar_data *)g->proto_data; | |
3514 aim_bos_setidle(odata->sess, odata->conn, time); | |
3515 } | |
3516 | |
3517 static void oscar_set_info(struct gaim_connection *g, char *info) { | |
3518 struct oscar_data *odata = (struct oscar_data *)g->proto_data; | |
2993 | 3519 gchar *inforeal; |
3520 | |
3521 if (odata->rights.maxsiglen == 0) | |
3427 | 3522 do_error_dialog(_("Unable to set AIM profile."), |
3523 _("You have probably requested to set your profile before the login procedure completed. " | |
3524 "Your profile remains unset; try setting it again when you are fully connected."), GAIM_ERROR); | |
2993 | 3525 |
3526 if (strlen(info) > odata->rights.maxsiglen) { | |
3527 gchar *errstr; | |
3528 | |
3427 | 3529 errstr = g_strdup_printf(_("The maximum profile length of %d bytes has been exceeded. " |
3530 "Gaim has truncated and set it."), odata->rights.maxsiglen); | |
3531 do_error_dialog("Profile too long.", errstr, GAIM_WARNING); | |
2993 | 3532 |
3533 g_free(errstr); | |
3534 } | |
3535 | |
3536 inforeal = g_strndup(info, odata->rights.maxsiglen); | |
3537 | |
3458 | 3538 if (odata->icq) |
3539 aim_bos_setprofile(odata->sess, odata->conn, NULL, NULL, caps_icq); | |
3540 else | |
3541 aim_bos_setprofile(odata->sess, odata->conn, inforeal, NULL, caps_aim); | |
2993 | 3542 |
3543 g_free(inforeal); | |
3544 | |
3545 return; | |
2086 | 3546 } |
3547 | |
2993 | 3548 static void oscar_set_away_aim(struct gaim_connection *gc, struct oscar_data *od, const char *message) |
3549 { | |
3550 | |
3551 if (od->rights.maxawaymsglen == 0) | |
3427 | 3552 do_error_dialog(_("Unable to set AIM away message."), |
3553 _("You have probably requested to set your away message before the login procedure completed. " | |
3554 "You remain in a \"present\" state; try setting it again when you are fully connected."), GAIM_ERROR); | |
3555 | |
2993 | 3556 if (gc->away) |
3557 g_free(gc->away); | |
3558 gc->away = NULL; | |
3559 | |
3560 if (!message) { | |
3458 | 3561 aim_bos_setprofile(od->sess, od->conn, NULL, "", caps_aim); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3562 return; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3563 } |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3564 |
2993 | 3565 if (strlen(message) > od->rights.maxawaymsglen) { |
3566 gchar *errstr; | |
3567 | |
3427 | 3568 errstr = g_strdup_printf(_("The away message length of %d bytes has been exceeded. " |
3569 "Gaim has truncated it and set you away."), od->rights.maxawaymsglen); | |
3570 do_error_dialog("Away message too long.", errstr, GAIM_WARNING); | |
2993 | 3571 g_free(errstr); |
3572 } | |
3573 | |
3574 gc->away = g_strndup(message, od->rights.maxawaymsglen); | |
3458 | 3575 aim_bos_setprofile(od->sess, od->conn, NULL, gc->away, caps_aim); |
2993 | 3576 |
3577 return; | |
3578 } | |
3579 | |
3580 static void oscar_set_away_icq(struct gaim_connection *gc, struct oscar_data *od, const char *state, const char *message) | |
3581 { | |
3582 | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3583 if (gc->away) |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3584 gc->away = NULL; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3585 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3586 if (!strcmp(state, "Online")) |
2866
6d62d4520460
[gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2865
diff
changeset
|
3587 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_NORMAL); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3588 else if (!strcmp(state, "Away")) { |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3589 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_AWAY); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3590 gc->away = ""; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3591 } else if (!strcmp(state, "Do Not Disturb")) { |
3212 | 3592 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_DND | AIM_ICQ_STATE_BUSY); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3593 gc->away = ""; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3594 } else if (!strcmp(state, "Not Available")) { |
3101 | 3595 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_OUT | AIM_ICQ_STATE_AWAY); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3596 gc->away = ""; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3597 } else if (!strcmp(state, "Occupied")) { |
3212 | 3598 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_BUSY); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3599 gc->away = ""; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3600 } else if (!strcmp(state, "Free For Chat")) { |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3601 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_CHAT); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3602 gc->away = ""; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3603 } else if (!strcmp(state, "Invisible")) { |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3604 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_INVISIBLE); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3605 gc->away = ""; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3606 } else if (!strcmp(state, GAIM_AWAY_CUSTOM)) { |
2998 | 3607 if (message) { |
3101 | 3608 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_OUT | AIM_ICQ_STATE_AWAY); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3609 gc->away = ""; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3610 } else { |
2866
6d62d4520460
[gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2865
diff
changeset
|
3611 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_NORMAL); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3612 } |
2086 | 3613 } |
2993 | 3614 |
3615 return; | |
3616 } | |
3617 | |
3618 static void oscar_set_away(struct gaim_connection *gc, char *state, char *message) | |
3619 { | |
3620 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
3621 | |
3622 if (od->icq) | |
3623 oscar_set_away_icq(gc, od, state, message); | |
3624 else | |
3625 oscar_set_away_aim(gc, od, message); | |
3626 | |
3627 return; | |
2086 | 3628 } |
3629 | |
3630 static void oscar_warn(struct gaim_connection *g, char *name, int anon) { | |
3631 struct oscar_data *odata = (struct oscar_data *)g->proto_data; | |
2113 | 3632 aim_send_warning(odata->sess, odata->conn, name, anon ? AIM_WARN_ANON : 0); |
2086 | 3633 } |
3634 | |
3466 | 3635 static void oscar_dir_search(struct gaim_connection *g, const char *first, const char *middle, const char *last, |
3636 const char *maiden, const char *city, const char *state, const char *country, const char *email) { | |
2086 | 3637 struct oscar_data *odata = (struct oscar_data *)g->proto_data; |
3638 if (strlen(email)) | |
3639 aim_usersearch_address(odata->sess, odata->conn, email); | |
3640 } | |
3641 | |
3466 | 3642 static void oscar_add_buddy(struct gaim_connection *g, const char *name) { |
2086 | 3643 struct oscar_data *odata = (struct oscar_data *)g->proto_data; |
3092 | 3644 if (odata->icq) { |
3645 aim_add_buddy(odata->sess, odata->conn, name); | |
3646 } else { | |
3210 | 3647 if ((odata->sess->ssi.received_data) && !(aim_ssi_itemlist_finditem(odata->sess->ssi.items, NULL, name, 0x0000))) { |
2995 | 3648 debug_printf("ssi: adding buddy %s to group %s\n", name, find_group_by_buddy(g, name)->name); |
3649 aim_ssi_addbuddies(odata->sess, odata->conn, find_group_by_buddy(g, name)->name, &name, 1); | |
3092 | 3650 } |
2991 | 3651 } |
2086 | 3652 } |
3653 | |
3654 static void oscar_add_buddies(struct gaim_connection *g, GList *buddies) { | |
3655 struct oscar_data *odata = (struct oscar_data *)g->proto_data; | |
3092 | 3656 if (odata->icq) { |
3657 char buf[MSG_LEN]; | |
3658 int n=0; | |
3659 while (buddies) { | |
3660 if (n > MSG_LEN - 18) { | |
3661 aim_bos_setbuddylist(odata->sess, odata->conn, buf); | |
3662 n = 0; | |
3663 } | |
3664 n += g_snprintf(buf + n, sizeof(buf) - n, "%s&", (char *)buddies->data); | |
3665 buddies = buddies->next; | |
3666 } | |
3667 aim_bos_setbuddylist(odata->sess, odata->conn, buf); | |
3668 } else { | |
3669 if (odata->sess->ssi.received_data) { | |
3670 int tmp; | |
3671 GSList *curgrp, *curbud; | |
3672 for (curgrp=g->groups; curgrp; curgrp=g_slist_next(curgrp)) { | |
2995 | 3673 tmp = 0; |
3674 for (curbud=((struct group*)curgrp->data)->members; curbud; curbud=curbud->next) | |
3210 | 3675 if (!aim_ssi_itemlist_finditem(odata->sess->ssi.items, NULL, ((struct buddy*)curbud->data)->name, 0x0000)) |
2995 | 3676 tmp++; |
3092 | 3677 if (tmp) { |
3678 char **sns = (char **)malloc(tmp*sizeof(char*)); | |
3679 tmp = 0; | |
3680 for (curbud=((struct group*)curgrp->data)->members; curbud; curbud=curbud->next) | |
3210 | 3681 if (!aim_ssi_itemlist_finditem(odata->sess->ssi.items, NULL, ((struct buddy*)curbud->data)->name, 0x0000)) { |
3092 | 3682 debug_printf("ssi: adding buddy %s to group %s\n", ((struct buddy*)curbud->data)->name, ((struct group*)curgrp->data)->name); |
3683 sns[tmp] = (char *)((struct buddy*)curbud->data)->name; | |
3684 tmp++; | |
3685 } | |
3595 | 3686 aim_ssi_addbuddies(odata->sess, odata->conn, ((struct group*)curgrp->data)->name, (const char**)sns, tmp); |
3092 | 3687 free(sns); |
2995 | 3688 } |
3092 | 3689 } |
2995 | 3690 } |
3691 } | |
3692 } | |
3693 | |
3140 | 3694 static void oscar_move_buddy(struct gaim_connection *g, char *name, char *old_group, char *new_group) { |
3695 struct oscar_data *odata = (struct oscar_data *)g->proto_data; | |
3696 if (!odata->icq) | |
3697 if (odata->sess->ssi.received_data) { | |
3698 aim_ssi_movebuddy(odata->sess, odata->conn, old_group, new_group, name); | |
3699 debug_printf("ssi: moved buddy %s from group %s to group %s\n", name, old_group, new_group); | |
3700 } | |
3701 } | |
3702 | |
2995 | 3703 static void oscar_remove_buddy(struct gaim_connection *g, char *name, char *group) { |
3704 struct oscar_data *odata = (struct oscar_data *)g->proto_data; | |
3092 | 3705 if (odata->icq) { |
3706 aim_remove_buddy(odata->sess, odata->conn, name); | |
3707 } else { | |
3708 if (odata->sess->ssi.received_data) { | |
3210 | 3709 struct aim_ssi_item *ssigroup; |
3710 while (aim_ssi_itemlist_finditem(odata->sess->ssi.items, NULL, name, 0x0000) && (ssigroup = aim_ssi_itemlist_findparent(odata->sess->ssi.items, name)) && !aim_ssi_delbuddies(odata->sess, odata->conn, ssigroup->name, &name, 1)) | |
3092 | 3711 debug_printf("ssi: deleted buddy %s from group %s\n", name, group); |
3712 } | |
2995 | 3713 } |
3714 } | |
3715 | |
3716 static void oscar_remove_buddies(struct gaim_connection *g, GList *buddies, char *group) { | |
3717 struct oscar_data *odata = (struct oscar_data *)g->proto_data; | |
3092 | 3718 if (odata->icq) { |
2995 | 3719 GList *cur; |
3720 for (cur=buddies; cur; cur=cur->next) | |
3092 | 3721 aim_remove_buddy(odata->sess, odata->conn, cur->data); |
3722 } else { | |
3723 if (odata->sess->ssi.received_data) { | |
3724 GList *cur; | |
3725 int tmp = 0; | |
2995 | 3726 for (cur=buddies; cur; cur=cur->next) |
3210 | 3727 if (aim_ssi_itemlist_finditem(odata->sess->ssi.items, NULL, cur->data, 0x0000)) |
2991 | 3728 tmp++; |
3092 | 3729 if (tmp) { |
3730 char **sns; | |
3731 sns = (char **)malloc(tmp*sizeof(char*)); | |
3732 tmp = 0; | |
3733 for (cur=buddies; cur; cur=cur->next) | |
3210 | 3734 if (aim_ssi_itemlist_finditem(odata->sess->ssi.items, NULL, cur->data, 0x0000)) { |
3092 | 3735 debug_printf("ssi: deleting buddy %s from group %s\n", cur->data, group); |
3736 sns[tmp] = cur->data; | |
3737 tmp++; | |
3738 } | |
3739 aim_ssi_delbuddies(odata->sess, odata->conn, group, sns, tmp); | |
3740 free(sns); | |
3741 } | |
2991 | 3742 } |
3743 } | |
3744 } | |
3745 | |
3348 | 3746 static void oscar_rename_group(struct gaim_connection *g, char *old_group, char *new_group, GList *members) { |
3747 struct oscar_data *odata = (struct oscar_data *)g->proto_data; | |
3748 if (!odata->icq) | |
3749 if (odata->sess->ssi.received_data) { | |
3750 if (aim_ssi_itemlist_finditem(odata->sess->ssi.items, NULL, new_group, 0x0001)) { | |
3751 oscar_remove_buddies(g, members, old_group); | |
3752 oscar_add_buddies(g, members); | |
3753 debug_printf("ssi: moved all buddies from group %s to %s\n", old_group, new_group); | |
3754 } else { | |
3755 aim_ssi_rename_group(odata->sess, odata->conn, old_group, new_group); | |
3756 debug_printf("ssi: renamed group %s to %s\n", old_group, new_group); | |
3757 } | |
3758 } | |
3759 } | |
3760 | |
2991 | 3761 static int gaim_ssi_parserights(aim_session_t *sess, aim_frame_t *fr, ...) { |
3762 /* XXX - Fix parsing of the ssi rights packet and pass us the data | |
3763 fu16_t maxbuddies, maxgroups, maxpermits, maxdenies; | |
3764 va_list ap; | |
3765 | |
3766 va_start(ap, fr); | |
3767 maxbuddies = (fu16_t)va_arg(ap, unsigned int); | |
3768 maxgroupss = (fu16_t)va_arg(ap, unsigned int); | |
3769 maxpermits = (fu16_t)va_arg(ap, unsigned int); | |
3770 maxdenies = (fu16_t)va_arg(ap, unsigned int); | |
3771 va_end(ap); | |
3772 | |
3773 debug_printf("ssi rights: Max buddies = %d / Max groups = %d / Max permits = %d / Max denies = %d\n", maxbuddies, maxgroups, maxpermits, maxdenies); | |
3774 */ | |
3775 | |
3776 return 1; | |
3777 } | |
3778 | |
3779 static int gaim_ssi_parselist(aim_session_t *sess, aim_frame_t *fr, ...) { | |
3780 struct gaim_connection *gc = sess->aux_data; | |
2995 | 3781 struct oscar_data *odata = (struct oscar_data *)gc->proto_data; |
3782 struct aim_ssi_item *curitem; | |
2991 | 3783 int tmp; |
3466 | 3784 const char **sns; |
2991 | 3785 |
3786 debug_printf("ssi: syncing local list and server list\n"); | |
3787 | |
3109 | 3788 if (odata->icq) |
3092 | 3789 return 1; |
3790 | |
2991 | 3791 /* Activate SSI */ |
3792 debug_printf("ssi: activating server-stored buddy list\n"); | |
3793 aim_ssi_enable(sess, fr->conn); | |
3794 | |
3795 /* Clean the buddy list */ | |
3210 | 3796 aim_ssi_cleanlist(sess, fr->conn); |
2991 | 3797 |
3798 /* Add from server list to local list */ | |
3799 tmp = 0; | |
3800 for (curitem=sess->ssi.items; curitem; curitem=curitem->next) { | |
3801 switch (curitem->type) { | |
3802 case 0x0000: /* Buddy */ | |
3803 if ((curitem->name) && (!find_buddy(gc, curitem->name))) { | |
2995 | 3804 struct aim_ssi_item *curgroup = sess->ssi.items; |
2991 | 3805 while (curgroup) { |
3806 if ((curgroup->type == 0x0001) && (curgroup->gid == curitem->gid) && (curgroup->name)) { | |
2995 | 3807 debug_printf("ssi: adding buddy %s to group %s to local list\n", curitem->name, curgroup->name); |
2991 | 3808 add_buddy(gc, curgroup->name, curitem->name, 0); |
3809 tmp++; | |
3810 } | |
3811 curgroup = curgroup->next; | |
3812 } | |
3813 } | |
3814 break; | |
3815 | |
2995 | 3816 case 0x0002: /* Permit buddy */ |
2991 | 3817 if (curitem->name) { |
3818 GSList *list; | |
3819 for (list=gc->permit; (list && aim_sncmp(curitem->name, list->data)); list=list->next); | |
3820 if (!list) { | |
3821 char *name; | |
2995 | 3822 debug_printf("ssi: adding permit buddy %s to local list\n", curitem->name); |
2991 | 3823 name = g_strdup(normalize(curitem->name)); |
3824 gc->permit = g_slist_append(gc->permit, name); | |
3825 build_allow_list(); | |
3826 tmp++; | |
3827 } | |
3828 } | |
3829 break; | |
3830 | |
2995 | 3831 case 0x0003: /* Deny buddy */ |
2991 | 3832 if (curitem->name) { |
3833 GSList *list; | |
3834 for (list=gc->deny; (list && aim_sncmp(curitem->name, list->data)); list=list->next); | |
3835 if (!list) { | |
3836 char *name; | |
2995 | 3837 debug_printf("ssi: adding deny buddy %s to local list\n", curitem->name); |
2991 | 3838 name = g_strdup(normalize(curitem->name)); |
3839 gc->deny = g_slist_append(gc->deny, name); | |
3840 build_block_list(); | |
3841 tmp++; | |
3842 } | |
3843 } | |
3844 break; | |
3845 | |
2995 | 3846 case 0x0004: /* Permit/deny setting */ |
2991 | 3847 if (curitem->data) { |
3848 fu8_t permdeny; | |
3210 | 3849 if ((permdeny = aim_ssi_getpermdeny(sess->ssi.items)) && (permdeny != gc->permdeny)) { |
2991 | 3850 debug_printf("ssi: changing permdeny from %d to %d\n", gc->permdeny, permdeny); |
3851 gc->permdeny = permdeny; | |
2995 | 3852 tmp++; |
2991 | 3853 } |
3854 } | |
3855 break; | |
3109 | 3856 |
3857 case 0x0005: /* Presence setting */ | |
3858 /* We don't want to change Gaim's setting because it applies to all accounts */ | |
3859 break; | |
2991 | 3860 } /* End of switch on curitem->type */ |
3861 } /* End of for loop */ | |
3862 if (tmp) | |
3863 do_export(gc); | |
3864 | |
3865 /* Add from local list to server list */ | |
3866 if (gc) { | |
3017 | 3867 GSList *cur; |
3868 | |
2991 | 3869 /* Buddies */ |
3017 | 3870 cur = gc->groups; |
3871 while (cur) { | |
3872 GSList *curbud; | |
2991 | 3873 tmp = 0; |
3017 | 3874 for (curbud=((struct group*)cur->data)->members; curbud; curbud=curbud->next) |
3210 | 3875 if (!aim_ssi_itemlist_finditem(sess->ssi.items, NULL, ((struct buddy*)curbud->data)->name, 0x0000)) |
2991 | 3876 tmp++; |
3877 if (tmp) { | |
3466 | 3878 sns = malloc(tmp*sizeof(char*)); |
3017 | 3879 tmp = 0; |
3880 for (curbud=((struct group*)cur->data)->members; curbud; curbud=curbud->next) | |
3210 | 3881 if (!aim_ssi_itemlist_finditem(sess->ssi.items, NULL, ((struct buddy*)curbud->data)->name, 0x0000)) { |
3017 | 3882 debug_printf("ssi: adding buddy %s from local list to server list\n", ((struct buddy*)curbud->data)->name); |
3883 sns[tmp] = ((char *)((struct buddy*)curbud->data)->name); | |
3884 tmp++; | |
3885 } | |
3886 aim_ssi_addbuddies(sess, fr->conn, ((struct group*)cur->data)->name, sns, tmp); | |
2991 | 3887 free(sns); |
3888 } | |
3017 | 3889 cur = g_slist_next(cur); |
2991 | 3890 } |
3891 | |
3892 /* Permit list */ | |
3893 if (gc->permit) { | |
3894 tmp = 0; | |
3017 | 3895 for (cur=gc->permit; cur; cur=cur->next) |
3210 | 3896 if (!aim_ssi_itemlist_finditem(sess->ssi.items, NULL, cur->data, 0x0002)) |
2991 | 3897 tmp++; |
3898 if (tmp) { | |
3466 | 3899 sns = malloc(tmp*sizeof(char*)); |
3017 | 3900 tmp = 0; |
3901 for (cur=gc->permit; cur; cur=cur->next) | |
3210 | 3902 if (!aim_ssi_itemlist_finditem(sess->ssi.items, NULL, cur->data, 0x0002)) { |
3017 | 3903 debug_printf("ssi: adding permit %s from local list to server list\n", cur->data); |
3904 sns[tmp] = cur->data; | |
3905 tmp++; | |
3906 } | |
3907 aim_ssi_addpord(sess, fr->conn, sns, tmp, AIM_SSI_TYPE_PERMIT); | |
2991 | 3908 free(sns); |
3909 } | |
3910 } | |
3911 | |
3912 /* Deny list */ | |
3913 if (gc->deny) { | |
3914 tmp = 0; | |
3017 | 3915 for (cur=gc->deny; cur; cur=cur->next) |
3210 | 3916 if (!aim_ssi_itemlist_finditem(sess->ssi.items, NULL, cur->data, 0x0003)) |
2991 | 3917 tmp++; |
3918 if (tmp) { | |
3466 | 3919 sns = malloc(tmp*sizeof(char*)); |
3017 | 3920 tmp = 0; |
3921 for (cur=gc->deny; cur; cur=cur->next) | |
3210 | 3922 if (!aim_ssi_itemlist_finditem(sess->ssi.items, NULL, cur->data, 0x0003)) { |
3017 | 3923 debug_printf("ssi: adding deny %s from local list to server list\n", cur->data); |
3924 sns[tmp] = cur->data; | |
3925 tmp++; | |
3926 } | |
3927 aim_ssi_addpord(sess, fr->conn, sns, tmp, AIM_SSI_TYPE_DENY); | |
2991 | 3928 free(sns); |
3929 } | |
3930 } | |
3109 | 3931 |
3932 /* Presence settings (idle time visibility) */ | |
3210 | 3933 if ((tmp = aim_ssi_getpresence(sess->ssi.items)) != 0xFFFFFFFF) |
3109 | 3934 if (report_idle && !(tmp & 0x400)) |
3935 aim_ssi_setpresence(sess, fr->conn, tmp | 0x400); | |
3210 | 3936 |
3937 /* Check for maximum number of buddies */ | |
3938 for (cur=gc->groups, tmp=0; cur; cur=g_slist_next(cur)) { | |
3214 | 3939 struct group* gr = (struct group*)cur->data; |
3940 tmp = tmp + g_slist_length(gr->members); | |
3941 } | |
3210 | 3942 if (tmp > odata->rights.maxbuddies) { |
3943 char *dialog_msg = g_strdup_printf(_("The maximum number of buddies allowed in your buddy list is %d, and you have %d." | |
3944 " Until you are below the limit, some buddies will not show up as online."), | |
3945 odata->rights.maxbuddies, tmp); | |
3427 | 3946 do_error_dialog("Maximum buddy list length exceeded.", dialog_msg, GAIM_WARNING); |
3210 | 3947 g_free(dialog_msg); |
3948 } | |
3214 | 3949 |
3210 | 3950 } /* end if (gc) */ |
3092 | 3951 |
2991 | 3952 return 1; |
2086 | 3953 } |
3954 | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3955 static GList *oscar_chat_info(struct gaim_connection *gc) { |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3956 GList *m = NULL; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3957 struct proto_chat_entry *pce; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3958 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3959 pce = g_new0(struct proto_chat_entry, 1); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3960 pce->label = _("Join what group:"); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3961 m = g_list_append(m, pce); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3962 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3963 pce = g_new0(struct proto_chat_entry, 1); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3964 pce->label = _("Exchange:"); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3965 pce->is_int = TRUE; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3966 pce->min = 4; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3967 pce->max = 20; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3968 m = g_list_append(m, pce); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3969 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3970 return m; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3971 } |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3972 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3973 static void oscar_join_chat(struct gaim_connection *g, GList *data) { |
2086 | 3974 struct oscar_data *odata = (struct oscar_data *)g->proto_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3975 aim_conn_t *cur; |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3976 char *name; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3977 int *exchange; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3978 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3979 if (!data || !data->next) |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3980 return; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3981 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3982 name = data->data; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3983 exchange = data->next->data; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3984 |
2086 | 3985 debug_printf("Attempting to join chat room %s.\n", name); |
3986 if ((cur = aim_getconn_type(odata->sess, AIM_CONN_TYPE_CHATNAV))) { | |
3987 debug_printf("chatnav exists, creating room\n"); | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
3988 aim_chatnav_createroom(odata->sess, cur, name, *exchange); |
2086 | 3989 } else { |
3990 /* this gets tricky */ | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
3991 struct create_room *cr = g_new0(struct create_room, 1); |
2086 | 3992 debug_printf("chatnav does not exist, opening chatnav\n"); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
3993 cr->exchange = *exchange; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
3994 cr->name = g_strdup(name); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
3995 odata->create_rooms = g_slist_append(odata->create_rooms, cr); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3996 aim_reqservice(odata->sess, odata->conn, AIM_CONN_TYPE_CHATNAV); |
2086 | 3997 } |
3998 } | |
3999 | |
3466 | 4000 static void oscar_chat_invite(struct gaim_connection *g, int id, const char *message, const char *name) { |
2086 | 4001 struct oscar_data *odata = (struct oscar_data *)g->proto_data; |
4002 struct chat_connection *ccon = find_oscar_chat(g, id); | |
4003 | |
4004 if (!ccon) | |
4005 return; | |
4006 | |
4007 aim_chat_invite(odata->sess, odata->conn, name, message ? message : "", | |
4008 ccon->exchange, ccon->name, 0x0); | |
4009 } | |
4010 | |
4011 static void oscar_chat_leave(struct gaim_connection *g, int id) { | |
4012 struct oscar_data *odata = g ? (struct oscar_data *)g->proto_data : NULL; | |
4013 GSList *bcs = g->buddy_chats; | |
4014 struct conversation *b = NULL; | |
4015 struct chat_connection *c = NULL; | |
4016 int count = 0; | |
4017 | |
4018 while (bcs) { | |
4019 count++; | |
4020 b = (struct conversation *)bcs->data; | |
4021 if (id == b->id) | |
4022 break; | |
4023 bcs = bcs->next; | |
4024 b = NULL; | |
4025 } | |
4026 | |
4027 if (!b) | |
4028 return; | |
4029 | |
4030 debug_printf("Attempting to leave room %s (currently in %d rooms)\n", b->name, count); | |
4031 | |
4032 c = find_oscar_chat(g, b->id); | |
4033 if (c != NULL) { | |
4034 if (odata) | |
4035 odata->oscar_chats = g_slist_remove(odata->oscar_chats, c); | |
4036 if (c->inpa > 0) | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
4037 gaim_input_remove(c->inpa); |
2086 | 4038 if (g && odata->sess) |
4039 aim_conn_kill(odata->sess, &c->conn); | |
4040 g_free(c->name); | |
4041 g_free(c->show); | |
4042 g_free(c); | |
4043 } | |
4044 /* we do this because with Oscar it doesn't tell us we left */ | |
4045 serv_got_chat_left(g, b->id); | |
4046 } | |
4047 | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4048 static int oscar_chat_send(struct gaim_connection *g, int id, char *message) { |
2086 | 4049 struct oscar_data *odata = (struct oscar_data *)g->proto_data; |
4050 GSList *bcs = g->buddy_chats; | |
4051 struct conversation *b = NULL; | |
4052 struct chat_connection *c = NULL; | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4053 char *buf, *buf2; |
2086 | 4054 int i, j; |
4055 | |
4056 while (bcs) { | |
4057 b = (struct conversation *)bcs->data; | |
4058 if (id == b->id) | |
4059 break; | |
4060 bcs = bcs->next; | |
4061 b = NULL; | |
4062 } | |
4063 if (!b) | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4064 return -EINVAL; |
2086 | 4065 |
4066 bcs = odata->oscar_chats; | |
4067 while (bcs) { | |
4068 c = (struct chat_connection *)bcs->data; | |
4069 if (b == c->cnv) | |
4070 break; | |
4071 bcs = bcs->next; | |
4072 c = NULL; | |
4073 } | |
4074 if (!c) | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4075 return -EINVAL; |
2086 | 4076 |
4077 buf = g_malloc(strlen(message) * 4 + 1); | |
4078 for (i = 0, j = 0; i < strlen(message); i++) { | |
4079 if (message[i] == '\n') { | |
4080 buf[j++] = '<'; | |
4081 buf[j++] = 'B'; | |
4082 buf[j++] = 'R'; | |
4083 buf[j++] = '>'; | |
4084 } else { | |
4085 buf[j++] = message[i]; | |
4086 } | |
4087 } | |
4088 buf[j] = '\0'; | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4089 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4090 if (strlen(buf) > c->maxlen) |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4091 return -E2BIG; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4092 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4093 buf2 = strip_html(buf); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4094 if (strlen(buf2) > c->maxvis) { |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4095 g_free(buf2); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4096 return -E2BIG; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4097 } |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4098 g_free(buf2); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4099 |
2086 | 4100 aim_chat_send_im(odata->sess, c->conn, 0, buf, strlen(buf)); |
4101 g_free(buf); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4102 return 0; |
2086 | 4103 } |
4104 | |
4105 static char **oscar_list_icon(int uc) { | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4106 if (uc == 0) |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4107 return (char **)icon_online_xpm; |
3595 | 4108 if (uc & 0xffff0000) { |
4109 uc >>= 16; | |
3101 | 4110 if (uc & AIM_ICQ_STATE_INVISIBLE) |
4111 return icon_offline_xpm; | |
4112 if (uc & AIM_ICQ_STATE_CHAT) | |
4113 return icon_ffc_xpm; | |
3212 | 4114 if (uc & AIM_ICQ_STATE_DND) |
4115 return icon_dnd_xpm; | |
4116 if (uc & AIM_ICQ_STATE_OUT) | |
4117 return icon_na_xpm; | |
3101 | 4118 if (uc & AIM_ICQ_STATE_BUSY) |
4119 return icon_occ_xpm; | |
4120 if (uc & AIM_ICQ_STATE_AWAY) | |
4121 return icon_away_xpm; | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4122 return icon_online_xpm; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4123 } |
3101 | 4124 if (uc & UC_UNAVAILABLE) |
4125 return (char **)away_icon_xpm; | |
3079 | 4126 if (uc & UC_WIRELESS) |
4127 return (char **)wireless_icon_xpm; | |
2689 | 4128 if (uc & UC_AB) |
2679 | 4129 return (char **)ab_xpm; |
2086 | 4130 if (uc & UC_AOL) |
4131 return (char **)aol_icon_xpm; | |
4132 if (uc & UC_ADMIN) | |
4133 return (char **)admin_icon_xpm; | |
4134 if (uc & UC_UNCONFIRMED) | |
4135 return (char **)dt_icon_xpm; | |
2297
a0f6ead876ca
[gaim-migrate @ 2307]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2288
diff
changeset
|
4136 if (uc & UC_NORMAL) |
a0f6ead876ca
[gaim-migrate @ 2307]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2288
diff
changeset
|
4137 return (char **)free_icon_xpm; |
2086 | 4138 return NULL; |
4139 } | |
4140 | |
3630 | 4141 void oscar_transfer_nextfile(struct gaim_connection *gc, |
4142 struct file_transfer *xfer) { | |
4143 struct oscar_file_transfer *oft = find_oft_by_xfer(gc, xfer); | |
4144 aim_conn_t *conn = oft->conn; | |
4145 aim_session_t *sess = aim_conn_getsess(conn); | |
4146 | |
4147 oft->filesdone++; | |
4148 oft->watcher = gaim_input_add(conn->fd, GAIM_INPUT_READ, | |
4149 oscar_callback, conn); | |
4150 | |
4151 /* If this is an incoming sendfile transfer, we send an OK | |
4152 * message to the sender; if this is an outgoing sendfile, we | |
4153 * will get an OK from the receiver that will be handled in | |
4154 * oscar_sendfile_out_done(), so we don't need to do anything | |
4155 * yet. | |
4156 */ | |
4157 | |
4158 if (oft->type == OFT_SENDFILE_IN) | |
4159 aim_oft_end(sess, conn); | |
4160 } | |
4161 | |
4162 void oscar_transfer_done(struct gaim_connection *gc, | |
4163 struct file_transfer *xfer) { | |
4164 struct oscar_file_transfer *oft = find_oft_by_xfer(gc, xfer); | |
4165 aim_conn_t *conn = oft->conn; | |
4166 aim_session_t *sess = aim_conn_getsess(conn); | |
4167 | |
4168 oft->filesdone++; | |
4169 if (oft->type == OFT_SENDFILE_IN) { | |
4170 aim_oft_end(sess, conn); | |
4171 oscar_file_transfer_disconnect(sess, conn); | |
4172 } | |
4173 else if (oft->type == OFT_SENDFILE_OUT) { | |
4174 /* Wait for response before closing connection. */ | |
4175 oft->watcher = gaim_input_add(conn->fd, GAIM_INPUT_READ, | |
4176 oscar_callback, conn); | |
4177 } | |
4178 } | |
4179 | |
4180 static int oscar_file_transfer_do(aim_session_t *sess, aim_frame_t *fr, ...) { | |
4181 struct gaim_connection *gc = sess->aux_data; | |
4182 va_list ap; | |
4183 aim_conn_t *conn; | |
4184 struct oscar_file_transfer *oft; | |
3752 | 4185 int err; |
3630 | 4186 |
4187 va_start(ap, fr); | |
4188 conn = va_arg(ap, aim_conn_t *); | |
4189 | |
4190 oft = find_oft_by_conn(gc, conn); | |
4191 | |
4192 /* Don't use the regular input handler for the raw data. */ | |
4193 gaim_input_remove(oft->watcher); | |
4194 oft->watcher = 0; | |
4195 | |
4196 if (oft->type == OFT_SENDFILE_IN) { | |
4197 const char *name = va_arg(ap, const char *); | |
4198 int size = va_arg(ap, int); | |
3752 | 4199 err = transfer_in_do(oft->xfer, conn->fd, name, size); |
3630 | 4200 } |
4201 else { | |
4202 int offset = va_arg(ap, int); | |
3752 | 4203 err = transfer_out_do(oft->xfer, conn->fd, offset); |
3630 | 4204 } |
4205 va_end(ap); | |
4206 | |
3752 | 4207 if (err) { |
4208 /* There was an error; cancel the transfer. */ | |
4209 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
4210 aim_conn_t *bosconn = od->conn; | |
4211 aim_canceltransfer(sess, bosconn, oft->cookie, | |
4212 oft->sn, AIM_CAPS_SENDFILE); | |
4213 oscar_file_transfer_disconnect(sess, oft->conn); | |
4214 } | |
4215 | |
3630 | 4216 return 0; |
4217 } | |
4218 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4219 static int gaim_directim_initiate(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 4220 va_list ap; |
4221 struct gaim_connection *gc = sess->aux_data; | |
4222 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4223 aim_conn_t *newconn, *listenerconn; |
2235
5d8b6100a9cc
[gaim-migrate @ 2245]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2232
diff
changeset
|
4224 struct conversation *cnv; |
2086 | 4225 struct direct_im *dim; |
4226 char buf[256]; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4227 char *sn; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4228 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4229 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4230 newconn = va_arg(ap, aim_conn_t *); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4231 listenerconn = va_arg(ap, aim_conn_t *); |
2086 | 4232 va_end(ap); |
4233 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4234 aim_conn_close(listenerconn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4235 aim_conn_kill(sess, &listenerconn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4236 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4237 sn = g_strdup(aim_directim_getsn(newconn)); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4238 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4239 debug_printf("DirectIM: initiate success to %s\n", sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4240 dim = find_direct_im(od, sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4241 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4242 if (!(cnv = find_conversation(sn))) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4243 cnv = new_conversation(sn); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
4244 gaim_input_remove(dim->watcher); |
2086 | 4245 dim->conn = newconn; |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
4246 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, |
2086 | 4247 oscar_callback, dim->conn); |
3008 | 4248 dim->connected = TRUE; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4249 g_snprintf(buf, sizeof buf, _("Direct IM with %s established"), sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4250 g_free(sn); |
2856
b1e300a85678
[gaim-migrate @ 2869]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2833
diff
changeset
|
4251 write_to_conv(cnv, buf, WFLAG_SYSTEM, NULL, time(NULL), -1); |
2086 | 4252 |
4253 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, | |
4254 gaim_directim_incoming, 0); | |
4255 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, | |
4256 gaim_directim_typing, 0); | |
3033 | 4257 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER, |
2993 | 4258 gaim_update_ui, 0); |
4259 return 1; | |
4260 } | |
4261 | |
4262 static int gaim_update_ui(aim_session_t *sess, aim_frame_t *fr, ...) { | |
4263 va_list ap; | |
4264 char *sn; | |
4265 double percent; | |
4266 struct gaim_connection *gc = sess->aux_data; | |
4267 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
4268 struct conversation *c; | |
4269 struct direct_im *dim; | |
4270 | |
4271 va_start(ap, fr); | |
4272 sn = va_arg(ap, char *); | |
4273 percent = va_arg(ap, double); | |
4274 va_end(ap); | |
4275 | |
2994 | 4276 if (!(dim = find_direct_im(od, sn))) |
4277 return 1; | |
3059 | 4278 if (dim->watcher) { |
4279 gaim_input_remove(dim->watcher); /* Otherwise, the callback will callback */ | |
4280 dim->watcher = 0; | |
4281 } | |
3044 | 4282 while (gtk_events_pending()) |
4283 gtk_main_iteration(); | |
4284 | |
2993 | 4285 if ((c = find_conversation(sn))) |
4286 update_progress(c, percent); | |
4287 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, | |
4288 oscar_callback, dim->conn); | |
2086 | 4289 |
4290 return 1; | |
4291 } | |
4292 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4293 static int gaim_directim_incoming(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 4294 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4295 char *msg, *sn; |
2993 | 4296 int len; |
2086 | 4297 struct gaim_connection *gc = sess->aux_data; |
4298 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4299 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4300 sn = va_arg(ap, char *); |
2086 | 4301 msg = va_arg(ap, char *); |
2993 | 4302 len = va_arg(ap, int); |
2086 | 4303 va_end(ap); |
4304 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4305 debug_printf("Got DirectIM message from %s\n", sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4306 |
2993 | 4307 serv_got_im(gc, sn, msg, 0, time(NULL), len); |
2086 | 4308 |
4309 return 1; | |
4310 } | |
4311 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4312 static int gaim_directim_typing(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 4313 va_list ap; |
4314 char *sn; | |
2993 | 4315 int typing; |
4316 struct gaim_connection *gc = sess->aux_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4317 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4318 va_start(ap, fr); |
2086 | 4319 sn = va_arg(ap, char *); |
2993 | 4320 typing = va_arg(ap, int); |
2086 | 4321 va_end(ap); |
4322 | |
2993 | 4323 if (typing) { |
4324 /* I had to leave this. It's just too funny. It reminds me of my sister. */ | |
4325 debug_printf("ohmigod! %s has started typing (DirectIM). He's going to send you a message! *squeal*\n", sn); | |
4326 serv_got_typing(gc,sn,0); | |
4327 } else | |
4328 serv_got_typing_stopped(gc,sn); | |
2086 | 4329 return 1; |
4330 } | |
4331 | |
4332 struct ask_do_dir_im { | |
4333 char *who; | |
4334 struct gaim_connection *gc; | |
4335 }; | |
4336 | |
3730 | 4337 static void oscar_cancel_direct_im(struct ask_do_dir_im *data) { |
2086 | 4338 g_free(data); |
4339 } | |
4340 | |
3730 | 4341 static void oscar_direct_im(struct ask_do_dir_im *data) { |
2086 | 4342 struct gaim_connection *gc = data->gc; |
4343 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
4344 struct direct_im *dim; | |
4345 | |
4346 dim = find_direct_im(od, data->who); | |
4347 if (dim) { | |
3008 | 4348 if (!(dim->connected)) { /* We'll free the old, unconnected dim, and start over */ |
4349 od->direct_ims = g_slist_remove(od->direct_ims, dim); | |
4350 gaim_input_remove(dim->watcher); | |
4351 g_free(dim); | |
4352 debug_printf("Gave up on old direct IM, trying again\n"); | |
4353 } else { | |
3427 | 4354 do_error_dialog("DirectIM already open.", NULL, GAIM_ERROR); |
3008 | 4355 return; |
4356 } | |
2086 | 4357 } |
4358 dim = g_new0(struct direct_im, 1); | |
4359 dim->gc = gc; | |
4360 g_snprintf(dim->name, sizeof dim->name, "%s", data->who); | |
4361 | |
2717
03bf072c6238
[gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2713
diff
changeset
|
4362 dim->conn = aim_directim_initiate(od->sess, data->who); |
2086 | 4363 if (dim->conn != NULL) { |
4364 od->direct_ims = g_slist_append(od->direct_ims, dim); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
4365 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, |
2086 | 4366 oscar_callback, dim->conn); |
4367 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINITIATE, | |
4368 gaim_directim_initiate, 0); | |
4369 } else { | |
3427 | 4370 do_error_dialog(_("Unable to open Direct IM"), NULL, GAIM_ERROR); |
2086 | 4371 g_free(dim); |
4372 } | |
4373 } | |
4374 | |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4375 static void oscar_ask_direct_im(struct gaim_connection *gc, gchar *who) { |
2086 | 4376 char buf[BUF_LONG]; |
4377 struct ask_do_dir_im *data = g_new0(struct ask_do_dir_im, 1); | |
4378 data->who = who; | |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4379 data->gc = gc; |
3730 | 4380 g_snprintf(buf, sizeof(buf), _("You have selected to open a Direct IM connection with %s."), who); |
4381 do_ask_dialog(buf, _("Because this reveals your IP address, it may be considered a privacy risk. Do you wish to continue?"), data, _("Connect"), oscar_direct_im, _("Cancel"), oscar_cancel_direct_im); | |
2086 | 4382 } |
4383 | |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4384 static void oscar_get_away_msg(struct gaim_connection *gc, char *who) { |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4385 struct oscar_data *od = gc->proto_data; |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4386 od->evilhack = g_slist_append(od->evilhack, g_strdup(normalize(who))); |
3212 | 4387 if (od->icq) { |
4388 struct buddy *budlight = find_buddy(gc, who); | |
4389 if (budlight) | |
3595 | 4390 if ((budlight->uc >> 16) & (AIM_ICQ_STATE_AWAY || AIM_ICQ_STATE_DND || AIM_ICQ_STATE_OUT || AIM_ICQ_STATE_BUSY || AIM_ICQ_STATE_CHAT)) |
3212 | 4391 if (budlight->caps & AIM_CAPS_ICQSERVERRELAY) |
3595 | 4392 aim_send_im_ch2_geticqmessage(od->sess, who, (budlight->uc & 0xffff0000) >> 16); |
3212 | 4393 else { |
3595 | 4394 char *state_msg = gaim_icq_status((budlight->uc & 0xffff0000) >> 16); |
3212 | 4395 char *dialog_msg = g_strdup_printf(_("<B>UIN:</B> %s<BR><B>Status:</B> %s<BR><HR><BR><I>Remote client does not support sending status messages.</I><BR>"), who, state_msg); |
4396 g_show_info_text(gc, who, 2, dialog_msg, NULL); | |
4397 free(state_msg); | |
4398 free(dialog_msg); | |
4399 } | |
4400 else { | |
3595 | 4401 char *state_msg = gaim_icq_status((budlight->uc & 0xffff0000) >> 16); |
3212 | 4402 char *dialog_msg = g_strdup_printf(_("<B>UIN:</B> %s<BR><B>Status:</B> %s<BR><HR><BR><I>User has no status message.</I><BR>"), who, state_msg); |
4403 g_show_info_text(gc, who, 2, dialog_msg, NULL); | |
4404 free(state_msg); | |
4405 free(dialog_msg); | |
4406 } | |
4407 else | |
3427 | 4408 do_error_dialog("Could not find contact in local list, therefore unable to request status message.\n", NULL, GAIM_ERROR); |
3212 | 4409 } else |
4410 oscar_get_info(gc, who); | |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4411 } |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4412 |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4413 static GList *oscar_buddy_menu(struct gaim_connection *gc, char *who) { |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4414 GList *m = NULL; |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4415 struct proto_buddy_menu *pbm; |
2086 | 4416 char *n = g_strdup(normalize(gc->username)); |
2833
cdbe6e2f0ff2
[gaim-migrate @ 2846]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2822
diff
changeset
|
4417 struct oscar_data *odata = gc->proto_data; |
2086 | 4418 |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4419 pbm = g_new0(struct proto_buddy_menu, 1); |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4420 pbm->label = _("Get Info"); |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4421 pbm->callback = oscar_get_info; |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4422 pbm->gc = gc; |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4423 m = g_list_append(m, pbm); |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4424 |
3212 | 4425 if (odata->icq) { |
4426 pbm = g_new0(struct proto_buddy_menu, 1); | |
4427 pbm->label = _("Get Status Msg"); | |
4428 pbm->callback = oscar_get_away_msg; | |
4429 pbm->gc = gc; | |
4430 m = g_list_append(m, pbm); | |
4431 } else { | |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4432 pbm = g_new0(struct proto_buddy_menu, 1); |
2833
cdbe6e2f0ff2
[gaim-migrate @ 2846]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2822
diff
changeset
|
4433 pbm->label = _("Get Away Msg"); |
cdbe6e2f0ff2
[gaim-migrate @ 2846]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2822
diff
changeset
|
4434 pbm->callback = oscar_get_away_msg; |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4435 pbm->gc = gc; |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4436 m = g_list_append(m, pbm); |
2833
cdbe6e2f0ff2
[gaim-migrate @ 2846]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2822
diff
changeset
|
4437 |
cdbe6e2f0ff2
[gaim-migrate @ 2846]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2822
diff
changeset
|
4438 if (strcmp(n, normalize(who))) { |
cdbe6e2f0ff2
[gaim-migrate @ 2846]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2822
diff
changeset
|
4439 pbm = g_new0(struct proto_buddy_menu, 1); |
cdbe6e2f0ff2
[gaim-migrate @ 2846]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2822
diff
changeset
|
4440 pbm->label = _("Direct IM"); |
cdbe6e2f0ff2
[gaim-migrate @ 2846]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2822
diff
changeset
|
4441 pbm->callback = oscar_ask_direct_im; |
cdbe6e2f0ff2
[gaim-migrate @ 2846]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2822
diff
changeset
|
4442 pbm->gc = gc; |
cdbe6e2f0ff2
[gaim-migrate @ 2846]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2822
diff
changeset
|
4443 m = g_list_append(m, pbm); |
3752 | 4444 |
4445 pbm = g_new0(struct proto_buddy_menu, 1); | |
4446 pbm->label = _("Send File"); | |
4447 pbm->callback = oscar_ask_send_file; | |
4448 pbm->gc = gc; | |
4449 m = g_list_append(m, pbm); | |
2833
cdbe6e2f0ff2
[gaim-migrate @ 2846]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2822
diff
changeset
|
4450 } |
2086 | 4451 } |
2920 | 4452 |
4453 pbm = g_new0(struct proto_buddy_menu, 1); | |
4454 pbm->label = _("Get Capabilities"); | |
4455 pbm->callback = oscar_get_caps; | |
4456 pbm->gc = gc; | |
4457 m = g_list_append(m, pbm); | |
4458 | |
2086 | 4459 g_free(n); |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4460 |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4461 return m; |
2086 | 4462 } |
4463 | |
3456 | 4464 static GList *oscar_edit_buddy_menu(struct gaim_connection *gc, char *who) |
4465 { | |
4466 GList *m = NULL; | |
4467 struct proto_buddy_menu *pbm; | |
4468 struct oscar_data *odata = gc->proto_data; | |
4469 | |
4470 if (odata->icq) { | |
4471 pbm = g_new0(struct proto_buddy_menu, 1); | |
4472 pbm->label = _("Get Info"); | |
4473 pbm->callback = oscar_get_info; | |
4474 pbm->gc = gc; | |
4475 m = g_list_append(m, pbm); | |
4476 } | |
4477 | |
4478 return m; | |
4479 } | |
4480 | |
2086 | 4481 static void oscar_set_permit_deny(struct gaim_connection *gc) { |
4482 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
2995 | 4483 if (od->icq) { |
4484 GSList *list; | |
4485 char buf[MAXMSGLEN]; | |
4486 int at; | |
4487 | |
4488 switch(gc->permdeny) { | |
4489 case 1: | |
4490 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_DENYADD, gc->username); | |
4491 break; | |
4492 case 2: | |
4493 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_PERMITADD, gc->username); | |
4494 break; | |
4495 case 3: | |
4496 list = gc->permit; | |
4497 at = 0; | |
4498 while (list) { | |
4499 at += g_snprintf(buf + at, sizeof(buf) - at, "%s&", (char *)list->data); | |
4500 list = list->next; | |
4501 } | |
4502 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_PERMITADD, buf); | |
4503 break; | |
4504 case 4: | |
4505 list = gc->deny; | |
4506 at = 0; | |
4507 while (list) { | |
4508 at += g_snprintf(buf + at, sizeof(buf) - at, "%s&", (char *)list->data); | |
4509 list = list->next; | |
4510 } | |
4511 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_DENYADD, buf); | |
4512 break; | |
4513 default: | |
4514 break; | |
2086 | 4515 } |
2995 | 4516 signoff_blocked(gc); |
4517 } else { | |
4518 if (od->sess->ssi.received_data) | |
3210 | 4519 aim_ssi_setpermdeny(od->sess, od->conn, gc->permdeny, 0xffffffff); |
2086 | 4520 } |
4521 } | |
4522 | |
4523 static void oscar_add_permit(struct gaim_connection *gc, char *who) { | |
2991 | 4524 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
2995 | 4525 if (od->icq) { |
4526 if (gc->permdeny != 3) return; | |
4527 oscar_set_permit_deny(gc); | |
4528 } else { | |
4529 debug_printf("ssi: About to add a permit\n"); | |
4530 if (od->sess->ssi.received_data) | |
3466 | 4531 aim_ssi_addpord(od->sess, od->conn, (const char **) &who, 1, AIM_SSI_TYPE_PERMIT); |
2995 | 4532 } |
2086 | 4533 } |
4534 | |
4535 static void oscar_add_deny(struct gaim_connection *gc, char *who) { | |
2991 | 4536 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
2995 | 4537 if (od->icq) { |
4538 if (gc->permdeny != 4) return; | |
4539 oscar_set_permit_deny(gc); | |
4540 } else { | |
4541 debug_printf("ssi: About to add a deny\n"); | |
4542 if (od->sess->ssi.received_data) | |
3466 | 4543 aim_ssi_addpord(od->sess, od->conn, (const char **) &who, 1, AIM_SSI_TYPE_DENY); |
2995 | 4544 } |
2086 | 4545 } |
4546 | |
4547 static void oscar_rem_permit(struct gaim_connection *gc, char *who) { | |
2991 | 4548 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
2995 | 4549 if (od->icq) { |
4550 if (gc->permdeny != 3) return; | |
4551 oscar_set_permit_deny(gc); | |
4552 } else { | |
4553 debug_printf("ssi: About to delete a permit\n"); | |
4554 if (od->sess->ssi.received_data) | |
3595 | 4555 aim_ssi_delpord(od->sess, od->conn, (const char **) &who, 1, AIM_SSI_TYPE_PERMIT); |
2995 | 4556 } |
2086 | 4557 } |
4558 | |
4559 static void oscar_rem_deny(struct gaim_connection *gc, char *who) { | |
2991 | 4560 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
2995 | 4561 if (od->icq) { |
4562 if (gc->permdeny != 4) return; | |
4563 oscar_set_permit_deny(gc); | |
4564 } else { | |
4565 debug_printf("ssi: About to delete a deny\n"); | |
4566 if (od->sess->ssi.received_data) | |
3595 | 4567 aim_ssi_delpord(od->sess, od->conn, (const char **) &who, 1, AIM_SSI_TYPE_DENY); |
2995 | 4568 } |
2086 | 4569 } |
4570 | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4571 static GList *oscar_away_states(struct gaim_connection *gc) |
2086 | 4572 { |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4573 struct oscar_data *od = gc->proto_data; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4574 GList *m = NULL; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4575 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4576 if (!od->icq) |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4577 return g_list_append(m, GAIM_AWAY_CUSTOM); |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4578 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4579 m = g_list_append(m, "Online"); |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4580 m = g_list_append(m, "Away"); |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4581 m = g_list_append(m, "Do Not Disturb"); |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4582 m = g_list_append(m, "Not Available"); |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4583 m = g_list_append(m, "Occupied"); |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4584 m = g_list_append(m, "Free For Chat"); |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4585 m = g_list_append(m, "Invisible"); |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4586 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4587 return m; |
2086 | 4588 } |
4589 | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4590 static void oscar_change_email(struct gaim_connection *gc, char *email) |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4591 { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4592 struct oscar_data *od = gc->proto_data; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4593 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4594 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4595 if (conn) { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4596 aim_admin_setemail(od->sess, conn, email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4597 } else { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4598 od->setemail = TRUE; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4599 od->email = g_strdup(email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4600 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4601 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4602 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4603 |
2979 | 4604 static void oscar_format_screenname(struct gaim_connection *gc, char *nick) { |
4605 struct oscar_data *od = gc->proto_data; | |
3031 | 4606 if (!strcmp(normalize(nick), normalize(gc->username))) { |
2979 | 4607 if (!aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH)) { |
4608 od->setnick = TRUE; | |
4609 od->newsn = g_strdup(nick); | |
4610 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
4611 } else { | |
4612 aim_admin_setnick(od->sess, aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH), nick); | |
4613 } | |
4614 } else { | |
3427 | 4615 do_error_dialog("The new formatting is invalid.", |
4616 "Screenname formatting can change only capitalization and whitespace.", GAIM_ERROR); | |
2979 | 4617 } |
4618 } | |
4619 | |
2086 | 4620 static void oscar_do_action(struct gaim_connection *gc, char *act) |
4621 { | |
4622 struct oscar_data *od = gc->proto_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4623 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); |
2086 | 4624 |
4625 if (!strcmp(act, "Set User Info")) { | |
4626 show_set_info(gc); | |
4627 } else if (!strcmp(act, "Change Password")) { | |
4628 show_change_passwd(gc); | |
2979 | 4629 } else if (!strcmp(act, "Format Screenname")) { |
4630 do_prompt_dialog("New screenname formatting:", | |
4631 gc->displayname, gc, oscar_format_screenname, NULL); | |
2086 | 4632 } else if (!strcmp(act, "Confirm Account")) { |
4633 if (!conn) { | |
4634 od->conf = TRUE; | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4635 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); |
2086 | 4636 } else |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4637 aim_admin_reqconfirm(od->sess, conn); |
2086 | 4638 } else if (!strcmp(act, "Display Current Registered Address")) { |
4639 if (!conn) { | |
4640 od->reqemail = TRUE; | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4641 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); |
2086 | 4642 } else |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4643 aim_admin_getinfo(od->sess, conn, 0x11); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4644 } else if (!strcmp(act, "Change Current Registered Address")) { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4645 do_prompt_dialog("Change Address To: ", NULL, gc, oscar_change_email, NULL); |
2086 | 4646 } else if (!strcmp(act, "Search for Buddy by Email")) { |
4647 show_find_email(gc); | |
4648 } | |
4649 } | |
4650 | |
4651 static GList *oscar_actions() | |
4652 { | |
4653 GList *m = NULL; | |
4654 | |
4655 m = g_list_append(m, "Set User Info"); | |
4656 m = g_list_append(m, NULL); | |
4657 m = g_list_append(m, "Change Password"); | |
2979 | 4658 m = g_list_append(m, "Format Screenname"); |
2086 | 4659 m = g_list_append(m, "Confirm Account"); |
4660 m = g_list_append(m, "Display Current Registered Address"); | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4661 m = g_list_append(m, "Change Current Registered Address"); |
2086 | 4662 m = g_list_append(m, NULL); |
4663 m = g_list_append(m, "Search for Buddy by Email"); | |
4664 | |
4665 return m; | |
4666 } | |
4667 | |
3466 | 4668 static void oscar_change_passwd(struct gaim_connection *gc, const char *old, const char *new) |
2086 | 4669 { |
4670 struct oscar_data *od = gc->proto_data; | |
4671 if (!aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH)) { | |
4672 od->chpass = TRUE; | |
4673 od->oldp = g_strdup(old); | |
4674 od->newp = g_strdup(new); | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4675 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); |
2086 | 4676 } else { |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4677 aim_admin_changepasswd(od->sess, aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH), |
2086 | 4678 new, old); |
4679 } | |
4680 } | |
4681 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4682 static void oscar_convo_closed(struct gaim_connection *gc, char *who) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4683 { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4684 struct oscar_data *od = gc->proto_data; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4685 struct direct_im *dim = find_direct_im(od, who); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4686 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4687 if (!dim) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4688 return; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4689 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4690 od->direct_ims = g_slist_remove(od->direct_ims, dim); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4691 gaim_input_remove(dim->watcher); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4692 aim_conn_kill(od->sess, &dim->conn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4693 g_free(dim); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4694 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4695 |
3035 | 4696 |
4697 | |
2086 | 4698 static struct prpl *my_protocol = NULL; |
4699 | |
3630 | 4700 G_MODULE_EXPORT void oscar_init(struct prpl *ret) { |
3572 | 4701 struct proto_user_opt *puo; |
2086 | 4702 ret->protocol = PROTO_OSCAR; |
3694 | 4703 ret->options = OPT_PROTO_MAIL_CHECK | OPT_PROTO_BUDDY_ICON | OPT_PROTO_IM_IMAGE; |
3572 | 4704 ret->name = g_strdup("Oscar"); |
2086 | 4705 ret->list_icon = oscar_list_icon; |
4706 ret->away_states = oscar_away_states; | |
4707 ret->actions = oscar_actions; | |
4708 ret->do_action = oscar_do_action; | |
4709 ret->buddy_menu = oscar_buddy_menu; | |
3456 | 4710 ret->edit_buddy_menu = oscar_edit_buddy_menu; |
2086 | 4711 ret->login = oscar_login; |
4712 ret->close = oscar_close; | |
4713 ret->send_im = oscar_send_im; | |
2993 | 4714 ret->send_typing = oscar_send_typing; |
2086 | 4715 ret->set_info = oscar_set_info; |
4716 ret->get_info = oscar_get_info; | |
4717 ret->set_away = oscar_set_away; | |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4718 ret->get_away = oscar_get_away; |
2086 | 4719 ret->set_dir = oscar_set_dir; |
4720 ret->get_dir = NULL; /* Oscar really doesn't have this */ | |
4721 ret->dir_search = oscar_dir_search; | |
4722 ret->set_idle = oscar_set_idle; | |
4723 ret->change_passwd = oscar_change_passwd; | |
4724 ret->add_buddy = oscar_add_buddy; | |
4725 ret->add_buddies = oscar_add_buddies; | |
3140 | 4726 ret->group_buddy = oscar_move_buddy; |
3348 | 4727 ret->rename_group = oscar_rename_group; |
3630 | 4728 ret->file_transfer_cancel = oscar_cancel_transfer; |
4729 ret->file_transfer_in = oscar_start_transfer_in; | |
4730 ret->file_transfer_out = oscar_start_transfer_out; | |
4731 ret->file_transfer_data_chunk = oscar_transfer_data_chunk; | |
4732 ret->file_transfer_nextfile = oscar_transfer_nextfile; | |
4733 ret->file_transfer_done = oscar_transfer_done; | |
2086 | 4734 ret->remove_buddy = oscar_remove_buddy; |
2991 | 4735 ret->remove_buddies = oscar_remove_buddies; |
2086 | 4736 ret->add_permit = oscar_add_permit; |
4737 ret->add_deny = oscar_add_deny; | |
4738 ret->rem_permit = oscar_rem_permit; | |
4739 ret->rem_deny = oscar_rem_deny; | |
4740 ret->set_permit_deny = oscar_set_permit_deny; | |
4741 ret->warn = oscar_warn; | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4742 ret->chat_info = oscar_chat_info; |
2086 | 4743 ret->join_chat = oscar_join_chat; |
4744 ret->chat_invite = oscar_chat_invite; | |
4745 ret->chat_leave = oscar_chat_leave; | |
4746 ret->chat_whisper = NULL; | |
4747 ret->chat_send = oscar_chat_send; | |
4748 ret->keepalive = oscar_keepalive; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4749 ret->convo_closed = oscar_convo_closed; |
2086 | 4750 |
3572 | 4751 puo = g_new0(struct proto_user_opt, 1); |
4752 puo->label = g_strdup("Auth Host:"); | |
4753 puo->def = g_strdup("login.oscar.aol.com"); | |
4754 puo->pos = USEROPT_AUTH; | |
4755 ret->user_opts = g_list_append(ret->user_opts, puo); | |
4756 | |
4757 puo = g_new0(struct proto_user_opt, 1); | |
4758 puo->label = g_strdup("Auth Port:"); | |
4759 puo->def = g_strdup("5190"); | |
4760 puo->pos = USEROPT_AUTHPORT; | |
4761 ret->user_opts = g_list_append(ret->user_opts, puo); | |
4762 | |
2086 | 4763 my_protocol = ret; |
4764 } | |
4765 | |
4766 #ifndef STATIC | |
4767 | |
3630 | 4768 G_MODULE_EXPORT void gaim_prpl_init(struct prpl *prpl) |
2086 | 4769 { |
3572 | 4770 oscar_init(prpl); |
4771 prpl->plug->desc.api_version = PLUGIN_API_VERSION; | |
2086 | 4772 } |
4773 | |
4774 #endif |