Mercurial > pidgin
annotate src/protocols/oscar/oscar.c @ 8461:16485e87b7bb
[gaim-migrate @ 9191]
Fix a problem displaying AIM tooltips with the dude or chick has an
away message containing an unmatched <
This breaks the string freeze horrendously. I'm afraid every string
for every language will have to be retranslated. Sorry.
Just kidding.
Really.
Don't hate me because I'm beautiful.
This commit brought to you by the follow quote:
"Chewie, take the professor in the back and plug him into the hyperdrive."
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Wed, 17 Mar 2004 02:25:03 +0000 |
parents | d9cf0c2f4339 |
children | e8aa46291f64 |
rev | line source |
---|---|
2086 | 1 /* |
2 * gaim | |
3 * | |
4 * Some code copyright (C) 1998-1999, Mark Spencer <markster@marko.net> | |
6302 | 5 * Some code copyright (C) 1999-2001, Eric Warmenhoven |
6 * Some code copyright (C) 2001-2003, Sean Egan | |
8151 | 7 * Some code copyright (C) 2001-2004, Mark Doliner <thekingant@users.sourceforge.net> |
6302 | 8 * |
9 * Most libfaim code copyright (C) 1998-2001 Adam Fritzler <afritz@auk.cx> | |
8151 | 10 * Some libfaim code copyright (C) 2001-2004 Mark Doliner <thekingant@users.sourceforge.net> |
2086 | 11 * |
12 * This program is free software; you can redistribute it and/or modify | |
13 * it under the terms of the GNU General Public License as published by | |
14 * the Free Software Foundation; either version 2 of the License, or | |
15 * (at your option) any later version. | |
16 * | |
17 * This program is distributed in the hope that it will be useful, | |
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
20 * GNU General Public License for more details. | |
21 * | |
22 * You should have received a copy of the GNU General Public License | |
23 * along with this program; if not, write to the Free Software | |
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
25 * | |
26 */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
27 #include "internal.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
28 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
29 #include "account.h" |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
30 #include "accountopt.h" |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
31 #include "buddyicon.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
32 #include "conversation.h" |
7083
3100a6e03644
[gaim-migrate @ 7648]
Christian Hammond <chipx86@chipx86.com>
parents:
7082
diff
changeset
|
33 #include "core.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
34 #include "debug.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
35 #include "ft.h" |
6982 | 36 #include "imgstore.h" |
2086 | 37 #include "multi.h" |
8231
f50c059b6384
[gaim-migrate @ 8954]
Christian Hammond <chipx86@chipx86.com>
parents:
8227
diff
changeset
|
38 #include "network.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
39 #include "notify.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
40 #include "privacy.h" |
2086 | 41 #include "prpl.h" |
4889 | 42 #include "proxy.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
43 #include "request.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
44 #include "util.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
45 |
2086 | 46 #include "aim.h" |
5842 | 47 #include "md5.h" |
2086 | 48 |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
49 #define UC_AOL 0x02 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
50 #define UC_ADMIN 0x04 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
51 #define UC_UNCONFIRMED 0x08 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
52 #define UC_NORMAL 0x10 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
53 #define UC_AB 0x20 |
3079 | 54 #define UC_WIRELESS 0x40 |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
55 |
2086 | 56 #define AIMHASHDATA "http://gaim.sourceforge.net/aim_data.php3" |
57 | |
7283 | 58 #define OSCAR_CONNECT_STEPS 6 |
59 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
60 static GaimPlugin *my_protocol = NULL; |
4249 | 61 |
7376 | 62 static int caps_aim = AIM_CAPS_CHAT | AIM_CAPS_BUDDYICON | AIM_CAPS_DIRECTIM | AIM_CAPS_SENDFILE | AIM_CAPS_INTEROPERATE | AIM_CAPS_ICHAT; |
63 static int caps_icq = AIM_CAPS_BUDDYICON | AIM_CAPS_DIRECTIM | AIM_CAPS_SENDFILE | AIM_CAPS_ICQUTF8 | AIM_CAPS_INTEROPERATE | AIM_CAPS_ICHAT; | |
3458 | 64 |
4665 | 65 static fu8_t features_aim[] = {0x01, 0x01, 0x01, 0x02}; |
66 static fu8_t features_icq[] = {0x01, 0x06}; | |
8341 | 67 static fu8_t ck[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; |
2086 | 68 |
7283 | 69 typedef struct _OscarData OscarData; |
70 struct _OscarData { | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
71 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
72 aim_conn_t *conn; |
2086 | 73 |
74 guint cnpa; | |
75 guint paspa; | |
3694 | 76 guint emlpa; |
4804 | 77 guint icopa; |
2086 | 78 |
4823 | 79 gboolean iconconnecting; |
5842 | 80 gboolean set_icon; |
4823 | 81 |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
82 GSList *create_rooms; |
2086 | 83 |
84 gboolean conf; | |
85 gboolean reqemail; | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
86 gboolean setemail; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
87 char *email; |
2979 | 88 gboolean setnick; |
89 char *newsn; | |
2086 | 90 gboolean chpass; |
91 char *oldp; | |
92 char *newp; | |
5842 | 93 |
2086 | 94 GSList *oscar_chats; |
95 GSList *direct_ims; | |
3630 | 96 GSList *file_transfers; |
4738 | 97 GHashTable *buddyinfo; |
4804 | 98 GSList *requesticon; |
2086 | 99 |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
100 gboolean killme; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
101 gboolean icq; |
4804 | 102 guint icontimer; |
5968 | 103 guint getblisttimer; |
8341 | 104 guint getinfotimer; |
2993 | 105 |
106 struct { | |
4230 | 107 guint maxwatchers; /* max users who can watch you */ |
2993 | 108 guint maxbuddies; /* max users you can watch */ |
4230 | 109 guint maxgroups; /* max groups in server list */ |
2993 | 110 guint maxpermits; /* max users on permit list */ |
111 guint maxdenies; /* max users on deny list */ | |
112 guint maxsiglen; /* max size (bytes) of profile */ | |
113 guint maxawaymsglen; /* max size (bytes) of posted away message */ | |
114 } rights; | |
2086 | 115 }; |
116 | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
117 struct create_room { |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
118 char *name; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
119 int exchange; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
120 }; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
121 |
2086 | 122 struct chat_connection { |
123 char *name; | |
124 char *show; /* AOL did something funny to us */ | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
125 fu16_t exchange; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
126 fu16_t instance; |
2086 | 127 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
|
128 aim_conn_t *conn; |
2086 | 129 int inpa; |
130 int id; | |
5575 | 131 GaimConnection *gc; /* i hate this. */ |
5679 | 132 GaimConversation *cnv; /* bah. */ |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
133 int maxlen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
134 int maxvis; |
2086 | 135 }; |
136 | |
137 struct direct_im { | |
5575 | 138 GaimConnection *gc; |
2086 | 139 char name[80]; |
140 int watcher; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
141 aim_conn_t *conn; |
3008 | 142 gboolean connected; |
2086 | 143 }; |
144 | |
145 struct ask_direct { | |
5575 | 146 GaimConnection *gc; |
2086 | 147 char *sn; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
148 char ip[64]; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
149 fu8_t cookie[8]; |
2086 | 150 }; |
151 | |
7011 | 152 /* |
153 * Various PRPL-specific buddy info that we want to keep track of | |
154 * Some other info is maintained by locate.c, and I'd like to move | |
155 * the rest of this to libfaim, mostly im.c | |
156 */ | |
4738 | 157 struct buddyinfo { |
158 gboolean typingnot; | |
6292 | 159 gchar *availmsg; |
6857 | 160 fu32_t ipaddr; |
5836 | 161 |
162 unsigned long ico_me_len; | |
163 unsigned long ico_me_csum; | |
164 time_t ico_me_time; | |
165 gboolean ico_informed; | |
4738 | 166 |
167 unsigned long ico_len; | |
168 unsigned long ico_csum; | |
169 time_t ico_time; | |
170 gboolean ico_need; | |
7406 | 171 gboolean ico_sent; |
2086 | 172 }; |
173 | |
4230 | 174 struct name_data { |
5575 | 175 GaimConnection *gc; |
4230 | 176 gchar *name; |
3453 | 177 gchar *nick; |
3141 | 178 }; |
179 | |
5129 | 180 static char *msgerrreason[] = { |
181 N_("Invalid error"), | |
182 N_("Invalid SNAC"), | |
183 N_("Rate to host"), | |
184 N_("Rate to client"), | |
185 N_("Not logged in"), | |
186 N_("Service unavailable"), | |
187 N_("Service not defined"), | |
188 N_("Obsolete SNAC"), | |
189 N_("Not supported by host"), | |
190 N_("Not supported by client"), | |
191 N_("Refused by client"), | |
192 N_("Reply too big"), | |
193 N_("Responses lost"), | |
194 N_("Request denied"), | |
195 N_("Busted SNAC payload"), | |
196 N_("Insufficient rights"), | |
197 N_("In local permit/deny"), | |
198 N_("Too evil (sender)"), | |
199 N_("Too evil (receiver)"), | |
200 N_("User temporarily unavailable"), | |
201 N_("No match"), | |
202 N_("List overflow"), | |
203 N_("Request ambiguous"), | |
204 N_("Queue full"), | |
205 N_("Not while on AOL") | |
206 }; | |
207 static int msgerrreasonlen = 25; | |
208 | |
209 /* All the libfaim->gaim callback functions */ | |
210 static int gaim_parse_auth_resp (aim_session_t *, aim_frame_t *, ...); | |
211 static int gaim_parse_login (aim_session_t *, aim_frame_t *, ...); | |
212 static int gaim_handle_redirect (aim_session_t *, aim_frame_t *, ...); | |
213 static int gaim_info_change (aim_session_t *, aim_frame_t *, ...); | |
214 static int gaim_account_confirm (aim_session_t *, aim_frame_t *, ...); | |
215 static int gaim_parse_oncoming (aim_session_t *, aim_frame_t *, ...); | |
216 static int gaim_parse_offgoing (aim_session_t *, aim_frame_t *, ...); | |
217 static int gaim_parse_incoming_im(aim_session_t *, aim_frame_t *, ...); | |
218 static int gaim_parse_misses (aim_session_t *, aim_frame_t *, ...); | |
219 static int gaim_parse_clientauto (aim_session_t *, aim_frame_t *, ...); | |
7011 | 220 static int gaim_parse_userinfo (aim_session_t *, aim_frame_t *, ...); |
8341 | 221 static int gaim_reqinfo_timeout (aim_session_t *, aim_frame_t *, ...); |
5129 | 222 static int gaim_parse_motd (aim_session_t *, aim_frame_t *, ...); |
223 static int gaim_chatnav_info (aim_session_t *, aim_frame_t *, ...); | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
224 static int gaim_conv_chat_join (aim_session_t *, aim_frame_t *, ...); |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
225 static int gaim_conv_chat_leave (aim_session_t *, aim_frame_t *, ...); |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
226 static int gaim_conv_chat_info_update (aim_session_t *, aim_frame_t *, ...); |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
227 static int gaim_conv_chat_incoming_msg(aim_session_t *, aim_frame_t *, ...); |
5129 | 228 static int gaim_email_parseupdate(aim_session_t *, aim_frame_t *, ...); |
229 static int gaim_icon_error (aim_session_t *, aim_frame_t *, ...); | |
230 static int gaim_icon_parseicon (aim_session_t *, aim_frame_t *, ...); | |
5844 | 231 static int oscar_icon_req (aim_session_t *, aim_frame_t *, ...); |
5129 | 232 static int gaim_parse_msgack (aim_session_t *, aim_frame_t *, ...); |
233 static int gaim_parse_ratechange (aim_session_t *, aim_frame_t *, ...); | |
234 static int gaim_parse_evilnotify (aim_session_t *, aim_frame_t *, ...); | |
235 static int gaim_parse_searcherror(aim_session_t *, aim_frame_t *, ...); | |
236 static int gaim_parse_searchreply(aim_session_t *, aim_frame_t *, ...); | |
237 static int gaim_bosrights (aim_session_t *, aim_frame_t *, ...); | |
238 static int gaim_connerr (aim_session_t *, aim_frame_t *, ...); | |
239 static int conninitdone_admin (aim_session_t *, aim_frame_t *, ...); | |
240 static int conninitdone_bos (aim_session_t *, aim_frame_t *, ...); | |
241 static int conninitdone_chatnav (aim_session_t *, aim_frame_t *, ...); | |
242 static int conninitdone_chat (aim_session_t *, aim_frame_t *, ...); | |
243 static int conninitdone_email (aim_session_t *, aim_frame_t *, ...); | |
244 static int conninitdone_icon (aim_session_t *, aim_frame_t *, ...); | |
245 static int gaim_parse_msgerr (aim_session_t *, aim_frame_t *, ...); | |
246 static int gaim_parse_mtn (aim_session_t *, aim_frame_t *, ...); | |
247 static int gaim_parse_locaterights(aim_session_t *, aim_frame_t *, ...); | |
248 static int gaim_parse_buddyrights(aim_session_t *, aim_frame_t *, ...); | |
249 static int gaim_parse_locerr (aim_session_t *, aim_frame_t *, ...); | |
250 static int gaim_icbm_param_info (aim_session_t *, aim_frame_t *, ...); | |
251 static int gaim_parse_genericerr (aim_session_t *, aim_frame_t *, ...); | |
252 static int gaim_memrequest (aim_session_t *, aim_frame_t *, ...); | |
253 static int gaim_selfinfo (aim_session_t *, aim_frame_t *, ...); | |
254 static int gaim_offlinemsg (aim_session_t *, aim_frame_t *, ...); | |
255 static int gaim_offlinemsgdone (aim_session_t *, aim_frame_t *, ...); | |
256 static int gaim_icqalias (aim_session_t *, aim_frame_t *, ...); | |
257 static int gaim_icqinfo (aim_session_t *, aim_frame_t *, ...); | |
258 static int gaim_popup (aim_session_t *, aim_frame_t *, ...); | |
259 #ifndef NOSSI | |
260 static int gaim_ssi_parseerr (aim_session_t *, aim_frame_t *, ...); | |
261 static int gaim_ssi_parserights (aim_session_t *, aim_frame_t *, ...); | |
262 static int gaim_ssi_parselist (aim_session_t *, aim_frame_t *, ...); | |
263 static int gaim_ssi_parseack (aim_session_t *, aim_frame_t *, ...); | |
8227 | 264 static int gaim_ssi_parseadd (aim_session_t *, aim_frame_t *, ...); |
5129 | 265 static int gaim_ssi_authgiven (aim_session_t *, aim_frame_t *, ...); |
266 static int gaim_ssi_authrequest (aim_session_t *, aim_frame_t *, ...); | |
267 static int gaim_ssi_authreply (aim_session_t *, aim_frame_t *, ...); | |
268 static int gaim_ssi_gotadded (aim_session_t *, aim_frame_t *, ...); | |
269 #endif | |
270 | |
271 /* for DirectIM/image transfer */ | |
272 static int gaim_odc_initiate (aim_session_t *, aim_frame_t *, ...); | |
273 static int gaim_odc_incoming (aim_session_t *, aim_frame_t *, ...); | |
274 static int gaim_odc_typing (aim_session_t *, aim_frame_t *, ...); | |
6982 | 275 static int gaim_odc_update_ui (aim_session_t *, aim_frame_t *, ...); |
5129 | 276 |
277 /* for file transfer */ | |
278 static int oscar_sendfile_estblsh(aim_session_t *, aim_frame_t *, ...); | |
279 static int oscar_sendfile_prompt (aim_session_t *, aim_frame_t *, ...); | |
280 static int oscar_sendfile_ack (aim_session_t *, aim_frame_t *, ...); | |
281 static int oscar_sendfile_done (aim_session_t *, aim_frame_t *, ...); | |
282 | |
283 /* for icons */ | |
284 static gboolean gaim_icon_timerfunc(gpointer data); | |
285 | |
8076 | 286 /* remove these at some point? */ |
7282 | 287 /* Because I don't like forward declarations? I think that was why... */ |
5954 | 288 static void oscar_set_info(GaimConnection *gc, const char *text); |
8076 | 289 static void oscar_set_away(GaimConnection *gc, const char *state, const char *message); |
5306 | 290 |
5836 | 291 static void oscar_free_name_data(struct name_data *data) { |
4230 | 292 g_free(data->name); |
293 g_free(data->nick); | |
294 g_free(data); | |
295 } | |
296 | |
5836 | 297 static void oscar_free_buddyinfo(void *data) { |
298 struct buddyinfo *bi = data; | |
6292 | 299 g_free(bi->availmsg); |
5836 | 300 g_free(bi); |
301 } | |
302 | |
5129 | 303 static fu32_t oscar_encoding_check(const char *utf8) |
304 { | |
305 int i = 0; | |
306 fu32_t encodingflag = 0; | |
307 | |
308 /* Determine how we can send this message. Per the warnings elsewhere | |
309 * in this file, these little checks determine the simplest encoding | |
310 * we can use for a given message send using it. */ | |
311 while (utf8[i]) { | |
312 if ((unsigned char)utf8[i] > 0x7f) { | |
313 /* not ASCII! */ | |
314 encodingflag = AIM_IMFLAGS_ISO_8859_1; | |
315 break; | |
316 } | |
317 i++; | |
318 } | |
319 while (utf8[i]) { | |
320 /* ISO-8859-1 is 0x00-0xbf in the first byte | |
321 * followed by 0xc0-0xc3 in the second */ | |
322 if ((unsigned char)utf8[i] < 0x80) { | |
323 i++; | |
324 continue; | |
325 } else if (((unsigned char)utf8[i] & 0xfc) == 0xc0 && | |
326 ((unsigned char)utf8[i + 1] & 0xc0) == 0x80) { | |
327 i += 2; | |
328 continue; | |
329 } | |
330 encodingflag = AIM_IMFLAGS_UNICODE; | |
331 break; | |
332 } | |
333 | |
334 return encodingflag; | |
335 } | |
336 | |
8225 | 337 /* |
338 * Take a string of the form charset="bleh" where bleh is | |
339 * one of us-ascii, utf-8, iso-8859-1, or unicode-2-0, and | |
340 * return a newly allocated string containing bleh. | |
341 */ | |
342 static gchar *oscar_encoding_extract(const char *encoding) | |
5129 | 343 { |
8225 | 344 gchar *ret = NULL; |
345 char *begin, *end; | |
346 | |
347 /* Make sure encoding begings with charset= */ | |
348 if (strncmp(encoding, "text/aolrtf; charset=", 21)) | |
349 return NULL; | |
350 | |
351 begin = strchr(encoding, '"'); | |
352 end = strrchr(encoding, '"'); | |
353 | |
354 if ((begin == NULL) || (end == NULL) || (begin >= end)) | |
355 return NULL; | |
356 | |
357 ret = g_strndup(begin+1, (end-1) - begin); | |
358 | |
359 return ret; | |
360 } | |
361 | |
362 /* | |
363 * Return the flag specifying the given encoding. | |
364 */ | |
365 static fu32_t oscar_encoding_parse(const char *encoding) | |
366 { | |
367 if ((encoding == NULL) || encoding[0] == '\0') { | |
368 gaim_debug(GAIM_DEBUG_WARNING, "oscar", "Empty encoding, assuming ASCII\n"); | |
5129 | 369 return 0; |
370 } | |
8225 | 371 |
372 if (!strcmp(encoding, "us-ascii") || !strcmp(encoding, "utf-8")) { | |
373 /* UTF-8 is our native encoding, ASCII is a proper subset */ | |
5129 | 374 return 0; |
8225 | 375 } else if (!strcmp(encoding, "iso-8859-1")) { |
5129 | 376 return AIM_IMFLAGS_ISO_8859_1; |
8225 | 377 } else if (!strcmp(encoding, "unicode-2-0")) { |
5129 | 378 return AIM_IMFLAGS_UNICODE; |
379 } else { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
380 gaim_debug(GAIM_DEBUG_WARNING, "oscar", |
8250 | 381 "Unrecognized character encoding '%s', attempting to convert to utf8 anyway\n", encoding); |
382 return 99; | |
5129 | 383 } |
384 } | |
385 | |
8233 | 386 gchar *oscar_encoding_to_utf8(const char *encoding, const char *text, int textlen) |
5129 | 387 { |
388 gchar *utf8 = NULL; | |
389 int flags = oscar_encoding_parse(encoding); | |
390 | |
391 switch (flags) { | |
392 case 0: | |
8250 | 393 utf8 = g_convert(text, textlen, "UTF-8", "UTF-8", NULL, NULL, NULL); |
5129 | 394 break; |
395 case AIM_IMFLAGS_ISO_8859_1: | |
396 utf8 = g_convert(text, textlen, "UTF-8", "ISO-8859-1", NULL, NULL, NULL); | |
397 break; | |
398 case AIM_IMFLAGS_UNICODE: | |
399 utf8 = g_convert(text, textlen, "UTF-8", "UCS-2BE", NULL, NULL, NULL); | |
400 break; | |
8250 | 401 case 99: |
402 utf8 = g_convert(text, textlen, "UTF-8", encoding, NULL, NULL, NULL); | |
403 if (utf8 == NULL) { | |
404 utf8 = g_convert(text, textlen, "UTF-8", "UTF-8", NULL, NULL, NULL); | |
405 } | |
406 break; | |
5129 | 407 } |
408 | |
409 return utf8; | |
410 } | |
411 | |
7283 | 412 static struct direct_im *find_direct_im(OscarData *od, const char *who) { |
2086 | 413 GSList *d = od->direct_ims; |
414 struct direct_im *m = NULL; | |
415 | |
416 while (d) { | |
417 m = (struct direct_im *)d->data; | |
4355 | 418 if (!aim_sncmp(who, m->name)) |
4269 | 419 return m; |
2086 | 420 d = d->next; |
421 } | |
422 | |
4269 | 423 return NULL; |
2086 | 424 } |
425 | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
426 static char *extract_name(const char *name) { |
4121 | 427 char *tmp, *x; |
2086 | 428 int i, j; |
4120 | 429 |
430 if (!name) | |
4121 | 431 return NULL; |
432 | |
4120 | 433 x = strchr(name, '-'); |
4121 | 434 |
2086 | 435 if (!x) return NULL; |
436 x = strchr(++x, '-'); | |
437 if (!x) return NULL; | |
438 tmp = g_strdup(++x); | |
439 | |
440 for (i = 0, j = 0; x[i]; i++) { | |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
441 char hex[3]; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
442 if (x[i] != '%') { |
2086 | 443 tmp[j++] = x[i]; |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
444 continue; |
2086 | 445 } |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
446 strncpy(hex, x + ++i, 2); hex[2] = 0; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
447 i++; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
448 tmp[j++] = strtol(hex, NULL, 16); |
2086 | 449 } |
450 | |
451 tmp[j] = 0; | |
452 return tmp; | |
453 } | |
454 | |
5575 | 455 static struct chat_connection *find_oscar_chat(GaimConnection *gc, int id) { |
7283 | 456 GSList *g = ((OscarData *)gc->proto_data)->oscar_chats; |
2086 | 457 struct chat_connection *c = NULL; |
458 | |
459 while (g) { | |
460 c = (struct chat_connection *)g->data; | |
461 if (c->id == id) | |
462 break; | |
463 g = g->next; | |
464 c = NULL; | |
465 } | |
466 | |
467 return c; | |
468 } | |
469 | |
5575 | 470 static struct chat_connection *find_oscar_chat_by_conn(GaimConnection *gc, |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
471 aim_conn_t *conn) { |
7283 | 472 GSList *g = ((OscarData *)gc->proto_data)->oscar_chats; |
2086 | 473 struct chat_connection *c = NULL; |
474 | |
475 while (g) { | |
476 c = (struct chat_connection *)g->data; | |
477 if (c->conn == conn) | |
478 break; | |
479 g = g->next; | |
480 c = NULL; | |
481 } | |
482 | |
483 return c; | |
484 } | |
485 | |
8219 | 486 static struct chat_connection *find_oscar_chat_by_conv(GaimConnection *gc, |
487 GaimConversation *conv) { | |
488 GSList *g = ((OscarData *)gc->proto_data)->oscar_chats; | |
489 struct chat_connection *c = NULL; | |
490 | |
491 while (g) { | |
492 c = (struct chat_connection *)g->data; | |
493 if (c->cnv == conv) | |
494 break; | |
495 g = g->next; | |
496 c = NULL; | |
497 } | |
498 | |
499 return c; | |
500 } | |
501 | |
4617 | 502 static void gaim_odc_disconnect(aim_session_t *sess, aim_conn_t *conn) { |
5575 | 503 GaimConnection *gc = sess->aux_data; |
7283 | 504 OscarData *od = (OscarData *)gc->proto_data; |
5679 | 505 GaimConversation *cnv; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
506 struct direct_im *dim; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
507 char *sn; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
508 char buf[256]; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
509 |
4617 | 510 sn = g_strdup(aim_odc_getsn(conn)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
511 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
512 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
513 "%s disconnected Direct IM.\n", sn); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
514 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
515 dim = find_direct_im(od, sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
516 od->direct_ims = g_slist_remove(od->direct_ims, dim); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
517 gaim_input_remove(dim->watcher); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
518 |
3008 | 519 if (dim->connected) |
520 g_snprintf(buf, sizeof buf, _("Direct IM with %s closed"), sn); | |
521 else | |
522 g_snprintf(buf, sizeof buf, _("Direct IM with %s failed"), sn); | |
6640
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6623
diff
changeset
|
523 |
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6623
diff
changeset
|
524 cnv = gaim_find_conversation_with_account(sn, gaim_connection_get_account(gc)); |
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6623
diff
changeset
|
525 if (cnv) |
6982 | 526 gaim_conversation_write(cnv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL)); |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
527 |
5579 | 528 gaim_conversation_update_progress(cnv, 0); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
529 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
530 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
|
531 g_free(sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
532 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
533 return; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
534 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
535 |
4617 | 536 static void oscar_callback(gpointer data, gint source, GaimInputCondition condition) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
537 aim_conn_t *conn = (aim_conn_t *)data; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
538 aim_session_t *sess = aim_conn_getsess(conn); |
5575 | 539 GaimConnection *gc = sess ? sess->aux_data : NULL; |
7283 | 540 OscarData *od; |
2086 | 541 |
542 if (!gc) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
543 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
544 "oscar callback for closed connection (1).\n"); |
2086 | 545 return; |
546 } | |
547 | |
7283 | 548 od = (OscarData *)gc->proto_data; |
2086 | 549 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
550 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 551 /* oh boy. this is probably bad. i guess the only thing we |
552 * can really do is return? */ | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
553 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
554 "oscar callback for closed connection (2).\n"); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
555 gaim_debug(GAIM_DEBUG_MISC, "oscar", "gc = %p\n", gc); |
2086 | 556 return; |
557 } | |
558 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
559 if (condition & GAIM_INPUT_READ) { |
4617 | 560 if (conn->type == AIM_CONN_TYPE_LISTENER) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
561 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
562 "got information on rendezvous listener\n"); |
4617 | 563 if (aim_handlerendconnect(od->sess, conn) < 0) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
564 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
565 "connection error (rendezvous listener)\n"); |
4617 | 566 aim_conn_kill(od->sess, &conn); |
8446 | 567 /* AAA - Don't we need to gaim_xfer_cancel here? --marv */ |
2086 | 568 } |
569 } else { | |
4617 | 570 if (aim_get_command(od->sess, conn) >= 0) { |
571 aim_rxdispatch(od->sess); | |
6029 | 572 if (od->killme) { |
573 gaim_debug(GAIM_DEBUG_ERROR, "oscar", "Waiting to be destroyed\n"); | |
574 return; | |
575 } | |
2086 | 576 } else { |
577 if ((conn->type == AIM_CONN_TYPE_BOS) || | |
4617 | 578 !(aim_getconn_type(od->sess, AIM_CONN_TYPE_BOS))) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
579 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
580 "major connection error\n"); |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
581 gaim_connection_error(gc, _("Disconnected.")); |
2086 | 582 } else if (conn->type == AIM_CONN_TYPE_CHAT) { |
583 struct chat_connection *c = find_oscar_chat_by_conn(gc, conn); | |
5420 | 584 char *buf; |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
585 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
586 "disconnected from chat room %s\n", c->name); |
2086 | 587 c->conn = NULL; |
588 if (c->inpa > 0) | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
589 gaim_input_remove(c->inpa); |
2086 | 590 c->inpa = 0; |
591 c->fd = -1; | |
4617 | 592 aim_conn_kill(od->sess, &conn); |
5420 | 593 buf = g_strdup_printf(_("You have been disconnected from chat room %s."), c->name); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
594 gaim_notify_error(gc, NULL, buf, NULL); |
5420 | 595 g_free(buf); |
2086 | 596 } else if (conn->type == AIM_CONN_TYPE_CHATNAV) { |
4617 | 597 if (od->cnpa > 0) |
598 gaim_input_remove(od->cnpa); | |
599 od->cnpa = 0; | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
600 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
601 "removing chatnav input watcher\n"); |
4617 | 602 while (od->create_rooms) { |
603 struct create_room *cr = od->create_rooms->data; | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
604 g_free(cr->name); |
4617 | 605 od->create_rooms = |
606 g_slist_remove(od->create_rooms, cr); | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
607 g_free(cr); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
608 gaim_notify_error(gc, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
609 _("Chat is currently unavailable"), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
610 NULL); |
2086 | 611 } |
4617 | 612 aim_conn_kill(od->sess, &conn); |
2086 | 613 } else if (conn->type == AIM_CONN_TYPE_AUTH) { |
4617 | 614 if (od->paspa > 0) |
615 gaim_input_remove(od->paspa); | |
616 od->paspa = 0; | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
617 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
618 "removing authconn input watcher\n"); |
4617 | 619 aim_conn_kill(od->sess, &conn); |
3694 | 620 } else if (conn->type == AIM_CONN_TYPE_EMAIL) { |
4617 | 621 if (od->emlpa > 0) |
622 gaim_input_remove(od->emlpa); | |
623 od->emlpa = 0; | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
624 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
625 "removing email input watcher\n"); |
4617 | 626 aim_conn_kill(od->sess, &conn); |
4804 | 627 } else if (conn->type == AIM_CONN_TYPE_ICON) { |
628 if (od->icopa > 0) | |
629 gaim_input_remove(od->icopa); | |
630 od->icopa = 0; | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
631 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
632 "removing icon input watcher\n"); |
4804 | 633 aim_conn_kill(od->sess, &conn); |
2086 | 634 } else if (conn->type == AIM_CONN_TYPE_RENDEZVOUS) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
635 if (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM) |
4617 | 636 gaim_odc_disconnect(od->sess, conn); |
637 aim_conn_kill(od->sess, &conn); | |
2086 | 638 } else { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
639 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
640 "holy crap! generic connection error! %hu\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
641 conn->type); |
4617 | 642 aim_conn_kill(od->sess, &conn); |
2086 | 643 } |
644 } | |
645 } | |
646 } | |
647 } | |
648 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
649 static void oscar_debug(aim_session_t *sess, int level, const char *format, va_list va) { |
5575 | 650 GaimConnection *gc = sess->aux_data; |
7285 | 651 gchar *s = g_strdup_vprintf(format, va); |
652 gchar *buf; | |
653 | |
654 buf = g_strdup_printf("%s %d: %s", gaim_account_get_username(gaim_connection_get_account(gc)), level, s); | |
655 gaim_debug(GAIM_DEBUG_INFO, "oscar", buf); | |
656 if (buf[strlen(buf)-1] != '\n') | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
657 gaim_debug(GAIM_DEBUG_INFO, NULL, "\n"); |
7285 | 658 g_free(buf); |
2086 | 659 g_free(s); |
660 } | |
661 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
662 static void oscar_login_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 663 { |
5575 | 664 GaimConnection *gc = data; |
7283 | 665 OscarData *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
666 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
667 aim_conn_t *conn; |
2086 | 668 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
669 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 670 close(source); |
671 return; | |
672 } | |
673 | |
4617 | 674 od = gc->proto_data; |
675 sess = od->sess; | |
2086 | 676 conn = aim_getconn_type_all(sess, AIM_CONN_TYPE_AUTH); |
4366 | 677 conn->fd = source; |
2086 | 678 |
679 if (source < 0) { | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
680 gaim_connection_error(gc, _("Couldn't connect to host")); |
2086 | 681 return; |
682 } | |
683 | |
684 aim_conn_completeconnect(sess, conn); | |
4617 | 685 gc->inpa = gaim_input_add(conn->fd, GAIM_INPUT_READ, oscar_callback, conn); |
7282 | 686 aim_request_login(sess, conn, gaim_account_get_username(gaim_connection_get_account(gc))); |
687 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
688 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
7282 | 689 "Screen name sent, waiting for response\n"); |
7283 | 690 gaim_connection_update_progress(gc, _("Screen name sent"), 1, OSCAR_CONNECT_STEPS); |
8341 | 691 ck[1] = 0x65; |
2086 | 692 } |
693 | |
5575 | 694 static void oscar_login(GaimAccount *account) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
695 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
696 aim_conn_t *conn; |
5575 | 697 GaimConnection *gc = gaim_account_get_connection(account); |
7283 | 698 OscarData *od = gc->proto_data = g_new0(OscarData, 1); |
2086 | 699 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
700 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
|
701 |
8437 | 702 #if 0 |
703 if (!aim_snvalid(gaim_account_get_username(account))) { | |
704 gchar *buf; | |
705 buf = g_strdup_printf(_("Unable to login: Could not sign on as %s because the screen name is invalid. Screen names must either start with a letter and contain only letters, numbers and spaces, or contain only numbers."), name); | |
706 gaim_connection_error(gc, buf); | |
707 g_free(buf); | |
708 } | |
709 #endif | |
710 | |
5575 | 711 if (isdigit(*(gaim_account_get_username(account)))) { |
4617 | 712 od->icq = TRUE; |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
713 } else { |
6622 | 714 gc->flags |= GAIM_CONNECTION_HTML; |
715 gc->flags |= GAIM_CONNECTION_AUTO_RESP; | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
716 } |
5836 | 717 od->buddyinfo = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, oscar_free_buddyinfo); |
2086 | 718 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
719 sess = g_new0(aim_session_t, 1); |
7285 | 720 aim_session_init(sess, TRUE, 0); |
2086 | 721 aim_setdebuggingcb(sess, oscar_debug); |
7282 | 722 /* |
723 * We need an immediate queue because we don't use a while-loop | |
724 * to see if things need to be sent. | |
725 */ | |
2086 | 726 aim_tx_setenqueue(sess, AIM_TX_IMMEDIATE, NULL); |
4617 | 727 od->sess = sess; |
2086 | 728 sess->aux_data = gc; |
729 | |
730 conn = aim_newconn(sess, AIM_CONN_TYPE_AUTH, NULL); | |
731 if (conn == NULL) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
732 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
733 "internal connection error\n"); |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
734 gaim_connection_error(gc, _("Unable to login to AIM")); |
2086 | 735 return; |
736 } | |
737 | |
4649 | 738 aim_conn_addhandler(sess, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2086 | 739 aim_conn_addhandler(sess, conn, 0x0017, 0x0007, gaim_parse_login, 0); |
740 aim_conn_addhandler(sess, conn, 0x0017, 0x0003, gaim_parse_auth_resp, 0); | |
741 | |
742 conn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
743 if (gaim_proxy_connect(account, gaim_account_get_string(account, "server", FAIM_LOGIN_SERVER), |
5575 | 744 gaim_account_get_int(account, "port", FAIM_LOGIN_PORT), |
745 oscar_login_connect, gc) < 0) { | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
746 gaim_connection_error(gc, _("Couldn't connect to host")); |
2086 | 747 return; |
748 } | |
7282 | 749 |
7283 | 750 gaim_connection_update_progress(gc, _("Connecting"), 0, OSCAR_CONNECT_STEPS); |
8341 | 751 ck[0] = 0x5a; |
5575 | 752 } |
753 | |
754 static void oscar_close(GaimConnection *gc) { | |
7283 | 755 OscarData *od = (OscarData *)gc->proto_data; |
4617 | 756 |
757 while (od->oscar_chats) { | |
758 struct chat_connection *n = od->oscar_chats->data; | |
2086 | 759 if (n->inpa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
760 gaim_input_remove(n->inpa); |
2086 | 761 g_free(n->name); |
762 g_free(n->show); | |
4617 | 763 od->oscar_chats = g_slist_remove(od->oscar_chats, n); |
2086 | 764 g_free(n); |
765 } | |
4617 | 766 while (od->direct_ims) { |
767 struct direct_im *n = od->direct_ims->data; | |
2086 | 768 if (n->watcher > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
769 gaim_input_remove(n->watcher); |
4617 | 770 od->direct_ims = g_slist_remove(od->direct_ims, n); |
2086 | 771 g_free(n); |
772 } | |
4617 | 773 /* BBB */ |
774 while (od->file_transfers) { | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
775 GaimXfer *xfer; |
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
776 xfer = (GaimXfer *)od->file_transfers->data; |
7805 | 777 gaim_xfer_cancel_local(xfer); |
3630 | 778 } |
4804 | 779 while (od->requesticon) { |
780 char *sn = od->requesticon->data; | |
781 od->requesticon = g_slist_remove(od->requesticon, sn); | |
782 free(sn); | |
783 } | |
4738 | 784 g_hash_table_destroy(od->buddyinfo); |
4617 | 785 while (od->create_rooms) { |
786 struct create_room *cr = od->create_rooms->data; | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
787 g_free(cr->name); |
4617 | 788 od->create_rooms = g_slist_remove(od->create_rooms, cr); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
789 g_free(cr); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
790 } |
4617 | 791 if (od->email) |
792 g_free(od->email); | |
793 if (od->newp) | |
794 g_free(od->newp); | |
795 if (od->oldp) | |
796 g_free(od->oldp); | |
2086 | 797 if (gc->inpa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
798 gaim_input_remove(gc->inpa); |
4617 | 799 if (od->cnpa > 0) |
800 gaim_input_remove(od->cnpa); | |
801 if (od->paspa > 0) | |
802 gaim_input_remove(od->paspa); | |
803 if (od->emlpa > 0) | |
804 gaim_input_remove(od->emlpa); | |
4804 | 805 if (od->icopa > 0) |
806 gaim_input_remove(od->icopa); | |
6907 | 807 if (od->icontimer > 0) |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
808 gaim_timeout_remove(od->icontimer); |
8341 | 809 if (od->getblisttimer > 0) |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
810 gaim_timeout_remove(od->getblisttimer); |
8341 | 811 if (od->getinfotimer > 0) |
812 gaim_timeout_remove(od->getinfotimer); | |
4617 | 813 aim_session_kill(od->sess); |
814 g_free(od->sess); | |
815 od->sess = NULL; | |
2086 | 816 g_free(gc->proto_data); |
817 gc->proto_data = NULL; | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
818 gaim_debug(GAIM_DEBUG_INFO, "oscar", "Signed off.\n"); |
2086 | 819 } |
820 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
821 static void oscar_bos_connect(gpointer data, gint source, GaimInputCondition cond) { |
5575 | 822 GaimConnection *gc = data; |
7283 | 823 OscarData *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
824 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
825 aim_conn_t *bosconn; |
2086 | 826 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
827 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 828 close(source); |
829 return; | |
830 } | |
831 | |
4617 | 832 od = gc->proto_data; |
833 sess = od->sess; | |
834 bosconn = od->conn; | |
4366 | 835 bosconn->fd = source; |
2086 | 836 |
837 if (source < 0) { | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
838 gaim_connection_error(gc, _("Could Not Connect")); |
2086 | 839 return; |
840 } | |
841 | |
842 aim_conn_completeconnect(sess, bosconn); | |
4617 | 843 gc->inpa = gaim_input_add(bosconn->fd, GAIM_INPUT_READ, oscar_callback, bosconn); |
7283 | 844 |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
845 gaim_connection_update_progress(gc, |
7283 | 846 _("Connection established, cookie sent"), 4, OSCAR_CONNECT_STEPS); |
8341 | 847 ck[4] = 0x61; |
2086 | 848 } |
849 | |
4617 | 850 /* BBB */ |
4656 | 851 /* |
852 * This little area in oscar.c is the nexus of file transfer code, | |
853 * so I wrote a little explanation of what happens. I am such a | |
854 * ninja. | |
855 * | |
856 * The series of events for a file send is: | |
857 * -Create xfer and call gaim_xfer_request (this happens in oscar_ask_sendfile) | |
858 * -User chooses a file and oscar_xfer_init is called. It establishs a | |
859 * listening socket, then asks the remote user to connect to us (and | |
860 * gives them the file name, port, IP, etc.) | |
861 * -They connect to us and we send them an AIM_CB_OFT_PROMPT (this happens | |
862 * in oscar_sendfile_estblsh) | |
863 * -They send us an AIM_CB_OFT_ACK and then we start sending data | |
864 * -When we finish, they send us an AIM_CB_OFT_DONE and they close the | |
865 * connection. | |
866 * -We get drunk because file transfer kicks ass. | |
867 * | |
868 * The series of events for a file receive is: | |
869 * -Create xfer and call gaim_xfer request (this happens in incomingim_chan2) | |
870 * -Gaim user selects file to name and location to save file to and | |
871 * oscar_xfer_init is called | |
872 * -It connects to the remote user using the IP they gave us earlier | |
873 * -After connecting, they send us an AIM_CB_OFT_PROMPT. In reply, we send | |
874 * them an AIM_CB_OFT_ACK. | |
875 * -They begin to send us lots of raw data. | |
876 * -When they finish sending data we send an AIM_CB_OFT_DONE and then close | |
877 * the connectionn. | |
878 */ | |
879 static void oscar_sendfile_connected(gpointer data, gint source, GaimInputCondition condition); | |
880 | |
8446 | 881 /* |
882 * Miscellaneous xfer functions | |
883 */ | |
884 static GaimXfer *oscar_find_xfer_by_cookie(GSList *fts, const fu8_t *ck) | |
4656 | 885 { |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
886 GaimXfer *xfer; |
5146 | 887 struct aim_oft_info *oft_info; |
4656 | 888 |
889 while (fts) { | |
890 xfer = fts->data; | |
5146 | 891 oft_info = xfer->data; |
892 | |
8446 | 893 if (oft_info && !memcmp(ck, oft_info->cookie, 8)) |
4656 | 894 return xfer; |
895 | |
896 fts = g_slist_next(fts); | |
897 } | |
898 | |
899 return NULL; | |
900 } | |
901 | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
902 static GaimXfer *oscar_find_xfer_by_conn(GSList *fts, aim_conn_t *conn) |
4656 | 903 { |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
904 GaimXfer *xfer; |
5146 | 905 struct aim_oft_info *oft_info; |
4656 | 906 |
907 while (fts) { | |
908 xfer = fts->data; | |
5146 | 909 oft_info = xfer->data; |
910 | |
911 if (oft_info && (conn == oft_info->conn)) | |
4656 | 912 return xfer; |
913 | |
914 fts = g_slist_next(fts); | |
915 } | |
916 | |
917 return NULL; | |
918 } | |
919 | |
8446 | 920 static void oscar_xfer_end(GaimXfer *xfer) |
921 { | |
922 struct aim_oft_info *oft_info = xfer->data; | |
923 GaimConnection *gc = oft_info->sess->aux_data; | |
924 OscarData *od = gc->proto_data; | |
925 | |
926 gaim_debug(GAIM_DEBUG_INFO, "oscar", "AAA - in oscar_xfer_end\n"); | |
927 | |
928 if (gaim_xfer_get_type(xfer) == GAIM_XFER_RECEIVE) { | |
929 oft_info->fh.nrecvd = gaim_xfer_get_bytes_sent(xfer); | |
930 aim_oft_sendheader(oft_info->sess, AIM_CB_OFT_DONE, oft_info); | |
931 } | |
932 | |
933 aim_conn_kill(oft_info->sess, &oft_info->conn); | |
934 aim_oft_destroyinfo(oft_info); | |
935 xfer->data = NULL; | |
936 od->file_transfers = g_slist_remove(od->file_transfers, xfer); | |
937 } | |
938 | |
939 /* | |
940 * xfer functions used when receiving files | |
941 */ | |
942 | |
943 static void oscar_xfer_init_recv(GaimXfer *xfer) | |
944 { | |
945 struct aim_oft_info *oft_info = xfer->data; | |
946 GaimConnection *gc = oft_info->sess->aux_data; | |
947 OscarData *od = gc->proto_data; | |
948 | |
949 gaim_debug(GAIM_DEBUG_INFO, "oscar", "AAA - in oscar_xfer_recv_init\n"); | |
950 | |
951 oft_info->conn = aim_newconn(od->sess, AIM_CONN_TYPE_RENDEZVOUS, NULL); | |
952 if (oft_info->conn) { | |
953 oft_info->conn->subtype = AIM_CONN_SUBTYPE_OFT_SENDFILE; | |
954 aim_conn_addhandler(od->sess, oft_info->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_PROMPT, oscar_sendfile_prompt, 0); | |
955 oft_info->conn->fd = xfer->fd = gaim_proxy_connect(gaim_connection_get_account(gc), | |
956 xfer->remote_ip, xfer->remote_port, oscar_sendfile_connected, xfer); | |
957 if (xfer->fd == -1) { | |
958 gaim_xfer_error(GAIM_XFER_RECEIVE, xfer->who, | |
959 _("Unable to establish file descriptor.")); | |
960 gaim_xfer_cancel_local(xfer); | |
961 } | |
962 } else { | |
963 gaim_xfer_error(GAIM_XFER_RECEIVE, xfer->who, | |
964 _("Unable to create new connection.")); | |
965 gaim_xfer_cancel_local(xfer); | |
966 /* Try a different port? Ask them to connect to us? /join #gaim and whine? */ | |
967 } | |
968 | |
969 } | |
970 | |
971 static void oscar_xfer_cancel_recv(GaimXfer *xfer) | |
972 { | |
973 struct aim_oft_info *oft_info = xfer->data; | |
974 GaimConnection *gc = oft_info->sess->aux_data; | |
975 OscarData *od = gc->proto_data; | |
976 | |
977 gaim_debug(GAIM_DEBUG_INFO, "oscar", "AAA - in oscar_xfer_cancel_recv\n"); | |
978 | |
979 aim_im_sendch2_sendfile_cancel(oft_info->sess, oft_info); | |
980 | |
981 aim_conn_kill(oft_info->sess, &oft_info->conn); | |
982 aim_oft_destroyinfo(oft_info); | |
983 xfer->data = NULL; | |
984 od->file_transfers = g_slist_remove(od->file_transfers, xfer); | |
985 } | |
986 | |
987 static void oscar_xfer_ack_recv(GaimXfer *xfer, const char *buffer, size_t size) | |
988 { | |
989 struct aim_oft_info *oft_info = xfer->data; | |
990 | |
991 /* Update our rolling checksum. Like Walmart, yo. */ | |
992 oft_info->fh.recvcsum = aim_oft_checksum_chunk(buffer, size, oft_info->fh.recvcsum); | |
993 } | |
994 | |
995 /* | |
996 * xfer functions used when sending files | |
997 */ | |
998 | |
999 static void oscar_xfer_init_send(GaimXfer *xfer) | |
1000 { | |
1001 struct aim_oft_info *oft_info = xfer->data; | |
1002 GaimConnection *gc = oft_info->sess->aux_data; | |
1003 OscarData *od = gc->proto_data; | |
1004 int listenfd; | |
1005 | |
1006 gaim_debug(GAIM_DEBUG_INFO, "oscar", "AAA - in oscar_xfer_send_init\n"); | |
1007 | |
1008 xfer->filename = g_path_get_basename(xfer->local_filename); | |
1009 strncpy(oft_info->fh.name, xfer->filename, 64); | |
1010 oft_info->fh.name[63] = '\0'; | |
1011 oft_info->fh.totsize = gaim_xfer_get_size(xfer); | |
1012 oft_info->fh.size = gaim_xfer_get_size(xfer); | |
1013 oft_info->fh.checksum = aim_oft_checksum_file(xfer->local_filename); | |
1014 | |
1015 /* Create a listening socket and an associated libfaim conn */ | |
1016 if ((listenfd = gaim_network_listen_range(5190, 5199)) < 0) { | |
1017 gaim_xfer_cancel_local(xfer); | |
1018 return; | |
1019 } | |
1020 xfer->local_port = gaim_network_get_port_from_fd(listenfd); | |
1021 oft_info->port = xfer->local_port; | |
1022 if (aim_sendfile_listen(od->sess, oft_info, listenfd) != 0) { | |
1023 gaim_xfer_cancel_local(xfer); | |
1024 return; | |
1025 } | |
1026 gaim_debug(GAIM_DEBUG_MISC, "oscar", | |
1027 "port is %hu, ip is %s\n", | |
1028 xfer->local_port, oft_info->clientip); | |
1029 if (oft_info->conn) { | |
1030 xfer->watcher = gaim_input_add(oft_info->conn->fd, GAIM_INPUT_READ, oscar_callback, oft_info->conn); | |
1031 aim_im_sendch2_sendfile_ask(od->sess, oft_info); | |
1032 aim_conn_addhandler(od->sess, oft_info->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_ESTABLISHED, oscar_sendfile_estblsh, 0); | |
1033 } else { | |
1034 gaim_xfer_error(GAIM_XFER_SEND, xfer->who, | |
1035 _("Unable to establish listener socket.")); | |
1036 gaim_xfer_cancel_local(xfer); | |
1037 } | |
1038 } | |
1039 | |
1040 static void oscar_xfer_cancel_send(GaimXfer *xfer) | |
1041 { | |
1042 struct aim_oft_info *oft_info = xfer->data; | |
1043 GaimConnection *gc = oft_info->sess->aux_data; | |
1044 OscarData *od = gc->proto_data; | |
1045 | |
1046 gaim_debug(GAIM_DEBUG_INFO, "oscar", "AAA - in oscar_xfer_cancel_send\n"); | |
1047 | |
1048 aim_im_sendch2_sendfile_cancel(oft_info->sess, oft_info); | |
1049 | |
1050 aim_conn_kill(oft_info->sess, &oft_info->conn); | |
1051 aim_oft_destroyinfo(oft_info); | |
1052 xfer->data = NULL; | |
1053 od->file_transfers = g_slist_remove(od->file_transfers, xfer); | |
1054 } | |
1055 | |
1056 static void oscar_xfer_ack_send(GaimXfer *xfer, const char *buffer, size_t size) | |
1057 { | |
1058 struct aim_oft_info *oft_info = xfer->data; | |
1059 | |
1060 /* I'm not sure I like how we do this. --marv | |
1061 * I do. AIM file transfers aren't really meant to be thought | |
1062 * of as a transferring just a single file. The rendezvous | |
1063 * establishes a connection between two computers, and then | |
1064 * those computers can use the same connection for transferring | |
1065 * multiple files. So we don't want the Gaim core up and closing | |
1066 * the socket all willy-nilly. We want to do that in the oscar | |
1067 * prpl, whenever one side or the other says they're finished | |
1068 * using the connection. There might be a better way to intercept | |
1069 * the socket from the core, however... --KingAnt | |
1070 */ | |
1071 | |
1072 /* | |
1073 * If we're done sending, intercept the socket from the core ft code | |
1074 * and wait for the other guy to send the "done" OFT packet. | |
1075 */ | |
1076 if (gaim_xfer_get_bytes_remaining(xfer) <= 0) { | |
1077 gaim_input_remove(xfer->watcher); | |
1078 xfer->watcher = gaim_input_add(xfer->fd, GAIM_INPUT_READ, oscar_callback, oft_info->conn); | |
1079 xfer->fd = 0; | |
1080 gaim_xfer_set_completed(xfer, TRUE); | |
1081 } | |
1082 } | |
1083 | |
5575 | 1084 static void oscar_ask_sendfile(GaimConnection *gc, const char *destsn) { |
7283 | 1085 OscarData *od = (OscarData *)gc->proto_data; |
8231
f50c059b6384
[gaim-migrate @ 8954]
Christian Hammond <chipx86@chipx86.com>
parents:
8227
diff
changeset
|
1086 GaimAccount *account = gaim_connection_get_account(gc); |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
1087 GaimXfer *xfer; |
5146 | 1088 struct aim_oft_info *oft_info; |
8231
f50c059b6384
[gaim-migrate @ 8954]
Christian Hammond <chipx86@chipx86.com>
parents:
8227
diff
changeset
|
1089 const char *ip; |
3752 | 1090 |
4617 | 1091 /* You want to send a file to someone else, you're so generous */ |
1092 | |
1093 /* Build the file transfer handle */ | |
5575 | 1094 xfer = gaim_xfer_new(gaim_connection_get_account(gc), GAIM_XFER_SEND, destsn); |
4617 | 1095 |
5146 | 1096 /* Create the oscar-specific data */ |
8240 | 1097 ip = gaim_network_get_ip_for_account(account, od->conn ? od->conn->fd : -1); |
1098 oft_info = aim_oft_createinfo(od->sess, NULL, destsn, ip, 0, 0, 0, NULL); | |
5146 | 1099 xfer->data = oft_info; |
1100 | |
4617 | 1101 /* Setup our I/O op functions */ |
8446 | 1102 gaim_xfer_set_init_fnc(xfer, oscar_xfer_init_send); |
4617 | 1103 gaim_xfer_set_end_fnc(xfer, oscar_xfer_end); |
4675
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
1104 gaim_xfer_set_cancel_send_fnc(xfer, oscar_xfer_cancel_send); |
8446 | 1105 gaim_xfer_set_request_denied_fnc(xfer, oscar_xfer_cancel_send); |
1106 gaim_xfer_set_ack_fnc(xfer, oscar_xfer_ack_send); | |
4617 | 1107 |
1108 /* Keep track of this transfer for later */ | |
1109 od->file_transfers = g_slist_append(od->file_transfers, xfer); | |
1110 | |
1111 /* Now perform the request */ | |
1112 gaim_xfer_request(xfer); | |
3630 | 1113 } |
1114 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1115 static int gaim_parse_auth_resp(aim_session_t *sess, aim_frame_t *fr, ...) { |
6029 | 1116 GaimConnection *gc = sess->aux_data; |
7283 | 1117 OscarData *od = gc->proto_data; |
6029 | 1118 GaimAccount *account = gc->account; |
1119 aim_conn_t *bosconn; | |
1120 char *host; int port; | |
1121 int i, rc; | |
2086 | 1122 va_list ap; |
2704 | 1123 struct aim_authresp_info *info; |
6029 | 1124 |
5575 | 1125 port = gaim_account_get_int(account, "port", FAIM_LOGIN_PORT); |
2086 | 1126 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1127 va_start(ap, fr); |
2704 | 1128 info = va_arg(ap, struct aim_authresp_info *); |
2086 | 1129 va_end(ap); |
1130 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1131 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1132 "inside auth_resp (Screen name: %s)\n", info->sn); |
2704 | 1133 |
4293 | 1134 if (info->errorcode || !info->bosip || !info->cookielen || !info->cookie) { |
4056 | 1135 char buf[256]; |
2704 | 1136 switch (info->errorcode) { |
2086 | 1137 case 0x05: |
1138 /* Incorrect nick/password */ | |
6498 | 1139 gc->wants_to_die = TRUE; |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1140 gaim_connection_error(gc, _("Incorrect nickname or password.")); |
2086 | 1141 break; |
1142 case 0x11: | |
1143 /* Suspended account */ | |
6498 | 1144 gc->wants_to_die = TRUE; |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1145 gaim_connection_error(gc, _("Your account is currently suspended.")); |
2086 | 1146 break; |
3498 | 1147 case 0x14: |
1148 /* service temporarily unavailable */ | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1149 gaim_connection_error(gc, _("The AOL Instant Messenger service is temporarily unavailable.")); |
3498 | 1150 break; |
2086 | 1151 case 0x18: |
1152 /* connecting too frequently */ | |
6498 | 1153 gc->wants_to_die = TRUE; |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1154 gaim_connection_error(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.")); |
2086 | 1155 break; |
1156 case 0x1c: | |
1157 /* client too old */ | |
6498 | 1158 gc->wants_to_die = TRUE; |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6350
diff
changeset
|
1159 g_snprintf(buf, sizeof(buf), _("The client version you are using is too old. Please upgrade at %s"), GAIM_WEBSITE); |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1160 gaim_connection_error(gc, buf); |
2086 | 1161 break; |
1162 default: | |
6623 | 1163 gaim_connection_error(gc, _("Authentication failed")); |
2086 | 1164 break; |
1165 } | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1166 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1167 "Login Error Code 0x%04hx\n", info->errorcode); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1168 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1169 "Error URL: %s\n", info->errorurl); |
2086 | 1170 od->killme = TRUE; |
1171 return 1; | |
1172 } | |
1173 | |
1174 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1175 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1176 "Reg status: %hu\n", info->regstatus); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1177 |
2704 | 1178 if (info->email) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1179 gaim_debug(GAIM_DEBUG_MISC, "oscar", "Email: %s\n", info->email); |
2086 | 1180 } else { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1181 gaim_debug(GAIM_DEBUG_MISC, "oscar", "Email is NULL\n"); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1182 } |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1183 |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1184 gaim_debug(GAIM_DEBUG_MISC, "oscar", "BOSIP: %s\n", info->bosip); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1185 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1186 "Closing auth connection...\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1187 aim_conn_kill(sess, &fr->conn); |
2086 | 1188 |
1189 bosconn = aim_newconn(sess, AIM_CONN_TYPE_BOS, NULL); | |
1190 if (bosconn == NULL) { | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1191 gaim_connection_error(gc, _("Internal Error")); |
2086 | 1192 od->killme = TRUE; |
1193 return 0; | |
1194 } | |
1195 | |
4649 | 1196 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 1197 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_bos, 0); |
2086 | 1198 aim_conn_addhandler(sess, bosconn, 0x0009, 0x0003, gaim_bosrights, 0); |
1199 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ACK, AIM_CB_ACK_ACK, NULL, 0); | |
1200 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_REDIRECT, gaim_handle_redirect, 0); | |
2993 | 1201 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_RIGHTSINFO, gaim_parse_locaterights, 0); |
2086 | 1202 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_RIGHTSINFO, gaim_parse_buddyrights, 0); |
1203 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_ONCOMING, gaim_parse_oncoming, 0); | |
1204 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_OFFGOING, gaim_parse_offgoing, 0); | |
1205 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_INCOMING, gaim_parse_incoming_im, 0); | |
1206 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_ERROR, gaim_parse_locerr, 0); | |
1207 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_MISSEDCALL, gaim_parse_misses, 0); | |
3212 | 1208 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_CLIENTAUTORESP, gaim_parse_clientauto, 0); |
2086 | 1209 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_RATECHANGE, gaim_parse_ratechange, 0); |
1210 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_EVIL, gaim_parse_evilnotify, 0); | |
1211 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOK, AIM_CB_LOK_ERROR, gaim_parse_searcherror, 0); | |
1212 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOK, 0x0003, gaim_parse_searchreply, 0); | |
1213 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ERROR, gaim_parse_msgerr, 0); | |
3595 | 1214 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_MTN, gaim_parse_mtn, 0); |
7011 | 1215 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_USERINFO, gaim_parse_userinfo, 0); |
8341 | 1216 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_REQUESTINFOTIMEOUT, gaim_reqinfo_timeout, 0); |
2086 | 1217 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ACK, gaim_parse_msgack, 0); |
1218 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
|
1219 aim_conn_addhandler(sess, bosconn, 0x0004, 0x0005, gaim_icbm_param_info, 0); |
2086 | 1220 aim_conn_addhandler(sess, bosconn, 0x0001, 0x0001, gaim_parse_genericerr, 0); |
1221 aim_conn_addhandler(sess, bosconn, 0x0003, 0x0001, gaim_parse_genericerr, 0); | |
1222 aim_conn_addhandler(sess, bosconn, 0x0009, 0x0001, gaim_parse_genericerr, 0); | |
1223 aim_conn_addhandler(sess, bosconn, 0x0001, 0x001f, gaim_memrequest, 0); | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
1224 aim_conn_addhandler(sess, bosconn, 0x0001, 0x000f, gaim_selfinfo, 0); |
5844 | 1225 aim_conn_addhandler(sess, bosconn, 0x0001, 0x0021, oscar_icon_req,0); |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
1226 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
|
1227 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
|
1228 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_POP, 0x0002, gaim_popup, 0); |
4759 | 1229 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_ALIAS, gaim_icqalias, 0); |
4624 | 1230 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_INFO, gaim_icqinfo, 0); |
4230 | 1231 #ifndef NOSSI |
4642 | 1232 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_ERROR, gaim_ssi_parseerr, 0); |
2991 | 1233 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RIGHTSINFO, gaim_ssi_parserights, 0); |
1234 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_LIST, gaim_ssi_parselist, 0); | |
1235 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_NOLIST, gaim_ssi_parselist, 0); | |
4230 | 1236 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_SRVACK, gaim_ssi_parseack, 0); |
8227 | 1237 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_ADD, gaim_ssi_parseadd, 0); |
4230 | 1238 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RECVAUTH, gaim_ssi_authgiven, 0); |
1239 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RECVAUTHREQ, gaim_ssi_authrequest, 0); | |
1240 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RECVAUTHREP, gaim_ssi_authreply, 0); | |
1241 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_ADDED, gaim_ssi_gotadded, 0); | |
1242 #endif | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
1243 |
7283 | 1244 od->conn = bosconn; |
2704 | 1245 for (i = 0; i < (int)strlen(info->bosip); i++) { |
1246 if (info->bosip[i] == ':') { | |
1247 port = atoi(&(info->bosip[i+1])); | |
2086 | 1248 break; |
1249 } | |
1250 } | |
2704 | 1251 host = g_strndup(info->bosip, i); |
2086 | 1252 bosconn->status |= AIM_CONN_STATUS_INPROGRESS; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1253 rc = gaim_proxy_connect(gc->account, host, port, oscar_bos_connect, gc); |
2086 | 1254 g_free(host); |
4366 | 1255 if (rc < 0) { |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1256 gaim_connection_error(gc, _("Could Not Connect")); |
2086 | 1257 od->killme = TRUE; |
1258 return 0; | |
1259 } | |
4293 | 1260 aim_sendcookie(sess, bosconn, info->cookielen, info->cookie); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1261 gaim_input_remove(gc->inpa); |
2704 | 1262 |
7283 | 1263 gaim_connection_update_progress(gc, _("Received authorization"), 3, OSCAR_CONNECT_STEPS); |
8341 | 1264 ck[3] = 0x64; |
7282 | 1265 |
2086 | 1266 return 1; |
1267 } | |
1268 | |
7285 | 1269 /* XXX - Should use gaim_url_fetch for the below stuff */ |
2086 | 1270 struct pieceofcrap { |
5575 | 1271 GaimConnection *gc; |
2086 | 1272 unsigned long offset; |
1273 unsigned long len; | |
1274 char *modname; | |
1275 int fd; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1276 aim_conn_t *conn; |
2086 | 1277 unsigned int inpa; |
1278 }; | |
1279 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1280 static void damn_you(gpointer data, gint source, GaimInputCondition c) |
2086 | 1281 { |
1282 struct pieceofcrap *pos = data; | |
7283 | 1283 OscarData *od = pos->gc->proto_data; |
2086 | 1284 char in = '\0'; |
1285 int x = 0; | |
1286 unsigned char m[17]; | |
1287 | |
1288 while (read(pos->fd, &in, 1) == 1) { | |
1289 if (in == '\n') | |
1290 x++; | |
1291 else if (in != '\r') | |
1292 x = 0; | |
1293 if (x == 2) | |
1294 break; | |
1295 in = '\0'; | |
1296 } | |
1297 if (in != '\n') { | |
4056 | 1298 char buf[256]; |
1299 g_snprintf(buf, sizeof(buf), _("You may be disconnected shortly. You may want to use TOC until " | |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6350
diff
changeset
|
1300 "this is fixed. Check %s for updates."), GAIM_WEBSITE); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1301 gaim_notify_warning(pos->gc, NULL, |
7422 | 1302 _("Gaim was unable to get a valid AIM login hash."), |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1303 buf); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1304 gaim_input_remove(pos->inpa); |
2086 | 1305 close(pos->fd); |
1306 g_free(pos); | |
1307 return; | |
1308 } | |
1309 read(pos->fd, m, 16); | |
1310 m[16] = '\0'; | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1311 gaim_debug(GAIM_DEBUG_MISC, "oscar", "Sending hash: "); |
2086 | 1312 for (x = 0; x < 16; x++) |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1313 gaim_debug(GAIM_DEBUG_MISC, NULL, "%02hhx ", (unsigned char)m[x]); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1314 |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1315 gaim_debug(GAIM_DEBUG_MISC, NULL, "\n"); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1316 gaim_input_remove(pos->inpa); |
2086 | 1317 close(pos->fd); |
1318 aim_sendmemblock(od->sess, pos->conn, 0, 16, m, AIM_SENDMEMBLOCK_FLAG_ISHASH); | |
1319 g_free(pos); | |
1320 } | |
1321 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1322 static void straight_to_hell(gpointer data, gint source, GaimInputCondition cond) { |
2086 | 1323 struct pieceofcrap *pos = data; |
5420 | 1324 gchar *buf; |
2086 | 1325 |
4366 | 1326 pos->fd = source; |
1327 | |
2086 | 1328 if (source < 0) { |
5420 | 1329 buf = g_strdup_printf(_("You may be disconnected shortly. You may want to use TOC until " |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6350
diff
changeset
|
1330 "this is fixed. Check %s for updates."), GAIM_WEBSITE); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1331 gaim_notify_warning(pos->gc, NULL, |
7422 | 1332 _("Gaim was unable to get a valid AIM login hash."), |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1333 buf); |
5420 | 1334 g_free(buf); |
2086 | 1335 if (pos->modname) |
1336 g_free(pos->modname); | |
1337 g_free(pos); | |
1338 return; | |
1339 } | |
1340 | |
5420 | 1341 buf = g_strdup_printf("GET " AIMHASHDATA "?offset=%ld&len=%ld&modname=%s HTTP/1.0\n\n", |
2086 | 1342 pos->offset, pos->len, pos->modname ? pos->modname : ""); |
1343 write(pos->fd, buf, strlen(buf)); | |
5420 | 1344 g_free(buf); |
2086 | 1345 if (pos->modname) |
1346 g_free(pos->modname); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1347 pos->inpa = gaim_input_add(pos->fd, GAIM_INPUT_READ, damn_you, pos); |
2086 | 1348 return; |
1349 } | |
1350 | |
1351 /* size of icbmui.ocm, the largest module in AIM 3.5 */ | |
1352 #define AIM_MAX_FILE_SIZE 98304 | |
1353 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1354 int gaim_memrequest(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 1355 va_list ap; |
1356 struct pieceofcrap *pos; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1357 fu32_t offset, len; |
2086 | 1358 char *modname; |
1359 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1360 va_start(ap, fr); |
4200 | 1361 offset = va_arg(ap, fu32_t); |
1362 len = va_arg(ap, fu32_t); | |
2086 | 1363 modname = va_arg(ap, char *); |
1364 va_end(ap); | |
1365 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1366 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
5556 | 1367 "offset: %u, len: %u, file: %s\n", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1368 offset, len, (modname ? modname : "aim.exe")); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1369 |
2086 | 1370 if (len == 0) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1371 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
|
1372 aim_sendmemblock(sess, fr->conn, offset, len, NULL, |
2086 | 1373 AIM_SENDMEMBLOCK_FLAG_ISREQUEST); |
1374 return 1; | |
1375 } | |
1376 /* uncomment this when you're convinced it's right. remember, it's been wrong before. | |
1377 if (offset > AIM_MAX_FILE_SIZE || len > AIM_MAX_FILE_SIZE) { | |
1378 char *buf; | |
1379 int i = 8; | |
1380 if (modname) | |
1381 i += strlen(modname); | |
1382 buf = g_malloc(i); | |
1383 i = 0; | |
1384 if (modname) { | |
1385 memcpy(buf, modname, strlen(modname)); | |
1386 i += strlen(modname); | |
1387 } | |
1388 buf[i++] = offset & 0xff; | |
1389 buf[i++] = (offset >> 8) & 0xff; | |
1390 buf[i++] = (offset >> 16) & 0xff; | |
1391 buf[i++] = (offset >> 24) & 0xff; | |
1392 buf[i++] = len & 0xff; | |
1393 buf[i++] = (len >> 8) & 0xff; | |
1394 buf[i++] = (len >> 16) & 0xff; | |
1395 buf[i++] = (len >> 24) & 0xff; | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1396 gaim_debug(GAIM_DEBUG_MISC, "oscar", "len + offset is invalid, " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1397 "hashing request\n"); |
2086 | 1398 aim_sendmemblock(sess, command->conn, offset, i, buf, AIM_SENDMEMBLOCK_FLAG_ISREQUEST); |
1399 g_free(buf); | |
1400 return 1; | |
1401 } | |
1402 */ | |
1403 | |
1404 pos = g_new0(struct pieceofcrap, 1); | |
1405 pos->gc = sess->aux_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1406 pos->conn = fr->conn; |
2086 | 1407 |
1408 pos->offset = offset; | |
1409 pos->len = len; | |
1410 pos->modname = modname ? g_strdup(modname) : NULL; | |
1411 | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1412 if (gaim_proxy_connect(pos->gc->account, "gaim.sourceforge.net", 80, straight_to_hell, pos) != 0) { |
4056 | 1413 char buf[256]; |
2086 | 1414 if (pos->modname) |
1415 g_free(pos->modname); | |
1416 g_free(pos); | |
4056 | 1417 g_snprintf(buf, sizeof(buf), _("You may be disconnected shortly. You may want to use TOC until " |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6350
diff
changeset
|
1418 "this is fixed. Check %s for updates."), GAIM_WEBSITE); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1419 gaim_notify_warning(pos->gc, NULL, |
7422 | 1420 _("Gaim was unable to get a valid login hash."), |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1421 buf); |
2086 | 1422 } |
1423 | |
1424 return 1; | |
1425 } | |
1426 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1427 static int gaim_parse_login(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 1428 GaimConnection *gc = sess->aux_data; |
7283 | 1429 OscarData *od = gc->proto_data; |
5591
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1430 GaimAccount *account = gaim_connection_get_account(gc); |
5575 | 1431 GaimAccount *ac = gaim_connection_get_account(gc); |
7282 | 1432 #if 0 |
1433 struct client_info_s info = {"gaim", 7, 3, 2003, "us", "en", 0x0004, 0x0000, 0x04b}; | |
1434 #endif | |
7011 | 1435 va_list ap; |
1436 char *key; | |
2086 | 1437 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1438 va_start(ap, fr); |
2086 | 1439 key = va_arg(ap, char *); |
1440 va_end(ap); | |
1441 | |
4617 | 1442 if (od->icq) { |
3458 | 1443 struct client_info_s info = CLIENTINFO_ICQ_KNOWNGOOD; |
5591
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1444 aim_send_login(sess, fr->conn, gaim_account_get_username(ac), |
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1445 gaim_account_get_password(account), &info, key); |
3458 | 1446 } else { |
1447 struct client_info_s info = CLIENTINFO_AIM_KNOWNGOOD; | |
5591
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1448 aim_send_login(sess, fr->conn, gaim_account_get_username(ac), |
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1449 gaim_account_get_password(account), &info, key); |
3458 | 1450 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1451 |
7283 | 1452 gaim_connection_update_progress(gc, _("Password sent"), 2, OSCAR_CONNECT_STEPS); |
8341 | 1453 ck[2] = 0x6c; |
7282 | 1454 |
2086 | 1455 return 1; |
1456 } | |
1457 | |
2675 | 1458 static int conninitdone_chat(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 1459 GaimConnection *gc = sess->aux_data; |
2647 | 1460 struct chat_connection *chatcon; |
1461 static int id = 1; | |
1462 | |
6905 | 1463 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, 0x0001, gaim_parse_genericerr, 0); |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
1464 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERJOIN, gaim_conv_chat_join, 0); |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
1465 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERLEAVE, gaim_conv_chat_leave, 0); |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
1466 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_ROOMINFOUPDATE, gaim_conv_chat_info_update, 0); |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
1467 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_INCOMINGMSG, gaim_conv_chat_incoming_msg, 0); |
2675 | 1468 |
2672 | 1469 aim_clientready(sess, fr->conn); |
2675 | 1470 |
2647 | 1471 chatcon = find_oscar_chat_by_conn(gc, fr->conn); |
1472 chatcon->id = id; | |
1473 chatcon->cnv = serv_got_joined_chat(gc, id++, chatcon->show); | |
1474 | |
1475 return 1; | |
1476 } | |
1477 | |
2675 | 1478 static int conninitdone_chatnav(aim_session_t *sess, aim_frame_t *fr, ...) { |
1479 | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1480 aim_conn_addhandler(sess, fr->conn, 0x000d, 0x0001, gaim_parse_genericerr, 0); |
2647 | 1481 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CTN, AIM_CB_CTN_INFO, gaim_chatnav_info, 0); |
2675 | 1482 |
1483 aim_clientready(sess, fr->conn); | |
1484 | |
1485 aim_chatnav_reqrights(sess, fr->conn); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1486 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1487 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1488 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1489 |
3694 | 1490 static int conninitdone_email(aim_session_t *sess, aim_frame_t *fr, ...) { |
1491 | |
1492 aim_conn_addhandler(sess, fr->conn, 0x0018, 0x0001, gaim_parse_genericerr, 0); | |
1493 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_EML, AIM_CB_EML_MAILSTATUS, gaim_email_parseupdate, 0); | |
1494 | |
7282 | 1495 aim_email_sendcookies(sess); |
1496 aim_email_activate(sess); | |
3694 | 1497 aim_clientready(sess, fr->conn); |
1498 | |
1499 return 1; | |
1500 } | |
1501 | |
4804 | 1502 static int conninitdone_icon(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 1503 GaimConnection *gc = sess->aux_data; |
7283 | 1504 OscarData *od = gc->proto_data; |
4804 | 1505 |
1506 aim_conn_addhandler(sess, fr->conn, 0x0018, 0x0001, gaim_parse_genericerr, 0); | |
1507 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ICO, AIM_CB_ICO_ERROR, gaim_icon_error, 0); | |
1508 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ICO, AIM_CB_ICO_RESPONSE, gaim_icon_parseicon, 0); | |
1509 | |
1510 aim_clientready(sess, fr->conn); | |
1511 | |
4823 | 1512 od->iconconnecting = FALSE; |
1513 | |
4804 | 1514 if (od->icontimer) |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
1515 gaim_timeout_remove(od->icontimer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
1516 od->icontimer = gaim_timeout_add(100, gaim_icon_timerfunc, gc); |
4804 | 1517 |
1518 return 1; | |
1519 } | |
1520 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1521 static void oscar_chatnav_connect(gpointer data, gint source, GaimInputCondition cond) { |
5575 | 1522 GaimConnection *gc = data; |
7283 | 1523 OscarData *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1524 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1525 aim_conn_t *tstconn; |
2086 | 1526 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1527 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 1528 close(source); |
1529 return; | |
1530 } | |
1531 | |
4617 | 1532 od = gc->proto_data; |
1533 sess = od->sess; | |
2086 | 1534 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_CHATNAV); |
4366 | 1535 tstconn->fd = source; |
2086 | 1536 |
1537 if (source < 0) { | |
1538 aim_conn_kill(sess, &tstconn); | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1539 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1540 "unable to connect to chatnav server\n"); |
2086 | 1541 return; |
1542 } | |
1543 | |
1544 aim_conn_completeconnect(sess, tstconn); | |
4617 | 1545 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
|
1546 gaim_debug(GAIM_DEBUG_INFO, "oscar", "chatnav: connected\n"); |
2086 | 1547 } |
1548 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1549 static void oscar_auth_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 1550 { |
5575 | 1551 GaimConnection *gc = data; |
7283 | 1552 OscarData *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1553 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1554 aim_conn_t *tstconn; |
2086 | 1555 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1556 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 1557 close(source); |
1558 return; | |
1559 } | |
1560 | |
4617 | 1561 od = gc->proto_data; |
1562 sess = od->sess; | |
2086 | 1563 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_AUTH); |
4366 | 1564 tstconn->fd = source; |
2086 | 1565 |
1566 if (source < 0) { | |
1567 aim_conn_kill(sess, &tstconn); | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1568 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1569 "unable to connect to authorizer\n"); |
2086 | 1570 return; |
1571 } | |
1572 | |
1573 aim_conn_completeconnect(sess, tstconn); | |
4617 | 1574 od->paspa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); |
6905 | 1575 gaim_debug(GAIM_DEBUG_INFO, "oscar", "admin: connected\n"); |
2086 | 1576 } |
1577 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1578 static void oscar_chat_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 1579 { |
1580 struct chat_connection *ccon = data; | |
5575 | 1581 GaimConnection *gc = ccon->gc; |
7283 | 1582 OscarData *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1583 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1584 aim_conn_t *tstconn; |
2086 | 1585 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1586 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 1587 close(source); |
1588 g_free(ccon->show); | |
1589 g_free(ccon->name); | |
1590 g_free(ccon); | |
1591 return; | |
1592 } | |
1593 | |
4617 | 1594 od = gc->proto_data; |
1595 sess = od->sess; | |
2086 | 1596 tstconn = ccon->conn; |
4366 | 1597 tstconn->fd = source; |
2086 | 1598 |
1599 if (source < 0) { | |
1600 aim_conn_kill(sess, &tstconn); | |
1601 g_free(ccon->show); | |
1602 g_free(ccon->name); | |
1603 g_free(ccon); | |
1604 return; | |
1605 } | |
1606 | |
1607 aim_conn_completeconnect(sess, ccon->conn); | |
4617 | 1608 ccon->inpa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); |
1609 od->oscar_chats = g_slist_append(od->oscar_chats, ccon); | |
2086 | 1610 } |
1611 | |
3694 | 1612 static void oscar_email_connect(gpointer data, gint source, GaimInputCondition cond) { |
5575 | 1613 GaimConnection *gc = data; |
7283 | 1614 OscarData *od; |
3694 | 1615 aim_session_t *sess; |
1616 aim_conn_t *tstconn; | |
1617 | |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1618 if (!g_list_find(gaim_connections_get_all(), gc)) { |
3694 | 1619 close(source); |
1620 return; | |
1621 } | |
1622 | |
4617 | 1623 od = gc->proto_data; |
1624 sess = od->sess; | |
3694 | 1625 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_EMAIL); |
4366 | 1626 tstconn->fd = source; |
3694 | 1627 |
1628 if (source < 0) { | |
1629 aim_conn_kill(sess, &tstconn); | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1630 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1631 "unable to connect to email server\n"); |
3694 | 1632 return; |
1633 } | |
1634 | |
1635 aim_conn_completeconnect(sess, tstconn); | |
4617 | 1636 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
|
1637 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1638 "email: connected\n"); |
3694 | 1639 } |
1640 | |
4804 | 1641 static void oscar_icon_connect(gpointer data, gint source, GaimInputCondition cond) { |
5575 | 1642 GaimConnection *gc = data; |
7283 | 1643 OscarData *od; |
4804 | 1644 aim_session_t *sess; |
1645 aim_conn_t *tstconn; | |
1646 | |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1647 if (!g_list_find(gaim_connections_get_all(), gc)) { |
4804 | 1648 close(source); |
1649 return; | |
1650 } | |
1651 | |
1652 od = gc->proto_data; | |
1653 sess = od->sess; | |
1654 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_ICON); | |
1655 tstconn->fd = source; | |
1656 | |
1657 if (source < 0) { | |
1658 aim_conn_kill(sess, &tstconn); | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1659 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1660 "unable to connect to icon server\n"); |
4804 | 1661 return; |
1662 } | |
1663 | |
1664 aim_conn_completeconnect(sess, tstconn); | |
1665 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
|
1666 gaim_debug(GAIM_DEBUG_INFO, "oscar", "icon: connected\n"); |
4804 | 1667 } |
1668 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1669 /* 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
|
1670 static int gaim_handle_redirect(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 1671 GaimConnection *gc = sess->aux_data; |
1672 GaimAccount *account = gaim_connection_get_account(gc); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1673 aim_conn_t *tstconn; |
4452 | 1674 int i; |
2086 | 1675 char *host; |
1676 int port; | |
4821 | 1677 va_list ap; |
1678 struct aim_redirect_data *redir; | |
2086 | 1679 |
5575 | 1680 port = gaim_account_get_int(account, "port", FAIM_LOGIN_PORT); |
2086 | 1681 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1682 va_start(ap, fr); |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1683 redir = va_arg(ap, struct aim_redirect_data *); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1684 va_end(ap); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1685 |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1686 for (i = 0; i < (int)strlen(redir->ip); i++) { |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1687 if (redir->ip[i] == ':') { |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1688 port = atoi(&(redir->ip[i+1])); |
2086 | 1689 break; |
1690 } | |
1691 } | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1692 host = g_strndup(redir->ip, i); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1693 |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1694 switch(redir->group) { |
2086 | 1695 case 0x7: /* Authorizer */ |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1696 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1697 "Reconnecting with authorizor...\n"); |
2086 | 1698 tstconn = aim_newconn(sess, AIM_CONN_TYPE_AUTH, NULL); |
1699 if (tstconn == NULL) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1700 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1701 "unable to reconnect with authorizer\n"); |
2086 | 1702 g_free(host); |
1703 return 1; | |
1704 } | |
4649 | 1705 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 1706 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_admin, 0); |
2086 | 1707 |
1708 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1709 if (gaim_proxy_connect(account, host, port, oscar_auth_connect, gc) != 0) { |
2086 | 1710 aim_conn_kill(sess, &tstconn); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1711 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1712 "unable to reconnect with authorizer\n"); |
2086 | 1713 g_free(host); |
1714 return 1; | |
1715 } | |
4293 | 1716 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
4194 | 1717 break; |
1718 | |
2086 | 1719 case 0xd: /* ChatNav */ |
1720 tstconn = aim_newconn(sess, AIM_CONN_TYPE_CHATNAV, NULL); | |
1721 if (tstconn == NULL) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1722 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1723 "unable to connect to chatnav server\n"); |
2086 | 1724 g_free(host); |
1725 return 1; | |
1726 } | |
4649 | 1727 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 1728 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_chatnav, 0); |
2086 | 1729 |
1730 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1731 if (gaim_proxy_connect(account, host, port, oscar_chatnav_connect, gc) != 0) { |
2086 | 1732 aim_conn_kill(sess, &tstconn); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1733 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1734 "unable to connect to chatnav server\n"); |
2086 | 1735 g_free(host); |
1736 return 1; | |
1737 } | |
4293 | 1738 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
4194 | 1739 break; |
1740 | |
1741 case 0xe: { /* Chat */ | |
2086 | 1742 struct chat_connection *ccon; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1743 |
2086 | 1744 tstconn = aim_newconn(sess, AIM_CONN_TYPE_CHAT, NULL); |
1745 if (tstconn == NULL) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1746 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1747 "unable to connect to chat server\n"); |
2086 | 1748 g_free(host); |
1749 return 1; | |
1750 } | |
1751 | |
4649 | 1752 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 1753 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_chat, 0); |
1754 | |
2086 | 1755 ccon = g_new0(struct chat_connection, 1); |
1756 ccon->conn = tstconn; | |
1757 ccon->gc = gc; | |
1758 ccon->fd = -1; | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1759 ccon->name = g_strdup(redir->chat.room); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1760 ccon->exchange = redir->chat.exchange; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1761 ccon->instance = redir->chat.instance; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1762 ccon->show = extract_name(redir->chat.room); |
4634 | 1763 |
2086 | 1764 ccon->conn->status |= AIM_CONN_STATUS_INPROGRESS; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1765 if (gaim_proxy_connect(account, host, port, oscar_chat_connect, ccon) != 0) { |
2086 | 1766 aim_conn_kill(sess, &tstconn); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1767 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1768 "unable to connect to chat server\n"); |
2086 | 1769 g_free(host); |
1770 g_free(ccon->show); | |
1771 g_free(ccon->name); | |
1772 g_free(ccon); | |
1773 return 1; | |
1774 } | |
4293 | 1775 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1776 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1777 "Connected to chat room %s exchange %hu\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1778 ccon->name, ccon->exchange); |
4194 | 1779 } break; |
3694 | 1780 |
4804 | 1781 case 0x0010: { /* icon */ |
1782 if (!(tstconn = aim_newconn(sess, AIM_CONN_TYPE_ICON, NULL))) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1783 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1784 "unable to connect to icon server\n"); |
4804 | 1785 g_free(host); |
1786 return 1; | |
1787 } | |
1788 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); | |
1789 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_icon, 0); | |
1790 | |
1791 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1792 if (gaim_proxy_connect(account, host, port, oscar_icon_connect, gc) != 0) { |
4804 | 1793 aim_conn_kill(sess, &tstconn); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1794 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1795 "unable to connect to icon server\n"); |
4804 | 1796 g_free(host); |
1797 return 1; | |
1798 } | |
1799 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); | |
1800 } break; | |
1801 | |
3694 | 1802 case 0x0018: { /* email */ |
1803 if (!(tstconn = aim_newconn(sess, AIM_CONN_TYPE_EMAIL, NULL))) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1804 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1805 "unable to connect to email server\n"); |
3694 | 1806 g_free(host); |
1807 return 1; | |
1808 } | |
4649 | 1809 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
3694 | 1810 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_email, 0); |
1811 | |
1812 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1813 if (gaim_proxy_connect(account, host, port, oscar_email_connect, gc) != 0) { |
3694 | 1814 aim_conn_kill(sess, &tstconn); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1815 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1816 "unable to connect to email server\n"); |
3694 | 1817 g_free(host); |
1818 return 1; | |
1819 } | |
4293 | 1820 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
3694 | 1821 } break; |
1822 | |
2086 | 1823 default: /* huh? */ |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1824 gaim_debug(GAIM_DEBUG_WARNING, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1825 "got redirect for unknown service 0x%04hx\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1826 redir->group); |
2086 | 1827 break; |
1828 } | |
1829 | |
1830 g_free(host); | |
1831 return 1; | |
1832 } | |
1833 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1834 static int gaim_parse_oncoming(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 1835 GaimConnection *gc = sess->aux_data; |
7283 | 1836 OscarData *od = gc->proto_data; |
4738 | 1837 struct buddyinfo *bi; |
2993 | 1838 time_t time_idle = 0, signon = 0; |
1839 int type = 0; | |
1840 int caps = 0; | |
2086 | 1841 va_list ap; |
4738 | 1842 aim_userinfo_t *info; |
4194 | 1843 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1844 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
1845 info = va_arg(ap, aim_userinfo_t *); |
2086 | 1846 va_end(ap); |
1847 | |
2993 | 1848 if (info->present & AIM_USERINFO_PRESENT_CAPABILITIES) |
1849 caps = info->capabilities; | |
3267 | 1850 if (info->flags & AIM_FLAG_ACTIVEBUDDY) |
1851 type |= UC_AB; | |
1852 | |
4766 | 1853 if (info->present & AIM_USERINFO_PRESENT_FLAGS) { |
1854 if (info->flags & AIM_FLAG_UNCONFIRMED) | |
1855 type |= UC_UNCONFIRMED; | |
1856 if (info->flags & AIM_FLAG_ADMINISTRATOR) | |
1857 type |= UC_ADMIN; | |
1858 if (info->flags & AIM_FLAG_AOL) | |
1859 type |= UC_AOL; | |
1860 if (info->flags & AIM_FLAG_FREE) | |
1861 type |= UC_NORMAL; | |
1862 if (info->flags & AIM_FLAG_AWAY) | |
1863 type |= UC_UNAVAILABLE; | |
1864 if (info->flags & AIM_FLAG_WIRELESS) | |
1865 type |= UC_WIRELESS; | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
1866 } |
2993 | 1867 if (info->present & AIM_USERINFO_PRESENT_ICQEXTSTATUS) { |
3595 | 1868 type = (info->icqinfo.status << 16); |
3013 | 1869 if (!(info->icqinfo.status & AIM_ICQ_STATE_CHAT) && |
1870 (info->icqinfo.status != AIM_ICQ_STATE_NORMAL)) { | |
2993 | 1871 type |= UC_UNAVAILABLE; |
3013 | 1872 } |
2993 | 1873 } |
1874 | |
7141 | 1875 if (caps & AIM_CAPS_ICQ_DIRECT) |
1876 caps ^= AIM_CAPS_ICQ_DIRECT; | |
2993 | 1877 |
1878 if (info->present & AIM_USERINFO_PRESENT_IDLE) { | |
2086 | 1879 time(&time_idle); |
1880 time_idle -= info->idletime*60; | |
2993 | 1881 } |
1882 | |
5836 | 1883 if (info->present & AIM_USERINFO_PRESENT_ONLINESINCE) |
1884 signon = info->onlinesince; | |
1885 else if (info->present & AIM_USERINFO_PRESENT_SESSIONLEN) | |
2993 | 1886 signon = time(NULL) - info->sessionlen; |
2086 | 1887 |
5575 | 1888 if (!aim_sncmp(gaim_account_get_username(gaim_connection_get_account(gc)), info->sn)) |
1889 gaim_connection_set_display_name(gc, info->sn); | |
2305
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
1890 |
7261 | 1891 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(gc->account, info->sn)); |
4738 | 1892 if (!bi) { |
1893 bi = g_new0(struct buddyinfo, 1); | |
7261 | 1894 g_hash_table_insert(od->buddyinfo, g_strdup(gaim_normalize(gc->account, info->sn)), bi); |
4738 | 1895 } |
4739 | 1896 bi->typingnot = FALSE; |
1897 bi->ico_informed = FALSE; | |
6857 | 1898 bi->ipaddr = info->icqinfo.ipaddr; |
1899 | |
1900 /* Available message stuff */ | |
6292 | 1901 free(bi->availmsg); |
7011 | 1902 if (info->avail != NULL) |
8225 | 1903 bi->availmsg = oscar_encoding_to_utf8(info->avail_encoding, info->avail, info->avail_len); |
5837 | 1904 else |
6292 | 1905 bi->availmsg = NULL; |
4732 | 1906 |
4804 | 1907 /* Server stored icon stuff */ |
4853 | 1908 if (info->iconcsumlen) { |
7125 | 1909 const char *filename = NULL, *saved_b16 = NULL; |
1910 char *b16 = NULL; | |
7093 | 1911 GaimBuddy *b = NULL; |
4853 | 1912 |
7106
db6bd3e794d8
[gaim-migrate @ 7671]
Christian Hammond <chipx86@chipx86.com>
parents:
7098
diff
changeset
|
1913 b16 = gaim_base16_encode(info->iconcsum, info->iconcsumlen); |
4853 | 1914 b = gaim_find_buddy(gc->account, info->sn); |
7093 | 1915 /* |
1916 * If for some reason the checksum is valid, but cached file is not.. | |
1917 * we want to know. | |
1918 */ | |
7693 | 1919 filename = gaim_blist_node_get_string((GaimBlistNode*)b, "buddy_icon"); |
7093 | 1920 if (filename != NULL) { |
1921 if (g_file_test(filename, G_FILE_TEST_EXISTS)) | |
7693 | 1922 saved_b16 = gaim_blist_node_get_string((GaimBlistNode*)b, |
1923 "icon_checksum"); | |
7093 | 1924 } else |
1925 saved_b16 = NULL; | |
7054
7c04a0775918
[gaim-migrate @ 7617]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
7045
diff
changeset
|
1926 |
4853 | 1927 if (!b16 || !saved_b16 || strcmp(b16, saved_b16)) { |
1928 GSList *cur = od->requesticon; | |
1929 while (cur && aim_sncmp((char *)cur->data, info->sn)) | |
1930 cur = cur->next; | |
1931 if (!cur) { | |
7475 | 1932 od->requesticon = g_slist_append(od->requesticon, g_strdup(gaim_normalize(gc->account, info->sn))); |
4853 | 1933 if (od->icontimer) |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
1934 gaim_timeout_remove(od->icontimer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
1935 od->icontimer = gaim_timeout_add(500, gaim_icon_timerfunc, gc); |
4853 | 1936 } |
1937 } | |
6053 | 1938 g_free(b16); |
4853 | 1939 } |
1940 | |
5628 | 1941 serv_got_update(gc, info->sn, 1, (info->warnlevel/10.0) + 0.5, signon, time_idle, type); |
2086 | 1942 |
1943 return 1; | |
1944 } | |
1945 | |
8341 | 1946 static void gaim_check_comment(OscarData *od, const char *str) { |
1947 if ((str == NULL) || strcmp(str, ck)) | |
1948 aim_locate_setcaps(od->sess, caps_aim); | |
1949 else | |
1950 aim_locate_setcaps(od->sess, caps_aim | AIM_CAPS_SECUREIM); | |
1951 } | |
1952 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1953 static int gaim_parse_offgoing(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 1954 GaimConnection *gc = sess->aux_data; |
7283 | 1955 OscarData *od = gc->proto_data; |
2086 | 1956 va_list ap; |
4739 | 1957 aim_userinfo_t *info; |
2086 | 1958 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1959 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
1960 info = va_arg(ap, aim_userinfo_t *); |
2086 | 1961 va_end(ap); |
1962 | |
4732 | 1963 serv_got_update(gc, info->sn, 0, 0, 0, 0, 0); |
2086 | 1964 |
7261 | 1965 g_hash_table_remove(od->buddyinfo, gaim_normalize(gc->account, info->sn)); |
5837 | 1966 |
2086 | 1967 return 1; |
1968 } | |
1969 | |
3730 | 1970 static void cancel_direct_im(struct ask_direct *d) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1971 gaim_debug(GAIM_DEBUG_INFO, "oscar", "Freeing DirectIM prompts.\n"); |
2086 | 1972 |
1973 g_free(d->sn); | |
1974 g_free(d); | |
1975 } | |
1976 | |
4617 | 1977 static void oscar_odc_callback(gpointer data, gint source, GaimInputCondition condition) { |
2086 | 1978 struct direct_im *dim = data; |
5575 | 1979 GaimConnection *gc = dim->gc; |
7283 | 1980 OscarData *od = gc->proto_data; |
5679 | 1981 GaimConversation *cnv; |
2086 | 1982 char buf[256]; |
3008 | 1983 struct sockaddr name; |
1984 socklen_t name_len = 1; | |
1985 | |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1986 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 1987 g_free(dim); |
1988 return; | |
1989 } | |
1990 | |
1991 if (source < 0) { | |
1992 g_free(dim); | |
1993 return; | |
1994 } | |
1995 | |
4366 | 1996 dim->conn->fd = source; |
2086 | 1997 aim_conn_completeconnect(od->sess, dim->conn); |
6640
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6623
diff
changeset
|
1998 cnv = gaim_conversation_new(GAIM_CONV_IM, dim->gc->account, dim->name); |
3008 | 1999 |
2000 /* This is the best way to see if we're connected or not */ | |
2001 if (getpeername(source, &name, &name_len) == 0) { | |
2002 g_snprintf(buf, sizeof buf, _("Direct IM with %s established"), dim->name); | |
2003 dim->connected = TRUE; | |
6982 | 2004 gaim_conversation_write(cnv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL)); |
3008 | 2005 } |
2086 | 2006 od->direct_ims = g_slist_append(od->direct_ims, dim); |
3008 | 2007 |
4617 | 2008 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, oscar_callback, dim->conn); |
2086 | 2009 } |
2010 | |
4617 | 2011 /* BBB */ |
3952 | 2012 /* |
4617 | 2013 * This is called after a remote AIM user has connected to us. We |
2014 * want to do some voodoo with the socket file descriptors, add a | |
2015 * callback or two, and then send the AIM_CB_OFT_PROMPT. | |
3952 | 2016 */ |
4656 | 2017 static int oscar_sendfile_estblsh(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 2018 GaimConnection *gc = sess->aux_data; |
7283 | 2019 OscarData *od = (OscarData *)gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2020 GaimXfer *xfer; |
5146 | 2021 struct aim_oft_info *oft_info; |
3630 | 2022 va_list ap; |
2023 aim_conn_t *conn, *listenerconn; | |
4656 | 2024 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2025 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2026 "AAA - in oscar_sendfile_estblsh\n"); |
3630 | 2027 va_start(ap, fr); |
2028 conn = va_arg(ap, aim_conn_t *); | |
2029 listenerconn = va_arg(ap, aim_conn_t *); | |
2030 va_end(ap); | |
2031 | |
4617 | 2032 if (!(xfer = oscar_find_xfer_by_conn(od->file_transfers, listenerconn))) |
2033 return 1; | |
2034 | |
5146 | 2035 if (!(oft_info = xfer->data)) |
4617 | 2036 return 1; |
2037 | |
3630 | 2038 /* Stop watching listener conn; watch transfer conn instead */ |
4617 | 2039 gaim_input_remove(xfer->watcher); |
3630 | 2040 aim_conn_kill(sess, &listenerconn); |
2041 | |
5146 | 2042 oft_info->conn = conn; |
2043 xfer->fd = oft_info->conn->fd; | |
2044 | |
2045 aim_conn_addhandler(sess, oft_info->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_ACK, oscar_sendfile_ack, 0); | |
2046 aim_conn_addhandler(sess, oft_info->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DONE, oscar_sendfile_done, 0); | |
2047 xfer->watcher = gaim_input_add(oft_info->conn->fd, GAIM_INPUT_READ, oscar_callback, oft_info->conn); | |
4617 | 2048 |
2049 /* Inform the other user that we are connected and ready to transfer */ | |
5146 | 2050 aim_oft_sendheader(sess, AIM_CB_OFT_PROMPT, oft_info); |
3630 | 2051 |
2052 return 0; | |
2053 } | |
2054 | |
3952 | 2055 /* |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2056 * This is the gaim callback passed to gaim_proxy_connect when connecting to another AIM |
4617 | 2057 * user in order to transfer a file. |
3952 | 2058 */ |
4617 | 2059 static void oscar_sendfile_connected(gpointer data, gint source, GaimInputCondition condition) { |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2060 GaimXfer *xfer; |
5146 | 2061 struct aim_oft_info *oft_info; |
4656 | 2062 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2063 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2064 "AAA - in oscar_sendfile_connected\n"); |
4617 | 2065 if (!(xfer = data)) |
2066 return; | |
5146 | 2067 if (!(oft_info = xfer->data)) |
3630 | 2068 return; |
8446 | 2069 if (source < 0) { |
2070 gaim_xfer_cancel_remote(xfer); | |
4617 | 2071 return; |
8446 | 2072 } |
4617 | 2073 |
2074 xfer->fd = source; | |
5146 | 2075 oft_info->conn->fd = source; |
2076 | |
2077 aim_conn_completeconnect(oft_info->sess, oft_info->conn); | |
2078 xfer->watcher = gaim_input_add(xfer->fd, GAIM_INPUT_READ, oscar_callback, oft_info->conn); | |
4617 | 2079 |
2080 /* Inform the other user that we are connected and ready to transfer */ | |
5146 | 2081 aim_im_sendch2_sendfile_accept(oft_info->sess, oft_info); |
4617 | 2082 |
2083 return; | |
3630 | 2084 } |
2085 | |
3952 | 2086 /* |
4617 | 2087 * This is called when a buddy sends us some file info. This happens when they |
2088 * are sending a file to you, and you have just established a connection to them. | |
4650 | 2089 * You should send them the exact same info except use the real cookie. We also |
4617 | 2090 * get like totally ready to like, receive the file, kay? |
3952 | 2091 */ |
4617 | 2092 static int oscar_sendfile_prompt(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 2093 GaimConnection *gc = sess->aux_data; |
7283 | 2094 OscarData *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2095 GaimXfer *xfer; |
5146 | 2096 struct aim_oft_info *oft_info; |
4617 | 2097 va_list ap; |
2098 aim_conn_t *conn; | |
2099 fu8_t *cookie; | |
2100 struct aim_fileheader_t *fh; | |
4656 | 2101 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2102 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2103 "AAA - in oscar_sendfile_prompt\n"); |
4617 | 2104 va_start(ap, fr); |
2105 conn = va_arg(ap, aim_conn_t *); | |
2106 cookie = va_arg(ap, fu8_t *); | |
2107 fh = va_arg(ap, struct aim_fileheader_t *); | |
2108 va_end(ap); | |
2109 | |
2110 if (!(xfer = oscar_find_xfer_by_conn(od->file_transfers, conn))) | |
2111 return 1; | |
2112 | |
5146 | 2113 if (!(oft_info = xfer->data)) |
4617 | 2114 return 1; |
2115 | |
2116 /* We want to stop listening with a normal thingy */ | |
2117 gaim_input_remove(xfer->watcher); | |
2118 xfer->watcher = 0; | |
2119 | |
5146 | 2120 /* They sent us some information about the file they're sending */ |
2121 memcpy(&oft_info->fh, fh, sizeof(*fh)); | |
2122 | |
2123 /* Fill in the cookie */ | |
2124 memcpy(&oft_info->fh.bcookie, oft_info->cookie, 8); | |
2125 | |
4617 | 2126 /* XXX - convert the name from UTF-8 to UCS-2 if necessary, and pass the encoding to the call below */ |
5146 | 2127 aim_oft_sendheader(oft_info->sess, AIM_CB_OFT_ACK, oft_info); |
4617 | 2128 gaim_xfer_start(xfer, xfer->fd, NULL, 0); |
2129 | |
2130 return 0; | |
3630 | 2131 } |
2132 | |
3952 | 2133 /* |
4657 | 2134 * We are sending a file to someone else. They have just acknowledged our |
4617 | 2135 * prompt, so we want to start sending data like there's no tomorrow. |
3952 | 2136 */ |
4617 | 2137 static int oscar_sendfile_ack(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 2138 GaimConnection *gc = sess->aux_data; |
7283 | 2139 OscarData *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2140 GaimXfer *xfer; |
4617 | 2141 va_list ap; |
2142 aim_conn_t *conn; | |
2143 fu8_t *cookie; | |
2144 struct aim_fileheader_t *fh; | |
4656 | 2145 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2146 gaim_debug(GAIM_DEBUG_INFO, "oscar", "AAA - in oscar_sendfile_ack\n"); |
4617 | 2147 va_start(ap, fr); |
2148 conn = va_arg(ap, aim_conn_t *); | |
2149 cookie = va_arg(ap, fu8_t *); | |
2150 fh = va_arg(ap, struct aim_fileheader_t *); | |
2151 va_end(ap); | |
2152 | |
2153 if (!(xfer = oscar_find_xfer_by_cookie(od->file_transfers, cookie))) | |
2154 return 1; | |
2155 | |
4656 | 2156 /* We want to stop listening with a normal thingy */ |
2157 gaim_input_remove(xfer->watcher); | |
2158 xfer->watcher = 0; | |
2159 | |
4617 | 2160 gaim_xfer_start(xfer, xfer->fd, NULL, 0); |
2161 | |
2162 return 0; | |
3630 | 2163 } |
4617 | 2164 |
2165 /* | |
2166 * We just sent a file to someone. They said they got it and everything, | |
2167 * so we can close our direct connection and what not. | |
2168 */ | |
2169 static int oscar_sendfile_done(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 2170 GaimConnection *gc = sess->aux_data; |
7283 | 2171 OscarData *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2172 GaimXfer *xfer; |
4617 | 2173 va_list ap; |
2174 aim_conn_t *conn; | |
2175 fu8_t *cookie; | |
2176 struct aim_fileheader_t *fh; | |
4656 | 2177 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2178 gaim_debug(GAIM_DEBUG_INFO, "oscar", "AAA - in oscar_sendfile_done\n"); |
4617 | 2179 va_start(ap, fr); |
2180 conn = va_arg(ap, aim_conn_t *); | |
2181 cookie = va_arg(ap, fu8_t *); | |
2182 fh = va_arg(ap, struct aim_fileheader_t *); | |
2183 va_end(ap); | |
2184 | |
2185 if (!(xfer = oscar_find_xfer_by_conn(od->file_transfers, conn))) | |
2186 return 1; | |
2187 | |
4656 | 2188 xfer->fd = conn->fd; |
4617 | 2189 gaim_xfer_end(xfer); |
2190 | |
2191 return 0; | |
2192 } | |
3630 | 2193 |
4244 | 2194 static void accept_direct_im(struct ask_direct *d) { |
5575 | 2195 GaimConnection *gc = d->gc; |
7283 | 2196 OscarData *od; |
2086 | 2197 struct direct_im *dim; |
8240 | 2198 char *host; int port = 5190; |
4366 | 2199 int i, rc; |
2086 | 2200 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2201 if (!g_list_find(gaim_connections_get_all(), gc)) { |
4244 | 2202 cancel_direct_im(d); |
2203 return; | |
2204 } | |
2205 | |
7283 | 2206 od = (OscarData *)gc->proto_data; |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2207 gaim_debug(GAIM_DEBUG_INFO, "oscar", "Accepted DirectIM.\n"); |
2086 | 2208 |
2209 dim = find_direct_im(od, d->sn); | |
2210 if (dim) { | |
3730 | 2211 cancel_direct_im(d); /* 40 */ |
4244 | 2212 return; |
2086 | 2213 } |
2214 dim = g_new0(struct direct_im, 1); | |
2215 dim->gc = d->gc; | |
2216 g_snprintf(dim->name, sizeof dim->name, "%s", d->sn); | |
2217 | |
4617 | 2218 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
|
2219 if (!dim->conn) { |
2086 | 2220 g_free(dim); |
3730 | 2221 cancel_direct_im(d); |
4244 | 2222 return; |
2086 | 2223 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2224 |
2086 | 2225 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, |
4617 | 2226 gaim_odc_incoming, 0); |
2086 | 2227 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, |
4617 | 2228 gaim_odc_typing, 0); |
3033 | 2229 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER, |
6982 | 2230 gaim_odc_update_ui, 0); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2231 for (i = 0; i < (int)strlen(d->ip); i++) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2232 if (d->ip[i] == ':') { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2233 port = atoi(&(d->ip[i+1])); |
2086 | 2234 break; |
2235 } | |
2236 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2237 host = g_strndup(d->ip, i); |
2086 | 2238 dim->conn->status |= AIM_CONN_STATUS_INPROGRESS; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2239 rc = gaim_proxy_connect(gc->account, host, port, oscar_odc_callback, dim); |
2086 | 2240 g_free(host); |
4366 | 2241 if (rc < 0) { |
2086 | 2242 aim_conn_kill(od->sess, &dim->conn); |
2243 g_free(dim); | |
3730 | 2244 cancel_direct_im(d); |
4244 | 2245 return; |
2086 | 2246 } |
2247 | |
3730 | 2248 cancel_direct_im(d); |
2086 | 2249 |
4244 | 2250 return; |
2086 | 2251 } |
2252 | |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2253 static int incomingim_chan1(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch1_args *args) { |
5575 | 2254 GaimConnection *gc = sess->aux_data; |
7283 | 2255 OscarData *od = gc->proto_data; |
7475 | 2256 gchar *tmp; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
2257 GaimConvImFlags flags = 0; |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
2258 gsize convlen; |
3659 | 2259 GError *err = NULL; |
4738 | 2260 struct buddyinfo *bi; |
5575 | 2261 const char *iconfile; |
4738 | 2262 |
7261 | 2263 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(gc->account, userinfo->sn)); |
4738 | 2264 if (!bi) { |
2265 bi = g_new0(struct buddyinfo, 1); | |
7261 | 2266 g_hash_table_insert(od->buddyinfo, g_strdup(gaim_normalize(gc->account, userinfo->sn)), bi); |
4738 | 2267 } |
2273
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
2268 |
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
2269 if (args->icbmflags & AIM_IMFLAGS_AWAY) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
2270 flags |= GAIM_CONV_IM_AUTO_RESP; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2271 |
4738 | 2272 if (args->icbmflags & AIM_IMFLAGS_TYPINGNOT) |
2273 bi->typingnot = TRUE; | |
2274 else | |
2275 bi->typingnot = FALSE; | |
2276 | |
4380 | 2277 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
|
2278 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2279 "%s has an icon\n", userinfo->sn); |
4738 | 2280 if ((args->iconlen != bi->ico_len) || (args->iconsum != bi->ico_csum) || (args->iconstamp != bi->ico_time)) { |
2281 bi->ico_need = TRUE; | |
2282 bi->ico_len = args->iconlen; | |
2283 bi->ico_csum = args->iconsum; | |
2284 bi->ico_time = args->iconstamp; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2285 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2286 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2287 |
5575 | 2288 if ((iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc))) && |
7406 | 2289 (args->icbmflags & AIM_IMFLAGS_BUDDYREQ) && !bi->ico_sent && bi->ico_informed) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2290 FILE *file; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2291 struct stat st; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2292 |
5575 | 2293 if (!stat(iconfile, &st)) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2294 char *buf = g_malloc(st.st_size); |
5575 | 2295 file = fopen(iconfile, "rb"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2296 if (file) { |
2603
24664768a739
[gaim-migrate @ 2616]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2597
diff
changeset
|
2297 int len = fread(buf, 1, st.st_size, file); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2298 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2299 "Sending buddy icon to %s (%d bytes, " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2300 "%lu reported)\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2301 userinfo->sn, len, st.st_size); |
4617 | 2302 aim_im_sendch2_icon(sess, userinfo->sn, buf, st.st_size, |
2303 st.st_mtime, aimutil_iconsum(buf, st.st_size)); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2304 fclose(file); |
2336
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
2305 } else |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2306 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2307 "Can't open buddy icon file!\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2308 g_free(buf); |
2336
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
2309 } else |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2310 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2311 "Can't stat buddy icon file!\n"); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2312 } |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2313 |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2314 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2315 "Character set is %hu %hu\n", args->charset, args->charsubset); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2316 if (args->icbmflags & AIM_IMFLAGS_UNICODE) { |
3722 | 2317 /* This message is marked as UNICODE, so we have to |
2318 * convert it to utf-8 before handing it to the gaim core. | |
2319 * This conversion should *never* fail, if it does it | |
2320 * means that either the incoming ICBM is corrupted or | |
4662 | 2321 * there is something we don't understand about it. |
2322 * For the record, AIM Unicode is big-endian UCS-2 */ | |
2323 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2324 gaim_debug(GAIM_DEBUG_INFO, "oscar", "Received UNICODE IM\n"); |
4121 | 2325 |
2326 if (!args->msg || !args->msglen) | |
2327 return 1; | |
4641 | 2328 |
3659 | 2329 tmp = g_convert(args->msg, args->msglen, "UTF-8", "UCS-2BE", NULL, &convlen, &err); |
2330 if (err) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2331 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2332 "Unicode IM conversion: %s\n", err->message); |
7475 | 2333 tmp = g_strdup(_("(There was an error receiving this message)")); |
4800 | 2334 g_error_free(err); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2335 } |
3722 | 2336 } else { |
3850 | 2337 /* This will get executed for both AIM_IMFLAGS_ISO_8859_1 and |
3722 | 2338 * unflagged messages, which are ASCII. That's OK because |
2339 * ASCII is a strict subset of ISO-8859-1; this should | |
2340 * help with compatibility with old, broken versions of | |
2341 * gaim (everything before 0.60) and other broken clients | |
2342 * that will happily send ISO-8859-1 without marking it as | |
2343 * such */ | |
4662 | 2344 if (args->icbmflags & AIM_IMFLAGS_ISO_8859_1) |
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 "Received ISO-8859-1 IM\n"); |
4121 | 2347 |
2348 if (!args->msg || !args->msglen) | |
2349 return 1; | |
2350 | |
3659 | 2351 tmp = g_convert(args->msg, args->msglen, "UTF-8", "ISO-8859-1", NULL, &convlen, &err); |
2352 if (err) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2353 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2354 "ISO-8859-1 IM conversion: %s\n", err->message); |
7475 | 2355 tmp = g_strdup(_("(There was an error receiving this message)")); |
4800 | 2356 g_error_free(err); |
3659 | 2357 } |
3642 | 2358 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2359 |
7478
3c21f3084ff0
[gaim-migrate @ 8091]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
7475
diff
changeset
|
2360 /* gaim_str_strip_cr(tmp); */ |
6982 | 2361 serv_got_im(gc, userinfo->sn, tmp, flags, time(NULL)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2362 g_free(tmp); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2363 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2364 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2365 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2366 |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2367 static int incomingim_chan2(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args) { |
5575 | 2368 GaimConnection *gc = sess->aux_data; |
7283 | 2369 OscarData *od = gc->proto_data; |
5575 | 2370 const char *username = gaim_account_get_username(gaim_connection_get_account(gc)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2371 |
4121 | 2372 if (!args) |
2373 return 0; | |
4194 | 2374 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2375 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2376 "rendezvous with %s, status is %hu\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2377 userinfo->sn, args->status); |
2869 | 2378 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2379 if (args->reqclass & AIM_CAPS_CHAT) { |
4121 | 2380 char *name; |
5234 | 2381 GHashTable *components; |
2382 | |
4121 | 2383 if (!args->info.chat.roominfo.name || !args->info.chat.roominfo.exchange || !args->msg) |
2384 return 1; | |
5234 | 2385 components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, |
2386 g_free); | |
4121 | 2387 name = extract_name(args->info.chat.roominfo.name); |
5234 | 2388 g_hash_table_replace(components, g_strdup("room"), g_strdup(name ? name : args->info.chat.roominfo.name)); |
2389 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
|
2390 serv_got_chat_invite(gc, |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2391 name ? name : args->info.chat.roominfo.name, |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2392 userinfo->sn, |
6059 | 2393 args->msg, |
5234 | 2394 components); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2395 if (name) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2396 g_free(name); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2397 } else if (args->reqclass & AIM_CAPS_SENDFILE) { |
4617 | 2398 /* BBB */ |
2399 if (args->status == AIM_RENDEZVOUS_PROPOSE) { | |
2400 /* Someone wants to send a file (or files) to us */ | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2401 GaimXfer *xfer; |
5146 | 2402 struct aim_oft_info *oft_info; |
2403 | |
2404 if (!args->cookie || !args->port || !args->verifiedip || | |
2405 !args->info.sendfile.filename || !args->info.sendfile.totsize || | |
4656 | 2406 !args->info.sendfile.totfiles || !args->reqclass) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2407 gaim_debug(GAIM_DEBUG_WARNING, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2408 "%s tried to send you a file with incomplete " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2409 "information.\n", userinfo->sn); |
5146 | 2410 if (args->proxyip) |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2411 gaim_debug(GAIM_DEBUG_WARNING, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2412 "IP for a proxy server was given. Gaim " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2413 "does not support this yet.\n"); |
4617 | 2414 return 1; |
4656 | 2415 } |
4617 | 2416 |
2417 if (args->info.sendfile.subtype == AIM_OFT_SUBTYPE_SEND_DIR) { | |
2418 /* last char of the ft req is a star, they are sending us a | |
2419 * directory -- remove the star and trailing slash so we dont save | |
2420 * directories that look like 'dirname\*' -- arl */ | |
2421 char *tmp = strrchr(args->info.sendfile.filename, '\\'); | |
2422 if (tmp && (tmp[1] == '*')) { | |
2423 tmp[0] = '\0'; | |
2424 } | |
8446 | 2425 gaim_debug(GAIM_DEBUG_WARNING, "oscar", |
2426 "We're receiving a whole directory! What fun! " | |
2427 "Especially since we don't support that!\n"); | |
4617 | 2428 } |
2429 | |
2430 /* Build the file transfer handle */ | |
2431 xfer = gaim_xfer_new(gc->account, GAIM_XFER_RECEIVE, userinfo->sn); | |
5163 | 2432 xfer->remote_ip = g_strdup(args->verifiedip); |
5146 | 2433 xfer->remote_port = args->port; |
4617 | 2434 gaim_xfer_set_filename(xfer, args->info.sendfile.filename); |
2435 gaim_xfer_set_size(xfer, args->info.sendfile.totsize); | |
5146 | 2436 |
2437 /* Create the oscar-specific data */ | |
5163 | 2438 oft_info = aim_oft_createinfo(od->sess, args->cookie, userinfo->sn, args->clientip, xfer->remote_port, 0, 0, NULL); |
4898 | 2439 if (args->proxyip) |
5146 | 2440 oft_info->proxyip = g_strdup(args->proxyip); |
4898 | 2441 if (args->verifiedip) |
5146 | 2442 oft_info->verifiedip = g_strdup(args->verifiedip); |
2443 xfer->data = oft_info; | |
4617 | 2444 |
2445 /* Setup our I/O op functions */ | |
8446 | 2446 gaim_xfer_set_init_fnc(xfer, oscar_xfer_init_recv); |
4617 | 2447 gaim_xfer_set_end_fnc(xfer, oscar_xfer_end); |
8446 | 2448 gaim_xfer_set_request_denied_fnc(xfer, oscar_xfer_cancel_recv); |
4675
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
2449 gaim_xfer_set_cancel_recv_fnc(xfer, oscar_xfer_cancel_recv); |
8446 | 2450 gaim_xfer_set_ack_fnc(xfer, oscar_xfer_ack_recv); |
4617 | 2451 |
2452 /* | |
2453 * XXX - Should do something with args->msg, args->encoding, and args->language | |
2454 * probably make it apply to all ch2 messages. | |
3752 | 2455 */ |
4617 | 2456 |
2457 /* Keep track of this transfer for later */ | |
2458 od->file_transfers = g_slist_append(od->file_transfers, xfer); | |
2459 | |
2460 /* Now perform the request */ | |
2461 gaim_xfer_request(xfer); | |
2462 } else if (args->status == AIM_RENDEZVOUS_CANCEL) { | |
2463 /* The other user wants to cancel a file transfer */ | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2464 GaimXfer *xfer; |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2465 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2466 "AAA - File transfer canceled by remote user\n"); |
4617 | 2467 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
|
2468 gaim_xfer_cancel_remote(xfer); |
4617 | 2469 } else if (args->status == AIM_RENDEZVOUS_ACCEPT) { |
2470 /* | |
2471 * This gets sent by the receiver of a file | |
2472 * as they connect directly to us. If we don't | |
2473 * get this, then maybe a third party connected | |
2474 * to us, and we shouldn't send them anything. | |
2475 */ | |
2476 } else { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2477 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2478 "unknown rendezvous status!\n"); |
3630 | 2479 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2480 } else if (args->reqclass & AIM_CAPS_GETFILE) { |
8092 | 2481 } else if (args->reqclass & AIM_CAPS_TALK) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2482 } else if (args->reqclass & AIM_CAPS_BUDDYICON) { |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
2483 gaim_buddy_icons_set_for_user(gaim_connection_get_account(gc), |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
2484 userinfo->sn, args->info.icon.icon, |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
2485 args->info.icon.length); |
6871 | 2486 } else if (args->reqclass & AIM_CAPS_DIRECTIM) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2487 struct ask_direct *d = g_new0(struct ask_direct, 1); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2488 char buf[256]; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2489 |
4212 | 2490 if (!args->verifiedip) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2491 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2492 "directim kill blocked (%s)\n", userinfo->sn); |
4650 | 2493 return 1; |
4212 | 2494 } |
2495 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2496 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2497 "%s received direct im request from %s (%s)\n", |
5575 | 2498 username, userinfo->sn, args->verifiedip); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2499 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2500 d->gc = gc; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2501 d->sn = g_strdup(userinfo->sn); |
2869 | 2502 strncpy(d->ip, args->verifiedip, sizeof(d->ip)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2503 memcpy(d->cookie, args->cookie, 8); |
5575 | 2504 g_snprintf(buf, sizeof buf, _("%s has just asked to directly connect to %s"), userinfo->sn, username); |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2505 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2506 gaim_request_action(gc, NULL, buf, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2507 _("This requires a direct connection between " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2508 "the two computers and is necessary for IM " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2509 "Images. Because your IP address will be " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2510 "revealed, this may be considered a privacy " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2511 "risk."), 0, d, 2, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2512 _("Connect"), G_CALLBACK(accept_direct_im), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2513 _("Cancel"), G_CALLBACK(cancel_direct_im)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2514 } else { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2515 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2516 "Unknown reqclass %hu\n", args->reqclass); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2517 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2518 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2519 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2520 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2521 |
3453 | 2522 /* |
4230 | 2523 * Authorization Functions |
2524 * Most of these are callbacks from dialogs. They're used by both | |
2525 * methods of authorization (SSI and old-school channel 4 ICBM) | |
3453 | 2526 */ |
4269 | 2527 /* When you ask other people for authorization */ |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2528 static void gaim_auth_request(struct name_data *data, char *msg) { |
5575 | 2529 GaimConnection *gc = data->gc; |
4244 | 2530 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2531 if (g_list_find(gaim_connections_get_all(), gc)) { |
7283 | 2532 OscarData *od = gc->proto_data; |
6695 | 2533 GaimBuddy *buddy = gaim_find_buddy(gc->account, data->name); |
2534 GaimGroup *group = gaim_find_buddys_group(buddy); | |
4244 | 2535 if (buddy && group) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2536 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2537 "ssi: adding buddy %s to group %s\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2538 buddy->name, group->name); |
4889 | 2539 aim_ssi_sendauthrequest(od->sess, data->name, msg ? msg : _("Please authorize me so I can add you to my buddy list.")); |
4269 | 2540 if (!aim_ssi_itemlist_finditem(od->sess->ssi.local, group->name, buddy->name, AIM_SSI_TYPE_BUDDY)) |
4889 | 2541 aim_ssi_addbuddy(od->sess, buddy->name, group->name, gaim_get_buddy_alias_only(buddy), NULL, NULL, 1); |
4244 | 2542 } |
4230 | 2543 } |
4337 | 2544 } |
2545 | |
2546 static void gaim_auth_request_msgprompt(struct name_data *data) { | |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2547 gaim_request_input(data->gc, NULL, _("Authorization Request Message:"), |
6035
8c44020a958e
[gaim-migrate @ 6485]
Christian Hammond <chipx86@chipx86.com>
parents:
6029
diff
changeset
|
2548 NULL, _("Please authorize me!"), TRUE, FALSE, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2549 _("OK"), G_CALLBACK(gaim_auth_request), |
5836 | 2550 _("Cancel"), G_CALLBACK(oscar_free_name_data), |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2551 data); |
4230 | 2552 } |
2553 | |
2554 static void gaim_auth_dontrequest(struct name_data *data) { | |
5575 | 2555 GaimConnection *gc = data->gc; |
4244 | 2556 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2557 if (g_list_find(gaim_connections_get_all(), gc)) { |
8151 | 2558 /* Remove from local list */ |
2559 GaimBuddy *b = gaim_find_buddy(gaim_connection_get_account(gc), data->name); | |
2560 gaim_blist_remove_buddy(b); | |
4244 | 2561 } |
2562 | |
5836 | 2563 oscar_free_name_data(data); |
4230 | 2564 } |
2565 | |
5575 | 2566 static void gaim_auth_sendrequest(GaimConnection *gc, const char *name) { |
4269 | 2567 struct name_data *data = g_new(struct name_data, 1); |
6695 | 2568 GaimBuddy *buddy; |
4269 | 2569 gchar *dialog_msg, *nombre; |
2570 | |
4687 | 2571 buddy = gaim_find_buddy(gc->account, name); |
2572 if (buddy && (gaim_get_buddy_alias_only(buddy))) | |
2573 nombre = g_strdup_printf("%s (%s)", name, gaim_get_buddy_alias_only(buddy)); | |
4269 | 2574 else |
4830 | 2575 nombre = NULL; |
2576 | |
2577 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 | 2578 data->gc = gc; |
2579 data->name = g_strdup(name); | |
2580 data->nick = NULL; | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2581 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2582 gaim_request_action(gc, NULL, _("Request Authorization"), dialog_msg, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2583 0, data, 2, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2584 _("Request Authorization"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2585 G_CALLBACK(gaim_auth_request_msgprompt), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2586 _("Cancel"), G_CALLBACK(gaim_auth_dontrequest)); |
4269 | 2587 |
2588 g_free(dialog_msg); | |
2589 g_free(nombre); | |
2590 } | |
2591 | |
4230 | 2592 /* When other people ask you for authorization */ |
2593 static void gaim_auth_grant(struct name_data *data) { | |
5575 | 2594 GaimConnection *gc = data->gc; |
4244 | 2595 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2596 if (g_list_find(gaim_connections_get_all(), gc)) { |
7283 | 2597 OscarData *od = gc->proto_data; |
4236 | 2598 #ifdef NOSSI |
6695 | 2599 GaimBuddy *buddy; |
4244 | 2600 gchar message; |
2601 message = 0; | |
4687 | 2602 buddy = gaim_find_buddy(gc->account, data->name); |
4617 | 2603 aim_im_sendch4(od->sess, data->name, AIM_ICQMSG_AUTHGRANTED, &message); |
7015
dece74f05509
[gaim-migrate @ 7578]
Christian Hammond <chipx86@chipx86.com>
parents:
7011
diff
changeset
|
2604 gaim_account_notify_added(gc->account, NULL, data->name, (buddy ? gaim_get_buddy_alias_only(buddy) : NULL), NULL); |
4230 | 2605 #else |
4889 | 2606 aim_ssi_sendauthreply(od->sess, data->name, 0x01, NULL); |
4230 | 2607 #endif |
4244 | 2608 } |
2609 | |
5836 | 2610 oscar_free_name_data(data); |
3141 | 2611 } |
2612 | |
4230 | 2613 /* When other people ask you for authorization */ |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2614 static void gaim_auth_dontgrant(struct name_data *data, char *msg) { |
5575 | 2615 GaimConnection *gc = data->gc; |
4244 | 2616 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2617 if (g_list_find(gaim_connections_get_all(), gc)) { |
7283 | 2618 OscarData *od = gc->proto_data; |
4230 | 2619 #ifdef NOSSI |
4617 | 2620 aim_im_sendch4(od->sess, data->name, AIM_ICQMSG_AUTHDENIED, msg ? msg : _("No reason given.")); |
4230 | 2621 #else |
4889 | 2622 aim_ssi_sendauthreply(od->sess, data->name, 0x00, msg ? msg : _("No reason given.")); |
4230 | 2623 #endif |
4244 | 2624 } |
4337 | 2625 } |
2626 | |
2627 static void gaim_auth_dontgrant_msgprompt(struct name_data *data) { | |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2628 gaim_request_input(data->gc, NULL, _("Authorization Denied Message:"), |
6035
8c44020a958e
[gaim-migrate @ 6485]
Christian Hammond <chipx86@chipx86.com>
parents:
6029
diff
changeset
|
2629 NULL, _("No reason given."), TRUE, FALSE, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2630 _("OK"), G_CALLBACK(gaim_auth_dontgrant), |
5836 | 2631 _("Cancel"), G_CALLBACK(oscar_free_name_data), |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2632 data); |
3141 | 2633 } |
2634 | |
7023 | 2635 /* When someone sends you buddies */ |
2636 static void gaim_icq_buddyadd(struct name_data *data) { | |
5575 | 2637 GaimConnection *gc = data->gc; |
4244 | 2638 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2639 if (g_list_find(gaim_connections_get_all(), gc)) { |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7054
diff
changeset
|
2640 gaim_blist_request_add_buddy(gaim_connection_get_account(gc), data->name, NULL, data->nick); |
4244 | 2641 } |
2642 | |
5836 | 2643 oscar_free_name_data(data); |
3453 | 2644 } |
2645 | |
4075 | 2646 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) { |
5575 | 2647 GaimConnection *gc = sess->aux_data; |
4076 | 2648 gchar **msg1, **msg2; |
2649 GError *err = NULL; | |
6051 | 2650 int i, numtoks; |
4076 | 2651 |
4121 | 2652 if (!args->type || !args->msg || !args->uin) |
2653 return 1; | |
4194 | 2654 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2655 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2656 "Received a channel 4 message of type 0x%02hhx.\n", args->type); |
4076 | 2657 |
2658 /* Split up the message at the delimeter character, then convert each string to UTF-8 */ | |
4173 | 2659 msg1 = g_strsplit(args->msg, "\376", 0); |
6051 | 2660 for (numtoks=0; msg1[numtoks]; numtoks++); |
2661 msg2 = (gchar **)g_malloc((numtoks+1)*sizeof(gchar *)); | |
4076 | 2662 for (i=0; msg1[i]; i++) { |
7478
3c21f3084ff0
[gaim-migrate @ 8091]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
7475
diff
changeset
|
2663 gaim_str_strip_cr(msg1[i]); |
4076 | 2664 msg2[i] = g_convert(msg1[i], strlen(msg1[i]), "UTF-8", "ISO-8859-1", NULL, NULL, &err); |
4800 | 2665 if (err) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2666 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2667 "Error converting a string from ISO-8859-1 to " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2668 "UTF-8 in oscar ICBM channel 4 parsing\n"); |
4800 | 2669 g_error_free(err); |
2670 } | |
4076 | 2671 } |
2672 msg2[i] = NULL; | |
2673 | |
3952 | 2674 switch (args->type) { |
4173 | 2675 case 0x01: { /* MacICQ message or basic offline message */ |
4076 | 2676 if (i >= 1) { |
5556 | 2677 gchar *uin = g_strdup_printf("%u", args->uin); |
4076 | 2678 if (t) { /* This is an offline message */ |
2679 /* I think this timestamp is in UTC, or something */ | |
6982 | 2680 serv_got_im(gc, uin, msg2[0], 0, t); |
4076 | 2681 } else { /* This is a message from MacICQ/Miranda */ |
6982 | 2682 serv_got_im(gc, uin, msg2[0], 0, time(NULL)); |
4076 | 2683 } |
2684 g_free(uin); | |
4075 | 2685 } |
3316 | 2686 } break; |
2687 | |
4173 | 2688 case 0x04: { /* Someone sent you a URL */ |
4076 | 2689 if (i >= 2) { |
7385 | 2690 if (msg2[1] != NULL) { |
2691 gchar *uin = g_strdup_printf("%u", args->uin); | |
2692 gchar *message = g_strdup_printf("<A HREF=\"%s\">%s</A>", | |
2693 msg2[1], | |
2694 (msg2[0] && msg2[0][0]) ? msg2[0] : msg2[1]); | |
2695 serv_got_im(gc, uin, message, 0, time(NULL)); | |
2696 g_free(uin); | |
2697 g_free(message); | |
2698 } | |
3453 | 2699 } |
2700 } break; | |
2701 | |
4173 | 2702 case 0x06: { /* Someone requested authorization */ |
4076 | 2703 if (i >= 6) { |
4230 | 2704 struct name_data *data = g_new(struct name_data, 1); |
5556 | 2705 gchar *dialog_msg = g_strdup_printf(_("The user %u wants to add you to their buddy list for the following reason:\n%s"), args->uin, msg2[5] ? msg2[5] : _("No reason given.")); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2706 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
5556 | 2707 "Received an authorization request from UIN %u\n", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2708 args->uin); |
4076 | 2709 data->gc = gc; |
5556 | 2710 data->name = g_strdup_printf("%u", args->uin); |
4230 | 2711 data->nick = NULL; |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2712 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2713 gaim_request_action(gc, NULL, _("Authorization Request"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2714 dialog_msg, 0, data, 2, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2715 _("Authorize"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2716 G_CALLBACK(gaim_auth_grant), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2717 _("Deny"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2718 G_CALLBACK(gaim_auth_dontgrant_msgprompt)); |
4076 | 2719 g_free(dialog_msg); |
2720 } | |
3141 | 2721 } break; |
2722 | |
4173 | 2723 case 0x07: { /* Someone has denied you authorization */ |
4076 | 2724 if (i >= 1) { |
7023 | 2725 gchar *dialog_msg = g_strdup_printf(_("The user %u has denied your request to add them to your buddy list for the following reason:\n%s"), args->uin, msg2[0] ? msg2[0] : _("No reason given.")); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2726 gaim_notify_info(gc, NULL, _("ICQ authorization denied."), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2727 dialog_msg); |
4076 | 2728 g_free(dialog_msg); |
2729 } | |
3141 | 2730 } break; |
2731 | |
4173 | 2732 case 0x08: { /* Someone has granted you authorization */ |
7023 | 2733 gchar *dialog_msg = g_strdup_printf(_("The user %u has granted your request to add them to your buddy list."), args->uin); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2734 gaim_notify_info(gc, NULL, "ICQ authorization accepted.", |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2735 dialog_msg); |
3141 | 2736 g_free(dialog_msg); |
2737 } break; | |
2738 | |
4333 | 2739 case 0x09: { /* Message from the Godly ICQ server itself, I think */ |
2740 if (i >= 5) { | |
2741 gchar *dialog_msg = g_strdup_printf(_("You have received a special message\n\nFrom: %s [%s]\n%s"), msg2[0], msg2[3], msg2[5]); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2742 gaim_notify_info(gc, NULL, "ICQ Server Message", dialog_msg); |
4333 | 2743 g_free(dialog_msg); |
2744 } | |
2745 } break; | |
2746 | |
4173 | 2747 case 0x0d: { /* Someone has sent you a pager message from http://www.icq.com/your_uin */ |
4076 | 2748 if (i >= 6) { |
4194 | 2749 gchar *dialog_msg = g_strdup_printf(_("You have received an ICQ page\n\nFrom: %s [%s]\n%s"), msg2[0], msg2[3], msg2[5]); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2750 gaim_notify_info(gc, NULL, "ICQ Page", dialog_msg); |
4076 | 2751 g_free(dialog_msg); |
2752 } | |
4075 | 2753 } break; |
2754 | |
4173 | 2755 case 0x0e: { /* Someone has emailed you at your_uin@pager.icq.com */ |
4076 | 2756 if (i >= 6) { |
4308 | 2757 gchar *dialog_msg = g_strdup_printf(_("You have received an ICQ email from %s [%s]\n\nMessage is:\n%s"), msg2[0], msg2[3], msg2[5]); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2758 gaim_notify_info(gc, NULL, "ICQ Email", dialog_msg); |
4076 | 2759 g_free(dialog_msg); |
2760 } | |
4075 | 2761 } break; |
2762 | |
4173 | 2763 case 0x12: { |
3141 | 2764 /* Ack for authorizing/denying someone. Or possibly an ack for sending any system notice */ |
7023 | 2765 /* Someone added you to their buddy list? */ |
3141 | 2766 } break; |
2767 | |
7023 | 2768 case 0x13: { /* Someone has sent you some ICQ buddies */ |
7631 | 2769 guint i, num; |
3453 | 2770 gchar **text; |
4173 | 2771 text = g_strsplit(args->msg, "\376", 0); |
3453 | 2772 if (text) { |
2773 num = 0; | |
2774 for (i=0; i<strlen(text[0]); i++) | |
2775 num = num*10 + text[0][i]-48; | |
2776 for (i=0; i<num; i++) { | |
4230 | 2777 struct name_data *data = g_new(struct name_data, 1); |
7023 | 2778 gchar *message = g_strdup_printf(_("ICQ user %u has sent you a buddy: %s (%s)"), args->uin, text[i*2+2], text[i*2+1]); |
3453 | 2779 data->gc = gc; |
4790 | 2780 data->name = g_strdup(text[i*2+1]); |
2781 data->nick = g_strdup(text[i*2+2]); | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2782 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2783 gaim_request_action(gc, NULL, message, |
7023 | 2784 _("Do you want to add this buddy " |
2785 "to your buddy list?"), | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2786 0, data, 2, |
7023 | 2787 _("Add"), G_CALLBACK(gaim_icq_buddyadd), |
5836 | 2788 _("Decline"), G_CALLBACK(oscar_free_name_data)); |
3453 | 2789 g_free(message); |
2790 } | |
2791 g_strfreev(text); | |
2792 } | |
2793 } break; | |
2794 | |
7023 | 2795 case 0x1a: { /* Someone has sent you a greeting card or requested buddies? */ |
3453 | 2796 /* This is boring and silly. */ |
2797 } break; | |
2798 | |
3141 | 2799 default: { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2800 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2801 "Received a channel 4 message of unknown type " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2802 "(type 0x%02hhx).\n", args->type); |
3141 | 2803 } break; |
2804 } | |
2805 | |
4076 | 2806 g_strfreev(msg1); |
2807 g_strfreev(msg2); | |
2808 | |
3141 | 2809 return 1; |
2810 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2811 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2812 static int gaim_parse_incoming_im(aim_session_t *sess, aim_frame_t *fr, ...) { |
4200 | 2813 fu16_t channel; |
2814 int ret = 0; | |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2815 aim_userinfo_t *userinfo; |
2086 | 2816 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2817 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2818 va_start(ap, fr); |
4200 | 2819 channel = (fu16_t)va_arg(ap, unsigned int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2820 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 2821 |
3141 | 2822 switch (channel) { |
2823 case 1: { /* standard message */ | |
2824 struct aim_incomingim_ch1_args *args; | |
2825 args = va_arg(ap, struct aim_incomingim_ch1_args *); | |
2826 ret = incomingim_chan1(sess, fr->conn, userinfo, args); | |
2827 } break; | |
2828 | |
2829 case 2: { /* rendevous */ | |
2830 struct aim_incomingim_ch2_args *args; | |
2831 args = va_arg(ap, struct aim_incomingim_ch2_args *); | |
2832 ret = incomingim_chan2(sess, fr->conn, userinfo, args); | |
2833 } break; | |
2834 | |
2835 case 4: { /* ICQ */ | |
2836 struct aim_incomingim_ch4_args *args; | |
2837 args = va_arg(ap, struct aim_incomingim_ch4_args *); | |
4075 | 2838 ret = incomingim_chan4(sess, fr->conn, userinfo, args, 0); |
3141 | 2839 } break; |
2840 | |
2841 default: { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2842 gaim_debug(GAIM_DEBUG_WARNING, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2843 "ICBM received on unsupported channel (channel " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2844 "0x%04hx).", channel); |
3141 | 2845 } break; |
2086 | 2846 } |
2847 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2848 va_end(ap); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2849 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2850 return ret; |
2086 | 2851 } |
2852 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2853 static int gaim_parse_misses(aim_session_t *sess, aim_frame_t *fr, ...) { |
5420 | 2854 char *buf; |
2086 | 2855 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2856 fu16_t chan, nummissed, reason; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2857 aim_userinfo_t *userinfo; |
2086 | 2858 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2859 va_start(ap, fr); |
4200 | 2860 chan = (fu16_t)va_arg(ap, unsigned int); |
2861 userinfo = va_arg(ap, aim_userinfo_t *); | |
2862 nummissed = (fu16_t)va_arg(ap, unsigned int); | |
2863 reason = (fu16_t)va_arg(ap, unsigned int); | |
2086 | 2864 va_end(ap); |
2865 | |
2866 switch(reason) { | |
5420 | 2867 case 0: /* Invalid (0) */ |
2868 buf = g_strdup_printf( | |
2869 ngettext( | |
4276 | 2870 "You missed %hu message from %s because it was invalid.", |
2871 "You missed %hu messages from %s because they were invalid.", | |
2872 nummissed), | |
4282 | 2873 nummissed, |
2874 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2875 break; |
5420 | 2876 case 1: /* Message too large */ |
2877 buf = g_strdup_printf( | |
2878 ngettext( | |
4276 | 2879 "You missed %hu message from %s because it was too large.", |
2880 "You missed %hu messages from %s because they were too large.", | |
2881 nummissed), | |
4282 | 2882 nummissed, |
2883 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2884 break; |
5420 | 2885 case 2: /* Rate exceeded */ |
2886 buf = g_strdup_printf( | |
2887 ngettext( | |
4276 | 2888 "You missed %hu message from %s because the rate limit has been exceeded.", |
2889 "You missed %hu messages from %s because the rate limit has been exceeded.", | |
2890 nummissed), | |
4282 | 2891 nummissed, |
2892 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2893 break; |
5420 | 2894 case 3: /* Evil Sender */ |
2895 buf = g_strdup_printf( | |
2896 ngettext( | |
4276 | 2897 "You missed %hu message from %s because he/she was too evil.", |
2898 "You missed %hu messages from %s because he/she was too evil.", | |
2899 nummissed), | |
4282 | 2900 nummissed, |
2901 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2902 break; |
5420 | 2903 case 4: /* Evil Receiver */ |
2904 buf = g_strdup_printf( | |
2905 ngettext( | |
4276 | 2906 "You missed %hu message from %s because you are too evil.", |
2907 "You missed %hu messages from %s because you are too evil.", | |
2908 nummissed), | |
4282 | 2909 nummissed, |
2910 userinfo->sn); | |
2086 | 2911 break; |
2912 default: | |
5420 | 2913 buf = g_strdup_printf( |
2914 ngettext( | |
4276 | 2915 "You missed %hu message from %s for an unknown reason.", |
2916 "You missed %hu messages from %s for an unknown reason.", | |
2917 nummissed), | |
4282 | 2918 nummissed, |
2919 userinfo->sn); | |
2086 | 2920 break; |
2921 } | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2922 gaim_notify_error(sess->aux_data, NULL, buf, NULL); |
5420 | 2923 g_free(buf); |
2086 | 2924 |
2925 return 1; | |
2926 } | |
2927 | |
3212 | 2928 static char *gaim_icq_status(int state) { |
2929 /* Make a cute little string that shows the status of the dude or dudet */ | |
2930 if (state & AIM_ICQ_STATE_CHAT) | |
4342 | 2931 return g_strdup_printf(_("Free For Chat")); |
3212 | 2932 else if (state & AIM_ICQ_STATE_DND) |
4342 | 2933 return g_strdup_printf(_("Do Not Disturb")); |
3212 | 2934 else if (state & AIM_ICQ_STATE_OUT) |
4342 | 2935 return g_strdup_printf(_("Not Available")); |
3212 | 2936 else if (state & AIM_ICQ_STATE_BUSY) |
4342 | 2937 return g_strdup_printf(_("Occupied")); |
3212 | 2938 else if (state & AIM_ICQ_STATE_AWAY) |
4342 | 2939 return g_strdup_printf(_("Away")); |
3212 | 2940 else if (state & AIM_ICQ_STATE_WEBAWARE) |
4342 | 2941 return g_strdup_printf(_("Web Aware")); |
3212 | 2942 else if (state & AIM_ICQ_STATE_INVISIBLE) |
4342 | 2943 return g_strdup_printf(_("Invisible")); |
3212 | 2944 else |
4342 | 2945 return g_strdup_printf(_("Online")); |
3212 | 2946 } |
2947 | |
4194 | 2948 static int gaim_parse_clientauto_ch2(aim_session_t *sess, const char *who, fu16_t reason, const char *cookie) { |
5575 | 2949 GaimConnection *gc = sess->aux_data; |
7283 | 2950 OscarData *od = gc->proto_data; |
4617 | 2951 |
2952 /* BBB */ | |
3630 | 2953 switch (reason) { |
4151 | 2954 case 3: { /* Decline sendfile. */ |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2955 GaimXfer *xfer; |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2956 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2957 "AAA - Other user declined file transfer\n"); |
4617 | 2958 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
|
2959 gaim_xfer_cancel_remote(xfer); |
4151 | 2960 } break; |
2961 | |
2962 default: { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2963 gaim_debug(GAIM_DEBUG_WARNING, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2964 "Received an unknown rendezvous client auto-response " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2965 "from %s. Type 0x%04hx\n", who, reason); |
4151 | 2966 } |
3630 | 2967 |
2968 } | |
2969 | |
2970 return 0; | |
2971 } | |
2972 | |
4194 | 2973 static int gaim_parse_clientauto_ch4(aim_session_t *sess, char *who, fu16_t reason, fu32_t state, char *msg) { |
5575 | 2974 GaimConnection *gc = sess->aux_data; |
4151 | 2975 |
2976 switch(reason) { | |
2977 case 0x0003: { /* Reply from an ICQ status message request */ | |
2978 char *status_msg = gaim_icq_status(state); | |
2979 char *dialog_msg, **splitmsg; | |
2980 | |
2981 /* Split at (carriage return/newline)'s, then rejoin later with BRs between. */ | |
2982 splitmsg = g_strsplit(msg, "\r\n", 0); | |
2983 | |
7011 | 2984 dialog_msg = g_strdup_printf(_("<B>UIN:</B> %s<BR><B>Status:</B> %s<HR>%s"), who, status_msg, g_strjoinv("<BR>", splitmsg)); |
7032 | 2985 gaim_notify_formatted(gc, NULL, _("Buddy Information"), NULL, dialog_msg, NULL, NULL); |
4151 | 2986 |
2987 g_free(status_msg); | |
2988 g_free(dialog_msg); | |
2989 g_strfreev(splitmsg); | |
2990 } break; | |
2991 | |
2992 default: { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2993 gaim_debug(GAIM_DEBUG_WARNING, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2994 "Received an unknown client auto-response from %s. " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2995 "Type 0x%04hx\n", who, reason); |
4151 | 2996 } break; |
2997 } /* end of switch */ | |
2998 | |
2999 return 0; | |
3000 } | |
3001 | |
3212 | 3002 static int gaim_parse_clientauto(aim_session_t *sess, aim_frame_t *fr, ...) { |
3003 va_list ap; | |
3004 fu16_t chan, reason; | |
3005 char *who; | |
3006 | |
3007 va_start(ap, fr); | |
4200 | 3008 chan = (fu16_t)va_arg(ap, unsigned int); |
3212 | 3009 who = va_arg(ap, char *); |
4200 | 3010 reason = (fu16_t)va_arg(ap, unsigned int); |
3212 | 3011 |
3952 | 3012 if (chan == 0x0002) { /* File transfer declined */ |
3630 | 3013 char *cookie = va_arg(ap, char *); |
4151 | 3014 return gaim_parse_clientauto_ch2(sess, who, reason, cookie); |
3952 | 3015 } else if (chan == 0x0004) { /* ICQ message */ |
4200 | 3016 fu32_t state = 0; |
4151 | 3017 char *msg = NULL; |
3018 if (reason == 0x0003) { | |
4200 | 3019 state = va_arg(ap, fu32_t); |
4151 | 3020 msg = va_arg(ap, char *); |
3021 } | |
3022 return gaim_parse_clientauto_ch4(sess, who, reason, state, msg); | |
3023 } | |
3952 | 3024 |
3212 | 3025 va_end(ap); |
3026 | |
3027 return 1; | |
3028 } | |
3029 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3030 static int gaim_parse_genericerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3031 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3032 fu16_t reason; |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
3033 char *m; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3034 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3035 va_start(ap, fr); |
4199 | 3036 reason = (fu16_t) va_arg(ap, unsigned int); |
2086 | 3037 va_end(ap); |
3038 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3039 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3040 "snac threw error (reason 0x%04hx: %s)\n", reason, |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3041 (reason < msgerrreasonlen) ? msgerrreason[reason] : "unknown"); |
2086 | 3042 |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
3043 m = g_strdup_printf(_("SNAC threw error: %s\n"), |
5411 | 3044 reason < msgerrreasonlen ? _(msgerrreason[reason]) : _("Unknown error")); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3045 gaim_notify_error(sess->aux_data, NULL, m, NULL); |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
3046 g_free(m); |
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
3047 |
2086 | 3048 return 1; |
3049 } | |
3050 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3051 static int gaim_parse_msgerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
4617 | 3052 #if 0 |
5575 | 3053 GaimConnection *gc = sess->aux_data; |
7283 | 3054 OscarData *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
3055 GaimXfer *xfer; |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
3056 #endif |
4617 | 3057 va_list ap; |
3058 fu16_t reason; | |
3059 char *data, *buf; | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
3060 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3061 va_start(ap, fr); |
4617 | 3062 reason = (fu16_t)va_arg(ap, unsigned int); |
3752 | 3063 data = va_arg(ap, char *); |
2086 | 3064 va_end(ap); |
3065 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3066 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3067 "Message error with data %s and reason %hu\n", data, reason); |
4617 | 3068 |
3069 /* BBB */ | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
3070 #if 0 |
4617 | 3071 /* If this was a file transfer request, data is a cookie */ |
3072 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
|
3073 gaim_xfer_cancel_remote(xfer); |
3630 | 3074 return 1; |
3075 } | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
3076 #endif |
3630 | 3077 |
4617 | 3078 /* Data is assumed to be the destination sn */ |
3079 buf = g_strdup_printf(_("Your message to %s did not get sent:"), data); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3080 gaim_notify_error(sess->aux_data, NULL, buf, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3081 (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("No reason given.")); |
4617 | 3082 g_free(buf); |
2086 | 3083 |
3084 return 1; | |
3085 } | |
3086 | |
3595 | 3087 static int gaim_parse_mtn(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3088 GaimConnection *gc = sess->aux_data; |
3595 | 3089 va_list ap; |
3090 fu16_t type1, type2; | |
3091 char *sn; | |
3092 | |
3093 va_start(ap, fr); | |
4199 | 3094 type1 = (fu16_t) va_arg(ap, unsigned int); |
3595 | 3095 sn = va_arg(ap, char *); |
4199 | 3096 type2 = (fu16_t) va_arg(ap, unsigned int); |
3595 | 3097 va_end(ap); |
3098 | |
3099 switch (type2) { | |
3100 case 0x0000: { /* Text has been cleared */ | |
3101 serv_got_typing_stopped(gc, sn); | |
3102 } break; | |
3103 | |
3104 case 0x0001: { /* Paused typing */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
3105 serv_got_typing(gc, sn, 0, GAIM_TYPED); |
3595 | 3106 } break; |
3107 | |
3108 case 0x0002: { /* Typing */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
3109 serv_got_typing(gc, sn, 0, GAIM_TYPING); |
3595 | 3110 } break; |
3111 | |
3112 default: { | |
5435 | 3113 gaim_debug(GAIM_DEBUG_ERROR, "oscar", "Received unknown typing notification message from %s. Type1 is 0x%04x and type2 is 0x%04hx.\n", sn, type1, type2); |
3595 | 3114 } break; |
3115 } | |
3116 | |
3117 return 1; | |
3118 } | |
3119 | |
7141 | 3120 /* |
3121 * We get this error when there was an error in the locate family. This | |
7259 | 3122 * happens when you request info of someone who is offline. |
7141 | 3123 */ |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3124 static int gaim_parse_locerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
7259 | 3125 gchar *buf; |
2086 | 3126 va_list ap; |
5420 | 3127 fu16_t reason; |
2086 | 3128 char *destn; |
3129 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3130 va_start(ap, fr); |
4199 | 3131 reason = (fu16_t) va_arg(ap, unsigned int); |
2086 | 3132 destn = va_arg(ap, char *); |
3133 va_end(ap); | |
3134 | |
7781 | 3135 if (destn == NULL) |
7793 | 3136 return 1; |
3137 | |
3138 buf = g_strdup_printf(_("User information for %s unavailable:"), destn); | |
7781 | 3139 |
3140 gaim_notify_error(sess->aux_data, NULL, buf, | |
3141 (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("No reason given.")); | |
3142 g_free(buf); | |
2086 | 3143 |
3144 return 1; | |
3145 } | |
3146 | |
6982 | 3147 #if 0 |
2086 | 3148 static char *images(int flags) { |
3149 static char buf[1024]; | |
3101 | 3150 g_snprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s", |
2679 | 3151 (flags & AIM_FLAG_ACTIVEBUDDY) ? "<IMG SRC=\"ab_icon.gif\">" : "", |
2086 | 3152 (flags & AIM_FLAG_UNCONFIRMED) ? "<IMG SRC=\"dt_icon.gif\">" : "", |
3153 (flags & AIM_FLAG_AOL) ? "<IMG SRC=\"aol_icon.gif\">" : "", | |
3101 | 3154 (flags & AIM_FLAG_ICQ) ? "<IMG SRC=\"icq_icon.gif\">" : "", |
2086 | 3155 (flags & AIM_FLAG_ADMINISTRATOR) ? "<IMG SRC=\"admin_icon.gif\">" : "", |
3079 | 3156 (flags & AIM_FLAG_FREE) ? "<IMG SRC=\"free_icon.gif\">" : "", |
3157 (flags & AIM_FLAG_WIRELESS) ? "<IMG SRC=\"wireless_icon.gif\">" : ""); | |
2086 | 3158 return buf; |
3159 } | |
6982 | 3160 #endif |
3101 | 3161 |
2920 | 3162 static char *caps_string(guint caps) |
3163 { | |
3164 static char buf[512], *tmp; | |
3165 int count = 0, i = 0; | |
3166 guint bit = 1; | |
4742 | 3167 |
3168 if (!caps) { | |
4744 | 3169 return NULL; |
6318 | 3170 } else while (bit <= AIM_CAPS_LAST) { |
2920 | 3171 if (bit & caps) { |
3172 switch (bit) { | |
6871 | 3173 case AIM_CAPS_BUDDYICON: |
2920 | 3174 tmp = _("Buddy Icon"); |
3175 break; | |
8092 | 3176 case AIM_CAPS_TALK: |
2920 | 3177 tmp = _("Voice"); |
3178 break; | |
6871 | 3179 case AIM_CAPS_DIRECTIM: |
7141 | 3180 tmp = _("AIM Direct IM"); |
2920 | 3181 break; |
6871 | 3182 case AIM_CAPS_CHAT: |
2920 | 3183 tmp = _("Chat"); |
3184 break; | |
6871 | 3185 case AIM_CAPS_GETFILE: |
2920 | 3186 tmp = _("Get File"); |
3187 break; | |
6871 | 3188 case AIM_CAPS_SENDFILE: |
2920 | 3189 tmp = _("Send File"); |
3190 break; | |
6871 | 3191 case AIM_CAPS_GAMES: |
3192 case AIM_CAPS_GAMES2: | |
2920 | 3193 tmp = _("Games"); |
3194 break; | |
8092 | 3195 case AIM_CAPS_ADDINS: |
4898 | 3196 tmp = _("Add-Ins"); |
2920 | 3197 break; |
6871 | 3198 case AIM_CAPS_SENDBUDDYLIST: |
2920 | 3199 tmp = _("Send Buddy List"); |
3200 break; | |
7141 | 3201 case AIM_CAPS_ICQ_DIRECT: |
3202 tmp = _("ICQ Direct Connect"); | |
2920 | 3203 break; |
6871 | 3204 case AIM_CAPS_APINFO: |
2920 | 3205 tmp = _("AP User"); |
3206 break; | |
6871 | 3207 case AIM_CAPS_ICQRTF: |
2920 | 3208 tmp = _("ICQ RTF"); |
3209 break; | |
6871 | 3210 case AIM_CAPS_EMPTY: |
2920 | 3211 tmp = _("Nihilist"); |
3212 break; | |
6871 | 3213 case AIM_CAPS_ICQSERVERRELAY: |
2920 | 3214 tmp = _("ICQ Server Relay"); |
3215 break; | |
6871 | 3216 case AIM_CAPS_ICQUTF8OLD: |
3217 tmp = _("Old ICQ UTF8"); | |
2920 | 3218 break; |
6871 | 3219 case AIM_CAPS_TRILLIANCRYPT: |
2920 | 3220 tmp = _("Trillian Encryption"); |
3221 break; | |
6871 | 3222 case AIM_CAPS_ICQUTF8: |
4742 | 3223 tmp = _("ICQ UTF8"); |
3224 break; | |
6318 | 3225 case AIM_CAPS_HIPTOP: |
3226 tmp = _("Hiptop"); | |
3227 break; | |
6871 | 3228 case AIM_CAPS_SECUREIM: |
7334 | 3229 tmp = _("Security Enabled"); |
6871 | 3230 break; |
7582 | 3231 case AIM_CAPS_VIDEO: |
3232 tmp = _("Video Chat"); | |
3233 break; | |
8092 | 3234 /* Not actually sure about this one... WinAIM doesn't show anything */ |
7945 | 3235 case AIM_CAPS_ICHATAV: |
3236 tmp = _("iChat AV"); | |
3237 break; | |
8092 | 3238 case AIM_CAPS_LIVEVIDEO: |
3239 tmp = _("Live Video"); | |
3240 break; | |
3241 case AIM_CAPS_CAMERA: | |
3242 tmp = _("Camera"); | |
3243 break; | |
2920 | 3244 default: |
3245 tmp = NULL; | |
3246 break; | |
3247 } | |
3248 if (tmp) | |
3249 i += g_snprintf(buf + i, sizeof(buf) - i, "%s%s", (count ? ", " : ""), | |
3250 tmp); | |
3251 count++; | |
3252 } | |
3253 bit <<= 1; | |
3254 } | |
4744 | 3255 return buf; |
2920 | 3256 } |
3257 | |
7011 | 3258 static int gaim_parse_userinfo(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3259 GaimConnection *gc = sess->aux_data; |
7011 | 3260 GString *text; |
7162 | 3261 gchar *info_utf8 = NULL, *away_utf8 = NULL; |
3262 const char *final = NULL; | |
4791 | 3263 va_list ap; |
7011 | 3264 aim_userinfo_t *userinfo; |
2086 | 3265 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3266 va_start(ap, fr); |
7011 | 3267 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 3268 va_end(ap); |
3269 | |
7011 | 3270 text = g_string_new(""); |
3271 g_string_append_printf(text, _("Username: <b>%s</b><br>\n"), userinfo->sn); | |
3272 g_string_append_printf(text, _("Warning Level: <b>%d%%</b><br>\n"), (int)((userinfo->warnlevel/10.0) + 0.5)); | |
3273 | |
3274 if (userinfo->present & AIM_USERINFO_PRESENT_ONLINESINCE) | |
3275 g_string_append_printf(text, _("Online Since: <b>%s</b><br>\n"), | |
3276 asctime(localtime((time_t *)&userinfo->onlinesince))); | |
3277 | |
3278 if (userinfo->present & AIM_USERINFO_PRESENT_MEMBERSINCE) | |
3279 g_string_append_printf(text, _("Member Since: <b>%s</b><br>\n"), | |
3280 asctime(localtime((time_t *)&userinfo->membersince))); | |
3281 | |
3282 if (userinfo->present & AIM_USERINFO_PRESENT_IDLE) { | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3283 gchar *itime = gaim_str_seconds_to_string(userinfo->idletime*60); |
7011 | 3284 g_string_append_printf(text, _("Idle: <b>%s</b>"), itime); |
4426 | 3285 g_free(itime); |
2993 | 3286 } else |
7011 | 3287 g_string_append_printf(text, _("Idle: <b>Active</b>")); |
3288 | |
3289 if ((userinfo->flags & AIM_FLAG_AWAY) && (userinfo->away_len > 0) && (userinfo->away != NULL) && (userinfo->away_encoding != NULL)) { | |
8225 | 3290 gchar *charset = oscar_encoding_extract(userinfo->away_encoding); |
3291 away_utf8 = oscar_encoding_to_utf8(charset, userinfo->away, userinfo->away_len); | |
3292 g_free(charset); | |
7011 | 3293 if (away_utf8 != NULL) { |
7129 | 3294 g_string_append_printf(text, "<hr>%s", away_utf8); |
7011 | 3295 g_free(away_utf8); |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3296 } |
7011 | 3297 } |
3298 | |
3299 if ((userinfo->info_len > 0) && (userinfo->info != NULL) && (userinfo->info_encoding != NULL)) { | |
8225 | 3300 gchar *charset = oscar_encoding_extract(userinfo->info_encoding); |
3301 info_utf8 = oscar_encoding_to_utf8(charset, userinfo->info, userinfo->info_len); | |
3302 g_free(charset); | |
7011 | 3303 if (info_utf8 != NULL) { |
7129 | 3304 g_string_append_printf(text, "<hr>%s", info_utf8); |
7011 | 3305 g_free(info_utf8); |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3306 } |
7011 | 3307 } |
3308 | |
7164 | 3309 final = gaim_str_sub_away_formatters(text->str, gaim_account_get_username(gaim_connection_get_account(gc))); |
7011 | 3310 g_string_free(text, TRUE); |
7091 | 3311 gaim_notify_formatted(gc, NULL, _("Buddy Information"), NULL, final, NULL, NULL); |
4151 | 3312 |
2086 | 3313 return 1; |
3314 } | |
3315 | |
8341 | 3316 static gboolean gaim_reqinfo_timeout_cb(void *data) |
3317 { | |
3318 aim_session_t *sess = data; | |
3319 GaimConnection *gc = sess->aux_data; | |
3320 OscarData *od = (OscarData *)gc->proto_data; | |
3321 | |
3322 aim_locate_dorequest(data); | |
3323 od->getinfotimer = 0; | |
3324 | |
3325 return FALSE; | |
3326 } | |
3327 | |
3328 static int gaim_reqinfo_timeout(aim_session_t *sess, aim_frame_t *fr, ...) | |
3329 { | |
3330 GaimConnection *gc = sess->aux_data; | |
3331 OscarData *od = (OscarData *)gc->proto_data; | |
3332 | |
3333 /* | |
3334 * Wait a little while then call aim_locate_dorequest(sess). This keeps | |
3335 * us from hitting the rate limit due to request away messages and info | |
3336 * too quickly. | |
3337 */ | |
3338 if (od->getinfotimer == 0) | |
3339 od->getinfotimer = gaim_timeout_add(1200, gaim_reqinfo_timeout_cb, sess); | |
3340 | |
3341 return 1; | |
3342 } | |
3343 | |
3344 static int gaim_parse_motd(aim_session_t *sess, aim_frame_t *fr, ...) | |
3345 { | |
2086 | 3346 char *msg; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3347 fu16_t id; |
2086 | 3348 va_list ap; |
3349 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3350 va_start(ap, fr); |
4199 | 3351 id = (fu16_t) va_arg(ap, unsigned int); |
2086 | 3352 msg = va_arg(ap, char *); |
3353 va_end(ap); | |
3354 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3355 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3356 "MOTD: %s (%hu)\n", msg ? msg : "Unknown", id); |
2092
59b0377d18aa
[gaim-migrate @ 2102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
3357 if (id < 4) |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3358 gaim_notify_warning(sess->aux_data, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3359 _("Your AIM connection may be lost."), NULL); |
2086 | 3360 |
3361 return 1; | |
3362 } | |
3363 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3364 static int gaim_chatnav_info(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3365 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3366 fu16_t type; |
5575 | 3367 GaimConnection *gc = sess->aux_data; |
7283 | 3368 OscarData *od = (OscarData *)gc->proto_data; |
2086 | 3369 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3370 va_start(ap, fr); |
4199 | 3371 type = (fu16_t) va_arg(ap, unsigned int); |
2086 | 3372 |
3373 switch(type) { | |
3374 case 0x0002: { | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3375 fu8_t maxrooms; |
2086 | 3376 struct aim_chat_exchangeinfo *exchanges; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3377 int exchangecount, i; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3378 |
4199 | 3379 maxrooms = (fu8_t) va_arg(ap, unsigned int); |
2086 | 3380 exchangecount = va_arg(ap, int); |
3381 exchanges = va_arg(ap, struct aim_chat_exchangeinfo *); | |
3382 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3383 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3384 "chat info: Chat Rights:\n"); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3385 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3386 "chat info: \tMax Concurrent Rooms: %hhd\n", maxrooms); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3387 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3388 "chat info: \tExchange List: (%d total)\n", exchangecount); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3389 for (i = 0; i < exchangecount; i++) |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3390 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3391 "chat info: \t\t%hu %s\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3392 exchanges[i].number, exchanges[i].name ? exchanges[i].name : ""); |
4617 | 3393 while (od->create_rooms) { |
3394 struct create_room *cr = od->create_rooms->data; | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3395 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3396 "creating room %s\n", cr->name); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
3397 aim_chatnav_createroom(sess, fr->conn, cr->name, cr->exchange); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
3398 g_free(cr->name); |
4617 | 3399 od->create_rooms = g_slist_remove(od->create_rooms, cr); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
3400 g_free(cr); |
2086 | 3401 } |
3402 } | |
3403 break; | |
3404 case 0x0008: { | |
3405 char *fqcn, *name, *ck; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3406 fu16_t instance, flags, maxmsglen, maxoccupancy, unknown, exchange; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3407 fu8_t createperms; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3408 fu32_t createtime; |
2086 | 3409 |
3410 fqcn = va_arg(ap, char *); | |
4200 | 3411 instance = (fu16_t)va_arg(ap, unsigned int); |
3412 exchange = (fu16_t)va_arg(ap, unsigned int); | |
3413 flags = (fu16_t)va_arg(ap, unsigned int); | |
3414 createtime = va_arg(ap, fu32_t); | |
3415 maxmsglen = (fu16_t)va_arg(ap, unsigned int); | |
3416 maxoccupancy = (fu16_t)va_arg(ap, unsigned int); | |
3417 createperms = (fu8_t)va_arg(ap, unsigned int); | |
3418 unknown = (fu16_t)va_arg(ap, unsigned int); | |
3419 name = va_arg(ap, char *); | |
3420 ck = va_arg(ap, char *); | |
4194 | 3421 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3422 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
5556 | 3423 "created room: %s %hu %hu %hu %u %hu %hu %hhu %hu %s %s\n", |
2086 | 3424 fqcn, |
3425 exchange, instance, flags, | |
3426 createtime, | |
3427 maxmsglen, maxoccupancy, createperms, unknown, | |
3428 name, ck); | |
4617 | 3429 aim_chat_join(od->sess, od->conn, exchange, ck, instance); |
2086 | 3430 } |
3431 break; | |
3432 default: | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3433 gaim_debug(GAIM_DEBUG_WARNING, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3434 "chatnav info: unknown type (%04hx)\n", type); |
2086 | 3435 break; |
3436 } | |
4194 | 3437 |
3438 va_end(ap); | |
3439 | |
2086 | 3440 return 1; |
3441 } | |
3442 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
3443 static int gaim_conv_chat_join(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3444 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3445 int count, i; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3446 aim_userinfo_t *info; |
5575 | 3447 GaimConnection *g = sess->aux_data; |
2086 | 3448 |
3449 struct chat_connection *c = NULL; | |
3450 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3451 va_start(ap, fr); |
2086 | 3452 count = va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3453 info = va_arg(ap, aim_userinfo_t *); |
2086 | 3454 va_end(ap); |
3455 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3456 c = find_oscar_chat_by_conn(g, fr->conn); |
2086 | 3457 if (!c) |
3458 return 1; | |
3459 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3460 for (i = 0; i < count; i++) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
3461 gaim_conv_chat_add_user(GAIM_CONV_CHAT(c->cnv), info[i].sn, NULL); |
2086 | 3462 |
3463 return 1; | |
3464 } | |
3465 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
3466 static int gaim_conv_chat_leave(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3467 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3468 int count, i; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3469 aim_userinfo_t *info; |
5575 | 3470 GaimConnection *g = sess->aux_data; |
2086 | 3471 |
3472 struct chat_connection *c = NULL; | |
3473 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3474 va_start(ap, fr); |
2086 | 3475 count = va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3476 info = va_arg(ap, aim_userinfo_t *); |
2086 | 3477 va_end(ap); |
3478 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3479 c = find_oscar_chat_by_conn(g, fr->conn); |
2086 | 3480 if (!c) |
3481 return 1; | |
3482 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3483 for (i = 0; i < count; i++) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
3484 gaim_conv_chat_remove_user(GAIM_CONV_CHAT(c->cnv), info[i].sn, NULL); |
2086 | 3485 |
3486 return 1; | |
3487 } | |
3488 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
3489 static int gaim_conv_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
|
3490 va_list ap; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3491 aim_userinfo_t *userinfo; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3492 struct aim_chat_roominfo *roominfo; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3493 char *roomname; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3494 int usercount; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3495 char *roomdesc; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3496 fu16_t unknown_c9, unknown_d2, unknown_d5, maxmsglen, maxvisiblemsglen; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3497 fu32_t creationtime; |
5575 | 3498 GaimConnection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3499 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
|
3500 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3501 va_start(ap, fr); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3502 roominfo = va_arg(ap, struct aim_chat_roominfo *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3503 roomname = va_arg(ap, char *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3504 usercount= va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3505 userinfo = va_arg(ap, aim_userinfo_t *); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3506 roomdesc = va_arg(ap, char *); |
4200 | 3507 unknown_c9 = (fu16_t)va_arg(ap, unsigned int); |
3508 creationtime = va_arg(ap, fu32_t); | |
3509 maxmsglen = (fu16_t)va_arg(ap, unsigned int); | |
3510 unknown_d2 = (fu16_t)va_arg(ap, unsigned int); | |
3511 unknown_d5 = (fu16_t)va_arg(ap, unsigned int); | |
3512 maxvisiblemsglen = (fu16_t)va_arg(ap, unsigned int); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3513 va_end(ap); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3514 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3515 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3516 "inside chat_info_update (maxmsglen = %hu, maxvislen = %hu)\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3517 maxmsglen, maxvisiblemsglen); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3518 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3519 ccon->maxlen = maxmsglen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3520 ccon->maxvis = maxvisiblemsglen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3521 |
2086 | 3522 return 1; |
3523 } | |
3524 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
3525 static int gaim_conv_chat_incoming_msg(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3526 GaimConnection *gc = sess->aux_data; |
8225 | 3527 struct chat_connection *ccon = find_oscar_chat_by_conn(gc, fr->conn); |
3528 gchar *utf8; | |
2086 | 3529 va_list ap; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3530 aim_userinfo_t *info; |
8225 | 3531 int len; |
2086 | 3532 char *msg; |
8219 | 3533 char *charset; |
2086 | 3534 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3535 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3536 info = va_arg(ap, aim_userinfo_t *); |
8219 | 3537 len = va_arg(ap, int); |
4194 | 3538 msg = va_arg(ap, char *); |
8219 | 3539 charset = va_arg(ap, char *); |
4194 | 3540 va_end(ap); |
2086 | 3541 |
8225 | 3542 utf8 = oscar_encoding_to_utf8(charset, msg, len); |
3543 serv_got_chat_in(gc, ccon->id, info->sn, 0, utf8, time((time_t)NULL)); | |
3544 g_free(utf8); | |
2086 | 3545 |
3546 return 1; | |
3547 } | |
3548 | |
3694 | 3549 static int gaim_email_parseupdate(aim_session_t *sess, aim_frame_t *fr, ...) { |
3550 va_list ap; | |
5575 | 3551 GaimConnection *gc = sess->aux_data; |
3694 | 3552 struct aim_emailinfo *emailinfo; |
3725 | 3553 int havenewmail; |
7297 | 3554 char *alertitle, *alerturl; |
3694 | 3555 |
3556 va_start(ap, fr); | |
3557 emailinfo = va_arg(ap, struct aim_emailinfo *); | |
3725 | 3558 havenewmail = va_arg(ap, int); |
7301 | 3559 alertitle = va_arg(ap, char *); |
3560 alerturl = va_arg(ap, char *); | |
3694 | 3561 va_end(ap); |
3562 | |
5628 | 3563 if (emailinfo && gaim_account_get_check_mail(gc->account)) { |
5575 | 3564 gchar *to = g_strdup_printf("%s@%s", gaim_account_get_username(gaim_connection_get_account(gc)), emailinfo->domain); |
5542 | 3565 if (emailinfo->unread && havenewmail) |
3566 gaim_notify_emails(gc, emailinfo->nummsgs, FALSE, NULL, NULL, (const char **)&to, (const char **)&emailinfo->url, NULL, NULL); | |
5537 | 3567 g_free(to); |
3694 | 3568 } |
7297 | 3569 |
7301 | 3570 if (alertitle) |
7313 | 3571 gaim_debug(GAIM_DEBUG_MISC, "oscar", "Got an alert '%s' %s\n", alertitle, alerturl ? alerturl : ""); |
3694 | 3572 |
3573 return 1; | |
3574 } | |
3575 | |
4804 | 3576 static int gaim_icon_error(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3577 GaimConnection *gc = sess->aux_data; |
7283 | 3578 OscarData *od = gc->proto_data; |
4804 | 3579 char *sn; |
3580 | |
3581 sn = od->requesticon->data; | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3582 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3583 "removing %s from hash table\n", sn); |
4804 | 3584 od->requesticon = g_slist_remove(od->requesticon, sn); |
3585 free(sn); | |
3586 | |
3587 if (od->icontimer) | |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
3588 gaim_timeout_remove(od->icontimer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
3589 od->icontimer = gaim_timeout_add(500, gaim_icon_timerfunc, gc); |
4804 | 3590 |
3591 return 1; | |
3592 } | |
3593 | |
3594 static int gaim_icon_parseicon(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 3595 GaimConnection *gc = sess->aux_data; |
7283 | 3596 OscarData *od = gc->proto_data; |
4804 | 3597 GSList *cur; |
3598 va_list ap; | |
3599 char *sn; | |
4853 | 3600 fu8_t *iconcsum, *icon; |
3601 fu16_t iconcsumlen, iconlen; | |
4804 | 3602 |
3603 va_start(ap, fr); | |
3604 sn = va_arg(ap, char *); | |
4853 | 3605 iconcsum = va_arg(ap, fu8_t *); |
3606 iconcsumlen = va_arg(ap, int); | |
4804 | 3607 icon = va_arg(ap, fu8_t *); |
3608 iconlen = va_arg(ap, int); | |
3609 va_end(ap); | |
3610 | |
4853 | 3611 if (iconlen > 0) { |
3612 char *b16; | |
6695 | 3613 GaimBuddy *b = gaim_find_buddy(gc->account, sn); |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
3614 gaim_buddy_icons_set_for_user(gaim_connection_get_account(gc), |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
3615 sn, icon, iconlen); |
7106
db6bd3e794d8
[gaim-migrate @ 7671]
Christian Hammond <chipx86@chipx86.com>
parents:
7098
diff
changeset
|
3616 b16 = gaim_base16_encode(iconcsum, iconcsumlen); |
5129 | 3617 if (b16) { |
7693 | 3618 gaim_blist_node_set_string((GaimBlistNode*)b, "icon_checksum", b16); |
5129 | 3619 gaim_blist_save(); |
7162 | 3620 g_free(b16); |
5129 | 3621 } |
4853 | 3622 } |
4804 | 3623 |
3624 cur = od->requesticon; | |
3625 while (cur) { | |
3626 char *cursn = cur->data; | |
3627 if (!aim_sncmp(cursn, sn)) { | |
3628 od->requesticon = g_slist_remove(od->requesticon, cursn); | |
3629 free(cursn); | |
3630 cur = od->requesticon; | |
3631 } else | |
3632 cur = cur->next; | |
3633 } | |
3634 | |
3635 if (od->icontimer) | |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
3636 gaim_timeout_remove(od->icontimer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
3637 od->icontimer = gaim_timeout_add(250, gaim_icon_timerfunc, gc); |
4804 | 3638 |
3639 return 1; | |
3640 } | |
3641 | |
3642 static gboolean gaim_icon_timerfunc(gpointer data) { | |
5575 | 3643 GaimConnection *gc = data; |
7283 | 3644 OscarData *od = gc->proto_data; |
7011 | 3645 aim_userinfo_t *userinfo; |
4804 | 3646 aim_conn_t *conn; |
3647 | |
3648 conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_ICON); | |
5892 | 3649 if (!conn) { |
3650 if (!od->iconconnecting) { | |
3651 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_ICON); | |
3652 od->iconconnecting = TRUE; | |
3653 } | |
4804 | 3654 return FALSE; |
3655 } | |
3656 | |
5842 | 3657 if (od->set_icon) { |
6039 | 3658 struct stat st; |
3659 const char *iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc)); | |
3660 if (iconfile == NULL) { | |
8363 | 3661 aim_ssi_delicon(od->sess); |
6039 | 3662 } else if (!stat(iconfile, &st)) { |
3663 char *buf = g_malloc(st.st_size); | |
3664 FILE *file = fopen(iconfile, "rb"); | |
3665 if (file) { | |
3666 fread(buf, 1, st.st_size, file); | |
3667 fclose(file); | |
3668 gaim_debug(GAIM_DEBUG_INFO, "oscar", | |
3669 "Uploading icon to icon server\n"); | |
6879 | 3670 aim_bart_upload(od->sess, buf, st.st_size); |
5842 | 3671 } else |
3672 gaim_debug(GAIM_DEBUG_ERROR, "oscar", | |
6039 | 3673 "Can't open buddy icon file!\n"); |
3674 g_free(buf); | |
3675 } else { | |
3676 gaim_debug(GAIM_DEBUG_ERROR, "oscar", | |
3677 "Can't stat buddy icon file!\n"); | |
5842 | 3678 } |
3679 od->set_icon = FALSE; | |
3680 } | |
3681 | |
3682 if (!od->requesticon) { | |
3683 gaim_debug(GAIM_DEBUG_MISC, "oscar", | |
3684 "no more icons to request\n"); | |
3685 return FALSE; | |
3686 } | |
3687 | |
7045 | 3688 userinfo = aim_locate_finduserinfo(od->sess, (char *)od->requesticon->data); |
7011 | 3689 if ((userinfo != NULL) && (userinfo->iconcsumlen > 0)) { |
3690 aim_bart_request(od->sess, od->requesticon->data, userinfo->iconcsum, userinfo->iconcsumlen); | |
4804 | 3691 return FALSE; |
3692 } else { | |
3693 char *sn = od->requesticon->data; | |
3694 od->requesticon = g_slist_remove(od->requesticon, sn); | |
3695 free(sn); | |
3696 } | |
3697 | |
3698 return TRUE; | |
3699 } | |
3700 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3701 /* |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3702 * 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
|
3703 */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3704 static int gaim_parse_msgack(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3705 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3706 fu16_t type; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3707 char *sn; |
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 va_start(ap, fr); |
4199 | 3710 type = (fu16_t) va_arg(ap, unsigned int); |
2086 | 3711 sn = va_arg(ap, char *); |
3712 va_end(ap); | |
3713 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3714 gaim_debug(GAIM_DEBUG_INFO, "oscar", "Sent message to %s.\n", sn); |
2086 | 3715 |
3716 return 1; | |
3717 } | |
3718 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3719 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
|
3720 static const char *codes[5] = { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3721 "invalid", |
4194 | 3722 "change", |
3723 "warning", | |
3724 "limit", | |
3725 "limit cleared", | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3726 }; |
2086 | 3727 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3728 fu16_t code, rateclass; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3729 fu32_t windowsize, clear, alert, limit, disconnect, currentavg, maxavg; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3730 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3731 va_start(ap, fr); |
4200 | 3732 code = (fu16_t)va_arg(ap, unsigned int); |
3733 rateclass= (fu16_t)va_arg(ap, unsigned int); | |
3734 windowsize = va_arg(ap, fu32_t); | |
3735 clear = va_arg(ap, fu32_t); | |
3736 alert = va_arg(ap, fu32_t); | |
3737 limit = va_arg(ap, fu32_t); | |
3738 disconnect = va_arg(ap, fu32_t); | |
3739 currentavg = va_arg(ap, fu32_t); | |
3740 maxavg = va_arg(ap, fu32_t); | |
2086 | 3741 va_end(ap); |
3742 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3743 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
5556 | 3744 "rate %s (param ID 0x%04hx): curavg = %u, maxavg = %u, alert at %u, " |
3745 "clear warning at %u, limit at %u, disconnect at %u (window size = %u)\n", | |
2086 | 3746 (code < 5) ? codes[code] : codes[0], |
3747 rateclass, | |
3748 currentavg, maxavg, | |
3749 alert, clear, | |
3750 limit, disconnect, | |
3751 windowsize); | |
3752 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3753 /* XXX fix these values */ |
2086 | 3754 if (code == AIM_RATE_CODE_CHANGE) { |
3755 if (currentavg >= clear) | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3756 aim_conn_setlatency(fr->conn, 0); |
2086 | 3757 } else if (code == AIM_RATE_CODE_WARNING) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3758 aim_conn_setlatency(fr->conn, windowsize/4); |
2909
48ec70928d7f
[gaim-migrate @ 2922]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2906
diff
changeset
|
3759 } else if (code == AIM_RATE_CODE_LIMIT) { |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3760 gaim_notify_error(sess->aux_data, NULL, _("Rate limiting error."), |
6040 | 3761 _("The last action you attempted could not be " |
3762 "performed because you are over the rate limit. " | |
3763 "Please wait 10 seconds and try again.")); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3764 aim_conn_setlatency(fr->conn, windowsize/2); |
2086 | 3765 } else if (code == AIM_RATE_CODE_CLEARLIMIT) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3766 aim_conn_setlatency(fr->conn, 0); |
2086 | 3767 } |
3768 | |
3769 return 1; | |
3770 } | |
3771 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3772 static int gaim_parse_evilnotify(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3773 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3774 fu16_t newevil; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3775 aim_userinfo_t *userinfo; |
5575 | 3776 GaimConnection *gc = sess->aux_data; |
2086 | 3777 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3778 va_start(ap, fr); |
4199 | 3779 newevil = (fu16_t) va_arg(ap, unsigned int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3780 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 3781 va_end(ap); |
3782 | |
7111 | 3783 serv_got_eviled(gc, (userinfo && userinfo->sn) ? userinfo->sn : NULL, (newevil/10.0) + 0.5); |
2086 | 3784 |
3785 return 1; | |
3786 } | |
3787 | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3788 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
|
3789 va_list ap; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3790 aim_userinfo_t *info; |
5575 | 3791 GaimConnection *gc = sess->aux_data; |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3792 |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3793 va_start(ap, fr); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3794 info = va_arg(ap, aim_userinfo_t *); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3795 va_end(ap); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3796 |
5628 | 3797 gc->evil = (info->warnlevel/10.0) + 0.5; |
4841 | 3798 |
7872 | 3799 if (info->present & AIM_USERINFO_PRESENT_ONLINESINCE) |
4841 | 3800 gc->login_time_official = info->onlinesince; |
7872 | 3801 else if (info->present & AIM_USERINFO_PRESENT_SESSIONLEN) |
3802 gc->login_time_official = time(NULL) - info->sessionlen; | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3803 |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3804 return 1; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3805 } |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3806 |
4649 | 3807 static int gaim_connerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3808 GaimConnection *gc = sess->aux_data; |
7283 | 3809 OscarData *od = gc->proto_data; |
4649 | 3810 va_list ap; |
3811 fu16_t code; | |
3812 char *msg; | |
3813 | |
3814 va_start(ap, fr); | |
3815 code = (fu16_t)va_arg(ap, int); | |
3816 msg = va_arg(ap, char *); | |
3817 va_end(ap); | |
3818 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3819 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3820 "Disconnected. Code is 0x%04x and msg is %s\n", code, msg); |
4649 | 3821 if ((fr) && (fr->conn) && (fr->conn->type == AIM_CONN_TYPE_BOS)) { |
4651 | 3822 if (code == 0x0001) { |
6113 | 3823 gc->wants_to_die = TRUE; |
5579 | 3824 gaim_connection_error(gc, _("You have been disconnected because you have signed on with this screen name at another location.")); |
4651 | 3825 } else { |
5579 | 3826 gaim_connection_error(gc, _("You have been signed off for an unknown reason.")); |
4651 | 3827 } |
4666 | 3828 od->killme = TRUE; |
4649 | 3829 } |
3830 | |
3831 return 1; | |
3832 } | |
3833 | |
2675 | 3834 static int conninitdone_bos(aim_session_t *sess, aim_frame_t *fr, ...) { |
7283 | 3835 GaimConnection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3836 |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3837 aim_reqpersonalinfo(sess, fr->conn); |
4230 | 3838 |
3839 #ifndef NOSSI | |
7334 | 3840 gaim_debug(GAIM_DEBUG_INFO, "oscar", "ssi: requesting rights and list\n"); |
4889 | 3841 aim_ssi_reqrights(sess); |
6350 | 3842 aim_ssi_reqdata(sess); |
4230 | 3843 #endif |
3844 | |
7011 | 3845 aim_locate_reqrights(sess); |
7285 | 3846 aim_buddylist_reqrights(sess, fr->conn); |
4617 | 3847 aim_im_reqparams(sess); |
7334 | 3848 aim_bos_reqrights(sess, fr->conn); /* XXX - Don't call this with ssi */ |
4230 | 3849 |
3850 #ifdef NOSSI | |
7334 | 3851 gaim_debug(GAIM_DEBUG_INFO, "oscar", "bos: requesting rights\n"); |
3852 aim_bos_reqrights(sess, fr->conn); | |
4230 | 3853 aim_bos_setgroupperm(sess, fr->conn, AIM_FLAG_ALLUSERS); |
3854 aim_bos_setprivacyflags(sess, fr->conn, AIM_PRIVFLAGS_ALLOWIDLE | AIM_PRIVFLAGS_ALLOWMEMBERSINCE); | |
3855 #endif | |
2086 | 3856 |
7283 | 3857 gaim_connection_update_progress(gc, _("Finalizing connection"), 5, OSCAR_CONNECT_STEPS); |
3858 | |
2086 | 3859 return 1; |
3860 } | |
3861 | |
2675 | 3862 static int conninitdone_admin(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3863 GaimConnection *gc = sess->aux_data; |
7283 | 3864 OscarData *od = gc->proto_data; |
2647 | 3865 |
6905 | 3866 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ADM, 0x0003, gaim_info_change, 0); |
3867 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ADM, 0x0005, gaim_info_change, 0); | |
3868 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ADM, 0x0007, gaim_account_confirm, 0); | |
3869 | |
2672 | 3870 aim_clientready(sess, fr->conn); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3871 gaim_debug(GAIM_DEBUG_INFO, "oscar", "connected to admin\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3872 |
2647 | 3873 if (od->chpass) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3874 gaim_debug(GAIM_DEBUG_INFO, "oscar", "changing password\n"); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3875 aim_admin_changepasswd(sess, fr->conn, od->newp, od->oldp); |
2647 | 3876 g_free(od->oldp); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3877 od->oldp = NULL; |
2647 | 3878 g_free(od->newp); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3879 od->newp = NULL; |
2647 | 3880 od->chpass = FALSE; |
3881 } | |
2979 | 3882 if (od->setnick) { |
8152 | 3883 gaim_debug(GAIM_DEBUG_INFO, "oscar", "formatting screen name\n"); |
2979 | 3884 aim_admin_setnick(sess, fr->conn, od->newsn); |
3885 g_free(od->newsn); | |
3886 od->newsn = NULL; | |
3887 od->setnick = FALSE; | |
3888 } | |
2647 | 3889 if (od->conf) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3890 gaim_debug(GAIM_DEBUG_INFO, "oscar", "confirming account\n"); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3891 aim_admin_reqconfirm(sess, fr->conn); |
2647 | 3892 od->conf = FALSE; |
3893 } | |
3894 if (od->reqemail) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3895 gaim_debug(GAIM_DEBUG_INFO, "oscar", "requesting email\n"); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3896 aim_admin_getinfo(sess, fr->conn, 0x0011); |
2647 | 3897 od->reqemail = FALSE; |
3898 } | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3899 if (od->setemail) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3900 gaim_debug(GAIM_DEBUG_INFO, "oscar", "setting email\n"); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3901 aim_admin_setemail(sess, fr->conn, od->email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3902 g_free(od->email); |
5497 | 3903 od->email = NULL; |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3904 od->setemail = FALSE; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3905 } |
2647 | 3906 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3907 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3908 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3909 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3910 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
|
3911 struct aim_icbmparameters *params; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3912 va_list ap; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3913 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3914 va_start(ap, fr); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3915 params = va_arg(ap, struct aim_icbmparameters *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3916 va_end(ap); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3917 |
4194 | 3918 /* 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
|
3919 gaim_debug(GAIM_DEBUG_MISC, "oscar", "ICBM Parameters: maxchannel = %hu, default flags = 0x%08lx, max msg len = %hu, " |
5556 | 3920 "max sender evil = %f, max receiver evil = %f, min msg interval = %u\n", |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3921 params->maxchan, params->flags, params->maxmsglen, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3922 ((float)params->maxsenderwarn)/10.0, ((float)params->maxrecverwarn)/10.0, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3923 params->minmsginterval); |
2427
5bc3b39fc0a5
[gaim-migrate @ 2440]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2421
diff
changeset
|
3924 */ |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3925 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3926 /* Maybe senderwarn and recverwarn should be user preferences... */ |
3595 | 3927 params->flags = 0x0000000b; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3928 params->maxmsglen = 8000; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3929 params->minmsginterval = 0; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3930 |
4617 | 3931 aim_im_setparams(sess, params); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3932 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3933 return 1; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3934 } |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3935 |
2993 | 3936 static int gaim_parse_locaterights(aim_session_t *sess, aim_frame_t *fr, ...) |
3937 { | |
5575 | 3938 GaimConnection *gc = sess->aux_data; |
7283 | 3939 OscarData *od = (OscarData *)gc->proto_data; |
5306 | 3940 va_list ap; |
3941 fu16_t maxsiglen; | |
2993 | 3942 |
3943 va_start(ap, fr); | |
4199 | 3944 maxsiglen = (fu16_t) va_arg(ap, int); |
2993 | 3945 va_end(ap); |
3946 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3947 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3948 "locate rights: max sig len = %d\n", maxsiglen); |
2993 | 3949 |
4617 | 3950 od->rights.maxsiglen = od->rights.maxawaymsglen = (guint)maxsiglen; |
3951 | |
3952 if (od->icq) | |
7334 | 3953 aim_locate_setcaps(od->sess, caps_icq); |
5301 | 3954 else |
7334 | 3955 aim_locate_setcaps(od->sess, caps_aim); |
3956 oscar_set_info(gc, gc->account->user_info); | |
2993 | 3957 |
3958 return 1; | |
3959 } | |
3960 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3961 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
|
3962 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3963 fu16_t maxbuddies, maxwatchers; |
5575 | 3964 GaimConnection *gc = sess->aux_data; |
7283 | 3965 OscarData *od = (OscarData *)gc->proto_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3966 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3967 va_start(ap, fr); |
4199 | 3968 maxbuddies = (fu16_t) va_arg(ap, unsigned int); |
3969 maxwatchers = (fu16_t) va_arg(ap, unsigned int); | |
2086 | 3970 va_end(ap); |
3971 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3972 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3973 "buddy list rights: Max buddies = %hu / Max watchers = %hu\n", maxbuddies, maxwatchers); |
2086 | 3974 |
4617 | 3975 od->rights.maxbuddies = (guint)maxbuddies; |
3976 od->rights.maxwatchers = (guint)maxwatchers; | |
2993 | 3977 |
2086 | 3978 return 1; |
3979 } | |
3980 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3981 static int gaim_bosrights(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3982 GaimConnection *gc = sess->aux_data; |
7283 | 3983 OscarData *od = (OscarData *)gc->proto_data; |
7334 | 3984 va_list ap; |
3985 fu16_t maxpermits, maxdenies; | |
2086 | 3986 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3987 va_start(ap, fr); |
4199 | 3988 maxpermits = (fu16_t) va_arg(ap, unsigned int); |
3989 maxdenies = (fu16_t) va_arg(ap, unsigned int); | |
2086 | 3990 va_end(ap); |
3991 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3992 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3993 "BOS rights: Max permit = %hu / Max deny = %hu\n", maxpermits, maxdenies); |
2086 | 3994 |
4617 | 3995 od->rights.maxpermits = (guint)maxpermits; |
3996 od->rights.maxdenies = (guint)maxdenies; | |
2993 | 3997 |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
3998 gaim_connection_set_state(gc, GAIM_CONNECTED); |
2993 | 3999 serv_finish_login(gc); |
4000 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4001 gaim_debug(GAIM_DEBUG_INFO, "oscar", "buddy list loaded\n"); |
2993 | 4002 |
2672 | 4003 aim_clientready(sess, fr->conn); |
5948 | 4004 aim_srv_setavailmsg(sess, NULL); |
7474 | 4005 aim_srv_setidle(sess, 0); |
4617 | 4006 |
4664 | 4007 if (od->icq) { |
4008 aim_icq_reqofflinemsgs(sess); | |
4009 aim_icq_hideip(sess); | |
4010 } | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4011 |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4012 aim_reqservice(sess, fr->conn, AIM_CONN_TYPE_CHATNAV); |
4102 | 4013 if (sess->authinfo->email) |
4014 aim_reqservice(sess, fr->conn, AIM_CONN_TYPE_EMAIL); | |
2086 | 4015 |
4016 return 1; | |
4017 } | |
4018 | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4019 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
|
4020 va_list ap; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4021 struct aim_icq_offlinemsg *msg; |
4075 | 4022 struct aim_incomingim_ch4_args args; |
4023 time_t t; | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4024 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4025 va_start(ap, fr); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4026 msg = va_arg(ap, struct aim_icq_offlinemsg *); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4027 va_end(ap); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4028 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4029 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4030 "Received offline message. Converting to channel 4 ICBM...\n"); |
4075 | 4031 args.uin = msg->sender; |
4032 args.type = msg->type; | |
4173 | 4033 args.flags = msg->flags; |
4076 | 4034 args.msglen = msg->msglen; |
4075 | 4035 args.msg = msg->msg; |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4036 t = gaim_time_build(msg->year, msg->month, msg->day, msg->hour, msg->minute, 0); |
4075 | 4037 incomingim_chan4(sess, fr->conn, NULL, &args, t); |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4038 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4039 return 1; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4040 } |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4041 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4042 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
|
4043 { |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4044 aim_icq_ackofflinemsgs(sess); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4045 return 1; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4046 } |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4047 |
7388 | 4048 #if 0 |
4049 /* | |
7465 | 4050 * Update, 2003-11-09: |
4051 * Joseph S. Myers, a gcc dude, fixed this for gcc 3.4! Rock on! | |
4052 * | |
7388 | 4053 * It may not be my place to do this, but... |
4054 * I feel pretty strongly that the "last 2 digits" warning is ridiculously | |
4055 * stupid, and should not exist for % switches (%x in our case) that request | |
4056 * a year in the preferred representation for the current locale. For that | |
4057 * reason I've chosen to not use this workaround (n., see kluge). | |
4058 * | |
4059 * I have a date. I want to show it to the user in the "preferred" way. | |
4060 * Whether that displays a 2 digit year is perfectly fine--after all, it's | |
4061 * what the locale wanted. | |
4062 * | |
4063 * If I have a necessity for a full representation of the year in the current | |
4064 * locale, then I'll use a switch that returns a full representation of the | |
4065 * year. | |
4066 * | |
4067 * If you think the preferred locale should show 4 digits instead of 2 digits | |
4068 * (because you're anal, or whatever), then change the f***ing locale. | |
4069 * | |
4070 * I guess the bottom line is--I'm trying to show a date to the user how they | |
4071 * prefer to see it, why the hell does gcc want me to change that? | |
7389 | 4072 * |
4073 * See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=3190 | |
4074 * See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=8714 | |
7388 | 4075 */ |
4076 | |
4077 /* | |
4078 * This function was recommended by the STRFTIME(3) man page to remove the | |
7386 | 4079 * "last 2 digits" warning. |
4080 */ | |
4081 static size_t my_strftime(char *s, size_t max, const char *fmt, | |
4082 const struct tm *tm) | |
4083 { | |
4084 return strftime(s, max, fmt, tm); | |
4085 } | |
7388 | 4086 #endif |
7386 | 4087 |
4624 | 4088 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
|
4089 { |
5575 | 4090 GaimConnection *gc = sess->aux_data; |
4819 | 4091 gchar *buf, *tmp, *utf8; |
4624 | 4092 gchar who[16]; |
6873 | 4093 GaimBuddy *buddy; |
4094 gchar *primary; | |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4095 va_list ap; |
4151 | 4096 struct aim_icq_info *info; |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4097 |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4098 va_start(ap, fr); |
4151 | 4099 info = va_arg(ap, struct aim_icq_info *); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4100 va_end(ap); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4101 |
4664 | 4102 if (!info->uin) |
4103 return 0; | |
4104 | |
5556 | 4105 g_snprintf(who, sizeof(who), "%u", info->uin); |
6623 | 4106 buf = g_strdup_printf("<b>%s:</b> %s", _("UIN"), who); |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4107 if (info->nick && info->nick[0] && (utf8 = gaim_utf8_try_convert(info->nick))) { |
6623 | 4108 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Nick"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4819 | 4109 } |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4110 if (info->first && info->first[0] && (utf8 = gaim_utf8_try_convert(info->first))) { |
6623 | 4111 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("First Name"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4819 | 4112 } |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4113 if (info->last && info->last[0] && (utf8 = gaim_utf8_try_convert(info->last))) { |
6623 | 4114 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Last Name"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4819 | 4115 } |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4116 if (info->email && info->email[0] && (utf8 = gaim_utf8_try_convert(info->email))) { |
6623 | 4117 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 | 4118 } |
4119 if (info->numaddresses && info->email2) { | |
4120 int i; | |
4121 for (i = 0; i < info->numaddresses; i++) { | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4122 if (info->email2[i] && info->email2[i][0] && (utf8 = gaim_utf8_try_convert(info->email2[i]))) { |
6623 | 4123 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 | 4124 } |
4625 | 4125 } |
4624 | 4126 } |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4127 if (info->mobile && info->mobile[0] && (utf8 = gaim_utf8_try_convert(info->mobile))) { |
6623 | 4128 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Mobile Phone"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4625 | 4129 } |
4130 if (info->gender) { | |
6623 | 4131 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Gender"), ":</b> ", info->gender==1 ? _("Female") : _("Male"), NULL); g_free(tmp); |
4151 | 4132 } |
4624 | 4133 if (info->birthyear || info->birthmonth || info->birthday) { |
4627 | 4134 char date[30]; |
4135 struct tm tm; | |
4136 tm.tm_mday = (int)info->birthday; | |
4137 tm.tm_mon = (int)info->birthmonth-1; | |
4138 tm.tm_year = (int)info->birthyear-1900; | |
7388 | 4139 strftime(date, sizeof(date), "%x", &tm); |
6623 | 4140 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Birthday"), ":</b> ", date, NULL); g_free(tmp); |
4151 | 4141 } |
4624 | 4142 if (info->age) { |
4143 char age[5]; | |
4144 snprintf(age, sizeof(age), "%hhd", info->age); | |
6623 | 4145 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Age"), ":</b> ", age, NULL); g_free(tmp); |
4819 | 4146 } |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4147 if (info->personalwebpage && info->personalwebpage[0] && (utf8 = gaim_utf8_try_convert(info->personalwebpage))) { |
6623 | 4148 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); |
4819 | 4149 } |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4150 if (info->info && info->info[0] && (utf8 = gaim_utf8_try_convert(info->info))) { |
6623 | 4151 tmp = buf; buf = g_strconcat(tmp, "<hr><b>", _("Additional Information"), ":</b><br>", utf8, NULL); g_free(tmp); g_free(utf8); |
4624 | 4152 } |
4153 tmp = buf; buf = g_strconcat(tmp, "<hr>\n", NULL); g_free(tmp); | |
4641 | 4154 if ((info->homeaddr && (info->homeaddr[0])) || (info->homecity && info->homecity[0]) || (info->homestate && info->homestate[0]) || (info->homezip && info->homezip[0])) { |
6623 | 4155 tmp = buf; buf = g_strconcat(tmp, "<b>", _("Home Address"), ":</b>", NULL); g_free(tmp); |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4156 if (info->homeaddr && info->homeaddr[0] && (utf8 = gaim_utf8_try_convert(info->homeaddr))) { |
6623 | 4157 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Address"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4624 | 4158 } |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4159 if (info->homecity && info->homecity[0] && (utf8 = gaim_utf8_try_convert(info->homecity))) { |
6623 | 4160 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("City"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4624 | 4161 } |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4162 if (info->homestate && info->homestate[0] && (utf8 = gaim_utf8_try_convert(info->homestate))) { |
6623 | 4163 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("State"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4624 | 4164 } |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4165 if (info->homezip && info->homezip[0] && (utf8 = gaim_utf8_try_convert(info->homezip))) { |
6623 | 4166 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Zip Code"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4624 | 4167 } |
4168 tmp = buf; buf = g_strconcat(tmp, "\n<hr>\n", NULL); g_free(tmp); | |
4151 | 4169 } |
4641 | 4170 if ((info->workaddr && info->workaddr[0]) || (info->workcity && info->workcity[0]) || (info->workstate && info->workstate[0]) || (info->workzip && info->workzip[0])) { |
6623 | 4171 tmp = buf; buf = g_strconcat(tmp, "<b>", _("Work Address"), ":</b>", NULL); g_free(tmp); |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4172 if (info->workaddr && info->workaddr[0] && (utf8 = gaim_utf8_try_convert(info->workaddr))) { |
6623 | 4173 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Address"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4624 | 4174 } |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4175 if (info->workcity && info->workcity[0] && (utf8 = gaim_utf8_try_convert(info->workcity))) { |
6623 | 4176 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("City"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4624 | 4177 } |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4178 if (info->workstate && info->workstate[0] && (utf8 = gaim_utf8_try_convert(info->workstate))) { |
6623 | 4179 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("State"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4624 | 4180 } |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4181 if (info->workzip && info->workzip[0] && (utf8 = gaim_utf8_try_convert(info->workzip))) { |
6623 | 4182 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Zip Code"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4624 | 4183 } |
4184 tmp = buf; buf = g_strconcat(tmp, "\n<hr>\n", NULL); g_free(tmp); | |
4185 } | |
4641 | 4186 if ((info->workcompany && info->workcompany[0]) || (info->workdivision && info->workdivision[0]) || (info->workposition && info->workposition[0]) || (info->workwebpage && info->workwebpage[0])) { |
6623 | 4187 tmp = buf; buf = g_strconcat(tmp, "<b>", _("Work Information"), ":</b>", NULL); g_free(tmp); |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4188 if (info->workcompany && info->workcompany[0] && (utf8 = gaim_utf8_try_convert(info->workcompany))) { |
6623 | 4189 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Company"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4624 | 4190 } |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4191 if (info->workdivision && info->workdivision[0] && (utf8 = gaim_utf8_try_convert(info->workdivision))) { |
6623 | 4192 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Division"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4624 | 4193 } |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4194 if (info->workposition && info->workposition[0] && (utf8 = gaim_utf8_try_convert(info->workposition))) { |
6623 | 4195 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Position"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4624 | 4196 } |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4197 if (info->workwebpage && info->workwebpage[0] && (utf8 = gaim_utf8_try_convert(info->workwebpage))) { |
6623 | 4198 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 | 4199 } |
4200 tmp = buf; buf = g_strconcat(tmp, "\n<hr>\n", NULL); g_free(tmp); | |
4151 | 4201 } |
4202 | |
6873 | 4203 buddy = gaim_find_buddy(gaim_connection_get_account(gc), who); |
4204 primary = g_strdup_printf(_("ICQ Info for %s"), gaim_get_buddy_alias(buddy)); | |
4205 gaim_notify_formatted(gc, NULL, primary, NULL, buf, NULL, NULL); | |
4206 g_free(primary); | |
4151 | 4207 g_free(buf); |
4208 | |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4209 return 1; |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4210 } |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4211 |
4759 | 4212 static int gaim_icqalias(aim_session_t *sess, aim_frame_t *fr, ...) |
4213 { | |
5575 | 4214 GaimConnection *gc = sess->aux_data; |
4820 | 4215 gchar who[16], *utf8; |
6695 | 4216 GaimBuddy *b; |
4759 | 4217 va_list ap; |
4218 struct aim_icq_info *info; | |
4219 | |
4220 va_start(ap, fr); | |
4221 info = va_arg(ap, struct aim_icq_info *); | |
4222 va_end(ap); | |
4223 | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4224 if (info->uin && info->nick && info->nick[0] && (utf8 = gaim_utf8_try_convert(info->nick))) { |
5556 | 4225 g_snprintf(who, sizeof(who), "%u", info->uin); |
4820 | 4226 serv_got_alias(gc, who, utf8); |
4759 | 4227 if ((b = gaim_find_buddy(gc->account, who))) { |
7693 | 4228 gaim_blist_node_set_string((GaimBlistNode*)b, "servernick", utf8); |
4759 | 4229 gaim_blist_save(); |
4230 } | |
4820 | 4231 g_free(utf8); |
4759 | 4232 } |
4233 | |
4234 return 1; | |
4235 } | |
4236 | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4237 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
|
4238 { |
7032 | 4239 GaimConnection *gc = sess->aux_data; |
4240 gchar *text; | |
4241 va_list ap; | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4242 char *msg, *url; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4243 fu16_t wid, hei, delay; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4244 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4245 va_start(ap, fr); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4246 msg = va_arg(ap, char *); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4247 url = va_arg(ap, char *); |
4199 | 4248 wid = (fu16_t) va_arg(ap, int); |
4249 hei = (fu16_t) va_arg(ap, int); | |
4250 delay = (fu16_t) va_arg(ap, int); | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4251 va_end(ap); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4252 |
7032 | 4253 text = g_strdup_printf("%s<br><a href=\"%s\">%s</a>", msg, url, url); |
4254 gaim_notify_formatted(gc, NULL, _("Pop-Up Message"), NULL, text, NULL, NULL); | |
4255 g_free(text); | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4256 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4257 return 1; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4258 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4259 |
7032 | 4260 static int gaim_parse_searchreply(aim_session_t *sess, aim_frame_t *fr, ...) |
4261 { | |
6873 | 4262 GaimConnection *gc = sess->aux_data; |
4263 gchar *secondary; | |
4264 GString *text; | |
4265 int i, num; | |
2086 | 4266 va_list ap; |
6873 | 4267 char *email, *SNs; |
2086 | 4268 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4269 va_start(ap, fr); |
6873 | 4270 email = va_arg(ap, char *); |
2086 | 4271 num = va_arg(ap, int); |
4272 SNs = va_arg(ap, char *); | |
4273 va_end(ap); | |
4274 | |
8152 | 4275 secondary = g_strdup_printf(_("The following screen names are associated with %s"), email); |
6873 | 4276 text = g_string_new(""); |
2086 | 4277 for (i = 0; i < num; i++) |
6873 | 4278 g_string_append_printf(text, "%s<br>", &SNs[i * (MAXSNLEN + 1)]); |
4279 gaim_notify_formatted(gc, NULL, _("Search Results"), secondary, text->str, NULL, NULL); | |
4280 | |
4281 g_free(secondary); | |
4282 g_string_free(text, TRUE); | |
2086 | 4283 |
4284 return 1; | |
4285 } | |
4286 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4287 static int gaim_parse_searcherror(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 4288 va_list ap; |
6873 | 4289 char *email; |
5420 | 4290 char *buf; |
2086 | 4291 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4292 va_start(ap, fr); |
6873 | 4293 email = va_arg(ap, char *); |
2086 | 4294 va_end(ap); |
4295 | |
6873 | 4296 buf = g_strdup_printf(_("No results found for email address %s"), email); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4297 gaim_notify_error(sess->aux_data, NULL, buf, NULL); |
5420 | 4298 g_free(buf); |
2086 | 4299 |
4300 return 1; | |
4301 } | |
4302 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4303 static int gaim_account_confirm(aim_session_t *sess, aim_frame_t *fr, ...) { |
6873 | 4304 GaimConnection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4305 fu16_t status; |
2086 | 4306 va_list ap; |
4307 char msg[256]; | |
4308 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4309 va_start(ap, fr); |
4199 | 4310 status = (fu16_t) va_arg(ap, unsigned int); /* status code of confirmation request */ |
2086 | 4311 va_end(ap); |
4312 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4313 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4314 "account confirmation returned status 0x%04x (%s)\n", status, |
3912 | 4315 status ? "unknown" : "email sent"); |
4316 if (!status) { | |
5302 | 4317 g_snprintf(msg, sizeof(msg), _("You should receive an email asking to confirm %s."), |
5575 | 4318 gaim_account_get_username(gaim_connection_get_account(gc))); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4319 gaim_notify_info(gc, NULL, _("Account Confirmation Requested"), msg); |
2086 | 4320 } |
4321 | |
4322 return 1; | |
4323 } | |
4324 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4325 static int gaim_info_change(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4326 GaimConnection *gc = sess->aux_data; |
2086 | 4327 va_list ap; |
3912 | 4328 fu16_t perms, err; |
4329 char *url, *sn, *email; | |
4330 int change; | |
2086 | 4331 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4332 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4333 change = va_arg(ap, int); |
4199 | 4334 perms = (fu16_t) va_arg(ap, unsigned int); |
4335 err = (fu16_t) va_arg(ap, unsigned int); | |
3912 | 4336 url = va_arg(ap, char *); |
4337 sn = va_arg(ap, char *); | |
4338 email = va_arg(ap, char *); | |
2086 | 4339 va_end(ap); |
4340 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4341 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4342 "account info: because of %s, perms=0x%04x, err=0x%04x, url=%s, sn=%s, email=%s\n", |
3912 | 4343 change ? "change" : "request", perms, err, url, sn, email); |
4344 | |
4345 if (err && url) { | |
4346 char *dialog_msg; | |
4347 char *dialog_top = g_strdup_printf(_("Error Changing Account Info")); | |
4348 switch (err) { | |
4349 case 0x0001: { | |
4350 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name differs from the original."), err); | |
4351 } break; | |
4352 case 0x0006: { | |
4353 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name ends in a space."), err); | |
4354 } break; | |
4355 case 0x000b: { | |
4356 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name is too long."), err); | |
4357 } break; | |
4358 case 0x001d: { | |
4359 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); | |
4360 } break; | |
4361 case 0x0021: { | |
4362 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); | |
4363 } break; | |
4364 case 0x0023: { | |
4365 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to change email address because the given address is invalid."), err); | |
4366 } break; | |
4367 default: { | |
4368 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unknown error."), err); | |
4369 } break; | |
4370 } | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4371 gaim_notify_error(gc, NULL, dialog_top, dialog_msg); |
3912 | 4372 g_free(dialog_top); |
4373 g_free(dialog_msg); | |
4374 return 1; | |
4375 } | |
4376 | |
4377 if (sn) { | |
4585 | 4378 char *dialog_msg = g_strdup_printf(_("Your screen name is currently formatted as follows:\n%s"), sn); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4379 gaim_notify_info(gc, NULL, _("Account Info"), dialog_msg); |
3912 | 4380 g_free(dialog_msg); |
4381 } | |
4382 | |
4383 if (email) { | |
5575 | 4384 char *dialog_msg = g_strdup_printf(_("The email address for %s is %s"), |
4385 gaim_account_get_username(gaim_connection_get_account(gc)), email); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4386 gaim_notify_info(gc, NULL, _("Account Info"), dialog_msg); |
3912 | 4387 g_free(dialog_msg); |
2086 | 4388 } |
4389 | |
4390 return 1; | |
4391 } | |
4392 | |
5575 | 4393 static void oscar_keepalive(GaimConnection *gc) { |
7283 | 4394 OscarData *od = (OscarData *)gc->proto_data; |
4617 | 4395 aim_flap_nop(od->sess, od->conn); |
2086 | 4396 } |
4397 | |
6059 | 4398 static int oscar_send_typing(GaimConnection *gc, const char *name, int typing) { |
7283 | 4399 OscarData *od = (OscarData *)gc->proto_data; |
4617 | 4400 struct direct_im *dim = find_direct_im(od, name); |
3595 | 4401 if (dim) |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
4402 if (typing == GAIM_TYPING) |
4870 | 4403 aim_odc_send_typing(od->sess, dim->conn, 0x0002); |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
4404 else if (typing == GAIM_TYPED) |
4870 | 4405 aim_odc_send_typing(od->sess, dim->conn, 0x0001); |
4406 else | |
4407 aim_odc_send_typing(od->sess, dim->conn, 0x0000); | |
3595 | 4408 else { |
5300 | 4409 /* Don't send if this turkey is in our deny list */ |
4410 GSList *list; | |
4411 for (list=gc->account->deny; (list && aim_sncmp(name, list->data)); list=list->next); | |
4412 if (!list) { | |
7261 | 4413 struct buddyinfo *bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(gc->account, name)); |
5300 | 4414 if (bi && bi->typingnot) { |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
4415 if (typing == GAIM_TYPING) |
5300 | 4416 aim_im_sendmtn(od->sess, 0x0001, name, 0x0002); |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
4417 else if (typing == GAIM_TYPED) |
5300 | 4418 aim_im_sendmtn(od->sess, 0x0001, name, 0x0001); |
4419 else | |
4420 aim_im_sendmtn(od->sess, 0x0001, name, 0x0000); | |
4421 } | |
3595 | 4422 } |
4423 } | |
2993 | 4424 return 0; |
4425 } | |
5575 | 4426 static void oscar_ask_direct_im(GaimConnection *gc, const char *name); |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
4427 static int gaim_odc_send_im(aim_session_t *, aim_conn_t *, const char *, GaimConvImFlags); |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
4428 |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
4429 static int oscar_send_im(GaimConnection *gc, const char *name, const char *message, GaimConvImFlags imflags) { |
7283 | 4430 OscarData *od = (OscarData *)gc->proto_data; |
4617 | 4431 struct direct_im *dim = find_direct_im(od, name); |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
4432 int ret = 0; |
3659 | 4433 GError *err = NULL; |
5575 | 4434 const char *iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc)); |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6350
diff
changeset
|
4435 char *tmpmsg = NULL; |
3458 | 4436 |
4838 | 4437 if (dim && dim->connected) { |
4438 /* If we're directly connected, send a direct IM */ | |
6982 | 4439 ret = gaim_odc_send_im(od->sess, dim->conn, message, imflags); |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
4440 } else if (imflags & GAIM_CONV_IM_IMAGES) { |
3044 | 4441 /* Trying to send an IM image outside of a direct connection. */ |
4442 oscar_ask_direct_im(gc, name); | |
4838 | 4443 ret = -ENOTCONN; |
2086 | 4444 } else { |
4738 | 4445 struct buddyinfo *bi; |
3008 | 4446 struct aim_sendimext_args args; |
4447 struct stat st; | |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
4448 gsize len; |
4269 | 4449 |
7261 | 4450 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(gc->account, name)); |
4738 | 4451 if (!bi) { |
4452 bi = g_new0(struct buddyinfo, 1); | |
7261 | 4453 g_hash_table_insert(od->buddyinfo, g_strdup(gaim_normalize(gc->account, name)), bi); |
4738 | 4454 } |
4455 | |
3008 | 4456 args.flags = AIM_IMFLAGS_ACK | AIM_IMFLAGS_CUSTOMFEATURES; |
4665 | 4457 if (od->icq) { |
4458 args.features = features_icq; | |
4459 args.featureslen = sizeof(features_icq); | |
3008 | 4460 args.flags |= AIM_IMFLAGS_OFFLINE; |
4665 | 4461 } else { |
4462 args.features = features_aim; | |
4463 args.featureslen = sizeof(features_aim); | |
4972 | 4464 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
4465 if (imflags & GAIM_CONV_IM_AUTO_RESP) |
4972 | 4466 args.flags |= AIM_IMFLAGS_AWAY; |
4665 | 4467 } |
4269 | 4468 |
4738 | 4469 if (bi->ico_need) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4470 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4471 "Sending buddy icon request with message\n"); |
3008 | 4472 args.flags |= AIM_IMFLAGS_BUDDYREQ; |
4738 | 4473 bi->ico_need = FALSE; |
3008 | 4474 } |
4269 | 4475 |
5575 | 4476 if (iconfile && !stat(iconfile, &st)) { |
8361 | 4477 FILE *file = fopen(iconfile, "rb"); |
3008 | 4478 if (file) { |
4479 char *buf = g_malloc(st.st_size); | |
4480 fread(buf, 1, st.st_size, file); | |
6039 | 4481 fclose(file); |
4269 | 4482 |
3008 | 4483 args.iconlen = st.st_size; |
4617 | 4484 args.iconsum = aimutil_iconsum(buf, st.st_size); |
3008 | 4485 args.iconstamp = st.st_mtime; |
4486 | |
7406 | 4487 if ((args.iconlen != bi->ico_me_len) || (args.iconsum != bi->ico_me_csum) || (args.iconstamp != bi->ico_me_time)) { |
4738 | 4488 bi->ico_informed = FALSE; |
7406 | 4489 bi->ico_sent = FALSE; |
4490 } | |
4738 | 4491 |
4492 if (!bi->ico_informed) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4493 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4494 "Claiming to have a buddy icon\n"); |
4738 | 4495 args.flags |= AIM_IMFLAGS_HASICON; |
4496 bi->ico_me_len = args.iconlen; | |
4497 bi->ico_me_csum = args.iconsum; | |
4498 bi->ico_me_time = args.iconstamp; | |
4499 bi->ico_informed = TRUE; | |
4500 } | |
4501 | |
3008 | 4502 g_free(buf); |
2086 | 4503 } |
4504 } | |
4269 | 4505 |
3008 | 4506 args.destsn = name; |
4269 | 4507 |
6310 | 4508 /* For ICQ send newlines as CR/LF, for AIM send newlines as <BR> */ |
4509 if (isdigit(name[0])) | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4510 tmpmsg = gaim_str_add_cr(message); |
6310 | 4511 else |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4512 tmpmsg = gaim_strdup_withhtml(message); |
6310 | 4513 len = strlen(tmpmsg); |
4514 | |
4515 args.flags |= oscar_encoding_check(tmpmsg); | |
3642 | 4516 if (args.flags & AIM_IMFLAGS_UNICODE) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4517 gaim_debug(GAIM_DEBUG_INFO, "oscar", "Sending Unicode IM\n"); |
4662 | 4518 args.charset = 0x0002; |
4665 | 4519 args.charsubset = 0x0000; |
6310 | 4520 args.msg = g_convert(tmpmsg, len, "UCS-2BE", "UTF-8", NULL, &len, &err); |
3659 | 4521 if (err) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4522 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4523 "Error converting a unicode message: %s\n", err->message); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4524 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4525 "This really shouldn't happen!\n"); |
3659 | 4526 /* We really shouldn't try to send the |
4527 * IM now, but I'm not sure what to do */ | |
4800 | 4528 g_error_free(err); |
3659 | 4529 } |
3850 | 4530 } else if (args.flags & AIM_IMFLAGS_ISO_8859_1) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4531 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4532 "Sending ISO-8859-1 IM\n"); |
4662 | 4533 args.charset = 0x0003; |
4665 | 4534 args.charsubset = 0x0000; |
6310 | 4535 args.msg = g_convert(tmpmsg, len, "ISO-8859-1", "UTF-8", NULL, &len, &err); |
3659 | 4536 if (err) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4537 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4538 "conversion error: %s\n", err->message); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4539 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4540 "Someone tell Ethan his 8859-1 detection is wrong\n"); |
3642 | 4541 args.flags ^= AIM_IMFLAGS_ISO_8859_1 | AIM_IMFLAGS_UNICODE; |
6310 | 4542 len = strlen(tmpmsg); |
4800 | 4543 g_error_free(err); |
6310 | 4544 args.msg = g_convert(tmpmsg, len, "UCS-2BE", "UTF8", NULL, &len, &err); |
3659 | 4545 if (err) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4546 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4547 "Error in unicode fallback: %s\n", err->message); |
4800 | 4548 g_error_free(err); |
3659 | 4549 } |
3642 | 4550 } |
4551 } else { | |
4662 | 4552 args.charset = 0x0000; |
4553 args.charsubset = 0x0000; | |
6310 | 4554 args.msg = tmpmsg; |
3642 | 4555 } |
4556 args.msglen = len; | |
4269 | 4557 |
4617 | 4558 ret = aim_im_sendch1_ext(od->sess, &args); |
2086 | 4559 } |
4838 | 4560 |
6310 | 4561 g_free(tmpmsg); |
4562 | |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
4563 if (ret >= 0) |
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
4564 return 1; |
6310 | 4565 |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
4566 return ret; |
2086 | 4567 } |
4568 | |
7011 | 4569 static void oscar_get_info(GaimConnection *gc, const char *name) { |
7283 | 4570 OscarData *od = (OscarData *)gc->proto_data; |
7011 | 4571 |
7173 | 4572 if (od->icq && isdigit(name[0])) |
4624 | 4573 aim_icq_getallinfo(od->sess, name); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4574 else |
7235 | 4575 aim_locate_getinfoshort(od->sess, name, 0x00000003); |
7011 | 4576 } |
4577 | |
4578 static void oscar_get_away(GaimConnection *gc, const char *who) { | |
7283 | 4579 OscarData *od = (OscarData *)gc->proto_data; |
4617 | 4580 if (od->icq) { |
7011 | 4581 GaimBuddy *budlight = gaim_find_buddy(gc->account, who); |
3212 | 4582 if (budlight) |
3595 | 4583 if ((budlight->uc & 0xffff0000) >> 16) |
4687 | 4584 aim_im_sendch2_geticqaway(od->sess, who, (budlight->uc & 0xffff0000) >> 16); |
3212 | 4585 else |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4586 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4587 "Error: The user %s has no status message, therefore not requesting.\n", who); |
3212 | 4588 else |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4589 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
7023 | 4590 "Error: Could not find %s in local buddy list, therefore unable to request status message.\n", who); |
3212 | 4591 } else |
7011 | 4592 aim_locate_getinfoshort(od->sess, who, 0x00000002); |
4593 } | |
4594 | |
4595 static void oscar_set_dir(GaimConnection *gc, const char *first, const char *middle, const char *last, | |
3466 | 4596 const char *maiden, const char *city, const char *state, const char *country, int web) { |
4617 | 4597 /* XXX - some of these things are wrong, but i'm lazy */ |
7283 | 4598 OscarData *od = (OscarData *)gc->proto_data; |
7011 | 4599 aim_locate_setdirinfo(od->sess, first, middle, last, |
2086 | 4600 maiden, NULL, NULL, city, state, NULL, 0, web); |
4601 } | |
4602 | |
5575 | 4603 static void oscar_set_idle(GaimConnection *gc, int time) { |
7283 | 4604 OscarData *od = (OscarData *)gc->proto_data; |
7474 | 4605 aim_srv_setidle(od->sess, time); |
2086 | 4606 } |
4607 | |
5954 | 4608 static void oscar_set_info(GaimConnection *gc, const char *text) { |
7283 | 4609 OscarData *od = (OscarData *)gc->proto_data; |
5129 | 4610 fu32_t flags = 0; |
6019 | 4611 char *text_html = NULL; |
5129 | 4612 char *msg = NULL; |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
4613 gsize msglen = 0; |
2993 | 4614 |
4617 | 4615 if (od->rights.maxsiglen == 0) |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4616 gaim_notify_warning(gc, NULL, _("Unable to set AIM profile."), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4617 _("You have probably requested to set your " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4618 "profile before the login procedure completed. " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4619 "Your profile remains unset; try setting it " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4620 "again when you are fully connected.")); |
4617 | 4621 |
7334 | 4622 if (!text) { |
4623 aim_locate_setprofile(od->sess, NULL, "", 0, NULL, NULL, 0); | |
4624 return; | |
4625 } | |
6019 | 4626 |
7334 | 4627 text_html = gaim_strdup_withhtml(text); |
4628 flags = oscar_encoding_check(text_html); | |
4629 if (flags & AIM_IMFLAGS_UNICODE) { | |
4630 msg = g_convert(text_html, strlen(text_html), "UCS-2BE", "UTF-8", NULL, &msglen, NULL); | |
4631 aim_locate_setprofile(od->sess, "unicode-2-0", msg, (msglen > od->rights.maxsiglen ? od->rights.maxsiglen : msglen), NULL, NULL, 0); | |
4632 g_free(msg); | |
4633 } else if (flags & AIM_IMFLAGS_ISO_8859_1) { | |
4634 msg = g_convert(text_html, strlen(text_html), "ISO-8859-1", "UTF-8", NULL, &msglen, NULL); | |
4635 aim_locate_setprofile(od->sess, "iso-8859-1", msg, (msglen > od->rights.maxsiglen ? od->rights.maxsiglen : msglen), NULL, NULL, 0); | |
4636 g_free(msg); | |
4637 } else { | |
4638 msglen = strlen(text_html); | |
4639 aim_locate_setprofile(od->sess, "us-ascii", text_html, (msglen > od->rights.maxsiglen ? od->rights.maxsiglen : msglen), NULL, NULL, 0); | |
4640 } | |
4641 | |
4642 if (msglen > od->rights.maxsiglen) { | |
4643 gchar *errstr; | |
4644 errstr = g_strdup_printf(ngettext("The maximum profile length of %d byte " | |
4645 "has been exceeded. Gaim has truncated it for you.", | |
4646 "The maximum profile length of %d bytes " | |
4647 "has been exceeded. Gaim has truncated it for you.", | |
4648 od->rights.maxsiglen), od->rights.maxsiglen); | |
4649 gaim_notify_warning(gc, NULL, _("Profile too long."), errstr); | |
4650 g_free(errstr); | |
4651 } | |
4652 | |
4653 g_free(text_html); | |
2993 | 4654 |
4655 return; | |
2086 | 4656 } |
4657 | |
8257 | 4658 static void oscar_set_away_aim(GaimConnection *gc, OscarData *od, const char *state, const char *text) |
2993 | 4659 { |
5129 | 4660 fu32_t flags = 0; |
6019 | 4661 gchar *text_html = NULL; |
5129 | 4662 char *msg = NULL; |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
4663 gsize msglen = 0; |
2993 | 4664 |
8257 | 4665 if (!strcmp(state, _("Visible"))) { |
4666 aim_setextstatus(od->sess, AIM_ICQ_STATE_NORMAL); | |
4667 return; | |
4668 } else if (!strcmp(state, _("Invisible"))) { | |
4669 aim_setextstatus(od->sess, AIM_ICQ_STATE_INVISIBLE); | |
4670 return; | |
4671 } /* else... */ | |
4672 | |
4673 aim_setextstatus(od->sess, AIM_ICQ_STATE_NORMAL); | |
4674 | |
2993 | 4675 if (od->rights.maxawaymsglen == 0) |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4676 gaim_notify_warning(gc, NULL, _("Unable to set AIM away message."), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4677 _("You have probably requested to set your " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4678 "away message before the login procedure " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4679 "completed. You remain in a \"present\" " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4680 "state; try setting it again when you are " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4681 "fully connected.")); |
5129 | 4682 |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4683 if (gc->away) { |
2993 | 4684 g_free(gc->away); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4685 gc->away = NULL; |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4686 } |
2993 | 4687 |
5129 | 4688 if (!text) { |
7334 | 4689 aim_locate_setprofile(od->sess, NULL, NULL, 0, NULL, "", 0); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4690 return; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4691 } |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4692 |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4693 text_html = gaim_strdup_withhtml(text); |
6019 | 4694 flags = oscar_encoding_check(text_html); |
5129 | 4695 if (flags & AIM_IMFLAGS_UNICODE) { |
6019 | 4696 msg = g_convert(text_html, strlen(text_html), "UCS-2BE", "UTF-8", NULL, &msglen, NULL); |
7011 | 4697 aim_locate_setprofile(od->sess, NULL, NULL, 0, "unicode-2-0", msg, |
7334 | 4698 (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen)); |
5129 | 4699 g_free(msg); |
4700 gc->away = g_strndup(text, od->rights.maxawaymsglen/2); | |
4701 } else if (flags & AIM_IMFLAGS_ISO_8859_1) { | |
6019 | 4702 msg = g_convert(text_html, strlen(text_html), "ISO-8859-1", "UTF-8", NULL, &msglen, NULL); |
7011 | 4703 aim_locate_setprofile(od->sess, NULL, NULL, 0, "iso-8859-1", msg, |
7334 | 4704 (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen)); |
5129 | 4705 g_free(msg); |
6019 | 4706 gc->away = g_strndup(text_html, od->rights.maxawaymsglen); |
5129 | 4707 } else { |
6019 | 4708 msglen = strlen(text_html); |
7011 | 4709 aim_locate_setprofile(od->sess, NULL, NULL, 0, "us-ascii", text_html, |
7334 | 4710 (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen)); |
6019 | 4711 gc->away = g_strndup(text_html, od->rights.maxawaymsglen); |
5129 | 4712 } |
4713 | |
4714 if (msglen > od->rights.maxawaymsglen) { | |
2993 | 4715 gchar *errstr; |
4716 | |
6308 | 4717 errstr = g_strdup_printf(ngettext("The maximum away message length of %d byte " |
4718 "has been exceeded. Gaim has truncated it for you.", | |
4719 "The maximum away message length of %d bytes " | |
4720 "has been exceeded. Gaim has truncated it for you.", | |
4721 od->rights.maxawaymsglen), od->rights.maxawaymsglen); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4722 gaim_notify_warning(gc, NULL, _("Away message too long."), errstr); |
2993 | 4723 g_free(errstr); |
4724 } | |
6019 | 4725 |
4726 g_free(text_html); | |
8257 | 4727 |
2993 | 4728 return; |
4729 } | |
4730 | |
7283 | 4731 static void oscar_set_away_icq(GaimConnection *gc, OscarData *od, const char *state, const char *message) |
2993 | 4732 { |
5575 | 4733 GaimAccount *account = gaim_connection_get_account(gc); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4734 if (gc->away) { |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4735 g_free(gc->away); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4736 gc->away = NULL; |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4737 } |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4738 |
8265 | 4739 if (strcmp(state, _("Invisible"))) |
5575 | 4740 account->perm_deny = 4; |
8265 | 4741 else |
5575 | 4742 account->perm_deny = 3; |
8265 | 4743 if ((od->sess->ssi.received_data) && (aim_ssi_getpermdeny(od->sess->ssi.local) != account->perm_deny)) |
4744 aim_ssi_setpermdeny(od->sess, account->perm_deny, 0xffffffff); | |
4342 | 4745 |
4746 if (!strcmp(state, _("Online"))) | |
4901 | 4747 aim_setextstatus(od->sess, AIM_ICQ_STATE_NORMAL); |
4342 | 4748 else if (!strcmp(state, _("Away"))) { |
4901 | 4749 aim_setextstatus(od->sess, AIM_ICQ_STATE_AWAY); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4750 gc->away = g_strdup(""); |
4342 | 4751 } else if (!strcmp(state, _("Do Not Disturb"))) { |
4901 | 4752 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
|
4753 gc->away = g_strdup(""); |
4342 | 4754 } else if (!strcmp(state, _("Not Available"))) { |
4901 | 4755 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
|
4756 gc->away = g_strdup(""); |
4342 | 4757 } else if (!strcmp(state, _("Occupied"))) { |
4901 | 4758 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
|
4759 gc->away = g_strdup(""); |
4342 | 4760 } else if (!strcmp(state, _("Free For Chat"))) { |
4901 | 4761 aim_setextstatus(od->sess, AIM_ICQ_STATE_CHAT); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4762 gc->away = g_strdup(""); |
4342 | 4763 } else if (!strcmp(state, _("Invisible"))) { |
4901 | 4764 aim_setextstatus(od->sess, AIM_ICQ_STATE_INVISIBLE); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4765 gc->away = g_strdup(""); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4766 } else if (!strcmp(state, GAIM_AWAY_CUSTOM)) { |
2998 | 4767 if (message) { |
4901 | 4768 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
|
4769 gc->away = g_strdup(""); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4770 } else { |
4901 | 4771 aim_setextstatus(od->sess, AIM_ICQ_STATE_NORMAL); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4772 } |
2086 | 4773 } |
2993 | 4774 |
4775 return; | |
4776 } | |
4777 | |
6059 | 4778 static void oscar_set_away(GaimConnection *gc, const char *state, const char *message) |
2993 | 4779 { |
7283 | 4780 OscarData *od = (OscarData *)gc->proto_data; |
2993 | 4781 |
4782 if (od->icq) | |
4783 oscar_set_away_icq(gc, od, state, message); | |
4784 else | |
8257 | 4785 oscar_set_away_aim(gc, od, state, message); |
2993 | 4786 |
4787 return; | |
2086 | 4788 } |
4789 | |
6059 | 4790 static void oscar_warn(GaimConnection *gc, const char *name, int anon) { |
7283 | 4791 OscarData *od = (OscarData *)gc->proto_data; |
4617 | 4792 aim_im_warn(od->sess, od->conn, name, anon ? AIM_WARN_ANON : 0); |
2086 | 4793 } |
4794 | |
5575 | 4795 static void oscar_dir_search(GaimConnection *gc, const char *first, const char *middle, const char *last, |
3466 | 4796 const char *maiden, const char *city, const char *state, const char *country, const char *email) { |
7283 | 4797 OscarData *od = (OscarData *)gc->proto_data; |
2086 | 4798 if (strlen(email)) |
6879 | 4799 aim_search_address(od->sess, od->conn, email); |
2086 | 4800 } |
4801 | |
6787
faa491042c66
[gaim-migrate @ 7326]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
4802 static void oscar_add_buddy(GaimConnection *gc, const char *name, GaimGroup *g) { |
7283 | 4803 OscarData *od = (OscarData *)gc->proto_data; |
8150 | 4804 GaimBuddy *b; |
4805 | |
4806 if (g == NULL) { | |
4807 /* If we were called from oscar_add_buddies... */ | |
4808 b = gaim_find_buddy(gaim_connection_get_account(gc), name); | |
4809 g = gaim_find_buddys_group(b); | |
4810 } else | |
4811 b = gaim_find_buddy_in_group(gaim_connection_get_account(gc), name, g); | |
8092 | 4812 |
4813 if (!aim_snvalid(name)) { | |
4814 gchar *buf; | |
8150 | 4815 buf = g_strdup_printf(_("Could not add the buddy %s because the screen name is invalid. Screen names must either start with a letter and contain only letters, numbers and spaces, or contain only numbers."), name); |
8092 | 4816 gaim_notify_error(gc, NULL, _("Unable To Add"), buf); |
4817 g_free(buf); | |
8150 | 4818 |
4819 /* Remove from local list */ | |
4820 gaim_blist_remove_buddy(b); | |
4821 | |
8092 | 4822 return; |
4823 } | |
4824 | |
4230 | 4825 #ifdef NOSSI |
8143 | 4826 aim_buddylist_addbuddy(od->sess, od->conn, name); |
4230 | 4827 #else |
4828 if ((od->sess->ssi.received_data) && !(aim_ssi_itemlist_exists(od->sess->ssi.local, name))) { | |
8150 | 4829 if (b && g) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4830 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
8150 | 4831 "ssi: adding buddy %s to group %s\n", name, g->name); |
4832 aim_ssi_addbuddy(od->sess, b->name, g->name, gaim_get_buddy_alias_only(b), NULL, NULL, 0); | |
4230 | 4833 } |
4834 } | |
4835 #endif | |
8150 | 4836 |
4759 | 4837 if (od->icq) |
4838 aim_icq_getalias(od->sess, name); | |
4230 | 4839 } |
4840 | |
5575 | 4841 static void oscar_add_buddies(GaimConnection *gc, GList *buddies) { |
7283 | 4842 OscarData *od = (OscarData *)gc->proto_data; |
4230 | 4843 #ifdef NOSSI |
4844 char buf[MSG_LEN]; | |
4845 int n=0; | |
4846 while (buddies) { | |
4847 if (n > MSG_LEN - 18) { | |
7285 | 4848 aim_buddylist_set(od->sess, od->conn, buf); |
4230 | 4849 n = 0; |
3092 | 4850 } |
8150 | 4851 n += g_snprintf(buf + n, sizeof(buf) - n, "%s&", (const char *)buddies->data); |
4230 | 4852 buddies = buddies->next; |
4853 } | |
7285 | 4854 aim_buddylist_set(od->sess, od->conn, buf); |
4230 | 4855 #else |
4856 if (od->sess->ssi.received_data) { | |
4857 while (buddies) { | |
8092 | 4858 oscar_add_buddy(gc, buddies->data, NULL); |
4230 | 4859 buddies = buddies->next; |
4860 } | |
4861 } | |
4862 #endif | |
4863 } | |
4864 | |
6059 | 4865 static void oscar_remove_buddy(GaimConnection *gc, const char *name, const char *group) { |
7283 | 4866 OscarData *od = (OscarData *)gc->proto_data; |
4230 | 4867 #ifdef NOSSI |
8143 | 4868 aim_buddylist_removebuddy(od->sess, od->conn, name); |
4230 | 4869 #else |
4870 if (od->sess->ssi.received_data) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4871 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4872 "ssi: deleting buddy %s from group %s\n", name, group); |
4889 | 4873 aim_ssi_delbuddy(od->sess, name, group); |
4230 | 4874 } |
4875 #endif | |
4876 } | |
4877 | |
5575 | 4878 static void oscar_remove_buddies(GaimConnection *gc, GList *buddies, const char *group) { |
7283 | 4879 OscarData *od = (OscarData *)gc->proto_data; |
4230 | 4880 #ifdef NOSSI |
4881 GList *cur; | |
4882 for (cur=buddies; cur; cur=cur->next) | |
8143 | 4883 aim_buddylist_removebuddy(od->sess, od->conn, cur->data); |
4230 | 4884 #else |
4885 if (od->sess->ssi.received_data) { | |
3092 | 4886 while (buddies) { |
8150 | 4887 oscar_remove_buddy(gc, buddies->data, group); |
3092 | 4888 buddies = buddies->next; |
4889 } | |
4230 | 4890 } |
4891 #endif | |
4892 } | |
4893 | |
4894 #ifndef NOSSI | |
5575 | 4895 static void oscar_move_buddy(GaimConnection *gc, const char *name, const char *old_group, const char *new_group) { |
7283 | 4896 OscarData *od = (OscarData *)gc->proto_data; |
4303 | 4897 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
|
4898 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4899 "ssi: moving buddy %s from group %s to group %s\n", name, old_group, new_group); |
4889 | 4900 aim_ssi_movebuddy(od->sess, old_group, new_group, name); |
4269 | 4901 } |
4902 } | |
4903 | |
5575 | 4904 static void oscar_alias_buddy(GaimConnection *gc, const char *name, const char *alias) { |
7283 | 4905 OscarData *od = (OscarData *)gc->proto_data; |
4269 | 4906 if (od->sess->ssi.received_data) { |
4907 char *gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, name); | |
4908 if (gname) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4909 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4910 "ssi: changing the alias for buddy %s to %s\n", name, alias); |
4889 | 4911 aim_ssi_aliasbuddy(od->sess, gname, name, alias); |
4269 | 4912 } |
4913 } | |
4914 } | |
4915 | |
8341 | 4916 static void oscar_rename_group(GaimConnection *gc, const char *old_group, const char *new_group, GList *members) { |
4917 OscarData *od = (OscarData *)gc->proto_data; | |
4230 | 4918 |
4919 if (od->sess->ssi.received_data) { | |
4920 if (aim_ssi_itemlist_finditem(od->sess->ssi.local, new_group, NULL, AIM_SSI_TYPE_GROUP)) { | |
8341 | 4921 oscar_remove_buddies(gc, members, old_group); |
4922 oscar_add_buddies(gc, members); | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4923 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4924 "ssi: moved all buddies from group %s to %s\n", old_group, new_group); |
4230 | 4925 } else { |
4889 | 4926 aim_ssi_rename_group(od->sess, old_group, new_group); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4927 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4928 "ssi: renamed group %s to %s\n", old_group, new_group); |
2995 | 4929 } |
4930 } | |
4931 } | |
4932 | |
5968 | 4933 static gboolean gaim_ssi_rerequestdata(gpointer data) { |
4934 aim_session_t *sess = data; | |
6350 | 4935 aim_ssi_reqdata(sess); |
5968 | 4936 return FALSE; |
4937 } | |
4938 | |
4642 | 4939 static int gaim_ssi_parseerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4940 GaimConnection *gc = sess->aux_data; |
7283 | 4941 OscarData *od = gc->proto_data; |
4642 | 4942 va_list ap; |
4943 fu16_t reason; | |
4944 | |
4945 va_start(ap, fr); | |
4946 reason = (fu16_t)va_arg(ap, unsigned int); | |
4947 va_end(ap); | |
4948 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4949 gaim_debug(GAIM_DEBUG_ERROR, "oscar", "ssi: SNAC error %hu\n", reason); |
4642 | 4950 |
4951 if (reason == 0x0005) { | |
5892 | 4952 gaim_notify_error(gc, NULL, _("Unable To Retrieve Buddy List"), |
5828 | 4953 _("Gaim was temporarily unable to retrieve your buddy list from the AIM servers. Your buddy list is not lost, and will probably become available in a few hours.")); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
4954 od->getblisttimer = gaim_timeout_add(300000, gaim_ssi_rerequestdata, od->sess); |
4642 | 4955 } |
4956 | |
4957 /* Activate SSI */ | |
4958 /* Sending the enable causes other people to be able to see you, and you to see them */ | |
4959 /* Make sure your privacy setting/invisibility is set how you want it before this! */ | |
5968 | 4960 gaim_debug(GAIM_DEBUG_INFO, "oscar", "ssi: activating server-stored buddy list\n"); |
4642 | 4961 aim_ssi_enable(od->sess); |
4962 | |
4963 return 1; | |
4964 } | |
4965 | |
2991 | 4966 static int gaim_ssi_parserights(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4967 GaimConnection *gc = sess->aux_data; |
7283 | 4968 OscarData *od = (OscarData *)gc->proto_data; |
4230 | 4969 int numtypes, i; |
4970 fu16_t *maxitems; | |
2991 | 4971 va_list ap; |
4972 | |
4973 va_start(ap, fr); | |
4230 | 4974 numtypes = va_arg(ap, int); |
4975 maxitems = va_arg(ap, fu16_t *); | |
2991 | 4976 va_end(ap); |
4977 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4978 gaim_debug(GAIM_DEBUG_MISC, "oscar", "ssi rights:"); |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
4979 |
4230 | 4980 for (i=0; i<numtypes; i++) |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
4981 gaim_debug(GAIM_DEBUG_MISC, NULL, " max type 0x%04x=%hd,", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
4982 i, maxitems[i]); |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
4983 |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
4984 gaim_debug(GAIM_DEBUG_MISC, NULL, "\n"); |
4230 | 4985 |
4986 if (numtypes >= 0) | |
4987 od->rights.maxbuddies = maxitems[0]; | |
4988 if (numtypes >= 1) | |
4989 od->rights.maxgroups = maxitems[1]; | |
4990 if (numtypes >= 2) | |
4991 od->rights.maxpermits = maxitems[2]; | |
4992 if (numtypes >= 3) | |
4993 od->rights.maxdenies = maxitems[3]; | |
2991 | 4994 |
4995 return 1; | |
4996 } | |
4997 | |
4998 static int gaim_ssi_parselist(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 4999 GaimConnection *gc = sess->aux_data; |
5000 GaimAccount *account = gaim_connection_get_account(gc); | |
7283 | 5001 OscarData *od = (OscarData *)gc->proto_data; |
8150 | 5002 GaimGroup *g; |
5003 GaimBuddy *b; | |
2995 | 5004 struct aim_ssi_item *curitem; |
2991 | 5005 int tmp; |
4230 | 5006 va_list ap; |
8219 | 5007 fu16_t fmtver, numitems; |
5008 struct aim_ssi_item *items; | |
5009 fu32_t timestamp; | |
4230 | 5010 |
5011 va_start(ap, fr); | |
5012 fmtver = (fu16_t)va_arg(ap, int); | |
5013 numitems = (fu16_t)va_arg(ap, int); | |
8219 | 5014 items = va_arg(ap, struct aim_ssi_item *); |
4230 | 5015 timestamp = va_arg(ap, fu32_t); |
8219 | 5016 va_end(ap); |
2991 | 5017 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5018 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5019 "ssi: syncing local list and server list\n"); |
2991 | 5020 |
8219 | 5021 if ((timestamp == 0) || (numitems == 0)) { |
8430 | 5022 gaim_debug(GAIM_DEBUG_INFO, "oscar", "Got AIM SSI with a 0 timestamp or 0 numitems--not syncing. This probably means your buddy list is empty.", NULL); |
8219 | 5023 return 1; |
5024 } | |
5025 | |
2991 | 5026 /* Clean the buddy list */ |
4889 | 5027 aim_ssi_cleanlist(sess); |
2991 | 5028 |
8150 | 5029 { /* If not in server list then prune from local list */ |
5030 GaimBlistNode *gnode, *cnode, *bnode; | |
5031 GaimBuddyList *blist; | |
5032 GSList *cur; | |
5033 | |
5034 /* Buddies */ | |
5035 cur = NULL; | |
5036 if ((blist = gaim_get_blist()) != NULL) { | |
5037 for (gnode = blist->root; gnode; gnode = gnode->next) { | |
5038 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
5039 continue; | |
5040 g = (GaimGroup *)gnode; | |
5041 for (cnode = gnode->child; cnode; cnode = cnode->next) { | |
5042 if(!GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
5043 continue; | |
5044 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
5045 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
5046 continue; | |
5047 b = (GaimBuddy *)bnode; | |
5048 if (b->account == gc->account) { | |
5049 if (aim_ssi_itemlist_exists(sess->ssi.local, b->name)) { | |
5050 /* If the buddy is an ICQ user then load his nickname */ | |
5051 const char *servernick = gaim_blist_node_get_string((GaimBlistNode*)b, "servernick"); | |
8214 | 5052 char *alias; |
8150 | 5053 if (servernick) |
5054 serv_got_alias(gc, b->name, servernick); | |
5055 | |
5056 /* Store local alias on server */ | |
8214 | 5057 alias = aim_ssi_getalias(sess->ssi.local, g->name, b->name); |
8150 | 5058 if (!alias && b->alias && strlen(b->alias)) |
5059 aim_ssi_aliasbuddy(sess, g->name, b->name, b->alias); | |
5060 free(alias); | |
5061 } else { | |
5062 gaim_debug(GAIM_DEBUG_INFO, "oscar", | |
5063 "ssi: removing buddy %s from local list\n", b->name); | |
5064 /* We can't actually remove now because it will screw up our looping */ | |
5065 cur = g_slist_prepend(cur, b); | |
5066 } | |
5067 } | |
5068 } | |
5069 } | |
5070 } | |
5071 } | |
8175 | 5072 |
8150 | 5073 while (cur != NULL) { |
5074 b = cur->data; | |
5075 cur = g_slist_remove(cur, b); | |
5076 gaim_blist_remove_buddy(b); | |
5077 } | |
5078 | |
5079 /* Permit list */ | |
5080 if (gc->account->permit) { | |
5081 for (cur=gc->account->permit; cur; cur=cur->next) | |
5082 if (!aim_ssi_itemlist_finditem(sess->ssi.local, NULL, cur->data, AIM_SSI_TYPE_PERMIT)) { | |
5083 gaim_debug(GAIM_DEBUG_INFO, "oscar", | |
5084 "ssi: removing permit %s from local list\n", (const char *)cur->data); | |
5085 gaim_privacy_permit_remove(account, cur->data, TRUE); | |
5086 cur = gc->account->permit; | |
5087 } | |
5088 } | |
5089 | |
5090 /* Deny list */ | |
5091 if (gc->account->deny) { | |
5092 for (cur=gc->account->deny; cur; cur=cur->next) | |
5093 if (!aim_ssi_itemlist_finditem(sess->ssi.local, NULL, cur->data, AIM_SSI_TYPE_DENY)) { | |
5094 gaim_debug(GAIM_DEBUG_INFO, "oscar", | |
5095 "ssi: removing deny %s from local list\n", (const char *)cur->data); | |
5096 gaim_privacy_deny_remove(account, cur->data, TRUE); | |
5097 cur = gc->account->deny; | |
5098 } | |
5099 } | |
5100 /* Presence settings (idle time visibility) */ | |
5101 if ((tmp = aim_ssi_getpresence(sess->ssi.local)) != 0xFFFFFFFF) | |
5102 if (!(tmp & 0x400)) | |
5103 aim_ssi_setpresence(sess, tmp | 0x400); | |
5104 } /* end pruning buddies from local list */ | |
5105 | |
2991 | 5106 /* Add from server list to local list */ |
4230 | 5107 for (curitem=sess->ssi.local; curitem; curitem=curitem->next) { |
7328 | 5108 if ((curitem->name == NULL) || (g_utf8_validate(curitem->name, -1, NULL))) |
2991 | 5109 switch (curitem->type) { |
4230 | 5110 case 0x0000: { /* Buddy */ |
4251 | 5111 if (curitem->name) { |
4292 | 5112 char *gname = aim_ssi_itemlist_findparentname(sess->ssi.local, curitem->name); |
7166 | 5113 char *gname_utf8 = gname ? gaim_utf8_try_convert(gname) : NULL; |
4282 | 5114 char *alias = aim_ssi_getalias(sess->ssi.local, gname, curitem->name); |
7166 | 5115 char *alias_utf8 = alias ? gaim_utf8_try_convert(alias) : NULL; |
8150 | 5116 b = gaim_find_buddy(gc->account, curitem->name); |
4458 | 5117 /* Should gname be freed here? -- elb */ |
4754 | 5118 /* Not with the current code, but that might be cleaner -- med */ |
4458 | 5119 free(alias); |
8150 | 5120 if (b) { |
4292 | 5121 /* Get server stored alias */ |
4705 | 5122 if (alias_utf8) { |
8150 | 5123 g_free(b->alias); |
5124 b->alias = g_strdup(alias_utf8); | |
4705 | 5125 } |
4282 | 5126 } else { |
8150 | 5127 b = gaim_buddy_new(gc->account, curitem->name, alias_utf8); |
5146 | 5128 |
4754 | 5129 if (!(g = gaim_find_group(gname_utf8 ? gname_utf8 : _("Orphans")))) { |
4687 | 5130 g = gaim_group_new(gname_utf8 ? gname_utf8 : _("Orphans")); |
4754 | 5131 gaim_blist_add_group(g, NULL); |
5132 } | |
5146 | 5133 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5134 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
8150 | 5135 "ssi: adding b %s to group %s to local list\n", curitem->name, gname_utf8 ? gname_utf8 : _("Orphans")); |
5136 gaim_blist_add_buddy(b, NULL, g, NULL); | |
4251 | 5137 } |
8341 | 5138 if (!aim_sncmp(curitem->name, account->username)) { |
5139 char *comment = aim_ssi_getcomment(sess->ssi.local, gname, curitem->name); | |
5140 gaim_check_comment(od, comment); | |
5141 free(comment); | |
5142 } | |
7162 | 5143 g_free(gname_utf8); |
5144 g_free(alias_utf8); | |
2991 | 5145 } |
4230 | 5146 } break; |
5147 | |
5148 case 0x0001: { /* Group */ | |
4282 | 5149 /* Shouldn't add empty groups */ |
4230 | 5150 } break; |
5151 | |
5152 case 0x0002: { /* Permit buddy */ | |
2991 | 5153 if (curitem->name) { |
4230 | 5154 /* if (!find_permdeny_by_name(gc->permit, curitem->name)) { AAA */ |
2991 | 5155 GSList *list; |
5575 | 5156 for (list=account->permit; (list && aim_sncmp(curitem->name, list->data)); list=list->next); |
2991 | 5157 if (!list) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5158 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5159 "ssi: adding permit buddy %s to local list\n", curitem->name); |
6400
588e88bcdac5
[gaim-migrate @ 6905]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
5160 gaim_privacy_permit_add(account, curitem->name, TRUE); |
2991 | 5161 } |
5162 } | |
4230 | 5163 } break; |
5164 | |
5165 case 0x0003: { /* Deny buddy */ | |
2991 | 5166 if (curitem->name) { |
5167 GSList *list; | |
5575 | 5168 for (list=account->deny; (list && aim_sncmp(curitem->name, list->data)); list=list->next); |
2991 | 5169 if (!list) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5170 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5171 "ssi: adding deny buddy %s to local list\n", curitem->name); |
6400
588e88bcdac5
[gaim-migrate @ 6905]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
5172 gaim_privacy_deny_add(account, curitem->name, TRUE); |
2991 | 5173 } |
5174 } | |
4230 | 5175 } break; |
5176 | |
5177 case 0x0004: { /* Permit/deny setting */ | |
2991 | 5178 if (curitem->data) { |
5179 fu8_t permdeny; | |
5575 | 5180 if ((permdeny = aim_ssi_getpermdeny(sess->ssi.local)) && (permdeny != account->perm_deny)) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5181 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
5575 | 5182 "ssi: changing permdeny from %d to %hhu\n", account->perm_deny, permdeny); |
5183 account->perm_deny = permdeny; | |
5184 if (od->icq && account->perm_deny == 0x03) { | |
4342 | 5185 serv_set_away(gc, "Invisible", ""); |
5186 } | |
2991 | 5187 } |
5188 } | |
4230 | 5189 } break; |
5190 | |
5191 case 0x0005: { /* Presence setting */ | |
3109 | 5192 /* We don't want to change Gaim's setting because it applies to all accounts */ |
4230 | 5193 } break; |
2991 | 5194 } /* End of switch on curitem->type */ |
5195 } /* End of for loop */ | |
4230 | 5196 |
4901 | 5197 /* Set our ICQ status */ |
8257 | 5198 if (!gc->away) { |
4901 | 5199 aim_setextstatus(sess, AIM_ICQ_STATE_NORMAL); |
5200 } | |
5201 | |
4342 | 5202 /* Activate SSI */ |
5203 /* Sending the enable causes other people to be able to see you, and you to see them */ | |
5204 /* 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
|
5205 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5206 "ssi: activating server-stored buddy list\n"); |
4642 | 5207 aim_ssi_enable(sess); |
4342 | 5208 |
2991 | 5209 return 1; |
2086 | 5210 } |
4230 | 5211 |
5212 static int gaim_ssi_parseack(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 5213 GaimConnection *gc = sess->aux_data; |
4230 | 5214 va_list ap; |
5215 struct aim_ssi_tmp *retval; | |
5216 | |
5217 va_start(ap, fr); | |
5218 retval = va_arg(ap, struct aim_ssi_tmp *); | |
5219 va_end(ap); | |
5220 | |
5221 while (retval) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5222 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5223 "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 | 5224 |
5225 if (retval->ack != 0xffff) | |
5226 switch (retval->ack) { | |
5227 case 0x0000: { /* added successfully */ | |
5228 } break; | |
5229 | |
4829 | 5230 case 0x000c: { /* you are over the limit, the cheat is to the limit, come on fhqwhgads */ |
5231 gchar *buf; | |
5232 buf = g_strdup_printf(_("Could not add the buddy %s because you have too many buddies in your buddy list. Please remove one and try again."), (retval->name ? retval->name : _("(no name)"))); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5233 gaim_notify_error(gc, NULL, _("Unable To Add"), buf); |
4829 | 5234 g_free(buf); |
5235 } | |
5236 | |
7023 | 5237 case 0x000e: { /* buddy requires authorization */ |
4828 | 5238 if ((retval->action == AIM_CB_SSI_ADD) && (retval->name)) |
4269 | 5239 gaim_auth_sendrequest(gc, retval->name); |
4230 | 5240 } break; |
5241 | |
5242 default: { /* La la la */ | |
5197 | 5243 gchar *buf; |
5402 | 5244 gaim_debug(GAIM_DEBUG_ERROR, "oscar", "ssi: Action 0x%04hx was unsuccessful with error 0x%04hx\n", retval->action, retval->ack); |
5245 buf = g_strdup_printf(_("Could not add the buddy %s for an unknown reason. The most common reason for this is that you have the maximum number of allowed buddies in your buddy list."), (retval->name ? retval->name : _("(no name)"))); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5246 gaim_notify_error(gc, NULL, _("Unable To Add"), buf); |
5197 | 5247 g_free(buf); |
4230 | 5248 } break; |
5249 } | |
5250 | |
5251 retval = retval->next; | |
5252 } | |
5253 | |
5254 return 1; | |
5255 } | |
5256 | |
8227 | 5257 static int gaim_ssi_parseadd(aim_session_t *sess, aim_frame_t *fr, ...) { |
5258 GaimConnection *gc = sess->aux_data; | |
5259 char *gname, *gname_utf8, *alias, *alias_utf8; | |
5260 GaimBuddy *b; | |
5261 GaimGroup *g; | |
5262 va_list ap; | |
5263 fu16_t type; | |
5264 const char *name; | |
5265 | |
5266 va_start(ap, fr); | |
5267 type = (fu16_t)va_arg(ap, int); | |
5268 name = va_arg(ap, char *); | |
5269 va_end(ap); | |
5270 | |
5271 if ((type != 0x0000) || (name == NULL)) | |
5272 return 1; | |
5273 | |
5274 gname = aim_ssi_itemlist_findparentname(sess->ssi.local, name); | |
5275 gname_utf8 = gname ? gaim_utf8_try_convert(gname) : NULL; | |
5276 alias = aim_ssi_getalias(sess->ssi.local, gname, name); | |
5277 alias_utf8 = alias ? gaim_utf8_try_convert(alias) : NULL; | |
5278 b = gaim_find_buddy(gc->account, name); | |
5279 free(alias); | |
5280 | |
5281 if (b) { | |
5282 /* Get server stored alias */ | |
5283 if (alias_utf8) { | |
5284 g_free(b->alias); | |
5285 b->alias = g_strdup(alias_utf8); | |
5286 } | |
5287 } else { | |
5288 b = gaim_buddy_new(gc->account, name, alias_utf8); | |
5289 | |
5290 if (!(g = gaim_find_group(gname_utf8 ? gname_utf8 : _("Orphans")))) { | |
5291 g = gaim_group_new(gname_utf8 ? gname_utf8 : _("Orphans")); | |
5292 gaim_blist_add_group(g, NULL); | |
5293 } | |
5294 | |
5295 gaim_debug(GAIM_DEBUG_INFO, "oscar", | |
5296 "ssi: adding b %s to group %s to local list\n", name, gname_utf8 ? gname_utf8 : _("Orphans")); | |
5297 gaim_blist_add_buddy(b, NULL, g, NULL); | |
5298 } | |
5299 g_free(gname_utf8); | |
5300 g_free(alias_utf8); | |
5301 | |
5302 return 1; | |
5303 } | |
5304 | |
4230 | 5305 static int gaim_ssi_authgiven(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 5306 GaimConnection *gc = sess->aux_data; |
4230 | 5307 va_list ap; |
5308 char *sn, *msg; | |
4236 | 5309 gchar *dialog_msg, *nombre; |
4230 | 5310 struct name_data *data; |
6695 | 5311 GaimBuddy *buddy; |
4230 | 5312 |
5313 va_start(ap, fr); | |
5314 sn = va_arg(ap, char *); | |
5315 msg = va_arg(ap, char *); | |
5316 va_end(ap); | |
5317 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5318 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5319 "ssi: %s has given you permission to add him to your buddy list\n", sn); |
4230 | 5320 |
4687 | 5321 buddy = gaim_find_buddy(gc->account, sn); |
5322 if (buddy && (gaim_get_buddy_alias_only(buddy))) | |
5323 nombre = g_strdup_printf("%s (%s)", sn, gaim_get_buddy_alias_only(buddy)); | |
4236 | 5324 else |
5325 nombre = g_strdup(sn); | |
5326 | |
5327 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 | 5328 data = g_new(struct name_data, 1); |
5329 data->gc = gc; | |
5330 data->name = g_strdup(sn); | |
5331 data->nick = NULL; | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5332 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5333 gaim_request_yes_no(gc, NULL, _("Authorization Given"), dialog_msg, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5334 0, data, |
7023 | 5335 G_CALLBACK(gaim_icq_buddyadd), |
5836 | 5336 G_CALLBACK(oscar_free_name_data)); |
4236 | 5337 |
4230 | 5338 g_free(dialog_msg); |
4236 | 5339 g_free(nombre); |
4230 | 5340 |
5341 return 1; | |
5342 } | |
5343 | |
5344 static int gaim_ssi_authrequest(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 5345 GaimConnection *gc = sess->aux_data; |
4230 | 5346 va_list ap; |
5347 char *sn, *msg; | |
4236 | 5348 gchar *dialog_msg, *nombre; |
4230 | 5349 struct name_data *data; |
6695 | 5350 GaimBuddy *buddy; |
4230 | 5351 |
5352 va_start(ap, fr); | |
5353 sn = va_arg(ap, char *); | |
5354 msg = va_arg(ap, char *); | |
5355 va_end(ap); | |
5356 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5357 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5358 "ssi: received authorization request from %s\n", sn); |
4230 | 5359 |
4687 | 5360 buddy = gaim_find_buddy(gc->account, sn); |
5361 if (buddy && (gaim_get_buddy_alias_only(buddy))) | |
5362 nombre = g_strdup_printf("%s (%s)", sn, gaim_get_buddy_alias_only(buddy)); | |
4236 | 5363 else |
5364 nombre = g_strdup(sn); | |
5365 | |
4337 | 5366 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 | 5367 data = g_new(struct name_data, 1); |
5368 data->gc = gc; | |
5369 data->name = g_strdup(sn); | |
5370 data->nick = NULL; | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5371 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5372 gaim_request_action(gc, NULL, _("Authorization Request"), dialog_msg, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5373 0, data, 2, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5374 _("Authorize"), G_CALLBACK(gaim_auth_grant), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5375 _("Deny"), G_CALLBACK(gaim_auth_dontgrant_msgprompt)); |
4236 | 5376 |
4230 | 5377 g_free(dialog_msg); |
4236 | 5378 g_free(nombre); |
4230 | 5379 |
5380 return 1; | |
5381 } | |
5382 | |
5383 static int gaim_ssi_authreply(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 5384 GaimConnection *gc = sess->aux_data; |
4230 | 5385 va_list ap; |
5386 char *sn, *msg; | |
4236 | 5387 gchar *dialog_msg, *nombre; |
4230 | 5388 fu8_t reply; |
6695 | 5389 GaimBuddy *buddy; |
4230 | 5390 |
5391 va_start(ap, fr); | |
5392 sn = va_arg(ap, char *); | |
5393 reply = (fu8_t)va_arg(ap, int); | |
5394 msg = va_arg(ap, char *); | |
5395 va_end(ap); | |
5396 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5397 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5398 "ssi: received authorization reply from %s. Reply is 0x%04hhx\n", sn, reply); |
4236 | 5399 |
4687 | 5400 buddy = gaim_find_buddy(gc->account, sn); |
5401 if (buddy && (gaim_get_buddy_alias_only(buddy))) | |
5402 nombre = g_strdup_printf("%s (%s)", sn, gaim_get_buddy_alias_only(buddy)); | |
4236 | 5403 else |
5404 nombre = g_strdup(sn); | |
5405 | |
4230 | 5406 if (reply) { |
5407 /* Granted */ | |
7023 | 5408 dialog_msg = g_strdup_printf(_("The user %s has granted your request to add them to your buddy list."), nombre); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5409 gaim_notify_info(gc, NULL, _("Authorization Granted"), dialog_msg); |
4230 | 5410 } else { |
5411 /* Denied */ | |
7023 | 5412 dialog_msg = g_strdup_printf(_("The user %s has denied your request to add them to your buddy list for the following reason:\n%s"), nombre, msg ? msg : _("No reason given.")); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5413 gaim_notify_info(gc, NULL, _("Authorization Denied"), dialog_msg); |
4230 | 5414 } |
5415 g_free(dialog_msg); | |
4236 | 5416 g_free(nombre); |
4230 | 5417 |
5418 return 1; | |
5419 } | |
5420 | |
5421 static int gaim_ssi_gotadded(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 5422 GaimConnection *gc = sess->aux_data; |
4230 | 5423 va_list ap; |
5424 char *sn; | |
6695 | 5425 GaimBuddy *buddy; |
4230 | 5426 |
5427 va_start(ap, fr); | |
5428 sn = va_arg(ap, char *); | |
5429 va_end(ap); | |
5430 | |
4687 | 5431 buddy = gaim_find_buddy(gc->account, sn); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5432 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5433 "ssi: %s added you to their buddy list\n", sn); |
7015
dece74f05509
[gaim-migrate @ 7578]
Christian Hammond <chipx86@chipx86.com>
parents:
7011
diff
changeset
|
5434 gaim_account_notify_added(gc->account, NULL, sn, (buddy ? gaim_get_buddy_alias_only(buddy) : NULL), NULL); |
4230 | 5435 |
5436 return 1; | |
5437 } | |
4269 | 5438 #endif |
2086 | 5439 |
5575 | 5440 static GList *oscar_chat_info(GaimConnection *gc) { |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5441 GList *m = NULL; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5442 struct proto_chat_entry *pce; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5443 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5444 pce = g_new0(struct proto_chat_entry, 1); |
7841 | 5445 pce->label = _("_Group:"); |
5234 | 5446 pce->identifier = "room"; |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5447 m = g_list_append(m, pce); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5448 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5449 pce = g_new0(struct proto_chat_entry, 1); |
7841 | 5450 pce->label = _("_Exchange:"); |
5234 | 5451 pce->identifier = "exchange"; |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5452 pce->is_int = TRUE; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5453 pce->min = 4; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5454 pce->max = 20; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5455 m = g_list_append(m, pce); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5456 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5457 return m; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5458 } |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5459 |
8308 | 5460 static void oscar_join_chat(GaimConnection *gc, GHashTable *data) { |
5461 OscarData *od = (OscarData *)gc->proto_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5462 aim_conn_t *cur; |
5234 | 5463 char *name, *exchange; |
5464 | |
5465 name = g_hash_table_lookup(data, "room"); | |
5466 exchange = g_hash_table_lookup(data, "exchange"); | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5467 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5468 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5469 "Attempting to join chat room %s.\n", name); |
8308 | 5470 |
5471 if ((name == NULL) || (*name == '\0')) { | |
5472 gaim_notify_error(gc, NULL, _("Invalid chat name specified."), NULL); | |
5473 return; | |
5474 } | |
5475 | |
4617 | 5476 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
|
5477 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5478 "chatnav exists, creating room\n"); |
5234 | 5479 aim_chatnav_createroom(od->sess, cur, name, atoi(exchange)); |
2086 | 5480 } else { |
5481 /* this gets tricky */ | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
5482 struct create_room *cr = g_new0(struct create_room, 1); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5483 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5484 "chatnav does not exist, opening chatnav\n"); |
5234 | 5485 cr->exchange = atoi(exchange); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
5486 cr->name = g_strdup(name); |
4617 | 5487 od->create_rooms = g_slist_append(od->create_rooms, cr); |
5488 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_CHATNAV); | |
2086 | 5489 } |
5490 } | |
5491 | |
8308 | 5492 static void oscar_chat_invite(GaimConnection *gc, int id, const char *message, const char *name) { |
5493 OscarData *od = (OscarData *)gc->proto_data; | |
5494 struct chat_connection *ccon = find_oscar_chat(gc, id); | |
2086 | 5495 |
5496 if (!ccon) | |
5497 return; | |
5498 | |
8225 | 5499 aim_im_sendch2_chatinvite(od->sess, name, message ? message : "", |
2086 | 5500 ccon->exchange, ccon->name, 0x0); |
5501 } | |
5502 | |
8308 | 5503 static void oscar_chat_leave(GaimConnection *gc, int id) { |
5504 OscarData *od = gc ? (OscarData *)gc->proto_data : NULL; | |
5505 GSList *bcs = gc->buddy_chats; | |
5679 | 5506 GaimConversation *b = NULL; |
2086 | 5507 struct chat_connection *c = NULL; |
5508 int count = 0; | |
5509 | |
5510 while (bcs) { | |
5511 count++; | |
5679 | 5512 b = (GaimConversation *)bcs->data; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
5513 if (id == gaim_conv_chat_get_id(GAIM_CONV_CHAT(b))) |
2086 | 5514 break; |
5515 bcs = bcs->next; | |
5516 b = NULL; | |
5517 } | |
5518 | |
5519 if (!b) | |
5520 return; | |
5521 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5522 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5523 "Attempting to leave room %s (currently in %d rooms)\n", b->name, count); |
2086 | 5524 |
8308 | 5525 c = find_oscar_chat(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(b))); |
2086 | 5526 if (c != NULL) { |
4617 | 5527 if (od) |
5528 od->oscar_chats = g_slist_remove(od->oscar_chats, c); | |
2086 | 5529 if (c->inpa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
5530 gaim_input_remove(c->inpa); |
8308 | 5531 if (gc && od->sess) |
4617 | 5532 aim_conn_kill(od->sess, &c->conn); |
2086 | 5533 g_free(c->name); |
5534 g_free(c->show); | |
5535 g_free(c); | |
5536 } | |
5537 /* we do this because with Oscar it doesn't tell us we left */ | |
8308 | 5538 serv_got_chat_left(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(b))); |
2086 | 5539 } |
5540 | |
8219 | 5541 static int oscar_send_chat(GaimConnection *gc, int id, const char *message) { |
5542 OscarData *od = (OscarData *)gc->proto_data; | |
5543 GError *err = NULL; | |
5544 GaimConversation *conv = NULL; | |
2086 | 5545 struct chat_connection *c = NULL; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5546 char *buf, *buf2; |
8219 | 5547 char *charset = NULL; |
5548 int encoding; | |
5549 int len; | |
5550 | |
5551 if (!(conv = gaim_find_chat(gc, id))) | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5552 return -EINVAL; |
2086 | 5553 |
8219 | 5554 if (!(c = find_oscar_chat_by_conv(gc, conv))) |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5555 return -EINVAL; |
2086 | 5556 |
8219 | 5557 buf = gaim_strdup_withhtml(message); |
5558 len = strlen(buf); | |
5559 | |
5560 encoding = oscar_encoding_check(buf); | |
8233 | 5561 if (encoding & AIM_IMFLAGS_UNICODE) { |
8359 | 5562 gaim_debug(GAIM_DEBUG_INFO, "oscar", "Sending Unicode chat\n"); |
8219 | 5563 charset = "unicode-2-0"; |
5564 buf2 = g_convert(buf, len, "UCS-2BE", "UTF-8", NULL, &len, &err); | |
5565 if (err) { | |
5566 gaim_debug(GAIM_DEBUG_ERROR, "oscar", | |
8359 | 5567 "Error converting to unicode-2-0: %s\n", err->message); |
5568 g_error_free(err); | |
5569 } | |
8219 | 5570 } else if (encoding & AIM_IMFLAGS_ISO_8859_1) { |
8359 | 5571 gaim_debug(GAIM_DEBUG_INFO, "oscar", "Sending ISO-8859-1 chat\n"); |
8219 | 5572 charset = "iso-8859-1"; |
5573 buf2 = g_convert(buf, len, "ISO-8859-1", "UTF-8", NULL, &len, &err); | |
5574 if (err) { | |
5575 gaim_debug(GAIM_DEBUG_ERROR, "oscar", | |
8359 | 5576 "Error converting to iso-8859-1: %s\n", err->message); |
8219 | 5577 g_error_free(err); |
8359 | 5578 err = NULL; |
5579 | |
5580 gaim_debug(GAIM_DEBUG_INFO, "oscar", "Falling back to Unicode\n"); | |
5581 charset = "unicode-2-0"; | |
5582 buf2 = g_convert(buf, len, "UCS-2BE", "UTF-8", NULL, &len, &err); | |
8219 | 5583 if (err) { |
5584 gaim_debug(GAIM_DEBUG_ERROR, "oscar", | |
8359 | 5585 "Error converting to unicode-2-0: %s\n", |
5586 err->message); | |
8219 | 5587 g_error_free(err); |
5588 } | |
2086 | 5589 } |
8219 | 5590 } else { |
5591 charset = "us-ascii"; | |
5592 buf2 = g_strdup(buf); | |
5593 } | |
8359 | 5594 g_free(buf); |
5595 | |
5596 if ((len > c->maxlen) || (len > c->maxvis)) { | |
5597 g_free(buf2); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5598 return -E2BIG; |
8359 | 5599 } |
5600 | |
5601 aim_chat_send_im(od->sess, c->conn, 0, buf2, len, charset, "en"); | |
8219 | 5602 g_free(buf2); |
8359 | 5603 |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5604 return 0; |
2086 | 5605 } |
5606 | |
6695 | 5607 static const char *oscar_list_icon(GaimAccount *a, GaimBuddy *b) { |
4766 | 5608 if (!b || (b && b->name && b->name[0] == '+')) { |
5646
48c63ee49961
[gaim-migrate @ 6060]
Christian Hammond <chipx86@chipx86.com>
parents:
5638
diff
changeset
|
5609 if (a != NULL && isdigit(*gaim_account_get_username(a))) |
4687 | 5610 return "icq"; |
5611 else | |
5612 return "aim"; | |
5613 } | |
5646
48c63ee49961
[gaim-migrate @ 6060]
Christian Hammond <chipx86@chipx86.com>
parents:
5638
diff
changeset
|
5614 |
48c63ee49961
[gaim-migrate @ 6060]
Christian Hammond <chipx86@chipx86.com>
parents:
5638
diff
changeset
|
5615 if (b != NULL && isdigit(b->name[0])) |
4687 | 5616 return "icq"; |
5617 return "aim"; | |
5618 } | |
5619 | |
6695 | 5620 static void oscar_list_emblems(GaimBuddy *b, char **se, char **sw, char **nw, char **ne) |
4687 | 5621 { |
7334 | 5622 GaimAccount *account = NULL; |
5623 GaimConnection *gc = NULL; | |
5624 OscarData *od = NULL; | |
4687 | 5625 char *emblems[4] = {NULL,NULL,NULL,NULL}; |
5626 int i = 0; | |
7334 | 5627 aim_userinfo_t *userinfo = NULL; |
5628 | |
5629 if (b != NULL) | |
5630 account = b->account; | |
5631 if (account != NULL) | |
5632 gc = account->gc; | |
5633 if (gc != NULL) | |
5634 od = gc->proto_data; | |
7945 | 5635 if (od != NULL) |
5636 userinfo = aim_locate_finduserinfo(od->sess, b->name); | |
4687 | 5637 |
5131 | 5638 if (!GAIM_BUDDY_IS_ONLINE(b)) { |
5639 char *gname; | |
7334 | 5640 if ((b->name) && (od) && (od->sess->ssi.received_data) && |
5131 | 5641 (gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, b->name)) && |
5642 (aim_ssi_waitingforauth(od->sess->ssi.local, gname, b->name))) { | |
5643 emblems[i++] = "notauthorized"; | |
5644 } else { | |
5645 emblems[i++] = "offline"; | |
5646 } | |
5647 } | |
4916 | 5648 |
4766 | 5649 if (b->name && (b->uc & 0xffff0000) && isdigit(b->name[0])) { |
4960 | 5650 int uc = b->uc >> 16; |
4766 | 5651 if (uc & AIM_ICQ_STATE_INVISIBLE) |
4960 | 5652 emblems[i++] = "invisible"; |
4766 | 5653 else if (uc & AIM_ICQ_STATE_CHAT) |
4960 | 5654 emblems[i++] = "freeforchat"; |
4766 | 5655 else if (uc & AIM_ICQ_STATE_DND) |
4960 | 5656 emblems[i++] = "dnd"; |
4766 | 5657 else if (uc & AIM_ICQ_STATE_OUT) |
4960 | 5658 emblems[i++] = "na"; |
4766 | 5659 else if (uc & AIM_ICQ_STATE_BUSY) |
4960 | 5660 emblems[i++] = "occupied"; |
4766 | 5661 else if (uc & AIM_ICQ_STATE_AWAY) |
5662 emblems[i++] = "away"; | |
5663 } else { | |
5664 if (b->uc & UC_UNAVAILABLE) | |
5665 emblems[i++] = "away"; | |
5666 } | |
4687 | 5667 if (b->uc & UC_WIRELESS) |
5668 emblems[i++] = "wireless"; | |
5669 if (b->uc & UC_AOL) | |
5670 emblems[i++] = "aol"; | |
5671 if (b->uc & UC_ADMIN) | |
5672 emblems[i++] = "admin"; | |
5673 if (b->uc & UC_AB && i < 4) | |
5674 emblems[i++] = "activebuddy"; | |
4766 | 5675 /* if (b->uc & UC_UNCONFIRMED && i < 4) |
5676 emblems[i++] = "unconfirmed"; */ | |
7334 | 5677 |
7945 | 5678 if ((i < 4) && (userinfo != NULL) && (userinfo->capabilities & AIM_CAPS_HIPTOP)) |
5679 emblems[i++] = "hiptop"; | |
5680 | |
5681 if ((i < 4) && (userinfo != NULL) && (userinfo->capabilities & AIM_CAPS_SECUREIM)) | |
7334 | 5682 emblems[i++] = "secure"; |
5683 | |
4687 | 5684 *se = emblems[0]; |
5685 *sw = emblems[1]; | |
5686 *nw = emblems[2]; | |
5687 *ne = emblems[3]; | |
5688 } | |
5689 | |
6695 | 5690 static char *oscar_tooltip_text(GaimBuddy *b) { |
5575 | 5691 GaimConnection *gc = b->account->gc; |
7283 | 5692 OscarData *od = gc->proto_data; |
7692 | 5693 GaimGroup *g = gaim_find_buddys_group(b); |
7261 | 5694 struct buddyinfo *bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(b->account, b->name)); |
7045 | 5695 aim_userinfo_t *userinfo = aim_locate_finduserinfo(od->sess, b->name); |
7011 | 5696 gchar *tmp = NULL, *ret = g_strdup(""); |
5131 | 5697 |
5698 if (GAIM_BUDDY_IS_ONLINE(b)) { | |
5699 if (isdigit(b->name[0])) { | |
7011 | 5700 char *status; |
5131 | 5701 status = gaim_icq_status((b->uc & 0xffff0000) >> 16); |
7011 | 5702 tmp = ret; |
5703 ret = g_strconcat(tmp, _("<b>Status:</b> "), status, "\n", NULL); | |
5131 | 5704 g_free(tmp); |
5705 g_free(status); | |
5706 } | |
5707 | |
7011 | 5708 if ((bi != NULL) && (bi->ipaddr)) { |
7283 | 5709 char *tstr = g_strdup_printf("%hhu.%hhu.%hhu.%hhu", |
7011 | 5710 (bi->ipaddr & 0xff000000) >> 24, |
5711 (bi->ipaddr & 0x00ff0000) >> 16, | |
5712 (bi->ipaddr & 0x0000ff00) >> 8, | |
5713 (bi->ipaddr & 0x000000ff)); | |
5714 tmp = ret; | |
5715 ret = g_strconcat(tmp, _("<b>IP Address:</b> "), tstr, "\n", NULL); | |
7162 | 5716 g_free(tmp); |
5717 g_free(tstr); | |
7011 | 5718 } |
5719 | |
5720 if ((userinfo != NULL) && (userinfo->capabilities)) { | |
5721 char *caps = caps_string(userinfo->capabilities); | |
5722 tmp = ret; | |
5723 ret = g_strconcat(tmp, _("<b>Capabilities:</b> "), caps, "\n", NULL); | |
7162 | 5724 g_free(tmp); |
7011 | 5725 } |
5726 | |
7692 | 5727 if (g && g->name) { |
5728 char *comment = NULL; | |
5729 comment = aim_ssi_getcomment(od->sess->ssi.local, g->name, b->name); | |
5730 if (comment != NULL) { | |
5731 tmp = ret; | |
5732 ret = g_strconcat(tmp, _("<b>Buddy Comment:</b> "), comment, "\n", NULL); | |
5733 free(tmp); | |
5734 free(comment); | |
5735 } | |
5736 } | |
5737 | |
7011 | 5738 if ((bi != NULL) && (bi->availmsg != NULL) && !(b->uc & UC_UNAVAILABLE)) { |
5739 gchar *escaped = g_markup_escape_text(bi->availmsg, strlen(bi->availmsg)); | |
5740 tmp = ret; | |
5741 ret = g_strconcat(tmp, _("<b>Available:</b> "), escaped, "\n", NULL); | |
7162 | 5742 g_free(tmp); |
7011 | 5743 g_free(escaped); |
5744 } | |
5745 | |
5746 if ((userinfo != NULL) && (userinfo->flags & AIM_FLAG_AWAY) && (userinfo->away_len > 0) && (userinfo->away != NULL) && (userinfo->away_encoding != NULL)) { | |
8225 | 5747 gchar *charset = oscar_encoding_extract(userinfo->away_encoding); |
8392 | 5748 gchar *away_utf8 = oscar_encoding_to_utf8(charset, userinfo->away, userinfo->away_len); |
8225 | 5749 g_free(charset); |
7011 | 5750 if (away_utf8 != NULL) { |
7091 | 5751 gchar *tmp1, *tmp2; |
8341 | 5752 const gchar *tmp3; |
5753 tmp1 = gaim_strcasereplace(away_utf8, "<BR>", "\n"); | |
5754 g_free(away_utf8); | |
7095
c8bf2da398e3
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7093
diff
changeset
|
5755 tmp2 = gaim_markup_strip_html(tmp1); |
7091 | 5756 g_free(tmp1); |
8461 | 5757 tmp1 = gaim_strreplace(tmp2, "<", "<"); |
7091 | 5758 g_free(tmp2); |
8461 | 5759 tmp3 = gaim_str_sub_away_formatters(tmp1, gaim_account_get_username(gaim_connection_get_account(gc))); |
5760 g_free(tmp1); | |
7011 | 5761 tmp = ret; |
7162 | 5762 ret = g_strconcat(tmp, _("<b>Away Message:</b> "), tmp3, "\n", NULL); |
5763 g_free(tmp); | |
5836 | 5764 } |
5131 | 5765 } |
5766 } else { | |
5767 char *gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, b->name); | |
5768 if (aim_ssi_waitingforauth(od->sess->ssi.local, gname, b->name)) { | |
7011 | 5769 tmp = ret; |
5770 ret = g_strconcat(tmp, _("<b>Status:</b> Not Authorized"), "\n", NULL); | |
5131 | 5771 g_free(tmp); |
5772 } else { | |
7011 | 5773 tmp = ret; |
5774 ret = g_strconcat(tmp, _("<b>Status:</b> Offline"), "\n", NULL); | |
5131 | 5775 g_free(tmp); |
5776 } | |
5777 } | |
5778 | |
5779 /* remove the trailing newline character */ | |
8266 | 5780 if (ret && (strlen(ret) > 0)) |
7011 | 5781 ret[strlen(ret)-1] = '\0'; |
5782 return ret; | |
5131 | 5783 } |
5784 | |
6695 | 5785 static char *oscar_status_text(GaimBuddy *b) { |
5575 | 5786 GaimConnection *gc = b->account->gc; |
7283 | 5787 OscarData *od = gc->proto_data; |
5167 | 5788 gchar *ret = NULL; |
5789 | |
5790 if ((b->uc & UC_UNAVAILABLE) || (((b->uc & 0xffff0000) >> 16) & AIM_ICQ_STATE_CHAT)) { | |
5791 if (isdigit(b->name[0])) | |
5792 ret = gaim_icq_status((b->uc & 0xffff0000) >> 16); | |
7038 | 5793 else |
5794 ret = g_strdup(_("Away")); | |
5836 | 5795 } else if (GAIM_BUDDY_IS_ONLINE(b)) { |
7261 | 5796 struct buddyinfo *bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(b->account, b->name)); |
6292 | 5797 if (bi->availmsg) |
5798 ret = g_markup_escape_text(bi->availmsg, strlen(bi->availmsg)); | |
5836 | 5799 } else { |
5167 | 5800 char *gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, b->name); |
5801 if (aim_ssi_waitingforauth(od->sess->ssi.local, gname, b->name)) | |
5802 ret = g_strdup(_("Not Authorized")); | |
5803 else | |
5804 ret = g_strdup(_("Offline")); | |
5805 } | |
5806 | |
5807 return ret; | |
5808 } | |
5809 | |
5842 | 5810 |
5844 | 5811 static int oscar_icon_req(aim_session_t *sess, aim_frame_t *fr, ...) { |
5842 | 5812 GaimConnection *gc = sess->aux_data; |
7283 | 5813 OscarData *od = gc->proto_data; |
5892 | 5814 va_list ap; |
5842 | 5815 fu16_t type; |
5892 | 5816 fu8_t flags = 0, length = 0; |
5817 char *md5 = NULL; | |
5818 | |
7334 | 5819 |
5842 | 5820 va_start(ap, fr); |
5821 type = va_arg(ap, int); | |
5892 | 5822 |
5823 switch(type) { | |
5824 case 0x0000: | |
5825 case 0x0001: { | |
5826 flags = va_arg(ap, int); | |
5827 length = va_arg(ap, int); | |
5828 md5 = va_arg(ap, char *); | |
5829 | |
5830 if (flags == 0x41) { | |
5831 if (!aim_getconn_type(od->sess, AIM_CONN_TYPE_ICON) && !od->iconconnecting) { | |
5832 od->iconconnecting = TRUE; | |
5833 od->set_icon = TRUE; | |
5834 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_ICON); | |
5835 } else { | |
6039 | 5836 struct stat st; |
5837 const char *iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc)); | |
5838 if (iconfile == NULL) { | |
8363 | 5839 aim_ssi_delicon(od->sess); |
6039 | 5840 } else if (!stat(iconfile, &st)) { |
5841 char *buf = g_malloc(st.st_size); | |
5842 FILE *file = fopen(iconfile, "rb"); | |
5843 if (file) { | |
5844 fread(buf, 1, st.st_size, file); | |
5845 fclose(file); | |
5846 gaim_debug(GAIM_DEBUG_INFO, "oscar", | |
5847 "Uploading icon to icon server\n"); | |
6879 | 5848 aim_bart_upload(od->sess, buf, st.st_size); |
5892 | 5849 } else |
5850 gaim_debug(GAIM_DEBUG_ERROR, "oscar", | |
6039 | 5851 "Can't open buddy icon file!\n"); |
5852 g_free(buf); | |
5853 } else { | |
5854 gaim_debug(GAIM_DEBUG_ERROR, "oscar", | |
5855 "Can't stat buddy icon file!\n"); | |
5892 | 5856 } |
5857 } | |
8363 | 5858 } else if (flags == 0x81) { |
5859 const char *iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc)); | |
5860 if (iconfile == NULL) | |
5861 aim_ssi_delicon(od->sess); | |
5862 else | |
5863 aim_ssi_seticon(od->sess, md5, length); | |
5864 } | |
5892 | 5865 } break; |
5866 | |
5867 case 0x0002: { /* We just set an "available" message? */ | |
5868 } break; | |
5869 } | |
5870 | |
5842 | 5871 va_end(ap); |
5844 | 5872 |
5873 return 0; | |
5842 | 5874 } |
5892 | 5875 |
3952 | 5876 /* |
4617 | 5877 * We have just established a socket with the other dude, so set up some handlers. |
3952 | 5878 */ |
4617 | 5879 static int gaim_odc_initiate(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 5880 GaimConnection *gc = sess->aux_data; |
7283 | 5881 OscarData *od = (OscarData *)gc->proto_data; |
5679 | 5882 GaimConversation *cnv; |
2086 | 5883 struct direct_im *dim; |
5884 char buf[256]; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5885 char *sn; |
4617 | 5886 va_list ap; |
5887 aim_conn_t *newconn, *listenerconn; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5888 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5889 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5890 newconn = va_arg(ap, aim_conn_t *); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5891 listenerconn = va_arg(ap, aim_conn_t *); |
2086 | 5892 va_end(ap); |
5893 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5894 aim_conn_close(listenerconn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5895 aim_conn_kill(sess, &listenerconn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5896 |
4617 | 5897 sn = g_strdup(aim_odc_getsn(newconn)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5898 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5899 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5900 "DirectIM: initiate success to %s\n", sn); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5901 dim = find_direct_im(od, sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5902 |
6640
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6623
diff
changeset
|
5903 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
|
5904 gaim_input_remove(dim->watcher); |
2086 | 5905 dim->conn = newconn; |
4617 | 5906 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, oscar_callback, dim->conn); |
3008 | 5907 dim->connected = TRUE; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5908 g_snprintf(buf, sizeof buf, _("Direct IM with %s established"), sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5909 g_free(sn); |
6982 | 5910 gaim_conversation_write(cnv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL)); |
2086 | 5911 |
4617 | 5912 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, gaim_odc_incoming, 0); |
5913 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, gaim_odc_typing, 0); | |
6982 | 5914 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER, gaim_odc_update_ui, 0); |
4617 | 5915 |
2993 | 5916 return 1; |
5917 } | |
5918 | |
6982 | 5919 /* |
5920 * This is called when each chunk of an image is received. It can be used to | |
5921 * update a progress bar, or to eat lots of dry cat food. Wet cat food is | |
5922 * nasty, you sicko. | |
5923 */ | |
5924 static int gaim_odc_update_ui(aim_session_t *sess, aim_frame_t *fr, ...) { | |
2993 | 5925 va_list ap; |
5926 char *sn; | |
5927 double percent; | |
5575 | 5928 GaimConnection *gc = sess->aux_data; |
7283 | 5929 OscarData *od = (OscarData *)gc->proto_data; |
5679 | 5930 GaimConversation *c; |
2993 | 5931 struct direct_im *dim; |
5932 | |
5933 va_start(ap, fr); | |
5934 sn = va_arg(ap, char *); | |
5935 percent = va_arg(ap, double); | |
5936 va_end(ap); | |
6873 | 5937 |
2994 | 5938 if (!(dim = find_direct_im(od, sn))) |
5939 return 1; | |
3059 | 5940 if (dim->watcher) { |
5941 gaim_input_remove(dim->watcher); /* Otherwise, the callback will callback */ | |
5942 dim->watcher = 0; | |
5943 } | |
6640
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6623
diff
changeset
|
5944 |
6982 | 5945 c = gaim_find_conversation_with_account(sn, gaim_connection_get_account(gc)); |
6873 | 5946 if (c != NULL) |
5947 gaim_conversation_update_progress(c, percent); | |
2993 | 5948 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, |
5949 oscar_callback, dim->conn); | |
2086 | 5950 |
5951 return 1; | |
5952 } | |
5953 | |
6982 | 5954 /* |
5955 * This is called after a direct IM has been received in its entirety. This | |
5956 * function is passed a long chunk of data which contains the IM with any | |
5957 * data chunks (images) appended to it. | |
5958 * | |
5959 * This function rips out all the data chunks and creates an imgstore for | |
5960 * each one. In order to do this, it first goes through the IM and takes | |
5961 * out all the IMG tags. When doing so, it rewrites the original IMG tag | |
5962 * with one compatable with the imgstore Gaim core code. For each one, we | |
5963 * then read in chunks of data from the end of the message and actually | |
5964 * create the img store using the given data. | |
5965 * | |
5966 * For somewhat easy reference, here's a sample message | |
5967 * (without the whitespace and asterisks): | |
5968 * | |
5969 * <HTML><BODY BGCOLOR="#ffffff"> | |
5970 * <FONT LANG="0"> | |
5971 * This is a really stupid picture:<BR> | |
5972 * <IMG SRC="Sample.jpg" ID="1" WIDTH="283" HEIGHT="212" DATASIZE="9894"><BR> | |
5973 * Yeah it is<BR> | |
5974 * Here is another one:<BR> | |
5975 * <IMG SRC="Soap Bubbles.bmp" ID="2" WIDTH="256" HEIGHT="256" DATASIZE="65978"> | |
5976 * </FONT> | |
5977 * </BODY></HTML> | |
5978 * <BINARY> | |
5979 * <DATA ID="1" SIZE="9894">datadatadatadata</DATA> | |
5980 * <DATA ID="2" SIZE="65978">datadatadatadata</DATA> | |
5981 * </BINARY> | |
5982 */ | |
4617 | 5983 static int gaim_odc_incoming(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 5984 GaimConnection *gc = sess->aux_data; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
5985 GaimConvImFlags imflags = 0; |
8233 | 5986 gchar *utf8; |
6982 | 5987 GString *newmsg = g_string_new(""); |
5988 GSList *images = NULL; | |
2086 | 5989 va_list ap; |
6982 | 5990 const char *sn, *msg, *msgend, *binary; |
5991 size_t len; | |
5992 int encoding, isawaymsg; | |
2086 | 5993 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5994 va_start(ap, fr); |
6982 | 5995 sn = va_arg(ap, const char *); |
5996 msg = va_arg(ap, const char *); | |
5997 len = va_arg(ap, size_t); | |
3952 | 5998 encoding = va_arg(ap, int); |
4870 | 5999 isawaymsg = va_arg(ap, int); |
2086 | 6000 va_end(ap); |
6982 | 6001 msgend = msg + len; |
2086 | 6002 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6003 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6004 "Got DirectIM message from %s\n", sn); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6005 |
4870 | 6006 if (isawaymsg) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
6007 imflags |= GAIM_CONV_IM_AUTO_RESP; |
4870 | 6008 |
6982 | 6009 /* message has a binary trailer */ |
6010 if ((binary = gaim_strcasestr(msg, "<binary>"))) { | |
6011 GData *attribs; | |
6012 const char *tmp, *start, *end, *last = NULL; | |
6013 | |
6014 tmp = msg; | |
6015 | |
6016 /* for each valid image tag... */ | |
6017 while (gaim_markup_find_tag("img", tmp, &start, &end, &attribs)) { | |
6018 const char *id, *src, *datasize; | |
6019 const char *tag = NULL, *data = NULL; | |
6020 size_t size; | |
6021 int imgid = 0; | |
6022 | |
6023 /* update the location of the last img tag */ | |
6024 last = end; | |
6025 | |
6026 /* grab attributes */ | |
6027 id = g_datalist_get_data(&attribs, "id"); | |
6028 src = g_datalist_get_data(&attribs, "src"); | |
6029 datasize = g_datalist_get_data(&attribs, "datasize"); | |
6030 | |
6031 /* if we have id & datasize, build the data tag */ | |
6032 if (id && datasize) | |
6033 tag = g_strdup_printf("<data id=\"%s\" size=\"%s\">", id, datasize); | |
6034 | |
6035 /* if we have a tag, find the start of the data */ | |
6036 if (tag && (data = gaim_strcasestr(binary, tag))) | |
6037 data += strlen(tag); | |
6038 | |
6039 /* check the data is here and store it */ | |
6040 if (data + (size = atoi(datasize)) <= msgend) | |
6041 imgid = gaim_imgstore_add(data, size, src); | |
6042 | |
8233 | 6043 /* |
6044 * XXX - The code below contains some calls to oscar_encoding_to_utf8 | |
6045 * The hardcoded "us-ascii" value REALLY needs to be removed. | |
6046 */ | |
6982 | 6047 /* if we have a stored image... */ |
6048 if (imgid) { | |
6049 /* append the message up to the tag */ | |
8233 | 6050 utf8 = oscar_encoding_to_utf8("us-ascii", tmp, start - tmp); |
6051 if (utf8 != NULL) { | |
6052 newmsg = g_string_append(newmsg, utf8); | |
6053 g_free(utf8); | |
6054 } | |
6982 | 6055 |
6056 /* write the new image tag */ | |
6057 g_string_append_printf(newmsg, "<IMG ID=\"%d\">", imgid); | |
6058 | |
6059 /* and record the image number */ | |
6060 images = g_slist_append(images, GINT_TO_POINTER(imgid)); | |
6061 } else { | |
6062 /* otherwise, copy up to the end of the tag */ | |
8233 | 6063 utf8 = oscar_encoding_to_utf8("us-ascii", tmp, (end + 1) - tmp); |
6064 if (utf8 != NULL) { | |
6065 newmsg = g_string_append(newmsg, utf8); | |
6066 g_free(utf8); | |
6067 } | |
6982 | 6068 } |
6069 | |
6070 /* clear the attribute list */ | |
6071 g_datalist_clear(&attribs); | |
6072 | |
6073 /* continue from the end of the tag */ | |
6074 tmp = end + 1; | |
6075 } | |
6076 | |
6077 /* append any remaining message data (without the > :-) */ | |
6078 if (last++ && (last < binary)) | |
6079 newmsg = g_string_append_len(newmsg, last, binary - last); | |
6080 | |
6081 /* set the flag if we caught any images */ | |
6082 if (images) | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
6083 imflags |= GAIM_CONV_IM_IMAGES; |
6982 | 6084 } else { |
6085 g_string_append_len(newmsg, msg, len); | |
6086 } | |
6087 | |
4617 | 6088 /* XXX - I imagine Paco-Paco will want to do some voodoo with the encoding here */ |
6982 | 6089 serv_got_im(gc, sn, newmsg->str, imflags, time(NULL)); |
6090 | |
6091 /* free up the message */ | |
6092 g_string_free(newmsg, TRUE); | |
6093 | |
6094 /* unref any images we allocated */ | |
6095 if (images) { | |
6096 GSList *tmp; | |
6097 int id; | |
6098 | |
6099 for (tmp = images; tmp != NULL; tmp = tmp->next) { | |
6100 id = GPOINTER_TO_INT(tmp->data); | |
6101 gaim_imgstore_unref(id); | |
6102 } | |
6103 | |
6104 g_slist_free(images); | |
6105 } | |
2086 | 6106 |
6107 return 1; | |
6108 } | |
6109 | |
4617 | 6110 static int gaim_odc_typing(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 6111 va_list ap; |
6112 char *sn; | |
2993 | 6113 int typing; |
5575 | 6114 GaimConnection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6115 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6116 va_start(ap, fr); |
2086 | 6117 sn = va_arg(ap, char *); |
2993 | 6118 typing = va_arg(ap, int); |
2086 | 6119 va_end(ap); |
6120 | |
4870 | 6121 if (typing == 0x0002) { |
2993 | 6122 /* 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
|
6123 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6124 "ohmigod! %s has started typing (DirectIM). He's going to send you a message! *squeal*\n", sn); |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
6125 serv_got_typing(gc, sn, 0, GAIM_TYPING); |
4870 | 6126 } else if (typing == 0x0001) |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
6127 serv_got_typing(gc, sn, 0, GAIM_TYPED); |
4870 | 6128 else |
4342 | 6129 serv_got_typing_stopped(gc, sn); |
2086 | 6130 return 1; |
6131 } | |
6132 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
6133 static int gaim_odc_send_im(aim_session_t *sess, aim_conn_t *conn, const char *message, GaimConvImFlags imflags) { |
6982 | 6134 char *buf; |
6135 size_t len; | |
6136 int ret; | |
6137 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
6138 if (imflags & GAIM_CONV_IM_IMAGES) { |
6982 | 6139 GString *msg = g_string_new(""); |
6140 GString *data = g_string_new("<BINARY>"); | |
6141 GData *attribs; | |
6142 const char *tmp, *start, *end, *last = NULL; | |
6143 int oscar_id = 0; | |
6144 | |
6145 tmp = message; | |
6146 | |
6147 /* for each valid IMG tag... */ | |
6148 while (gaim_markup_find_tag("img", tmp, &start, &end, &attribs)) { | |
6149 GaimStoredImage *image = NULL; | |
6150 const char *id; | |
6151 | |
6152 last = end; | |
6153 id = g_datalist_get_data(&attribs, "id"); | |
6154 | |
6155 /* ... if it refers to a valid gaim image ... */ | |
6156 if (id && (image = gaim_imgstore_get(atoi(id)))) { | |
6157 /* ... append the message from start to the tag ... */ | |
6158 msg = g_string_append_len(msg, tmp, start - tmp); | |
6159 oscar_id++; | |
6160 | |
6161 /* ... insert a new img tag with the oscar id ... */ | |
6162 if (image->filename) | |
6163 g_string_append_printf(msg, | |
6164 "<IMG SRC=\"file://%s\" ID=\"%d\" DATASIZE=\"%d\">", | |
7386 | 6165 image->filename, oscar_id, (int)image->size); |
6982 | 6166 else |
6167 g_string_append_printf(msg, | |
6168 "<IMG ID=\"%d\" DATASIZE=\"%d\">", | |
7386 | 6169 oscar_id, (int)image->size); |
6982 | 6170 |
6171 /* ... and append the data to the binary section ... */ | |
6172 g_string_append_printf(data, "<DATA ID=\"%d\" SIZE=\"%d\">", | |
7386 | 6173 oscar_id, (int)image->size); |
6982 | 6174 data = g_string_append_len(data, image->data, image->size); |
6175 data = g_string_append(data, "</DATA>"); | |
6176 } else { | |
6177 /* ... otherwise, allow the possibly invalid img tag through. */ | |
6178 /* should we do something else? */ | |
6179 msg = g_string_append_len(msg, tmp, (end + 1) - tmp); | |
6180 } | |
6181 | |
6182 g_datalist_clear(&attribs); | |
6183 | |
6184 /* continue from the end of the tag */ | |
6185 tmp = end + 1; | |
6186 } | |
6187 | |
6188 /* append any remaining message data (without the > :-) */ | |
6189 if (last++ && *last) | |
6190 msg = g_string_append(msg, last); | |
6191 | |
6192 /* if we inserted any images in the binary section, append it */ | |
6193 if (oscar_id) { | |
6194 msg = g_string_append_len(msg, data->str, data->len); | |
6195 msg = g_string_append(msg, "</BINARY>"); | |
6196 } | |
6197 | |
6198 len = msg->len; | |
6199 buf = msg->str; | |
6200 g_string_free(msg, FALSE); | |
6201 g_string_free(data, TRUE); | |
6202 } else { | |
6203 len = strlen(message); | |
6204 buf = g_memdup(message, len+1); | |
6205 } | |
6206 | |
6207 /* XXX - The last parameter below is the encoding. Let Paco-Paco do something with it. */ | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
6208 if (imflags & GAIM_CONV_IM_AUTO_RESP) |
6982 | 6209 ret = aim_odc_send_im(sess, conn, buf, len, 0, 1); |
6210 else | |
6211 ret = aim_odc_send_im(sess, conn, buf, len, 0, 0); | |
6212 | |
6213 g_free(buf); | |
6214 | |
6215 return ret; | |
6216 } | |
6217 | |
2086 | 6218 struct ask_do_dir_im { |
6219 char *who; | |
5575 | 6220 GaimConnection *gc; |
2086 | 6221 }; |
6222 | |
3730 | 6223 static void oscar_cancel_direct_im(struct ask_do_dir_im *data) { |
5136 | 6224 g_free(data->who); |
2086 | 6225 g_free(data); |
6226 } | |
6227 | |
3730 | 6228 static void oscar_direct_im(struct ask_do_dir_im *data) { |
5575 | 6229 GaimConnection *gc = data->gc; |
7283 | 6230 OscarData *od; |
2086 | 6231 struct direct_im *dim; |
8240 | 6232 int listenfd; |
2086 | 6233 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
6234 if (!g_list_find(gaim_connections_get_all(), gc)) { |
5136 | 6235 g_free(data->who); |
4244 | 6236 g_free(data); |
6237 return; | |
6238 } | |
6239 | |
7283 | 6240 od = (OscarData *)gc->proto_data; |
4244 | 6241 |
2086 | 6242 dim = find_direct_im(od, data->who); |
6243 if (dim) { | |
3008 | 6244 if (!(dim->connected)) { /* We'll free the old, unconnected dim, and start over */ |
6245 od->direct_ims = g_slist_remove(od->direct_ims, dim); | |
6246 gaim_input_remove(dim->watcher); | |
6247 g_free(dim); | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6248 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6249 "Gave up on old direct IM, trying again\n"); |
3008 | 6250 } else { |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
6251 gaim_notify_error(gc, NULL, "DirectIM already open.", NULL); |
5136 | 6252 g_free(data->who); |
4244 | 6253 g_free(data); |
3008 | 6254 return; |
6255 } | |
2086 | 6256 } |
6257 dim = g_new0(struct direct_im, 1); | |
6258 dim->gc = gc; | |
6259 g_snprintf(dim->name, sizeof dim->name, "%s", data->who); | |
6260 | |
8246 | 6261 listenfd = gaim_network_listen_range(5190, 5199); |
8240 | 6262 dim->conn = aim_odc_initiate(od->sess, data->who, listenfd, gaim_network_get_port_from_fd(listenfd)); |
2086 | 6263 if (dim->conn != NULL) { |
6264 od->direct_ims = g_slist_append(od->direct_ims, dim); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
6265 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, |
2086 | 6266 oscar_callback, dim->conn); |
4617 | 6267 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIM_ESTABLISHED, |
6268 gaim_odc_initiate, 0); | |
2086 | 6269 } else { |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
6270 gaim_notify_error(gc, NULL, _("Unable to open Direct IM"), NULL); |
2086 | 6271 g_free(dim); |
6272 } | |
4244 | 6273 |
5136 | 6274 g_free(data->who); |
4244 | 6275 g_free(data); |
2086 | 6276 } |
6277 | |
5575 | 6278 static void oscar_ask_direct_im(GaimConnection *gc, const char *who) { |
5420 | 6279 gchar *buf; |
2086 | 6280 struct ask_do_dir_im *data = g_new0(struct ask_do_dir_im, 1); |
5136 | 6281 data->who = g_strdup(who); |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
6282 data->gc = gc; |
5420 | 6283 buf = g_strdup_printf(_("You have selected to open a Direct IM connection with %s."), who); |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6284 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6285 gaim_request_action(gc, NULL, buf, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6286 _("Because this reveals your IP address, it " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6287 "may be considered a privacy risk. Do you " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6288 "wish to continue?"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6289 0, data, 2, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6290 _("Connect"), G_CALLBACK(oscar_direct_im), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6291 _("Cancel"), G_CALLBACK(oscar_cancel_direct_im)); |
5420 | 6292 g_free(buf); |
2086 | 6293 } |
6294 | |
5575 | 6295 static void oscar_set_permit_deny(GaimConnection *gc) { |
6296 GaimAccount *account = gaim_connection_get_account(gc); | |
7283 | 6297 OscarData *od = (OscarData *)gc->proto_data; |
4230 | 6298 #ifdef NOSSI |
8143 | 6299 GSList *list; |
4230 | 6300 char buf[MAXMSGLEN]; |
6301 int at; | |
6302 | |
5575 | 6303 switch(account->perm_deny) { |
8175 | 6304 case GAIM_PRIVACY_ALLOW_ALL: |
5575 | 6305 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_DENYADD, gaim_account_get_username(account)); |
4230 | 6306 break; |
8175 | 6307 case GAIM_PRIVACY_DENY_ALL: |
5575 | 6308 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_PERMITADD, gaim_account_get_username(account)); |
4230 | 6309 break; |
8175 | 6310 case GAIM_PRIVACY_ALLOW_USERS: |
5575 | 6311 list = account->permit; |
4230 | 6312 at = 0; |
6313 while (list) { | |
6314 at += g_snprintf(buf + at, sizeof(buf) - at, "%s&", (char *)list->data); | |
6315 list = list->next; | |
6316 } | |
6317 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_PERMITADD, buf); | |
6318 break; | |
8175 | 6319 case GAIM_PRIVACY_DENY_USERS: |
5575 | 6320 list = account->deny; |
4230 | 6321 at = 0; |
6322 while (list) { | |
6323 at += g_snprintf(buf + at, sizeof(buf) - at, "%s&", (char *)list->data); | |
6324 list = list->next; | |
6325 } | |
6326 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_DENYADD, buf); | |
6327 break; | |
6328 default: | |
6329 break; | |
2086 | 6330 } |
4230 | 6331 #else |
8175 | 6332 if (od->sess->ssi.received_data) { |
6333 switch (account->perm_deny) { | |
6334 case GAIM_PRIVACY_ALLOW_ALL: | |
6335 aim_ssi_setpermdeny(od->sess, 0x01, 0xffffffff); | |
6336 break; | |
6337 case GAIM_PRIVACY_ALLOW_BUDDYLIST: | |
6338 aim_ssi_setpermdeny(od->sess, 0x05, 0xffffffff); | |
6339 break; | |
6340 case GAIM_PRIVACY_ALLOW_USERS: | |
6341 aim_ssi_setpermdeny(od->sess, 0x03, 0xffffffff); | |
6342 break; | |
6343 case GAIM_PRIVACY_DENY_ALL: | |
6344 aim_ssi_setpermdeny(od->sess, 0x02, 0xffffffff); | |
6345 break; | |
6346 case GAIM_PRIVACY_DENY_USERS: | |
6347 aim_ssi_setpermdeny(od->sess, 0x04, 0xffffffff); | |
6348 break; | |
6349 default: | |
6350 aim_ssi_setpermdeny(od->sess, 0x01, 0xffffffff); | |
6351 break; | |
6352 } | |
6353 } | |
4230 | 6354 #endif |
2086 | 6355 } |
6356 | |
5575 | 6357 static void oscar_add_permit(GaimConnection *gc, const char *who) { |
4269 | 6358 #ifdef NOSSI |
8143 | 6359 if (gc->account->perm_deny == 3) |
4269 | 6360 oscar_set_permit_deny(gc); |
6361 #else | |
7283 | 6362 OscarData *od = (OscarData *)gc->proto_data; |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6363 gaim_debug(GAIM_DEBUG_INFO, "oscar", "ssi: About to add a permit\n"); |
4230 | 6364 if (od->sess->ssi.received_data) |
4889 | 6365 aim_ssi_addpermit(od->sess, who); |
4230 | 6366 #endif |
2086 | 6367 } |
6368 | |
5575 | 6369 static void oscar_add_deny(GaimConnection *gc, const char *who) { |
4269 | 6370 #ifdef NOSSI |
8143 | 6371 if (gc->account->perm_deny == 4) |
4269 | 6372 oscar_set_permit_deny(gc); |
6373 #else | |
7283 | 6374 OscarData *od = (OscarData *)gc->proto_data; |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6375 gaim_debug(GAIM_DEBUG_INFO, "oscar", "ssi: About to add a deny\n"); |
4230 | 6376 if (od->sess->ssi.received_data) |
4889 | 6377 aim_ssi_adddeny(od->sess, who); |
4230 | 6378 #endif |
2086 | 6379 } |
6380 | |
5575 | 6381 static void oscar_rem_permit(GaimConnection *gc, const char *who) { |
4269 | 6382 #ifdef NOSSI |
8143 | 6383 if (gc->account->perm_deny == 3) |
4269 | 6384 oscar_set_permit_deny(gc); |
6385 #else | |
7283 | 6386 OscarData *od = (OscarData *)gc->proto_data; |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6387 gaim_debug(GAIM_DEBUG_INFO, "oscar", "ssi: About to delete a permit\n"); |
4230 | 6388 if (od->sess->ssi.received_data) |
4889 | 6389 aim_ssi_delpermit(od->sess, who); |
4230 | 6390 #endif |
2086 | 6391 } |
6392 | |
5575 | 6393 static void oscar_rem_deny(GaimConnection *gc, const char *who) { |
4269 | 6394 #ifdef NOSSI |
8143 | 6395 if (gc->account->perm_deny == 4) |
4269 | 6396 oscar_set_permit_deny(gc); |
6397 #else | |
7283 | 6398 OscarData *od = (OscarData *)gc->proto_data; |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6399 gaim_debug(GAIM_DEBUG_INFO, "oscar", "ssi: About to delete a deny\n"); |
4230 | 6400 if (od->sess->ssi.received_data) |
4889 | 6401 aim_ssi_deldeny(od->sess, who); |
4230 | 6402 #endif |
2086 | 6403 } |
6404 | |
5575 | 6405 static GList *oscar_away_states(GaimConnection *gc) |
2086 | 6406 { |
7283 | 6407 OscarData *od = gc->proto_data; |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
6408 GList *m = NULL; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
6409 |
8257 | 6410 if (od->icq) { |
6411 m = g_list_append(m, _("Online")); | |
6412 m = g_list_append(m, _("Away")); | |
6413 m = g_list_append(m, _("Do Not Disturb")); | |
6414 m = g_list_append(m, _("Not Available")); | |
6415 m = g_list_append(m, _("Occupied")); | |
6416 m = g_list_append(m, _("Free For Chat")); | |
6417 m = g_list_append(m, _("Invisible")); | |
6418 } else { | |
6419 m = g_list_append(m, GAIM_AWAY_CUSTOM); | |
6420 m = g_list_append(m, _("Visible")); | |
6421 m = g_list_append(m, _("Invisible")); | |
6422 } | |
4333 | 6423 |
6424 return m; | |
6425 } | |
6426 | |
7172 | 6427 static void oscar_ssi_editcomment(struct name_data *data, const char *text) { |
8341 | 6428 GaimConnection *gc = data->gc; |
6429 OscarData *od = gc->proto_data; | |
7172 | 6430 GaimBuddy *b; |
6431 GaimGroup *g; | |
6432 | |
6433 if (!(b = gaim_find_buddy(gaim_connection_get_account(data->gc), data->name))) { | |
6434 oscar_free_name_data(data); | |
6435 return; | |
6436 } | |
6437 | |
6438 if (!(g = gaim_find_buddys_group(b))) { | |
6439 oscar_free_name_data(data); | |
6440 return; | |
6441 } | |
6442 | |
6443 aim_ssi_editcomment(od->sess, g->name, data->name, text); | |
8341 | 6444 |
6445 if (!aim_sncmp(data->name, gc->account->username)) | |
6446 gaim_check_comment(od, text); | |
6447 | |
7172 | 6448 oscar_free_name_data(data); |
6449 } | |
6450 | |
6451 static void oscar_buddycb_edit_comment(GaimConnection *gc, const char *name) { | |
7283 | 6452 OscarData *od = gc->proto_data; |
7172 | 6453 struct name_data *data = g_new(struct name_data, 1); |
6454 GaimBuddy *b; | |
6455 GaimGroup *g; | |
6456 char *comment; | |
6457 gchar *comment_utf8; | |
6458 | |
6459 if (!(b = gaim_find_buddy(gaim_connection_get_account(gc), name))) | |
6460 return; | |
6461 if (!(g = gaim_find_buddys_group(b))) | |
6462 return; | |
6463 comment = aim_ssi_getcomment(od->sess->ssi.local, g->name, name); | |
6464 comment_utf8 = comment ? gaim_utf8_try_convert(comment) : NULL; | |
6465 | |
6466 data->gc = gc; | |
6467 data->name = g_strdup(name); | |
6468 data->nick = NULL; | |
6469 | |
6470 gaim_request_input(gc, NULL, _("Buddy Comment:"), NULL, | |
6471 comment_utf8, TRUE, FALSE, | |
6472 _("OK"), G_CALLBACK(oscar_ssi_editcomment), | |
6473 _("Cancel"), G_CALLBACK(oscar_free_name_data), | |
6474 data); | |
6475 | |
6476 free(comment); | |
6477 g_free(comment_utf8); | |
6478 } | |
6479 | |
5575 | 6480 static GList *oscar_buddy_menu(GaimConnection *gc, const char *who) { |
7283 | 6481 OscarData *od = gc->proto_data; |
4333 | 6482 GList *m = NULL; |
6483 struct proto_buddy_menu *pbm; | |
6484 | |
7172 | 6485 pbm = g_new0(struct proto_buddy_menu, 1); |
6486 pbm->label = _("Edit Buddy Comment"); | |
6487 pbm->callback = oscar_buddycb_edit_comment; | |
6488 pbm->gc = gc; | |
6489 m = g_list_append(m, pbm); | |
6490 | |
4333 | 6491 if (od->icq) { |
4624 | 6492 #if 0 |
4333 | 6493 pbm = g_new0(struct proto_buddy_menu, 1); |
6494 pbm->label = _("Get Status Msg"); | |
4969 | 6495 pbm->callback = oscar_get_icqstatusmsg; |
4333 | 6496 pbm->gc = gc; |
6497 m = g_list_append(m, pbm); | |
4624 | 6498 #endif |
4333 | 6499 } else { |
6695 | 6500 GaimBuddy *b = gaim_find_buddy(gc->account, who); |
7011 | 6501 aim_userinfo_t *userinfo; |
5975 | 6502 |
6503 if (b) | |
7045 | 6504 userinfo = aim_locate_finduserinfo(od->sess, b->name); |
7011 | 6505 |
6506 if (b && userinfo && aim_sncmp(gaim_account_get_username(gaim_connection_get_account(gc)), who) && GAIM_BUDDY_IS_ONLINE(b)) { | |
6507 if (userinfo->capabilities & AIM_CAPS_DIRECTIM) { | |
5917 | 6508 pbm = g_new0(struct proto_buddy_menu, 1); |
6509 pbm->label = _("Direct IM"); | |
6510 pbm->callback = oscar_ask_direct_im; | |
6511 pbm->gc = gc; | |
6512 m = g_list_append(m, pbm); | |
6513 } | |
7650 | 6514 |
6515 if (userinfo->capabilities & AIM_CAPS_SENDFILE) { | |
6516 pbm = g_new0(struct proto_buddy_menu, 1); | |
6517 pbm->label = _("Send File"); | |
6518 pbm->callback = oscar_ask_sendfile; | |
6519 pbm->gc = gc; | |
6520 m = g_list_append(m, pbm); | |
6521 } | |
4826 | 6522 #if 0 |
7011 | 6523 if (userinfo->capabilities & AIM_CAPS_GETFILE) { |
5917 | 6524 pbm = g_new0(struct proto_buddy_menu, 1); |
6525 pbm->label = _("Get File"); | |
6526 pbm->callback = oscar_ask_getfile; | |
6527 pbm->gc = gc; | |
6528 m = g_list_append(m, pbm); | |
6529 } | |
4826 | 6530 #endif |
4333 | 6531 } |
5131 | 6532 } |
5197 | 6533 |
5131 | 6534 if (od->sess->ssi.received_data) { |
6535 char *gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, who); | |
6536 if (gname && aim_ssi_waitingforauth(od->sess->ssi.local, gname, who)) { | |
6537 pbm = g_new0(struct proto_buddy_menu, 1); | |
6873 | 6538 pbm->label = _("Re-request Authorization"); |
5131 | 6539 pbm->callback = gaim_auth_sendrequest; |
6540 pbm->gc = gc; | |
6541 m = g_list_append(m, pbm); | |
4333 | 6542 } |
4916 | 6543 } |
6544 | |
4333 | 6545 return m; |
6546 } | |
6547 | |
5575 | 6548 static void oscar_format_screenname(GaimConnection *gc, const char *nick) { |
7283 | 6549 OscarData *od = gc->proto_data; |
5575 | 6550 if (!aim_sncmp(gaim_account_get_username(gaim_connection_get_account(gc)), nick)) { |
4333 | 6551 if (!aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH)) { |
6552 od->setnick = TRUE; | |
6553 od->newsn = g_strdup(nick); | |
6554 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
6555 } else { | |
6556 aim_admin_setnick(od->sess, aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH), nick); | |
6557 } | |
6558 } else { | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
6559 gaim_notify_error(gc, NULL, _("The new formatting is invalid."), |
8152 | 6560 _("Screen name formatting can change only capitalization and whitespace.")); |
4333 | 6561 } |
6562 } | |
6563 | |
5575 | 6564 static void oscar_show_format_screenname(GaimConnection *gc) |
4333 | 6565 { |
8152 | 6566 gaim_request_input(gc, NULL, _("New screen name formatting:"), NULL, |
6035
8c44020a958e
[gaim-migrate @ 6485]
Christian Hammond <chipx86@chipx86.com>
parents:
6029
diff
changeset
|
6567 gaim_connection_get_display_name(gc), FALSE, FALSE, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
6568 _("OK"), G_CALLBACK(oscar_format_screenname), |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
6569 _("Cancel"), NULL, |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
6570 gc); |
4333 | 6571 } |
6572 | |
5575 | 6573 static void oscar_confirm_account(GaimConnection *gc) |
4333 | 6574 { |
7283 | 6575 OscarData *od = gc->proto_data; |
4333 | 6576 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); |
6577 | |
6578 if (conn) { | |
6579 aim_admin_reqconfirm(od->sess, conn); | |
6580 } else { | |
6581 od->conf = TRUE; | |
6582 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
6583 } | |
6584 } | |
6585 | |
5575 | 6586 static void oscar_show_email(GaimConnection *gc) |
4333 | 6587 { |
7283 | 6588 OscarData *od = gc->proto_data; |
4333 | 6589 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); |
6590 | |
6591 if (conn) { | |
6592 aim_admin_getinfo(od->sess, conn, 0x11); | |
6593 } else { | |
6594 od->reqemail = TRUE; | |
6595 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
6596 } | |
6597 } | |
6598 | |
5575 | 6599 static void oscar_change_email(GaimConnection *gc, const char *email) |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6600 { |
7283 | 6601 OscarData *od = gc->proto_data; |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6602 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
|
6603 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6604 if (conn) { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6605 aim_admin_setemail(od->sess, conn, email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6606 } else { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6607 od->setemail = TRUE; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6608 od->email = g_strdup(email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6609 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6610 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6611 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6612 |
5575 | 6613 static void oscar_show_change_email(GaimConnection *gc) |
4333 | 6614 { |
6035
8c44020a958e
[gaim-migrate @ 6485]
Christian Hammond <chipx86@chipx86.com>
parents:
6029
diff
changeset
|
6615 gaim_request_input(gc, NULL, _("Change Address To:"), NULL, NULL, |
8c44020a958e
[gaim-migrate @ 6485]
Christian Hammond <chipx86@chipx86.com>
parents:
6029
diff
changeset
|
6616 FALSE, FALSE, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
6617 _("OK"), G_CALLBACK(oscar_change_email), |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
6618 _("Cancel"), NULL, |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
6619 gc); |
4333 | 6620 } |
6621 | |
5575 | 6622 static void oscar_show_awaitingauth(GaimConnection *gc) |
4333 | 6623 { |
7283 | 6624 OscarData *od = gc->proto_data; |
4333 | 6625 gchar *nombre, *text, *tmp; |
6695 | 6626 GaimBlistNode *gnode, *cnode, *bnode; |
4333 | 6627 int num=0; |
6628 | |
6873 | 6629 text = g_strdup(""); |
4333 | 6630 |
4785 | 6631 for (gnode = gaim_get_blist()->root; gnode; gnode = gnode->next) { |
6695 | 6632 GaimGroup *group = (GaimGroup *)gnode; |
4785 | 6633 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) |
6634 continue; | |
6695 | 6635 for (cnode = gnode->child; cnode; cnode = cnode->next) { |
6636 if(!GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
4785 | 6637 continue; |
6695 | 6638 for (bnode = cnode->child; bnode; bnode = bnode->next) { |
6639 GaimBuddy *buddy = (GaimBuddy *)bnode; | |
6640 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
6641 continue; | |
6642 if (buddy->account == gc->account && aim_ssi_waitingforauth(od->sess->ssi.local, group->name, buddy->name)) { | |
6643 if (gaim_get_buddy_alias_only(buddy)) | |
6644 nombre = g_strdup_printf(" %s (%s)", buddy->name, gaim_get_buddy_alias_only(buddy)); | |
6645 else | |
6646 nombre = g_strdup_printf(" %s", buddy->name); | |
6873 | 6647 tmp = g_strdup_printf("%s%s<br>", text, nombre); |
6695 | 6648 g_free(text); |
6649 text = tmp; | |
6650 g_free(nombre); | |
6651 num++; | |
6652 } | |
4333 | 6653 } |
2979 | 6654 } |
4333 | 6655 } |
6656 | |
6657 if (!num) { | |
6658 g_free(text); | |
6873 | 6659 text = g_strdup(_("<i>you are not waiting for authorization</i>")); |
6660 } | |
6661 | |
6662 gaim_notify_formatted(gc, NULL, _("You are awaiting authorization from " | |
6663 "the following buddies"), _("You can re-request " | |
6664 "authorization from these buddies by " | |
6665 "right-clicking on them and selecting " | |
6666 "\"Re-request Authorization.\""), text, NULL, NULL); | |
4333 | 6667 g_free(text); |
2979 | 6668 } |
6669 | |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6670 static void search_by_email_cb(GaimConnection *gc, const char *email) |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6671 { |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6672 serv_dir_search(gc, "", "", "", "", "", "", "", email); |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6673 } |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6674 |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6675 static void oscar_show_find_email(GaimConnection *gc) |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6676 { |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6677 gaim_request_input(gc, _("Find Buddy by E-mail"), |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6678 _("Search for a buddy by e-mail address"), |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6679 _("Type the e-mail address of the buddy you are " |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6680 "searching for."), |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6681 NULL, FALSE, FALSE, |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6682 _("Search"), G_CALLBACK(search_by_email_cb), |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6683 _("Cancel"), NULL, gc); |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6684 } |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6685 |
7366 | 6686 #if 0 |
5917 | 6687 static void oscar_setavailmsg(GaimConnection *gc, char *text) { |
7283 | 6688 OscarData *od = (OscarData *)gc->proto_data; |
5917 | 6689 |
7334 | 6690 aim_locate_setprofile(od->sess, NULL, NULL, 0, NULL, "", 0); |
5917 | 6691 aim_srv_setavailmsg(od->sess, text); |
6692 } | |
6693 | |
6694 static void oscar_show_setavailmsg(GaimConnection *gc) | |
6695 { | |
7313 | 6696 gaim_request_input(gc, NULL, _("Available Message:"), NULL, |
6697 _("I'm doing work and hoping for a distraction--IM me!"), | |
6698 TRUE, FALSE, | |
5917 | 6699 _("OK"), G_CALLBACK(oscar_setavailmsg), |
6700 _("Cancel"), NULL, | |
6701 gc); | |
6702 } | |
7366 | 6703 #endif |
5917 | 6704 |
7067
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
6705 static void oscar_show_set_info(GaimConnection *gc) |
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
6706 { |
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
6707 gaim_account_request_change_user_info(gaim_connection_get_account(gc)); |
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
6708 } |
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
6709 |
7063
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
6710 static void oscar_change_pass(GaimConnection *gc) |
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
6711 { |
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
6712 gaim_account_request_change_password(gaim_connection_get_account(gc)); |
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
6713 } |
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
6714 |
5575 | 6715 static void oscar_show_chpassurl(GaimConnection *gc) |
4333 | 6716 { |
7283 | 6717 OscarData *od = gc->proto_data; |
5575 | 6718 gchar *substituted = gaim_strreplace(od->sess->authinfo->chpassurl, "%s", gaim_account_get_username(gaim_connection_get_account(gc))); |
6465
fb64cc87bc96
[gaim-migrate @ 6974]
Christian Hammond <chipx86@chipx86.com>
parents:
6400
diff
changeset
|
6719 gaim_notify_uri(gc, substituted); |
5517 | 6720 g_free(substituted); |
4333 | 6721 } |
6722 | |
7026 | 6723 static void oscar_show_imforwardingurl(GaimConnection *gc) |
6724 { | |
6725 gaim_notify_uri(gc, "http://mymobile.aol.com/dbreg/register?action=imf&clientID=1"); | |
6726 } | |
6727 | |
5842 | 6728 static void oscar_set_icon(GaimConnection *gc, const char *iconfile) |
6729 { | |
7283 | 6730 OscarData *od = gc->proto_data; |
5844 | 6731 aim_session_t *sess = od->sess; |
5842 | 6732 FILE *file; |
6733 struct stat st; | |
5844 | 6734 |
6039 | 6735 if (iconfile == NULL) { |
8363 | 6736 aim_ssi_delicon(od->sess); |
6039 | 6737 } else if (!stat(iconfile, &st)) { |
5842 | 6738 char *buf = g_malloc(st.st_size); |
6739 file = fopen(iconfile, "rb"); | |
6740 if (file) { | |
6052 | 6741 md5_state_t *state; |
6039 | 6742 char md5[16]; |
5842 | 6743 int len = fread(buf, 1, st.st_size, file); |
6039 | 6744 fclose(file); |
6052 | 6745 state = g_malloc(sizeof(md5_state_t)); |
5842 | 6746 md5_init(state); |
6747 md5_append(state, buf, len); | |
6748 md5_finish(state, md5); | |
6749 g_free(state); | |
6750 aim_ssi_seticon(sess, md5, 16); | |
6751 } else | |
6752 gaim_debug(GAIM_DEBUG_ERROR, "oscar", | |
6753 "Can't open buddy icon file!\n"); | |
6754 g_free(buf); | |
6755 } else | |
6756 gaim_debug(GAIM_DEBUG_ERROR, "oscar", | |
6757 "Can't stat buddy icon file!\n"); | |
6758 } | |
6759 | |
6760 | |
5575 | 6761 static GList *oscar_actions(GaimConnection *gc) |
2086 | 6762 { |
7283 | 6763 OscarData *od = gc->proto_data; |
4333 | 6764 struct proto_actions_menu *pam; |
6765 GList *m = NULL; | |
6766 | |
6767 pam = g_new0(struct proto_actions_menu, 1); | |
7853 | 6768 pam->label = _("Set User Info..."); |
7067
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
6769 pam->callback = oscar_show_set_info; |
4333 | 6770 pam->gc = gc; |
6771 m = g_list_append(m, pam); | |
6772 | |
7366 | 6773 #if 0 |
5917 | 6774 pam = g_new0(struct proto_actions_menu, 1); |
7853 | 6775 pam->label = _("Set Available Message..."); |
5917 | 6776 pam->callback = oscar_show_setavailmsg; |
6777 pam->gc = gc; | |
6778 m = g_list_append(m, pam); | |
7366 | 6779 #endif |
5917 | 6780 |
5238 | 6781 pam = g_new0(struct proto_actions_menu, 1); |
7853 | 6782 pam->label = _("Change Password..."); |
7063
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
6783 pam->callback = oscar_change_pass; |
5238 | 6784 pam->gc = gc; |
6785 m = g_list_append(m, pam); | |
4617 | 6786 |
6787 if (od->sess->authinfo->chpassurl) { | |
6788 pam = g_new0(struct proto_actions_menu, 1); | |
6789 pam->label = _("Change Password (URL)"); | |
6790 pam->callback = oscar_show_chpassurl; | |
6791 pam->gc = gc; | |
6792 m = g_list_append(m, pam); | |
6793 } | |
6794 | |
7026 | 6795 if (od->sess->authinfo->chpassurl) { |
6796 pam = g_new0(struct proto_actions_menu, 1); | |
6797 pam->label = _("Configure IM Forwarding (URL)"); | |
6798 pam->callback = oscar_show_imforwardingurl; | |
6799 pam->gc = gc; | |
6800 m = g_list_append(m, pam); | |
6801 } | |
6802 | |
5238 | 6803 if (!od->icq) { |
4617 | 6804 /* AIM actions */ |
6805 m = g_list_append(m, NULL); | |
4333 | 6806 |
5917 | 6807 pam = g_new0(struct proto_actions_menu, 1); |
8152 | 6808 pam->label = _("Format Screen Name..."); |
5844 | 6809 pam->callback = oscar_show_format_screenname; |
4333 | 6810 pam->gc = gc; |
6811 m = g_list_append(m, pam); | |
6812 | |
6813 pam = g_new0(struct proto_actions_menu, 1); | |
6814 pam->label = _("Confirm Account"); | |
6815 pam->callback = oscar_confirm_account; | |
6816 pam->gc = gc; | |
6817 m = g_list_append(m, pam); | |
6818 | |
6819 pam = g_new0(struct proto_actions_menu, 1); | |
7880 | 6820 pam->label = _("Display Currently Registered Address"); |
4333 | 6821 pam->callback = oscar_show_email; |
6822 pam->gc = gc; | |
6823 m = g_list_append(m, pam); | |
6824 | |
6825 pam = g_new0(struct proto_actions_menu, 1); | |
7880 | 6826 pam->label = _("Change Currently Registered Address..."); |
4333 | 6827 pam->callback = oscar_show_change_email; |
6828 pam->gc = gc; | |
6829 m = g_list_append(m, pam); | |
2086 | 6830 } |
4333 | 6831 |
6832 m = g_list_append(m, NULL); | |
6833 | |
6834 pam = g_new0(struct proto_actions_menu, 1); | |
6835 pam->label = _("Show Buddies Awaiting Authorization"); | |
6836 pam->callback = oscar_show_awaitingauth; | |
6837 pam->gc = gc; | |
6838 m = g_list_append(m, pam); | |
6839 | |
2086 | 6840 m = g_list_append(m, NULL); |
4333 | 6841 |
6842 pam = g_new0(struct proto_actions_menu, 1); | |
7853 | 6843 pam->label = _("Search for Buddy by Email..."); |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6844 pam->callback = oscar_show_find_email; |
4333 | 6845 pam->gc = gc; |
6846 m = g_list_append(m, pam); | |
6847 | |
4336 | 6848 /* pam = g_new0(struct proto_actions_menu, 1); |
4333 | 6849 pam->label = _("Search for Buddy by Information"); |
6850 pam->callback = show_find_info; | |
6851 pam->gc = gc; | |
4336 | 6852 m = g_list_append(m, pam); */ |
2086 | 6853 |
6854 return m; | |
6855 } | |
6856 | |
5575 | 6857 static void oscar_change_passwd(GaimConnection *gc, const char *old, const char *new) |
2086 | 6858 { |
7283 | 6859 OscarData *od = gc->proto_data; |
4617 | 6860 |
6861 if (od->icq) { | |
6862 aim_icq_changepasswd(od->sess, new); | |
2086 | 6863 } else { |
4617 | 6864 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); |
6865 if (conn) { | |
6866 aim_admin_changepasswd(od->sess, conn, new, old); | |
6867 } else { | |
6868 od->chpass = TRUE; | |
6869 od->oldp = g_strdup(old); | |
6870 od->newp = g_strdup(new); | |
6871 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
6872 } | |
2086 | 6873 } |
6874 } | |
6875 | |
6059 | 6876 static void oscar_convo_closed(GaimConnection *gc, const char *who) |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6877 { |
7283 | 6878 OscarData *od = gc->proto_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6879 struct direct_im *dim = find_direct_im(od, who); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6880 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6881 if (!dim) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6882 return; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6883 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6884 od->direct_ims = g_slist_remove(od->direct_ims, dim); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6885 gaim_input_remove(dim->watcher); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6886 aim_conn_kill(od->sess, &dim->conn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6887 g_free(dim); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6888 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6889 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6890 static GaimPluginProtocolInfo prpl_info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6891 { |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6892 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
|
6893 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6894 NULL, |
8170 | 6895 NULL, |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6896 oscar_list_icon, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6897 oscar_list_emblems, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6898 oscar_status_text, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6899 oscar_tooltip_text, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6900 oscar_away_states, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6901 oscar_actions, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6902 oscar_buddy_menu, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6903 oscar_chat_info, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6904 oscar_login, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6905 oscar_close, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6906 oscar_send_im, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6907 oscar_set_info, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6908 oscar_send_typing, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6909 oscar_get_info, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6910 oscar_set_away, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6911 oscar_get_away, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6912 oscar_set_dir, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6913 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6914 oscar_dir_search, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6915 oscar_set_idle, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6916 oscar_change_passwd, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6917 oscar_add_buddy, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6918 oscar_add_buddies, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6919 oscar_remove_buddy, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6920 oscar_remove_buddies, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6921 oscar_add_permit, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6922 oscar_add_deny, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6923 oscar_rem_permit, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6924 oscar_rem_deny, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6925 oscar_set_permit_deny, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6926 oscar_warn, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6927 oscar_join_chat, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6928 oscar_chat_invite, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6929 oscar_chat_leave, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6930 NULL, |
8219 | 6931 oscar_send_chat, |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6932 oscar_keepalive, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6933 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6934 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6935 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6936 #ifndef NOSSI |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6937 oscar_alias_buddy, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6938 oscar_move_buddy, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6939 oscar_rename_group, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6940 #else |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6941 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6942 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6943 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6944 #endif |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6945 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6946 oscar_convo_closed, |
5842 | 6947 NULL, |
7650 | 6948 oscar_set_icon |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6949 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6950 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6951 static GaimPluginInfo info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6952 { |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6953 2, /**< api_version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6954 GAIM_PLUGIN_PROTOCOL, /**< type */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6955 NULL, /**< ui_requirement */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6956 0, /**< flags */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6957 NULL, /**< dependencies */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6958 GAIM_PRIORITY_DEFAULT, /**< priority */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6959 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6960 "prpl-oscar", /**< id */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6961 "AIM/ICQ", /**< name */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6962 VERSION, /**< version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6963 /** summary */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6964 N_("AIM/ICQ Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6965 /** description */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6966 N_("AIM/ICQ Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6967 NULL, /**< author */ |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6350
diff
changeset
|
6968 GAIM_WEBSITE, /**< homepage */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6969 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6970 NULL, /**< load */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6971 NULL, /**< unload */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6972 NULL, /**< destroy */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6973 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6974 NULL, /**< ui_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6975 &prpl_info /**< extra_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6976 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6977 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6978 static void |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5917
diff
changeset
|
6979 init_plugin(GaimPlugin *plugin) |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6980 { |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
6981 GaimAccountOption *option; |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
6982 |
5685
43ea75092684
[gaim-migrate @ 6106]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
6983 option = gaim_account_option_string_new(_("Auth host"), "server", |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
6984 "login.oscar.aol.com"); |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
6985 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
6986 option); |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
6987 |
5685
43ea75092684
[gaim-migrate @ 6106]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
6988 option = gaim_account_option_int_new(_("Auth port"), "port", 5190); |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
6989 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
6990 option); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6991 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6992 my_protocol = plugin; |
2086 | 6993 } |
6994 | |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5917
diff
changeset
|
6995 GAIM_INIT_PLUGIN(oscar, init_plugin, info); |