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