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