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