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