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