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