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