Mercurial > pidgin
annotate src/protocols/oscar/oscar.c @ 6982:083d1e4a9c78
[gaim-migrate @ 7538]
This is Mr. Holland's Opus. And by Mr. Holland I mean Robot101. He
rewrote the coreish IM image support so that the binary data gets
ripped out in the prpl and put in an imgstore instead of just being
passed in the same huge as char string as the actual message. This
is good because it's prpl agnostic, or something. It also means
we don't have a silly length of "-1" with pretty much every send or
receive IM function.
It should be crash free, bug free, and memleak free, but additional
testing is always a good thing.
If you like good stuff then you'll love this patch. But don't take
my word for it--ba dun dunt!
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sat, 27 Sep 2003 19:17:21 +0000 |
parents | 2c2ff3a50435 |
children | 4375bf2d9020 |
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 | |
7 * Some code copyright (C) 2001-2003, Mark Doliner <thekingant@users.sourceforge.net> | |
8 * | |
9 * Most libfaim code copyright (C) 1998-2001 Adam Fritzler <afritz@auk.cx> | |
10 * Some libfaim code copyright (C) 2001-2003 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" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
33 #include "debug.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
34 #include "ft.h" |
6982 | 35 #include "imgstore.h" |
2086 | 36 #include "multi.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
37 #include "notify.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
38 #include "privacy.h" |
2086 | 39 #include "prpl.h" |
4889 | 40 #include "proxy.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
41 #include "request.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
42 #include "util.h" |
6115
11bedb793a44
[gaim-migrate @ 6578]
Christian Hammond <chipx86@chipx86.com>
parents:
6113
diff
changeset
|
43 #include "html.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
44 |
2086 | 45 #include "aim.h" |
5842 | 46 #include "md5.h" |
2086 | 47 |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6350
diff
changeset
|
48 /* XXX CORE/UI */ |
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6350
diff
changeset
|
49 #include "gtkinternal.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
50 #include "gaim.h" |
3630 | 51 |
2086 | 52 |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
53 #define UC_AOL 0x02 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
54 #define UC_ADMIN 0x04 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
55 #define UC_UNCONFIRMED 0x08 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
56 #define UC_NORMAL 0x10 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
57 #define UC_AB 0x20 |
3079 | 58 #define UC_WIRELESS 0x40 |
6318 | 59 #define UC_HIPTOP 0x80 |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
60 |
2086 | 61 #define AIMHASHDATA "http://gaim.sourceforge.net/aim_data.php3" |
62 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
63 static GaimPlugin *my_protocol = NULL; |
4249 | 64 |
6871 | 65 static int caps_aim = AIM_CAPS_CHAT | AIM_CAPS_BUDDYICON | AIM_CAPS_DIRECTIM | AIM_CAPS_SENDFILE | AIM_CAPS_INTEROPERATE; |
66 static int caps_icq = AIM_CAPS_BUDDYICON | AIM_CAPS_DIRECTIM | AIM_CAPS_SENDFILE | AIM_CAPS_ICQUTF8 | AIM_CAPS_INTEROPERATE; | |
3458 | 67 |
4665 | 68 static fu8_t features_aim[] = {0x01, 0x01, 0x01, 0x02}; |
69 static fu8_t features_icq[] = {0x01, 0x06}; | |
2086 | 70 |
71 struct oscar_data { | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
72 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
73 aim_conn_t *conn; |
2086 | 74 |
75 guint cnpa; | |
76 guint paspa; | |
3694 | 77 guint emlpa; |
4804 | 78 guint icopa; |
2086 | 79 |
4823 | 80 gboolean iconconnecting; |
5842 | 81 gboolean set_icon; |
4823 | 82 |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
83 GSList *create_rooms; |
2086 | 84 |
85 gboolean conf; | |
86 gboolean reqemail; | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
87 gboolean setemail; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
88 char *email; |
2979 | 89 gboolean setnick; |
90 char *newsn; | |
2086 | 91 gboolean chpass; |
92 char *oldp; | |
93 char *newp; | |
5842 | 94 |
2086 | 95 GSList *oscar_chats; |
96 GSList *direct_ims; | |
3630 | 97 GSList *file_transfers; |
4738 | 98 GHashTable *buddyinfo; |
4804 | 99 GSList *requesticon; |
2086 | 100 |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
101 gboolean killme; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
102 gboolean icq; |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
103 GSList *evilhack; |
4804 | 104 guint icontimer; |
5968 | 105 guint getblisttimer; |
2993 | 106 |
107 struct { | |
4230 | 108 guint maxwatchers; /* max users who can watch you */ |
2993 | 109 guint maxbuddies; /* max users you can watch */ |
4230 | 110 guint maxgroups; /* max groups in server list */ |
2993 | 111 guint maxpermits; /* max users on permit list */ |
112 guint maxdenies; /* max users on deny list */ | |
113 guint maxsiglen; /* max size (bytes) of profile */ | |
114 guint maxawaymsglen; /* max size (bytes) of posted away message */ | |
115 } rights; | |
2086 | 116 }; |
117 | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
118 struct create_room { |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
119 char *name; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
120 int exchange; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
121 }; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
122 |
2086 | 123 struct chat_connection { |
124 char *name; | |
125 char *show; /* AOL did something funny to us */ | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
126 fu16_t exchange; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
127 fu16_t instance; |
2086 | 128 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
|
129 aim_conn_t *conn; |
2086 | 130 int inpa; |
131 int id; | |
5575 | 132 GaimConnection *gc; /* i hate this. */ |
5679 | 133 GaimConversation *cnv; /* bah. */ |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
134 int maxlen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
135 int maxvis; |
2086 | 136 }; |
137 | |
138 struct direct_im { | |
5575 | 139 GaimConnection *gc; |
2086 | 140 char name[80]; |
141 int watcher; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
142 aim_conn_t *conn; |
3008 | 143 gboolean connected; |
2086 | 144 }; |
145 | |
146 struct ask_direct { | |
5575 | 147 GaimConnection *gc; |
2086 | 148 char *sn; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
149 char ip[64]; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
150 fu8_t cookie[8]; |
2086 | 151 }; |
152 | |
4738 | 153 /* Various PRPL-specific buddy info that we want to keep track of */ |
154 struct buddyinfo { | |
155 time_t signon; | |
156 int caps; | |
157 gboolean typingnot; | |
6292 | 158 gchar *availmsg; |
6857 | 159 fu32_t ipaddr; |
5836 | 160 |
161 unsigned long ico_me_len; | |
162 unsigned long ico_me_csum; | |
163 time_t ico_me_time; | |
164 gboolean ico_informed; | |
4738 | 165 |
166 unsigned long ico_len; | |
167 unsigned long ico_csum; | |
168 time_t ico_time; | |
169 gboolean ico_need; | |
170 | |
4853 | 171 fu16_t iconcsumlen; |
5836 | 172 fu8_t *iconcsum; |
2086 | 173 }; |
174 | |
4230 | 175 struct name_data { |
5575 | 176 GaimConnection *gc; |
4230 | 177 gchar *name; |
3453 | 178 gchar *nick; |
3141 | 179 }; |
180 | |
5129 | 181 static char *msgerrreason[] = { |
182 N_("Invalid error"), | |
183 N_("Invalid SNAC"), | |
184 N_("Rate to host"), | |
185 N_("Rate to client"), | |
186 N_("Not logged in"), | |
187 N_("Service unavailable"), | |
188 N_("Service not defined"), | |
189 N_("Obsolete SNAC"), | |
190 N_("Not supported by host"), | |
191 N_("Not supported by client"), | |
192 N_("Refused by client"), | |
193 N_("Reply too big"), | |
194 N_("Responses lost"), | |
195 N_("Request denied"), | |
196 N_("Busted SNAC payload"), | |
197 N_("Insufficient rights"), | |
198 N_("In local permit/deny"), | |
199 N_("Too evil (sender)"), | |
200 N_("Too evil (receiver)"), | |
201 N_("User temporarily unavailable"), | |
202 N_("No match"), | |
203 N_("List overflow"), | |
204 N_("Request ambiguous"), | |
205 N_("Queue full"), | |
206 N_("Not while on AOL") | |
207 }; | |
208 static int msgerrreasonlen = 25; | |
209 | |
210 /* All the libfaim->gaim callback functions */ | |
211 static int gaim_parse_auth_resp (aim_session_t *, aim_frame_t *, ...); | |
212 static int gaim_parse_login (aim_session_t *, aim_frame_t *, ...); | |
213 static int gaim_handle_redirect (aim_session_t *, aim_frame_t *, ...); | |
214 static int gaim_info_change (aim_session_t *, aim_frame_t *, ...); | |
215 static int gaim_account_confirm (aim_session_t *, aim_frame_t *, ...); | |
216 static int gaim_parse_oncoming (aim_session_t *, aim_frame_t *, ...); | |
217 static int gaim_parse_offgoing (aim_session_t *, aim_frame_t *, ...); | |
218 static int gaim_parse_incoming_im(aim_session_t *, aim_frame_t *, ...); | |
219 static int gaim_parse_misses (aim_session_t *, aim_frame_t *, ...); | |
220 static int gaim_parse_clientauto (aim_session_t *, aim_frame_t *, ...); | |
221 static int gaim_parse_user_info (aim_session_t *, aim_frame_t *, ...); | |
222 static int gaim_parse_motd (aim_session_t *, aim_frame_t *, ...); | |
223 static int gaim_chatnav_info (aim_session_t *, aim_frame_t *, ...); | |
224 static int gaim_chat_join (aim_session_t *, aim_frame_t *, ...); | |
225 static int gaim_chat_leave (aim_session_t *, aim_frame_t *, ...); | |
226 static int gaim_chat_info_update (aim_session_t *, aim_frame_t *, ...); | |
227 static int gaim_chat_incoming_msg(aim_session_t *, aim_frame_t *, ...); | |
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 *, ...); | |
264 static int gaim_ssi_authgiven (aim_session_t *, aim_frame_t *, ...); | |
265 static int gaim_ssi_authrequest (aim_session_t *, aim_frame_t *, ...); | |
266 static int gaim_ssi_authreply (aim_session_t *, aim_frame_t *, ...); | |
267 static int gaim_ssi_gotadded (aim_session_t *, aim_frame_t *, ...); | |
268 #endif | |
269 | |
270 /* for DirectIM/image transfer */ | |
271 static int gaim_odc_initiate (aim_session_t *, aim_frame_t *, ...); | |
272 static int gaim_odc_incoming (aim_session_t *, aim_frame_t *, ...); | |
273 static int gaim_odc_typing (aim_session_t *, aim_frame_t *, ...); | |
6982 | 274 static int gaim_odc_update_ui (aim_session_t *, aim_frame_t *, ...); |
5129 | 275 |
276 /* for file transfer */ | |
277 static int oscar_sendfile_estblsh(aim_session_t *, aim_frame_t *, ...); | |
278 static int oscar_sendfile_prompt (aim_session_t *, aim_frame_t *, ...); | |
279 static int oscar_sendfile_ack (aim_session_t *, aim_frame_t *, ...); | |
280 static int oscar_sendfile_done (aim_session_t *, aim_frame_t *, ...); | |
281 | |
282 /* for icons */ | |
283 static gboolean gaim_icon_timerfunc(gpointer data); | |
284 | |
5306 | 285 /* prpl actions - remove this at some point */ |
5954 | 286 static void oscar_set_info(GaimConnection *gc, const char *text); |
5306 | 287 |
5836 | 288 static void oscar_free_name_data(struct name_data *data) { |
4230 | 289 g_free(data->name); |
290 g_free(data->nick); | |
291 g_free(data); | |
292 } | |
293 | |
5836 | 294 static void oscar_free_buddyinfo(void *data) { |
295 struct buddyinfo *bi = data; | |
6292 | 296 g_free(bi->availmsg); |
5836 | 297 g_free(bi->iconcsum); |
298 g_free(bi); | |
299 } | |
300 | |
5129 | 301 static fu32_t oscar_encoding_check(const char *utf8) |
302 { | |
303 int i = 0; | |
304 fu32_t encodingflag = 0; | |
305 | |
306 /* Determine how we can send this message. Per the warnings elsewhere | |
307 * in this file, these little checks determine the simplest encoding | |
308 * we can use for a given message send using it. */ | |
309 while (utf8[i]) { | |
310 if ((unsigned char)utf8[i] > 0x7f) { | |
311 /* not ASCII! */ | |
312 encodingflag = AIM_IMFLAGS_ISO_8859_1; | |
313 break; | |
314 } | |
315 i++; | |
316 } | |
317 while (utf8[i]) { | |
318 /* ISO-8859-1 is 0x00-0xbf in the first byte | |
319 * followed by 0xc0-0xc3 in the second */ | |
320 if ((unsigned char)utf8[i] < 0x80) { | |
321 i++; | |
322 continue; | |
323 } else if (((unsigned char)utf8[i] & 0xfc) == 0xc0 && | |
324 ((unsigned char)utf8[i + 1] & 0xc0) == 0x80) { | |
325 i += 2; | |
326 continue; | |
327 } | |
328 encodingflag = AIM_IMFLAGS_UNICODE; | |
329 break; | |
330 } | |
331 | |
332 return encodingflag; | |
333 } | |
334 | |
335 static fu32_t oscar_encoding_parse(const char *enc) | |
336 { | |
337 char *charset; | |
338 | |
339 /* If anything goes wrong, fall back on ASCII and print a message */ | |
340 if (enc == NULL) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
341 gaim_debug(GAIM_DEBUG_WARNING, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
342 "Encoding was null, that's odd\n"); |
5129 | 343 return 0; |
344 } | |
345 charset = strstr(enc, "charset="); | |
346 if (charset == NULL) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
347 gaim_debug(GAIM_DEBUG_WARNING, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
348 "No charset specified for info, assuming ASCII\n"); |
5129 | 349 return 0; |
350 } | |
351 charset += 8; | |
352 if (!strcmp(charset, "\"us-ascii\"") || !strcmp(charset, "\"utf-8\"")) { | |
353 /* UTF-8 is our native charset, ASCII is a proper subset */ | |
354 return 0; | |
355 } else if (!strcmp(charset, "\"iso-8859-1\"")) { | |
356 return AIM_IMFLAGS_ISO_8859_1; | |
357 } else if (!strcmp(charset, "\"unicode-2-0\"")) { | |
358 return AIM_IMFLAGS_UNICODE; | |
359 } else { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
360 gaim_debug(GAIM_DEBUG_WARNING, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
361 "Unrecognized character set '%s', using ASCII\n", charset); |
5129 | 362 return 0; |
363 } | |
364 } | |
365 | |
366 gchar *oscar_encoding_to_utf8(const char *encoding, char *text, int textlen) | |
367 { | |
368 gchar *utf8 = NULL; | |
369 int flags = oscar_encoding_parse(encoding); | |
370 | |
371 switch (flags) { | |
372 case 0: | |
373 utf8 = g_strndup(text, textlen); | |
374 break; | |
375 case AIM_IMFLAGS_ISO_8859_1: | |
376 utf8 = g_convert(text, textlen, "UTF-8", "ISO-8859-1", NULL, NULL, NULL); | |
377 break; | |
378 case AIM_IMFLAGS_UNICODE: | |
379 utf8 = g_convert(text, textlen, "UTF-8", "UCS-2BE", NULL, NULL, NULL); | |
380 break; | |
381 } | |
382 | |
383 return utf8; | |
384 } | |
385 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
386 static struct direct_im *find_direct_im(struct oscar_data *od, const char *who) { |
2086 | 387 GSList *d = od->direct_ims; |
388 struct direct_im *m = NULL; | |
389 | |
390 while (d) { | |
391 m = (struct direct_im *)d->data; | |
4355 | 392 if (!aim_sncmp(who, m->name)) |
4269 | 393 return m; |
2086 | 394 d = d->next; |
395 } | |
396 | |
4269 | 397 return NULL; |
2086 | 398 } |
399 | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
400 static char *extract_name(const char *name) { |
4121 | 401 char *tmp, *x; |
2086 | 402 int i, j; |
4120 | 403 |
404 if (!name) | |
4121 | 405 return NULL; |
406 | |
4120 | 407 x = strchr(name, '-'); |
4121 | 408 |
2086 | 409 if (!x) return NULL; |
410 x = strchr(++x, '-'); | |
411 if (!x) return NULL; | |
412 tmp = g_strdup(++x); | |
413 | |
414 for (i = 0, j = 0; x[i]; i++) { | |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
415 char hex[3]; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
416 if (x[i] != '%') { |
2086 | 417 tmp[j++] = x[i]; |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
418 continue; |
2086 | 419 } |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
420 strncpy(hex, x + ++i, 2); hex[2] = 0; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
421 i++; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
422 tmp[j++] = strtol(hex, NULL, 16); |
2086 | 423 } |
424 | |
425 tmp[j] = 0; | |
426 return tmp; | |
427 } | |
428 | |
5575 | 429 static struct chat_connection *find_oscar_chat(GaimConnection *gc, int id) { |
2086 | 430 GSList *g = ((struct oscar_data *)gc->proto_data)->oscar_chats; |
431 struct chat_connection *c = NULL; | |
432 | |
433 while (g) { | |
434 c = (struct chat_connection *)g->data; | |
435 if (c->id == id) | |
436 break; | |
437 g = g->next; | |
438 c = NULL; | |
439 } | |
440 | |
441 return c; | |
442 } | |
443 | |
5575 | 444 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
|
445 aim_conn_t *conn) { |
2086 | 446 GSList *g = ((struct oscar_data *)gc->proto_data)->oscar_chats; |
447 struct chat_connection *c = NULL; | |
448 | |
449 while (g) { | |
450 c = (struct chat_connection *)g->data; | |
451 if (c->conn == conn) | |
452 break; | |
453 g = g->next; | |
454 c = NULL; | |
455 } | |
456 | |
457 return c; | |
458 } | |
459 | |
4617 | 460 static void gaim_odc_disconnect(aim_session_t *sess, aim_conn_t *conn) { |
5575 | 461 GaimConnection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
462 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
5679 | 463 GaimConversation *cnv; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
464 struct direct_im *dim; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
465 char *sn; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
466 char buf[256]; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
467 |
4617 | 468 sn = g_strdup(aim_odc_getsn(conn)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
469 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
470 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
471 "%s disconnected Direct IM.\n", sn); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
472 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
473 dim = find_direct_im(od, sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
474 od->direct_ims = g_slist_remove(od->direct_ims, dim); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
475 gaim_input_remove(dim->watcher); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
476 |
3008 | 477 if (dim->connected) |
478 g_snprintf(buf, sizeof buf, _("Direct IM with %s closed"), sn); | |
479 else | |
480 g_snprintf(buf, sizeof buf, _("Direct IM with %s failed"), sn); | |
6640
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6623
diff
changeset
|
481 |
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6623
diff
changeset
|
482 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
|
483 if (cnv) |
6982 | 484 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
|
485 |
5579 | 486 gaim_conversation_update_progress(cnv, 0); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
487 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
488 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
|
489 g_free(sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
490 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
491 return; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
492 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
493 |
4617 | 494 static void oscar_callback(gpointer data, gint source, GaimInputCondition condition) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
495 aim_conn_t *conn = (aim_conn_t *)data; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
496 aim_session_t *sess = aim_conn_getsess(conn); |
5575 | 497 GaimConnection *gc = sess ? sess->aux_data : NULL; |
4617 | 498 struct oscar_data *od; |
2086 | 499 |
500 if (!gc) { | |
501 /* gc is null. we return, else we seg SIGSEG on next line. */ | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
502 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
503 "oscar callback for closed connection (1).\n"); |
2086 | 504 return; |
505 } | |
506 | |
4617 | 507 od = (struct oscar_data *)gc->proto_data; |
2086 | 508 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
509 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 510 /* oh boy. this is probably bad. i guess the only thing we |
511 * can really do is return? */ | |
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 "oscar callback for closed connection (2).\n"); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
514 gaim_debug(GAIM_DEBUG_MISC, "oscar", "gc = %p\n", gc); |
2086 | 515 return; |
516 } | |
517 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
518 if (condition & GAIM_INPUT_READ) { |
4617 | 519 if (conn->type == AIM_CONN_TYPE_LISTENER) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
520 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
521 "got information on rendezvous listener\n"); |
4617 | 522 if (aim_handlerendconnect(od->sess, conn) < 0) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
523 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
524 "connection error (rendezvous listener)\n"); |
4617 | 525 aim_conn_kill(od->sess, &conn); |
2086 | 526 } |
527 } else { | |
4617 | 528 if (aim_get_command(od->sess, conn) >= 0) { |
529 aim_rxdispatch(od->sess); | |
6029 | 530 if (od->killme) { |
531 gaim_debug(GAIM_DEBUG_ERROR, "oscar", "Waiting to be destroyed\n"); | |
532 return; | |
533 } | |
2086 | 534 } else { |
535 if ((conn->type == AIM_CONN_TYPE_BOS) || | |
4617 | 536 !(aim_getconn_type(od->sess, AIM_CONN_TYPE_BOS))) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
537 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
538 "major connection error\n"); |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
539 gaim_connection_error(gc, _("Disconnected.")); |
2086 | 540 } else if (conn->type == AIM_CONN_TYPE_CHAT) { |
541 struct chat_connection *c = find_oscar_chat_by_conn(gc, conn); | |
5420 | 542 char *buf; |
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 "disconnected from chat room %s\n", c->name); |
2086 | 545 c->conn = NULL; |
546 if (c->inpa > 0) | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
547 gaim_input_remove(c->inpa); |
2086 | 548 c->inpa = 0; |
549 c->fd = -1; | |
4617 | 550 aim_conn_kill(od->sess, &conn); |
5420 | 551 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
|
552 gaim_notify_error(gc, NULL, buf, NULL); |
5420 | 553 g_free(buf); |
2086 | 554 } else if (conn->type == AIM_CONN_TYPE_CHATNAV) { |
4617 | 555 if (od->cnpa > 0) |
556 gaim_input_remove(od->cnpa); | |
557 od->cnpa = 0; | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
558 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
559 "removing chatnav input watcher\n"); |
4617 | 560 while (od->create_rooms) { |
561 struct create_room *cr = od->create_rooms->data; | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
562 g_free(cr->name); |
4617 | 563 od->create_rooms = |
564 g_slist_remove(od->create_rooms, cr); | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
565 g_free(cr); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
566 gaim_notify_error(gc, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
567 _("Chat is currently unavailable"), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
568 NULL); |
2086 | 569 } |
4617 | 570 aim_conn_kill(od->sess, &conn); |
2086 | 571 } else if (conn->type == AIM_CONN_TYPE_AUTH) { |
4617 | 572 if (od->paspa > 0) |
573 gaim_input_remove(od->paspa); | |
574 od->paspa = 0; | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
575 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
576 "removing authconn input watcher\n"); |
4617 | 577 aim_conn_kill(od->sess, &conn); |
3694 | 578 } else if (conn->type == AIM_CONN_TYPE_EMAIL) { |
4617 | 579 if (od->emlpa > 0) |
580 gaim_input_remove(od->emlpa); | |
581 od->emlpa = 0; | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
582 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
583 "removing email input watcher\n"); |
4617 | 584 aim_conn_kill(od->sess, &conn); |
4804 | 585 } else if (conn->type == AIM_CONN_TYPE_ICON) { |
586 if (od->icopa > 0) | |
587 gaim_input_remove(od->icopa); | |
588 od->icopa = 0; | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
589 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
590 "removing icon input watcher\n"); |
4804 | 591 aim_conn_kill(od->sess, &conn); |
2086 | 592 } else if (conn->type == AIM_CONN_TYPE_RENDEZVOUS) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
593 if (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM) |
4617 | 594 gaim_odc_disconnect(od->sess, conn); |
595 aim_conn_kill(od->sess, &conn); | |
2086 | 596 } else { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
597 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
598 "holy crap! generic connection error! %hu\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
599 conn->type); |
4617 | 600 aim_conn_kill(od->sess, &conn); |
2086 | 601 } |
602 } | |
603 } | |
604 } | |
605 } | |
606 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
607 static void oscar_debug(aim_session_t *sess, int level, const char *format, va_list va) { |
2086 | 608 char *s = g_strdup_vprintf(format, va); |
609 char buf[256]; | |
610 char *t; | |
5575 | 611 GaimConnection *gc = sess->aux_data; |
612 | |
613 g_snprintf(buf, sizeof(buf), "%s %d: ", gaim_account_get_username(gaim_connection_get_account(gc)), level); | |
2086 | 614 t = g_strconcat(buf, s, NULL); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
615 gaim_debug(GAIM_DEBUG_INFO, "oscar", t); |
2086 | 616 if (t[strlen(t)-1] != '\n') |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
617 gaim_debug(GAIM_DEBUG_INFO, NULL, "\n"); |
2086 | 618 g_free(t); |
619 g_free(s); | |
620 } | |
621 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
622 static void oscar_login_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 623 { |
5575 | 624 GaimConnection *gc = data; |
4617 | 625 struct oscar_data *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
626 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
627 aim_conn_t *conn; |
2086 | 628 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
629 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 630 close(source); |
631 return; | |
632 } | |
633 | |
4617 | 634 od = gc->proto_data; |
635 sess = od->sess; | |
2086 | 636 conn = aim_getconn_type_all(sess, AIM_CONN_TYPE_AUTH); |
4366 | 637 |
638 conn->fd = source; | |
2086 | 639 |
640 if (source < 0) { | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
641 gaim_connection_error(gc, _("Couldn't connect to host")); |
2086 | 642 return; |
643 } | |
644 | |
645 aim_conn_completeconnect(sess, conn); | |
4617 | 646 gc->inpa = gaim_input_add(conn->fd, GAIM_INPUT_READ, oscar_callback, conn); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
647 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
648 "Password sent, waiting for response\n"); |
2086 | 649 } |
650 | |
5575 | 651 static void oscar_login(GaimAccount *account) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
652 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
653 aim_conn_t *conn; |
2086 | 654 char buf[256]; |
5575 | 655 GaimConnection *gc = gaim_account_get_connection(account); |
4617 | 656 struct oscar_data *od = gc->proto_data = g_new0(struct oscar_data, 1); |
2086 | 657 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
658 gaim_debug(GAIM_DEBUG_MISC, "oscar", "oscar_login: gc = %p\n", gc); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
659 |
5575 | 660 if (isdigit(*(gaim_account_get_username(account)))) { |
4617 | 661 od->icq = TRUE; |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
662 } else { |
6622 | 663 gc->flags |= GAIM_CONNECTION_HTML; |
664 gc->flags |= GAIM_CONNECTION_AUTO_RESP; | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
665 } |
5836 | 666 od->buddyinfo = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, oscar_free_buddyinfo); |
2086 | 667 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
668 sess = g_new0(aim_session_t, 1); |
2086 | 669 |
670 aim_session_init(sess, AIM_SESS_FLAGS_NONBLOCKCONNECT, 0); | |
671 aim_setdebuggingcb(sess, oscar_debug); | |
672 | |
673 /* we need an immediate queue because we don't use a while-loop to | |
674 * see if things need to be sent. */ | |
675 aim_tx_setenqueue(sess, AIM_TX_IMMEDIATE, NULL); | |
4617 | 676 od->sess = sess; |
2086 | 677 sess->aux_data = gc; |
678 | |
679 conn = aim_newconn(sess, AIM_CONN_TYPE_AUTH, NULL); | |
680 if (conn == NULL) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
681 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
682 "internal connection error\n"); |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
683 gaim_connection_error(gc, _("Unable to login to AIM")); |
2086 | 684 return; |
685 } | |
686 | |
5575 | 687 g_snprintf(buf, sizeof(buf), _("Signon: %s"), gaim_account_get_username(account)); |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
688 gaim_connection_update_progress(gc, buf, 2, 5); |
2086 | 689 |
4649 | 690 aim_conn_addhandler(sess, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2086 | 691 aim_conn_addhandler(sess, conn, 0x0017, 0x0007, gaim_parse_login, 0); |
692 aim_conn_addhandler(sess, conn, 0x0017, 0x0003, gaim_parse_auth_resp, 0); | |
693 | |
694 conn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
695 if (gaim_proxy_connect(account, gaim_account_get_string(account, "server", FAIM_LOGIN_SERVER), |
5575 | 696 gaim_account_get_int(account, "port", FAIM_LOGIN_PORT), |
697 oscar_login_connect, gc) < 0) { | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
698 gaim_connection_error(gc, _("Couldn't connect to host")); |
2086 | 699 return; |
700 } | |
5575 | 701 aim_request_login(sess, conn, gaim_account_get_username(account)); |
702 } | |
703 | |
704 static void oscar_close(GaimConnection *gc) { | |
4617 | 705 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
706 | |
707 while (od->oscar_chats) { | |
708 struct chat_connection *n = od->oscar_chats->data; | |
2086 | 709 if (n->inpa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
710 gaim_input_remove(n->inpa); |
2086 | 711 g_free(n->name); |
712 g_free(n->show); | |
4617 | 713 od->oscar_chats = g_slist_remove(od->oscar_chats, n); |
2086 | 714 g_free(n); |
715 } | |
4617 | 716 while (od->direct_ims) { |
717 struct direct_im *n = od->direct_ims->data; | |
2086 | 718 if (n->watcher > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
719 gaim_input_remove(n->watcher); |
4617 | 720 od->direct_ims = g_slist_remove(od->direct_ims, n); |
2086 | 721 g_free(n); |
722 } | |
4617 | 723 /* BBB */ |
724 while (od->file_transfers) { | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
725 GaimXfer *xfer; |
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
726 xfer = (GaimXfer *)od->file_transfers->data; |
4617 | 727 gaim_xfer_destroy(xfer); |
3630 | 728 } |
4804 | 729 while (od->requesticon) { |
730 char *sn = od->requesticon->data; | |
731 od->requesticon = g_slist_remove(od->requesticon, sn); | |
732 free(sn); | |
733 } | |
4738 | 734 g_hash_table_destroy(od->buddyinfo); |
4617 | 735 while (od->evilhack) { |
736 g_free(od->evilhack->data); | |
737 od->evilhack = g_slist_remove(od->evilhack, od->evilhack->data); | |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
738 } |
4617 | 739 while (od->create_rooms) { |
740 struct create_room *cr = od->create_rooms->data; | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
741 g_free(cr->name); |
4617 | 742 od->create_rooms = g_slist_remove(od->create_rooms, cr); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
743 g_free(cr); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
744 } |
4617 | 745 if (od->email) |
746 g_free(od->email); | |
747 if (od->newp) | |
748 g_free(od->newp); | |
749 if (od->oldp) | |
750 g_free(od->oldp); | |
2086 | 751 if (gc->inpa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
752 gaim_input_remove(gc->inpa); |
4617 | 753 if (od->cnpa > 0) |
754 gaim_input_remove(od->cnpa); | |
755 if (od->paspa > 0) | |
756 gaim_input_remove(od->paspa); | |
757 if (od->emlpa > 0) | |
758 gaim_input_remove(od->emlpa); | |
4804 | 759 if (od->icopa > 0) |
760 gaim_input_remove(od->icopa); | |
6907 | 761 if (od->icontimer > 0) |
4832 | 762 g_source_remove(od->icontimer); |
5968 | 763 if (od->getblisttimer) |
764 g_source_remove(od->getblisttimer); | |
4617 | 765 aim_session_kill(od->sess); |
766 g_free(od->sess); | |
767 od->sess = NULL; | |
2086 | 768 g_free(gc->proto_data); |
769 gc->proto_data = NULL; | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
770 gaim_debug(GAIM_DEBUG_INFO, "oscar", "Signed off.\n"); |
2086 | 771 } |
772 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
773 static void oscar_bos_connect(gpointer data, gint source, GaimInputCondition cond) { |
5575 | 774 GaimConnection *gc = data; |
4617 | 775 struct oscar_data *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
776 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
777 aim_conn_t *bosconn; |
2086 | 778 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
779 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 780 close(source); |
781 return; | |
782 } | |
783 | |
4617 | 784 od = gc->proto_data; |
785 sess = od->sess; | |
786 bosconn = od->conn; | |
4366 | 787 bosconn->fd = source; |
2086 | 788 |
789 if (source < 0) { | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
790 gaim_connection_error(gc, _("Could Not Connect")); |
2086 | 791 return; |
792 } | |
793 | |
794 aim_conn_completeconnect(sess, bosconn); | |
4617 | 795 gc->inpa = gaim_input_add(bosconn->fd, GAIM_INPUT_READ, oscar_callback, bosconn); |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
796 gaim_connection_update_progress(gc, |
5577
7ed9999926af
[gaim-migrate @ 5981]
Christian Hammond <chipx86@chipx86.com>
parents:
5576
diff
changeset
|
797 _("Connection established, cookie sent"), 4, 5); |
2086 | 798 } |
799 | |
4617 | 800 /* BBB */ |
4656 | 801 /* |
802 * This little area in oscar.c is the nexus of file transfer code, | |
803 * so I wrote a little explanation of what happens. I am such a | |
804 * ninja. | |
805 * | |
806 * The series of events for a file send is: | |
807 * -Create xfer and call gaim_xfer_request (this happens in oscar_ask_sendfile) | |
808 * -User chooses a file and oscar_xfer_init is called. It establishs a | |
809 * listening socket, then asks the remote user to connect to us (and | |
810 * gives them the file name, port, IP, etc.) | |
811 * -They connect to us and we send them an AIM_CB_OFT_PROMPT (this happens | |
812 * in oscar_sendfile_estblsh) | |
813 * -They send us an AIM_CB_OFT_ACK and then we start sending data | |
814 * -When we finish, they send us an AIM_CB_OFT_DONE and they close the | |
815 * connection. | |
816 * -We get drunk because file transfer kicks ass. | |
817 * | |
818 * The series of events for a file receive is: | |
819 * -Create xfer and call gaim_xfer request (this happens in incomingim_chan2) | |
820 * -Gaim user selects file to name and location to save file to and | |
821 * oscar_xfer_init is called | |
822 * -It connects to the remote user using the IP they gave us earlier | |
823 * -After connecting, they send us an AIM_CB_OFT_PROMPT. In reply, we send | |
824 * them an AIM_CB_OFT_ACK. | |
825 * -They begin to send us lots of raw data. | |
826 * -When they finish sending data we send an AIM_CB_OFT_DONE and then close | |
827 * the connectionn. | |
828 */ | |
829 static void oscar_sendfile_connected(gpointer data, gint source, GaimInputCondition condition); | |
830 | |
831 /* XXX - This function is pretty ugly */ | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
832 static void oscar_xfer_init(GaimXfer *xfer) |
4656 | 833 { |
5146 | 834 struct aim_oft_info *oft_info = xfer->data; |
5575 | 835 GaimConnection *gc = oft_info->sess->aux_data; |
5146 | 836 struct oscar_data *od = gc->proto_data; |
4656 | 837 |
838 if (gaim_xfer_get_type(xfer) == GAIM_XFER_SEND) { | |
839 int i; | |
840 | |
841 xfer->filename = g_path_get_basename(xfer->local_filename); | |
5146 | 842 strncpy(oft_info->fh.name, xfer->filename, 64); |
843 oft_info->fh.totsize = gaim_xfer_get_size(xfer); | |
844 oft_info->fh.size = gaim_xfer_get_size(xfer); | |
845 oft_info->fh.checksum = aim_oft_checksum_file(xfer->local_filename); | |
4656 | 846 |
847 /* | |
5146 | 848 * First try the port specified earlier (5190). If that fails, |
849 * increment by 1 and try again. | |
4656 | 850 */ |
5146 | 851 aim_sendfile_listen(od->sess, oft_info); |
852 for (i=0; (i<5 && !oft_info->conn); i++) { | |
853 xfer->local_port = oft_info->port = oft_info->port + 1; | |
854 aim_sendfile_listen(od->sess, oft_info); | |
4656 | 855 } |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
856 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
857 "port is %d, ip is %s\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
858 xfer->local_port, oft_info->clientip); |
5146 | 859 if (oft_info->conn) { |
860 xfer->watcher = gaim_input_add(oft_info->conn->fd, GAIM_INPUT_READ, oscar_callback, oft_info->conn); | |
861 aim_im_sendch2_sendfile_ask(od->sess, oft_info); | |
862 aim_conn_addhandler(od->sess, oft_info->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_ESTABLISHED, oscar_sendfile_estblsh, 0); | |
4656 | 863 } else { |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
864 gaim_notify_error(gc, NULL, _("File Transfer Aborted"), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
865 _("Unable to establish listener socket.")); |
4656 | 866 /* XXX - The below line causes a crash because the transfer is canceled before the "Ok" callback on the file selection thing exists, I think */ |
4675
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
867 /* gaim_xfer_cancel_remote(xfer); */ |
4656 | 868 } |
869 } else if (gaim_xfer_get_type(xfer) == GAIM_XFER_RECEIVE) { | |
5146 | 870 oft_info->conn = aim_newconn(od->sess, AIM_CONN_TYPE_RENDEZVOUS, NULL); |
871 if (oft_info->conn) { | |
872 oft_info->conn->subtype = AIM_CONN_SUBTYPE_OFT_SENDFILE; | |
873 aim_conn_addhandler(od->sess, oft_info->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_PROMPT, oscar_sendfile_prompt, 0); | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
874 oft_info->conn->fd = xfer->fd = gaim_proxy_connect(gaim_connection_get_account(gc), xfer->remote_ip, xfer->remote_port, |
5575 | 875 oscar_sendfile_connected, xfer); |
4656 | 876 if (xfer->fd == -1) { |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
877 gaim_notify_error(gc, NULL, _("File Transfer Aborted"), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
878 _("Unable to establish file descriptor.")); |
4675
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
879 /* gaim_xfer_cancel_remote(xfer); */ |
4656 | 880 } |
881 } else { | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
882 gaim_notify_error(gc, NULL, _("File Transfer Aborted"), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
883 _("Unable to create new connection.")); |
4675
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
884 /* gaim_xfer_cancel_remote(xfer); */ |
4656 | 885 /* Try a different port? Ask them to connect to us? */ |
886 } | |
887 | |
888 } | |
889 } | |
890 | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
891 static void oscar_xfer_start(GaimXfer *xfer) |
4656 | 892 { |
5146 | 893 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
894 gaim_debug(GAIM_DEBUG_INFO, "oscar", "AAA - in oscar_xfer_start\n"); |
4656 | 895 /* I'm pretty sure we don't need to do jack here. Nor Jill. */ |
896 } | |
897 | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
898 static void oscar_xfer_end(GaimXfer *xfer) |
4656 | 899 { |
5146 | 900 struct aim_oft_info *oft_info = xfer->data; |
5575 | 901 GaimConnection *gc = oft_info->sess->aux_data; |
5146 | 902 struct oscar_data *od = gc->proto_data; |
4656 | 903 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
904 gaim_debug(GAIM_DEBUG_INFO, "oscar", "AAA - in oscar_xfer_end\n"); |
5146 | 905 |
906 if (gaim_xfer_get_type(xfer) == GAIM_XFER_RECEIVE) { | |
907 oft_info->fh.nrecvd = gaim_xfer_get_bytes_sent(xfer); | |
908 aim_oft_sendheader(oft_info->sess, AIM_CB_OFT_DONE, oft_info); | |
909 } | |
910 | |
911 aim_conn_kill(oft_info->sess, &oft_info->conn); | |
912 aim_oft_destroyinfo(oft_info); | |
4656 | 913 xfer->data = NULL; |
5146 | 914 od->file_transfers = g_slist_remove(od->file_transfers, xfer); |
4656 | 915 } |
916 | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
917 static void oscar_xfer_cancel_send(GaimXfer *xfer) |
4675
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
918 { |
5146 | 919 struct aim_oft_info *oft_info = xfer->data; |
5575 | 920 GaimConnection *gc = oft_info->sess->aux_data; |
5146 | 921 struct oscar_data *od = gc->proto_data; |
4763 | 922 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
923 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
924 "AAA - in oscar_xfer_cancel_send\n"); |
5146 | 925 |
926 aim_im_sendch2_sendfile_cancel(oft_info->sess, oft_info); | |
927 | |
928 aim_conn_kill(oft_info->sess, &oft_info->conn); | |
929 aim_oft_destroyinfo(oft_info); | |
4763 | 930 xfer->data = NULL; |
5146 | 931 od->file_transfers = g_slist_remove(od->file_transfers, xfer); |
4675
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
932 } |
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
933 |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
934 static void oscar_xfer_cancel_recv(GaimXfer *xfer) |
4656 | 935 { |
5146 | 936 struct aim_oft_info *oft_info = xfer->data; |
5575 | 937 GaimConnection *gc = oft_info->sess->aux_data; |
5146 | 938 struct oscar_data *od = gc->proto_data; |
4656 | 939 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
940 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
941 "AAA - in oscar_xfer_cancel_recv\n"); |
5146 | 942 |
943 aim_im_sendch2_sendfile_cancel(oft_info->sess, oft_info); | |
944 | |
945 aim_conn_kill(oft_info->sess, &oft_info->conn); | |
946 aim_oft_destroyinfo(oft_info); | |
4656 | 947 xfer->data = NULL; |
5146 | 948 od->file_transfers = g_slist_remove(od->file_transfers, xfer); |
4656 | 949 } |
950 | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
951 static void oscar_xfer_ack(GaimXfer *xfer, const char *buffer, size_t size) |
4656 | 952 { |
5146 | 953 struct aim_oft_info *oft_info = xfer->data; |
4656 | 954 |
955 if (gaim_xfer_get_type(xfer) == GAIM_XFER_SEND) { | |
956 /* | |
957 * If we're done sending, intercept the socket from the core ft code | |
958 * and wait for the other guy to send the "done" OFT packet. | |
959 */ | |
960 if (gaim_xfer_get_bytes_remaining(xfer) <= 0) { | |
961 gaim_input_remove(xfer->watcher); | |
5146 | 962 xfer->watcher = gaim_input_add(xfer->fd, GAIM_INPUT_READ, oscar_callback, oft_info->conn); |
4656 | 963 xfer->fd = 0; |
964 gaim_xfer_set_completed(xfer, TRUE); | |
965 } | |
966 } else if (gaim_xfer_get_type(xfer) == GAIM_XFER_RECEIVE) { | |
5146 | 967 /* Update our rolling checksum. Like Walmart, yo. */ |
968 oft_info->fh.recvcsum = aim_oft_checksum_chunk(buffer, size, oft_info->fh.recvcsum); | |
4656 | 969 } |
970 } | |
971 | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
972 static GaimXfer *oscar_find_xfer_by_cookie(GSList *fts, const char *ck) |
4656 | 973 { |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
974 GaimXfer *xfer; |
5146 | 975 struct aim_oft_info *oft_info; |
4656 | 976 |
977 while (fts) { | |
978 xfer = fts->data; | |
5146 | 979 oft_info = xfer->data; |
980 | |
981 if (oft_info && !strcmp(ck, oft_info->cookie)) | |
4656 | 982 return xfer; |
983 | |
984 fts = g_slist_next(fts); | |
985 } | |
986 | |
987 return NULL; | |
988 } | |
989 | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
990 static GaimXfer *oscar_find_xfer_by_conn(GSList *fts, aim_conn_t *conn) |
4656 | 991 { |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
992 GaimXfer *xfer; |
5146 | 993 struct aim_oft_info *oft_info; |
4656 | 994 |
995 while (fts) { | |
996 xfer = fts->data; | |
5146 | 997 oft_info = xfer->data; |
998 | |
999 if (oft_info && (conn == oft_info->conn)) | |
4656 | 1000 return xfer; |
1001 | |
1002 fts = g_slist_next(fts); | |
1003 } | |
1004 | |
1005 return NULL; | |
1006 } | |
1007 | |
5575 | 1008 static void oscar_ask_sendfile(GaimConnection *gc, const char *destsn) { |
3630 | 1009 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
1010 GaimXfer *xfer; |
5146 | 1011 struct aim_oft_info *oft_info; |
3752 | 1012 |
4617 | 1013 /* You want to send a file to someone else, you're so generous */ |
1014 | |
1015 /* Build the file transfer handle */ | |
5575 | 1016 xfer = gaim_xfer_new(gaim_connection_get_account(gc), GAIM_XFER_SEND, destsn); |
4617 | 1017 xfer->local_port = 5190; |
1018 | |
5146 | 1019 /* Create the oscar-specific data */ |
1020 oft_info = aim_oft_createinfo(od->sess, NULL, destsn, xfer->local_ip, xfer->local_port, 0, 0, NULL); | |
1021 xfer->data = oft_info; | |
1022 | |
4617 | 1023 /* Setup our I/O op functions */ |
1024 gaim_xfer_set_init_fnc(xfer, oscar_xfer_init); | |
1025 gaim_xfer_set_start_fnc(xfer, oscar_xfer_start); | |
1026 gaim_xfer_set_end_fnc(xfer, oscar_xfer_end); | |
4675
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
1027 gaim_xfer_set_cancel_send_fnc(xfer, oscar_xfer_cancel_send); |
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
1028 gaim_xfer_set_cancel_recv_fnc(xfer, oscar_xfer_cancel_recv); |
4656 | 1029 gaim_xfer_set_ack_fnc(xfer, oscar_xfer_ack); |
4617 | 1030 |
1031 /* Keep track of this transfer for later */ | |
1032 od->file_transfers = g_slist_append(od->file_transfers, xfer); | |
1033 | |
1034 /* Now perform the request */ | |
1035 gaim_xfer_request(xfer); | |
3630 | 1036 } |
1037 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1038 static int gaim_parse_auth_resp(aim_session_t *sess, aim_frame_t *fr, ...) { |
6029 | 1039 GaimConnection *gc = sess->aux_data; |
1040 struct oscar_data *od = gc->proto_data; | |
1041 GaimAccount *account = gc->account; | |
1042 aim_conn_t *bosconn; | |
1043 char *host; int port; | |
1044 int i, rc; | |
2086 | 1045 va_list ap; |
2704 | 1046 struct aim_authresp_info *info; |
6029 | 1047 |
5575 | 1048 port = gaim_account_get_int(account, "port", FAIM_LOGIN_PORT); |
2086 | 1049 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1050 va_start(ap, fr); |
2704 | 1051 info = va_arg(ap, struct aim_authresp_info *); |
2086 | 1052 va_end(ap); |
1053 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1054 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1055 "inside auth_resp (Screen name: %s)\n", info->sn); |
2704 | 1056 |
4293 | 1057 if (info->errorcode || !info->bosip || !info->cookielen || !info->cookie) { |
4056 | 1058 char buf[256]; |
2704 | 1059 switch (info->errorcode) { |
2086 | 1060 case 0x05: |
1061 /* Incorrect nick/password */ | |
6498 | 1062 gc->wants_to_die = TRUE; |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1063 gaim_connection_error(gc, _("Incorrect nickname or password.")); |
2086 | 1064 break; |
1065 case 0x11: | |
1066 /* Suspended account */ | |
6498 | 1067 gc->wants_to_die = TRUE; |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1068 gaim_connection_error(gc, _("Your account is currently suspended.")); |
2086 | 1069 break; |
3498 | 1070 case 0x14: |
1071 /* service temporarily unavailable */ | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1072 gaim_connection_error(gc, _("The AOL Instant Messenger service is temporarily unavailable.")); |
3498 | 1073 break; |
2086 | 1074 case 0x18: |
1075 /* connecting too frequently */ | |
6498 | 1076 gc->wants_to_die = TRUE; |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1077 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 | 1078 break; |
1079 case 0x1c: | |
1080 /* client too old */ | |
6498 | 1081 gc->wants_to_die = TRUE; |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6350
diff
changeset
|
1082 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
|
1083 gaim_connection_error(gc, buf); |
2086 | 1084 break; |
1085 default: | |
6623 | 1086 gaim_connection_error(gc, _("Authentication failed")); |
2086 | 1087 break; |
1088 } | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1089 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1090 "Login Error Code 0x%04hx\n", info->errorcode); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1091 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1092 "Error URL: %s\n", info->errorurl); |
2086 | 1093 od->killme = TRUE; |
1094 return 1; | |
1095 } | |
1096 | |
1097 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1098 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1099 "Reg status: %hu\n", info->regstatus); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1100 |
2704 | 1101 if (info->email) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1102 gaim_debug(GAIM_DEBUG_MISC, "oscar", "Email: %s\n", info->email); |
2086 | 1103 } else { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1104 gaim_debug(GAIM_DEBUG_MISC, "oscar", "Email is NULL\n"); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1105 } |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1106 |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1107 gaim_debug(GAIM_DEBUG_MISC, "oscar", "BOSIP: %s\n", info->bosip); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1108 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1109 "Closing auth connection...\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1110 aim_conn_kill(sess, &fr->conn); |
2086 | 1111 |
1112 bosconn = aim_newconn(sess, AIM_CONN_TYPE_BOS, NULL); | |
1113 if (bosconn == NULL) { | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1114 gaim_connection_error(gc, _("Internal Error")); |
2086 | 1115 od->killme = TRUE; |
1116 return 0; | |
1117 } | |
1118 | |
4649 | 1119 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 1120 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_bos, 0); |
2086 | 1121 aim_conn_addhandler(sess, bosconn, 0x0009, 0x0003, gaim_bosrights, 0); |
1122 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ACK, AIM_CB_ACK_ACK, NULL, 0); | |
1123 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_REDIRECT, gaim_handle_redirect, 0); | |
2993 | 1124 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_RIGHTSINFO, gaim_parse_locaterights, 0); |
2086 | 1125 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_RIGHTSINFO, gaim_parse_buddyrights, 0); |
1126 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_ONCOMING, gaim_parse_oncoming, 0); | |
1127 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_OFFGOING, gaim_parse_offgoing, 0); | |
1128 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_INCOMING, gaim_parse_incoming_im, 0); | |
1129 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_ERROR, gaim_parse_locerr, 0); | |
1130 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_MISSEDCALL, gaim_parse_misses, 0); | |
3212 | 1131 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_CLIENTAUTORESP, gaim_parse_clientauto, 0); |
2086 | 1132 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_RATECHANGE, gaim_parse_ratechange, 0); |
1133 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_EVIL, gaim_parse_evilnotify, 0); | |
1134 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOK, AIM_CB_LOK_ERROR, gaim_parse_searcherror, 0); | |
1135 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOK, 0x0003, gaim_parse_searchreply, 0); | |
1136 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ERROR, gaim_parse_msgerr, 0); | |
3595 | 1137 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_MTN, gaim_parse_mtn, 0); |
2086 | 1138 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_USERINFO, gaim_parse_user_info, 0); |
1139 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ACK, gaim_parse_msgack, 0); | |
1140 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
|
1141 aim_conn_addhandler(sess, bosconn, 0x0004, 0x0005, gaim_icbm_param_info, 0); |
2086 | 1142 aim_conn_addhandler(sess, bosconn, 0x0001, 0x0001, gaim_parse_genericerr, 0); |
1143 aim_conn_addhandler(sess, bosconn, 0x0003, 0x0001, gaim_parse_genericerr, 0); | |
1144 aim_conn_addhandler(sess, bosconn, 0x0009, 0x0001, gaim_parse_genericerr, 0); | |
1145 aim_conn_addhandler(sess, bosconn, 0x0001, 0x001f, gaim_memrequest, 0); | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
1146 aim_conn_addhandler(sess, bosconn, 0x0001, 0x000f, gaim_selfinfo, 0); |
5844 | 1147 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
|
1148 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
|
1149 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
|
1150 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_POP, 0x0002, gaim_popup, 0); |
4759 | 1151 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_ALIAS, gaim_icqalias, 0); |
4624 | 1152 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_INFO, gaim_icqinfo, 0); |
4230 | 1153 #ifndef NOSSI |
4642 | 1154 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_ERROR, gaim_ssi_parseerr, 0); |
2991 | 1155 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RIGHTSINFO, gaim_ssi_parserights, 0); |
1156 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_LIST, gaim_ssi_parselist, 0); | |
1157 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_NOLIST, gaim_ssi_parselist, 0); | |
4230 | 1158 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_SRVACK, gaim_ssi_parseack, 0); |
1159 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RECVAUTH, gaim_ssi_authgiven, 0); | |
1160 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RECVAUTHREQ, gaim_ssi_authrequest, 0); | |
1161 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RECVAUTHREP, gaim_ssi_authreply, 0); | |
1162 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_ADDED, gaim_ssi_gotadded, 0); | |
1163 #endif | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
1164 |
2086 | 1165 ((struct oscar_data *)gc->proto_data)->conn = bosconn; |
2704 | 1166 for (i = 0; i < (int)strlen(info->bosip); i++) { |
1167 if (info->bosip[i] == ':') { | |
1168 port = atoi(&(info->bosip[i+1])); | |
2086 | 1169 break; |
1170 } | |
1171 } | |
2704 | 1172 host = g_strndup(info->bosip, i); |
2086 | 1173 bosconn->status |= AIM_CONN_STATUS_INPROGRESS; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1174 rc = gaim_proxy_connect(gc->account, host, port, oscar_bos_connect, gc); |
2086 | 1175 g_free(host); |
4366 | 1176 if (rc < 0) { |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1177 gaim_connection_error(gc, _("Could Not Connect")); |
2086 | 1178 od->killme = TRUE; |
1179 return 0; | |
1180 } | |
4293 | 1181 aim_sendcookie(sess, bosconn, info->cookielen, info->cookie); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1182 gaim_input_remove(gc->inpa); |
2704 | 1183 |
2086 | 1184 return 1; |
1185 } | |
1186 | |
1187 struct pieceofcrap { | |
5575 | 1188 GaimConnection *gc; |
2086 | 1189 unsigned long offset; |
1190 unsigned long len; | |
1191 char *modname; | |
1192 int fd; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1193 aim_conn_t *conn; |
2086 | 1194 unsigned int inpa; |
1195 }; | |
1196 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1197 static void damn_you(gpointer data, gint source, GaimInputCondition c) |
2086 | 1198 { |
1199 struct pieceofcrap *pos = data; | |
1200 struct oscar_data *od = pos->gc->proto_data; | |
1201 char in = '\0'; | |
1202 int x = 0; | |
1203 unsigned char m[17]; | |
1204 | |
1205 while (read(pos->fd, &in, 1) == 1) { | |
1206 if (in == '\n') | |
1207 x++; | |
1208 else if (in != '\r') | |
1209 x = 0; | |
1210 if (x == 2) | |
1211 break; | |
1212 in = '\0'; | |
1213 } | |
1214 if (in != '\n') { | |
4056 | 1215 char buf[256]; |
1216 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
|
1217 "this is fixed. Check %s for updates."), GAIM_WEBSITE); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1218 gaim_notify_warning(pos->gc, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1219 _("Gaim was Unable to get a valid AIM login hash."), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1220 buf); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1221 gaim_input_remove(pos->inpa); |
2086 | 1222 close(pos->fd); |
1223 g_free(pos); | |
1224 return; | |
1225 } | |
1226 read(pos->fd, m, 16); | |
1227 m[16] = '\0'; | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1228 gaim_debug(GAIM_DEBUG_MISC, "oscar", "Sending hash: "); |
2086 | 1229 for (x = 0; x < 16; x++) |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1230 gaim_debug(GAIM_DEBUG_MISC, NULL, "%02hhx ", (unsigned char)m[x]); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1231 |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1232 gaim_debug(GAIM_DEBUG_MISC, NULL, "\n"); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1233 gaim_input_remove(pos->inpa); |
2086 | 1234 close(pos->fd); |
1235 aim_sendmemblock(od->sess, pos->conn, 0, 16, m, AIM_SENDMEMBLOCK_FLAG_ISHASH); | |
1236 g_free(pos); | |
1237 } | |
1238 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1239 static void straight_to_hell(gpointer data, gint source, GaimInputCondition cond) { |
2086 | 1240 struct pieceofcrap *pos = data; |
5420 | 1241 gchar *buf; |
2086 | 1242 |
4366 | 1243 pos->fd = source; |
1244 | |
2086 | 1245 if (source < 0) { |
5420 | 1246 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
|
1247 "this is fixed. Check %s for updates."), GAIM_WEBSITE); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1248 gaim_notify_warning(pos->gc, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1249 _("Gaim was Unable to get a valid AIM login hash."), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1250 buf); |
5420 | 1251 g_free(buf); |
2086 | 1252 if (pos->modname) |
1253 g_free(pos->modname); | |
1254 g_free(pos); | |
1255 return; | |
1256 } | |
1257 | |
5420 | 1258 buf = g_strdup_printf("GET " AIMHASHDATA "?offset=%ld&len=%ld&modname=%s HTTP/1.0\n\n", |
2086 | 1259 pos->offset, pos->len, pos->modname ? pos->modname : ""); |
1260 write(pos->fd, buf, strlen(buf)); | |
5420 | 1261 g_free(buf); |
2086 | 1262 if (pos->modname) |
1263 g_free(pos->modname); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1264 pos->inpa = gaim_input_add(pos->fd, GAIM_INPUT_READ, damn_you, pos); |
2086 | 1265 return; |
1266 } | |
1267 | |
1268 /* size of icbmui.ocm, the largest module in AIM 3.5 */ | |
1269 #define AIM_MAX_FILE_SIZE 98304 | |
1270 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1271 int gaim_memrequest(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 1272 va_list ap; |
1273 struct pieceofcrap *pos; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1274 fu32_t offset, len; |
2086 | 1275 char *modname; |
1276 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1277 va_start(ap, fr); |
4200 | 1278 offset = va_arg(ap, fu32_t); |
1279 len = va_arg(ap, fu32_t); | |
2086 | 1280 modname = va_arg(ap, char *); |
1281 va_end(ap); | |
1282 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1283 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
5556 | 1284 "offset: %u, len: %u, file: %s\n", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1285 offset, len, (modname ? modname : "aim.exe")); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1286 |
2086 | 1287 if (len == 0) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1288 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
|
1289 aim_sendmemblock(sess, fr->conn, offset, len, NULL, |
2086 | 1290 AIM_SENDMEMBLOCK_FLAG_ISREQUEST); |
1291 return 1; | |
1292 } | |
1293 /* uncomment this when you're convinced it's right. remember, it's been wrong before. | |
1294 if (offset > AIM_MAX_FILE_SIZE || len > AIM_MAX_FILE_SIZE) { | |
1295 char *buf; | |
1296 int i = 8; | |
1297 if (modname) | |
1298 i += strlen(modname); | |
1299 buf = g_malloc(i); | |
1300 i = 0; | |
1301 if (modname) { | |
1302 memcpy(buf, modname, strlen(modname)); | |
1303 i += strlen(modname); | |
1304 } | |
1305 buf[i++] = offset & 0xff; | |
1306 buf[i++] = (offset >> 8) & 0xff; | |
1307 buf[i++] = (offset >> 16) & 0xff; | |
1308 buf[i++] = (offset >> 24) & 0xff; | |
1309 buf[i++] = len & 0xff; | |
1310 buf[i++] = (len >> 8) & 0xff; | |
1311 buf[i++] = (len >> 16) & 0xff; | |
1312 buf[i++] = (len >> 24) & 0xff; | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1313 gaim_debug(GAIM_DEBUG_MISC, "oscar", "len + offset is invalid, " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1314 "hashing request\n"); |
2086 | 1315 aim_sendmemblock(sess, command->conn, offset, i, buf, AIM_SENDMEMBLOCK_FLAG_ISREQUEST); |
1316 g_free(buf); | |
1317 return 1; | |
1318 } | |
1319 */ | |
1320 | |
1321 pos = g_new0(struct pieceofcrap, 1); | |
1322 pos->gc = sess->aux_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1323 pos->conn = fr->conn; |
2086 | 1324 |
1325 pos->offset = offset; | |
1326 pos->len = len; | |
1327 pos->modname = modname ? g_strdup(modname) : NULL; | |
1328 | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1329 if (gaim_proxy_connect(pos->gc->account, "gaim.sourceforge.net", 80, straight_to_hell, pos) != 0) { |
4056 | 1330 char buf[256]; |
2086 | 1331 if (pos->modname) |
1332 g_free(pos->modname); | |
1333 g_free(pos); | |
4056 | 1334 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
|
1335 "this is fixed. Check %s for updates."), GAIM_WEBSITE); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1336 gaim_notify_warning(pos->gc, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1337 _("Gaim was Unable to get a valid login hash."), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1338 buf); |
2086 | 1339 } |
1340 | |
1341 return 1; | |
1342 } | |
1343 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1344 static int gaim_parse_login(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 1345 char *key; |
1346 va_list ap; | |
5575 | 1347 GaimConnection *gc = sess->aux_data; |
5591
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1348 GaimAccount *account = gaim_connection_get_account(gc); |
5575 | 1349 GaimAccount *ac = gaim_connection_get_account(gc); |
4617 | 1350 struct oscar_data *od = gc->proto_data; |
2086 | 1351 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1352 va_start(ap, fr); |
2086 | 1353 key = va_arg(ap, char *); |
1354 va_end(ap); | |
1355 | |
4617 | 1356 if (od->icq) { |
3458 | 1357 struct client_info_s info = CLIENTINFO_ICQ_KNOWNGOOD; |
5591
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1358 aim_send_login(sess, fr->conn, gaim_account_get_username(ac), |
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1359 gaim_account_get_password(account), &info, key); |
3458 | 1360 } else { |
1361 #if 0 | |
1362 struct client_info_s info = {"gaim", 4, 1, 2010, "us", "en", 0x0004, 0x0000, 0x04b}; | |
1363 #endif | |
1364 struct client_info_s info = CLIENTINFO_AIM_KNOWNGOOD; | |
5591
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1365 aim_send_login(sess, fr->conn, gaim_account_get_username(ac), |
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1366 gaim_account_get_password(account), &info, key); |
3458 | 1367 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1368 |
2086 | 1369 return 1; |
1370 } | |
1371 | |
2675 | 1372 static int conninitdone_chat(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 1373 GaimConnection *gc = sess->aux_data; |
2647 | 1374 struct chat_connection *chatcon; |
1375 static int id = 1; | |
1376 | |
6905 | 1377 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, 0x0001, gaim_parse_genericerr, 0); |
2675 | 1378 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERJOIN, gaim_chat_join, 0); |
1379 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERLEAVE, gaim_chat_leave, 0); | |
1380 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_ROOMINFOUPDATE, gaim_chat_info_update, 0); | |
1381 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_INCOMINGMSG, gaim_chat_incoming_msg, 0); | |
1382 | |
2672 | 1383 aim_clientready(sess, fr->conn); |
2675 | 1384 |
2647 | 1385 chatcon = find_oscar_chat_by_conn(gc, fr->conn); |
1386 chatcon->id = id; | |
1387 chatcon->cnv = serv_got_joined_chat(gc, id++, chatcon->show); | |
1388 | |
1389 return 1; | |
1390 } | |
1391 | |
2675 | 1392 static int conninitdone_chatnav(aim_session_t *sess, aim_frame_t *fr, ...) { |
1393 | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1394 aim_conn_addhandler(sess, fr->conn, 0x000d, 0x0001, gaim_parse_genericerr, 0); |
2647 | 1395 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CTN, AIM_CB_CTN_INFO, gaim_chatnav_info, 0); |
2675 | 1396 |
1397 aim_clientready(sess, fr->conn); | |
1398 | |
1399 aim_chatnav_reqrights(sess, fr->conn); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1400 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1401 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1402 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1403 |
3694 | 1404 static int conninitdone_email(aim_session_t *sess, aim_frame_t *fr, ...) { |
1405 | |
1406 aim_conn_addhandler(sess, fr->conn, 0x0018, 0x0001, gaim_parse_genericerr, 0); | |
1407 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_EML, AIM_CB_EML_MAILSTATUS, gaim_email_parseupdate, 0); | |
1408 | |
1409 aim_email_sendcookies(sess, fr->conn); | |
1410 aim_email_activate(sess, fr->conn); | |
1411 aim_clientready(sess, fr->conn); | |
1412 | |
1413 return 1; | |
1414 } | |
1415 | |
4804 | 1416 static int conninitdone_icon(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 1417 GaimConnection *gc = sess->aux_data; |
4804 | 1418 struct oscar_data *od = gc->proto_data; |
1419 | |
1420 aim_conn_addhandler(sess, fr->conn, 0x0018, 0x0001, gaim_parse_genericerr, 0); | |
1421 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ICO, AIM_CB_ICO_ERROR, gaim_icon_error, 0); | |
1422 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ICO, AIM_CB_ICO_RESPONSE, gaim_icon_parseicon, 0); | |
1423 | |
1424 aim_clientready(sess, fr->conn); | |
1425 | |
4823 | 1426 od->iconconnecting = FALSE; |
1427 | |
4804 | 1428 if (od->icontimer) |
1429 g_source_remove(od->icontimer); | |
1430 od->icontimer = g_timeout_add(100, gaim_icon_timerfunc, gc); | |
1431 | |
1432 return 1; | |
1433 } | |
1434 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1435 static void oscar_chatnav_connect(gpointer data, gint source, GaimInputCondition cond) { |
5575 | 1436 GaimConnection *gc = data; |
4617 | 1437 struct oscar_data *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1438 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1439 aim_conn_t *tstconn; |
2086 | 1440 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1441 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 1442 close(source); |
1443 return; | |
1444 } | |
1445 | |
4617 | 1446 od = gc->proto_data; |
1447 sess = od->sess; | |
2086 | 1448 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_CHATNAV); |
4366 | 1449 tstconn->fd = source; |
2086 | 1450 |
1451 if (source < 0) { | |
1452 aim_conn_kill(sess, &tstconn); | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1453 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1454 "unable to connect to chatnav server\n"); |
2086 | 1455 return; |
1456 } | |
1457 | |
1458 aim_conn_completeconnect(sess, tstconn); | |
4617 | 1459 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
|
1460 gaim_debug(GAIM_DEBUG_INFO, "oscar", "chatnav: connected\n"); |
2086 | 1461 } |
1462 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1463 static void oscar_auth_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 1464 { |
5575 | 1465 GaimConnection *gc = data; |
4617 | 1466 struct oscar_data *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1467 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1468 aim_conn_t *tstconn; |
2086 | 1469 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1470 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 1471 close(source); |
1472 return; | |
1473 } | |
1474 | |
4617 | 1475 od = gc->proto_data; |
1476 sess = od->sess; | |
2086 | 1477 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_AUTH); |
4366 | 1478 tstconn->fd = source; |
2086 | 1479 |
1480 if (source < 0) { | |
1481 aim_conn_kill(sess, &tstconn); | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1482 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1483 "unable to connect to authorizer\n"); |
2086 | 1484 return; |
1485 } | |
1486 | |
1487 aim_conn_completeconnect(sess, tstconn); | |
4617 | 1488 od->paspa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); |
6905 | 1489 gaim_debug(GAIM_DEBUG_INFO, "oscar", "admin: connected\n"); |
2086 | 1490 } |
1491 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1492 static void oscar_chat_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 1493 { |
1494 struct chat_connection *ccon = data; | |
5575 | 1495 GaimConnection *gc = ccon->gc; |
4617 | 1496 struct oscar_data *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1497 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1498 aim_conn_t *tstconn; |
2086 | 1499 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1500 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 1501 close(source); |
1502 g_free(ccon->show); | |
1503 g_free(ccon->name); | |
1504 g_free(ccon); | |
1505 return; | |
1506 } | |
1507 | |
4617 | 1508 od = gc->proto_data; |
1509 sess = od->sess; | |
2086 | 1510 tstconn = ccon->conn; |
4366 | 1511 tstconn->fd = source; |
2086 | 1512 |
1513 if (source < 0) { | |
1514 aim_conn_kill(sess, &tstconn); | |
1515 g_free(ccon->show); | |
1516 g_free(ccon->name); | |
1517 g_free(ccon); | |
1518 return; | |
1519 } | |
1520 | |
1521 aim_conn_completeconnect(sess, ccon->conn); | |
4617 | 1522 ccon->inpa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); |
1523 od->oscar_chats = g_slist_append(od->oscar_chats, ccon); | |
2086 | 1524 } |
1525 | |
3694 | 1526 static void oscar_email_connect(gpointer data, gint source, GaimInputCondition cond) { |
5575 | 1527 GaimConnection *gc = data; |
4617 | 1528 struct oscar_data *od; |
3694 | 1529 aim_session_t *sess; |
1530 aim_conn_t *tstconn; | |
1531 | |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1532 if (!g_list_find(gaim_connections_get_all(), gc)) { |
3694 | 1533 close(source); |
1534 return; | |
1535 } | |
1536 | |
4617 | 1537 od = gc->proto_data; |
1538 sess = od->sess; | |
3694 | 1539 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_EMAIL); |
4366 | 1540 tstconn->fd = source; |
3694 | 1541 |
1542 if (source < 0) { | |
1543 aim_conn_kill(sess, &tstconn); | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1544 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1545 "unable to connect to email server\n"); |
3694 | 1546 return; |
1547 } | |
1548 | |
1549 aim_conn_completeconnect(sess, tstconn); | |
4617 | 1550 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
|
1551 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1552 "email: connected\n"); |
3694 | 1553 } |
1554 | |
4804 | 1555 static void oscar_icon_connect(gpointer data, gint source, GaimInputCondition cond) { |
5575 | 1556 GaimConnection *gc = data; |
4804 | 1557 struct oscar_data *od; |
1558 aim_session_t *sess; | |
1559 aim_conn_t *tstconn; | |
1560 | |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1561 if (!g_list_find(gaim_connections_get_all(), gc)) { |
4804 | 1562 close(source); |
1563 return; | |
1564 } | |
1565 | |
1566 od = gc->proto_data; | |
1567 sess = od->sess; | |
1568 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_ICON); | |
1569 tstconn->fd = source; | |
1570 | |
1571 if (source < 0) { | |
1572 aim_conn_kill(sess, &tstconn); | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1573 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1574 "unable to connect to icon server\n"); |
4804 | 1575 return; |
1576 } | |
1577 | |
1578 aim_conn_completeconnect(sess, tstconn); | |
1579 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
|
1580 gaim_debug(GAIM_DEBUG_INFO, "oscar", "icon: connected\n"); |
4804 | 1581 } |
1582 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1583 /* 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
|
1584 static int gaim_handle_redirect(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 1585 GaimConnection *gc = sess->aux_data; |
1586 GaimAccount *account = gaim_connection_get_account(gc); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1587 aim_conn_t *tstconn; |
4452 | 1588 int i; |
2086 | 1589 char *host; |
1590 int port; | |
4821 | 1591 va_list ap; |
1592 struct aim_redirect_data *redir; | |
2086 | 1593 |
5575 | 1594 port = gaim_account_get_int(account, "port", FAIM_LOGIN_PORT); |
2086 | 1595 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1596 va_start(ap, fr); |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1597 redir = va_arg(ap, struct aim_redirect_data *); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1598 va_end(ap); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1599 |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1600 for (i = 0; i < (int)strlen(redir->ip); i++) { |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1601 if (redir->ip[i] == ':') { |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1602 port = atoi(&(redir->ip[i+1])); |
2086 | 1603 break; |
1604 } | |
1605 } | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1606 host = g_strndup(redir->ip, i); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1607 |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1608 switch(redir->group) { |
2086 | 1609 case 0x7: /* Authorizer */ |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1610 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1611 "Reconnecting with authorizor...\n"); |
2086 | 1612 tstconn = aim_newconn(sess, AIM_CONN_TYPE_AUTH, NULL); |
1613 if (tstconn == NULL) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1614 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1615 "unable to reconnect with authorizer\n"); |
2086 | 1616 g_free(host); |
1617 return 1; | |
1618 } | |
4649 | 1619 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 1620 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_admin, 0); |
2086 | 1621 |
1622 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1623 if (gaim_proxy_connect(account, host, port, oscar_auth_connect, gc) != 0) { |
2086 | 1624 aim_conn_kill(sess, &tstconn); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1625 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1626 "unable to reconnect with authorizer\n"); |
2086 | 1627 g_free(host); |
1628 return 1; | |
1629 } | |
4293 | 1630 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
4194 | 1631 break; |
1632 | |
2086 | 1633 case 0xd: /* ChatNav */ |
1634 tstconn = aim_newconn(sess, AIM_CONN_TYPE_CHATNAV, NULL); | |
1635 if (tstconn == NULL) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1636 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1637 "unable to connect to chatnav server\n"); |
2086 | 1638 g_free(host); |
1639 return 1; | |
1640 } | |
4649 | 1641 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 1642 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_chatnav, 0); |
2086 | 1643 |
1644 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1645 if (gaim_proxy_connect(account, host, port, oscar_chatnav_connect, gc) != 0) { |
2086 | 1646 aim_conn_kill(sess, &tstconn); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1647 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1648 "unable to connect to chatnav server\n"); |
2086 | 1649 g_free(host); |
1650 return 1; | |
1651 } | |
4293 | 1652 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
4194 | 1653 break; |
1654 | |
1655 case 0xe: { /* Chat */ | |
2086 | 1656 struct chat_connection *ccon; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1657 |
2086 | 1658 tstconn = aim_newconn(sess, AIM_CONN_TYPE_CHAT, NULL); |
1659 if (tstconn == NULL) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1660 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1661 "unable to connect to chat server\n"); |
2086 | 1662 g_free(host); |
1663 return 1; | |
1664 } | |
1665 | |
4649 | 1666 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 1667 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_chat, 0); |
1668 | |
2086 | 1669 ccon = g_new0(struct chat_connection, 1); |
1670 ccon->conn = tstconn; | |
1671 ccon->gc = gc; | |
1672 ccon->fd = -1; | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1673 ccon->name = g_strdup(redir->chat.room); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1674 ccon->exchange = redir->chat.exchange; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1675 ccon->instance = redir->chat.instance; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1676 ccon->show = extract_name(redir->chat.room); |
4634 | 1677 |
2086 | 1678 ccon->conn->status |= AIM_CONN_STATUS_INPROGRESS; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1679 if (gaim_proxy_connect(account, host, port, oscar_chat_connect, ccon) != 0) { |
2086 | 1680 aim_conn_kill(sess, &tstconn); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1681 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1682 "unable to connect to chat server\n"); |
2086 | 1683 g_free(host); |
1684 g_free(ccon->show); | |
1685 g_free(ccon->name); | |
1686 g_free(ccon); | |
1687 return 1; | |
1688 } | |
4293 | 1689 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1690 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1691 "Connected to chat room %s exchange %hu\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1692 ccon->name, ccon->exchange); |
4194 | 1693 } break; |
3694 | 1694 |
4804 | 1695 case 0x0010: { /* icon */ |
1696 if (!(tstconn = aim_newconn(sess, AIM_CONN_TYPE_ICON, NULL))) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1697 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1698 "unable to connect to icon server\n"); |
4804 | 1699 g_free(host); |
1700 return 1; | |
1701 } | |
1702 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); | |
1703 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_icon, 0); | |
1704 | |
1705 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1706 if (gaim_proxy_connect(account, host, port, oscar_icon_connect, gc) != 0) { |
4804 | 1707 aim_conn_kill(sess, &tstconn); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1708 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1709 "unable to connect to icon server\n"); |
4804 | 1710 g_free(host); |
1711 return 1; | |
1712 } | |
1713 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); | |
1714 } break; | |
1715 | |
3694 | 1716 case 0x0018: { /* email */ |
1717 if (!(tstconn = aim_newconn(sess, AIM_CONN_TYPE_EMAIL, NULL))) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1718 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1719 "unable to connect to email server\n"); |
3694 | 1720 g_free(host); |
1721 return 1; | |
1722 } | |
4649 | 1723 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
3694 | 1724 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_email, 0); |
1725 | |
1726 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1727 if (gaim_proxy_connect(account, host, port, oscar_email_connect, gc) != 0) { |
3694 | 1728 aim_conn_kill(sess, &tstconn); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1729 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1730 "unable to connect to email server\n"); |
3694 | 1731 g_free(host); |
1732 return 1; | |
1733 } | |
4293 | 1734 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
3694 | 1735 } break; |
1736 | |
2086 | 1737 default: /* huh? */ |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1738 gaim_debug(GAIM_DEBUG_WARNING, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1739 "got redirect for unknown service 0x%04hx\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1740 redir->group); |
2086 | 1741 break; |
1742 } | |
1743 | |
1744 g_free(host); | |
1745 return 1; | |
1746 } | |
1747 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1748 static int gaim_parse_oncoming(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 1749 GaimConnection *gc = sess->aux_data; |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
1750 struct oscar_data *od = gc->proto_data; |
4738 | 1751 struct buddyinfo *bi; |
2993 | 1752 time_t time_idle = 0, signon = 0; |
1753 int type = 0; | |
1754 int caps = 0; | |
2086 | 1755 va_list ap; |
4738 | 1756 aim_userinfo_t *info; |
4194 | 1757 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1758 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
1759 info = va_arg(ap, aim_userinfo_t *); |
2086 | 1760 va_end(ap); |
1761 | |
2993 | 1762 if (info->present & AIM_USERINFO_PRESENT_CAPABILITIES) |
1763 caps = info->capabilities; | |
3267 | 1764 if (info->flags & AIM_FLAG_ACTIVEBUDDY) |
1765 type |= UC_AB; | |
6318 | 1766 if (caps & AIM_CAPS_HIPTOP) |
1767 type |= UC_HIPTOP; | |
3267 | 1768 |
4766 | 1769 if (info->present & AIM_USERINFO_PRESENT_FLAGS) { |
1770 if (info->flags & AIM_FLAG_UNCONFIRMED) | |
1771 type |= UC_UNCONFIRMED; | |
1772 if (info->flags & AIM_FLAG_ADMINISTRATOR) | |
1773 type |= UC_ADMIN; | |
1774 if (info->flags & AIM_FLAG_AOL) | |
1775 type |= UC_AOL; | |
1776 if (info->flags & AIM_FLAG_FREE) | |
1777 type |= UC_NORMAL; | |
1778 if (info->flags & AIM_FLAG_AWAY) | |
1779 type |= UC_UNAVAILABLE; | |
1780 if (info->flags & AIM_FLAG_WIRELESS) | |
1781 type |= UC_WIRELESS; | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
1782 } |
2993 | 1783 if (info->present & AIM_USERINFO_PRESENT_ICQEXTSTATUS) { |
3595 | 1784 type = (info->icqinfo.status << 16); |
3013 | 1785 if (!(info->icqinfo.status & AIM_ICQ_STATE_CHAT) && |
1786 (info->icqinfo.status != AIM_ICQ_STATE_NORMAL)) { | |
2993 | 1787 type |= UC_UNAVAILABLE; |
3013 | 1788 } |
2993 | 1789 } |
1790 | |
1791 if (caps & AIM_CAPS_ICQ) | |
1792 caps ^= AIM_CAPS_ICQ; | |
1793 | |
1794 if (info->present & AIM_USERINFO_PRESENT_IDLE) { | |
2086 | 1795 time(&time_idle); |
1796 time_idle -= info->idletime*60; | |
2993 | 1797 } |
1798 | |
5836 | 1799 if (info->present & AIM_USERINFO_PRESENT_ONLINESINCE) |
1800 signon = info->onlinesince; | |
1801 else if (info->present & AIM_USERINFO_PRESENT_SESSIONLEN) | |
2993 | 1802 signon = time(NULL) - info->sessionlen; |
2086 | 1803 |
5575 | 1804 if (!aim_sncmp(gaim_account_get_username(gaim_connection_get_account(gc)), info->sn)) |
1805 gaim_connection_set_display_name(gc, info->sn); | |
2305
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
1806 |
4738 | 1807 bi = g_hash_table_lookup(od->buddyinfo, normalize(info->sn)); |
1808 if (!bi) { | |
1809 bi = g_new0(struct buddyinfo, 1); | |
1810 g_hash_table_insert(od->buddyinfo, g_strdup(normalize(info->sn)), bi); | |
1811 } | |
1812 bi->signon = info->onlinesince ? info->onlinesince : (info->sessionlen + time(NULL)); | |
4829 | 1813 if (caps) |
1814 bi->caps = caps; | |
4739 | 1815 bi->typingnot = FALSE; |
1816 bi->ico_informed = FALSE; | |
6857 | 1817 bi->ipaddr = info->icqinfo.ipaddr; |
1818 | |
1819 /* Available message stuff */ | |
6292 | 1820 free(bi->availmsg); |
1821 if (info->availmsg) | |
1822 if (info->availmsg_encoding) { | |
1823 gchar *enc = g_strdup_printf("charset=\"%s\"", info->availmsg_encoding); | |
1824 bi->availmsg = oscar_encoding_to_utf8(enc, info->availmsg, info->availmsg_len); | |
1825 g_free(enc); | |
1826 } else { | |
1827 /* No explicit encoding means utf8. Yay. */ | |
1828 bi->availmsg = g_strdup(info->availmsg); | |
1829 } | |
5837 | 1830 else |
6292 | 1831 bi->availmsg = NULL; |
4732 | 1832 |
4804 | 1833 /* Server stored icon stuff */ |
4853 | 1834 if (info->iconcsumlen) { |
1835 char *b16, *saved_b16; | |
6695 | 1836 GaimBuddy *b; |
4853 | 1837 |
5836 | 1838 free(bi->iconcsum); |
1839 bi->iconcsum = malloc(info->iconcsumlen); | |
4853 | 1840 memcpy(bi->iconcsum, info->iconcsum, info->iconcsumlen); |
1841 bi->iconcsumlen = info->iconcsumlen; | |
1842 b16 = tobase16(bi->iconcsum, bi->iconcsumlen); | |
1843 b = gaim_find_buddy(gc->account, info->sn); | |
1844 saved_b16 = gaim_buddy_get_setting(b, "icon_checksum"); | |
1845 if (!b16 || !saved_b16 || strcmp(b16, saved_b16)) { | |
1846 GSList *cur = od->requesticon; | |
1847 while (cur && aim_sncmp((char *)cur->data, info->sn)) | |
1848 cur = cur->next; | |
1849 if (!cur) { | |
1850 od->requesticon = g_slist_append(od->requesticon, strdup(normalize(info->sn))); | |
1851 if (od->icontimer) | |
1852 g_source_remove(od->icontimer); | |
1853 od->icontimer = g_timeout_add(500, gaim_icon_timerfunc, gc); | |
1854 } | |
1855 } | |
6053 | 1856 g_free(saved_b16); |
1857 g_free(b16); | |
4853 | 1858 } |
1859 | |
5628 | 1860 serv_got_update(gc, info->sn, 1, (info->warnlevel/10.0) + 0.5, signon, time_idle, type); |
2086 | 1861 |
1862 return 1; | |
1863 } | |
1864 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1865 static int gaim_parse_offgoing(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 1866 GaimConnection *gc = sess->aux_data; |
5837 | 1867 struct oscar_data *od = gc->proto_data; |
2086 | 1868 va_list ap; |
4739 | 1869 aim_userinfo_t *info; |
2086 | 1870 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1871 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
1872 info = va_arg(ap, aim_userinfo_t *); |
2086 | 1873 va_end(ap); |
1874 | |
4732 | 1875 serv_got_update(gc, info->sn, 0, 0, 0, 0, 0); |
2086 | 1876 |
5837 | 1877 g_hash_table_remove(od->buddyinfo, normalize(info->sn)); |
1878 | |
2086 | 1879 return 1; |
1880 } | |
1881 | |
3730 | 1882 static void cancel_direct_im(struct ask_direct *d) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1883 gaim_debug(GAIM_DEBUG_INFO, "oscar", "Freeing DirectIM prompts.\n"); |
2086 | 1884 |
1885 g_free(d->sn); | |
1886 g_free(d); | |
1887 } | |
1888 | |
4617 | 1889 static void oscar_odc_callback(gpointer data, gint source, GaimInputCondition condition) { |
2086 | 1890 struct direct_im *dim = data; |
5575 | 1891 GaimConnection *gc = dim->gc; |
2086 | 1892 struct oscar_data *od = gc->proto_data; |
5679 | 1893 GaimConversation *cnv; |
2086 | 1894 char buf[256]; |
3008 | 1895 struct sockaddr name; |
1896 socklen_t name_len = 1; | |
1897 | |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1898 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 1899 g_free(dim); |
1900 return; | |
1901 } | |
1902 | |
1903 if (source < 0) { | |
1904 g_free(dim); | |
1905 return; | |
1906 } | |
1907 | |
4366 | 1908 dim->conn->fd = source; |
2086 | 1909 aim_conn_completeconnect(od->sess, dim->conn); |
6640
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6623
diff
changeset
|
1910 cnv = gaim_conversation_new(GAIM_CONV_IM, dim->gc->account, dim->name); |
3008 | 1911 |
1912 /* This is the best way to see if we're connected or not */ | |
1913 if (getpeername(source, &name, &name_len) == 0) { | |
1914 g_snprintf(buf, sizeof buf, _("Direct IM with %s established"), dim->name); | |
1915 dim->connected = TRUE; | |
6982 | 1916 gaim_conversation_write(cnv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL)); |
3008 | 1917 } |
2086 | 1918 od->direct_ims = g_slist_append(od->direct_ims, dim); |
3008 | 1919 |
4617 | 1920 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, oscar_callback, dim->conn); |
2086 | 1921 } |
1922 | |
4617 | 1923 /* BBB */ |
3952 | 1924 /* |
4617 | 1925 * This is called after a remote AIM user has connected to us. We |
1926 * want to do some voodoo with the socket file descriptors, add a | |
1927 * callback or two, and then send the AIM_CB_OFT_PROMPT. | |
3952 | 1928 */ |
4656 | 1929 static int oscar_sendfile_estblsh(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 1930 GaimConnection *gc = sess->aux_data; |
3630 | 1931 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
1932 GaimXfer *xfer; |
5146 | 1933 struct aim_oft_info *oft_info; |
3630 | 1934 va_list ap; |
1935 aim_conn_t *conn, *listenerconn; | |
4656 | 1936 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1937 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1938 "AAA - in oscar_sendfile_estblsh\n"); |
3630 | 1939 va_start(ap, fr); |
1940 conn = va_arg(ap, aim_conn_t *); | |
1941 listenerconn = va_arg(ap, aim_conn_t *); | |
1942 va_end(ap); | |
1943 | |
4617 | 1944 if (!(xfer = oscar_find_xfer_by_conn(od->file_transfers, listenerconn))) |
1945 return 1; | |
1946 | |
5146 | 1947 if (!(oft_info = xfer->data)) |
4617 | 1948 return 1; |
1949 | |
3630 | 1950 /* Stop watching listener conn; watch transfer conn instead */ |
4617 | 1951 gaim_input_remove(xfer->watcher); |
3630 | 1952 aim_conn_kill(sess, &listenerconn); |
1953 | |
5146 | 1954 oft_info->conn = conn; |
1955 xfer->fd = oft_info->conn->fd; | |
1956 | |
1957 aim_conn_addhandler(sess, oft_info->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_ACK, oscar_sendfile_ack, 0); | |
1958 aim_conn_addhandler(sess, oft_info->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DONE, oscar_sendfile_done, 0); | |
1959 xfer->watcher = gaim_input_add(oft_info->conn->fd, GAIM_INPUT_READ, oscar_callback, oft_info->conn); | |
4617 | 1960 |
1961 /* Inform the other user that we are connected and ready to transfer */ | |
5146 | 1962 aim_oft_sendheader(sess, AIM_CB_OFT_PROMPT, oft_info); |
3630 | 1963 |
1964 return 0; | |
1965 } | |
1966 | |
3952 | 1967 /* |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1968 * This is the gaim callback passed to gaim_proxy_connect when connecting to another AIM |
4617 | 1969 * user in order to transfer a file. |
3952 | 1970 */ |
4617 | 1971 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
|
1972 GaimXfer *xfer; |
5146 | 1973 struct aim_oft_info *oft_info; |
4656 | 1974 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1975 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1976 "AAA - in oscar_sendfile_connected\n"); |
4617 | 1977 if (!(xfer = data)) |
1978 return; | |
5146 | 1979 if (!(oft_info = xfer->data)) |
3630 | 1980 return; |
4617 | 1981 if (source < 0) |
1982 return; | |
1983 | |
1984 xfer->fd = source; | |
5146 | 1985 oft_info->conn->fd = source; |
1986 | |
1987 aim_conn_completeconnect(oft_info->sess, oft_info->conn); | |
1988 xfer->watcher = gaim_input_add(xfer->fd, GAIM_INPUT_READ, oscar_callback, oft_info->conn); | |
4617 | 1989 |
1990 /* Inform the other user that we are connected and ready to transfer */ | |
5146 | 1991 aim_im_sendch2_sendfile_accept(oft_info->sess, oft_info); |
4617 | 1992 |
1993 return; | |
3630 | 1994 } |
1995 | |
3952 | 1996 /* |
4617 | 1997 * This is called when a buddy sends us some file info. This happens when they |
1998 * are sending a file to you, and you have just established a connection to them. | |
4650 | 1999 * You should send them the exact same info except use the real cookie. We also |
4617 | 2000 * get like totally ready to like, receive the file, kay? |
3952 | 2001 */ |
4617 | 2002 static int oscar_sendfile_prompt(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 2003 GaimConnection *gc = sess->aux_data; |
4617 | 2004 struct oscar_data *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2005 GaimXfer *xfer; |
5146 | 2006 struct aim_oft_info *oft_info; |
4617 | 2007 va_list ap; |
2008 aim_conn_t *conn; | |
2009 fu8_t *cookie; | |
2010 struct aim_fileheader_t *fh; | |
4656 | 2011 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2012 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2013 "AAA - in oscar_sendfile_prompt\n"); |
4617 | 2014 va_start(ap, fr); |
2015 conn = va_arg(ap, aim_conn_t *); | |
2016 cookie = va_arg(ap, fu8_t *); | |
2017 fh = va_arg(ap, struct aim_fileheader_t *); | |
2018 va_end(ap); | |
2019 | |
2020 if (!(xfer = oscar_find_xfer_by_conn(od->file_transfers, conn))) | |
2021 return 1; | |
2022 | |
5146 | 2023 if (!(oft_info = xfer->data)) |
4617 | 2024 return 1; |
2025 | |
2026 /* We want to stop listening with a normal thingy */ | |
2027 gaim_input_remove(xfer->watcher); | |
2028 xfer->watcher = 0; | |
2029 | |
5146 | 2030 /* They sent us some information about the file they're sending */ |
2031 memcpy(&oft_info->fh, fh, sizeof(*fh)); | |
2032 | |
2033 /* Fill in the cookie */ | |
2034 memcpy(&oft_info->fh.bcookie, oft_info->cookie, 8); | |
2035 | |
4617 | 2036 /* XXX - convert the name from UTF-8 to UCS-2 if necessary, and pass the encoding to the call below */ |
5146 | 2037 aim_oft_sendheader(oft_info->sess, AIM_CB_OFT_ACK, oft_info); |
4617 | 2038 gaim_xfer_start(xfer, xfer->fd, NULL, 0); |
2039 | |
2040 return 0; | |
3630 | 2041 } |
2042 | |
3952 | 2043 /* |
4657 | 2044 * We are sending a file to someone else. They have just acknowledged our |
4617 | 2045 * prompt, so we want to start sending data like there's no tomorrow. |
3952 | 2046 */ |
4617 | 2047 static int oscar_sendfile_ack(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 2048 GaimConnection *gc = sess->aux_data; |
4617 | 2049 struct oscar_data *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2050 GaimXfer *xfer; |
4617 | 2051 va_list ap; |
2052 aim_conn_t *conn; | |
2053 fu8_t *cookie; | |
2054 struct aim_fileheader_t *fh; | |
4656 | 2055 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2056 gaim_debug(GAIM_DEBUG_INFO, "oscar", "AAA - in oscar_sendfile_ack\n"); |
4617 | 2057 va_start(ap, fr); |
2058 conn = va_arg(ap, aim_conn_t *); | |
2059 cookie = va_arg(ap, fu8_t *); | |
2060 fh = va_arg(ap, struct aim_fileheader_t *); | |
2061 va_end(ap); | |
2062 | |
2063 if (!(xfer = oscar_find_xfer_by_cookie(od->file_transfers, cookie))) | |
2064 return 1; | |
2065 | |
4656 | 2066 /* We want to stop listening with a normal thingy */ |
2067 gaim_input_remove(xfer->watcher); | |
2068 xfer->watcher = 0; | |
2069 | |
4617 | 2070 gaim_xfer_start(xfer, xfer->fd, NULL, 0); |
2071 | |
2072 return 0; | |
3630 | 2073 } |
4617 | 2074 |
2075 /* | |
2076 * We just sent a file to someone. They said they got it and everything, | |
2077 * so we can close our direct connection and what not. | |
2078 */ | |
2079 static int oscar_sendfile_done(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 2080 GaimConnection *gc = sess->aux_data; |
4617 | 2081 struct oscar_data *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2082 GaimXfer *xfer; |
4617 | 2083 va_list ap; |
2084 aim_conn_t *conn; | |
2085 fu8_t *cookie; | |
2086 struct aim_fileheader_t *fh; | |
4656 | 2087 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2088 gaim_debug(GAIM_DEBUG_INFO, "oscar", "AAA - in oscar_sendfile_done\n"); |
4617 | 2089 va_start(ap, fr); |
2090 conn = va_arg(ap, aim_conn_t *); | |
2091 cookie = va_arg(ap, fu8_t *); | |
2092 fh = va_arg(ap, struct aim_fileheader_t *); | |
2093 va_end(ap); | |
2094 | |
2095 if (!(xfer = oscar_find_xfer_by_conn(od->file_transfers, conn))) | |
2096 return 1; | |
2097 | |
4656 | 2098 xfer->fd = conn->fd; |
4617 | 2099 gaim_xfer_end(xfer); |
2100 | |
2101 return 0; | |
2102 } | |
3630 | 2103 |
4244 | 2104 static void accept_direct_im(struct ask_direct *d) { |
5575 | 2105 GaimConnection *gc = d->gc; |
4244 | 2106 struct oscar_data *od; |
2086 | 2107 struct direct_im *dim; |
2945 | 2108 char *host; int port = 4443; |
4366 | 2109 int i, rc; |
2086 | 2110 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2111 if (!g_list_find(gaim_connections_get_all(), gc)) { |
4244 | 2112 cancel_direct_im(d); |
2113 return; | |
2114 } | |
2115 | |
2116 od = (struct oscar_data *)gc->proto_data; | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2117 gaim_debug(GAIM_DEBUG_INFO, "oscar", "Accepted DirectIM.\n"); |
2086 | 2118 |
2119 dim = find_direct_im(od, d->sn); | |
2120 if (dim) { | |
3730 | 2121 cancel_direct_im(d); /* 40 */ |
4244 | 2122 return; |
2086 | 2123 } |
2124 dim = g_new0(struct direct_im, 1); | |
2125 dim->gc = d->gc; | |
2126 g_snprintf(dim->name, sizeof dim->name, "%s", d->sn); | |
2127 | |
4617 | 2128 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
|
2129 if (!dim->conn) { |
2086 | 2130 g_free(dim); |
3730 | 2131 cancel_direct_im(d); |
4244 | 2132 return; |
2086 | 2133 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2134 |
2086 | 2135 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, |
4617 | 2136 gaim_odc_incoming, 0); |
2086 | 2137 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, |
4617 | 2138 gaim_odc_typing, 0); |
3033 | 2139 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER, |
6982 | 2140 gaim_odc_update_ui, 0); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2141 for (i = 0; i < (int)strlen(d->ip); i++) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2142 if (d->ip[i] == ':') { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2143 port = atoi(&(d->ip[i+1])); |
2086 | 2144 break; |
2145 } | |
2146 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2147 host = g_strndup(d->ip, i); |
2086 | 2148 dim->conn->status |= AIM_CONN_STATUS_INPROGRESS; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2149 rc = gaim_proxy_connect(gc->account, host, port, oscar_odc_callback, dim); |
2086 | 2150 g_free(host); |
4366 | 2151 if (rc < 0) { |
2086 | 2152 aim_conn_kill(od->sess, &dim->conn); |
2153 g_free(dim); | |
3730 | 2154 cancel_direct_im(d); |
4244 | 2155 return; |
2086 | 2156 } |
2157 | |
3730 | 2158 cancel_direct_im(d); |
2086 | 2159 |
4244 | 2160 return; |
2086 | 2161 } |
2162 | |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2163 static int incomingim_chan1(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch1_args *args) { |
5575 | 2164 GaimConnection *gc = sess->aux_data; |
3600 | 2165 struct oscar_data *od = gc->proto_data; |
4738 | 2166 char *tmp; |
6622 | 2167 GaimImFlags flags = 0; |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
2168 gsize convlen; |
3659 | 2169 GError *err = NULL; |
4738 | 2170 struct buddyinfo *bi; |
5575 | 2171 const char *iconfile; |
4738 | 2172 |
2173 bi = g_hash_table_lookup(od->buddyinfo, normalize(userinfo->sn)); | |
2174 if (!bi) { | |
2175 bi = g_new0(struct buddyinfo, 1); | |
2176 g_hash_table_insert(od->buddyinfo, g_strdup(normalize(userinfo->sn)), bi); | |
2177 } | |
2273
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
2178 |
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
2179 if (args->icbmflags & AIM_IMFLAGS_AWAY) |
6622 | 2180 flags |= GAIM_IM_AUTO_RESP; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2181 |
4738 | 2182 if (args->icbmflags & AIM_IMFLAGS_TYPINGNOT) |
2183 bi->typingnot = TRUE; | |
2184 else | |
2185 bi->typingnot = FALSE; | |
2186 | |
4380 | 2187 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
|
2188 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2189 "%s has an icon\n", userinfo->sn); |
4738 | 2190 if ((args->iconlen != bi->ico_len) || (args->iconsum != bi->ico_csum) || (args->iconstamp != bi->ico_time)) { |
2191 bi->ico_need = TRUE; | |
2192 bi->ico_len = args->iconlen; | |
2193 bi->ico_csum = args->iconsum; | |
2194 bi->ico_time = args->iconstamp; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2195 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2196 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2197 |
5575 | 2198 if ((iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc))) && |
2199 (args->icbmflags & AIM_IMFLAGS_BUDDYREQ)) { | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2200 FILE *file; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2201 struct stat st; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2202 |
5575 | 2203 if (!stat(iconfile, &st)) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2204 char *buf = g_malloc(st.st_size); |
5575 | 2205 file = fopen(iconfile, "rb"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2206 if (file) { |
2603
24664768a739
[gaim-migrate @ 2616]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2597
diff
changeset
|
2207 int len = fread(buf, 1, st.st_size, file); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2208 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2209 "Sending buddy icon to %s (%d bytes, " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2210 "%lu reported)\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2211 userinfo->sn, len, st.st_size); |
4617 | 2212 aim_im_sendch2_icon(sess, userinfo->sn, buf, st.st_size, |
2213 st.st_mtime, aimutil_iconsum(buf, st.st_size)); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2214 fclose(file); |
2336
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
2215 } else |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2216 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2217 "Can't open buddy icon file!\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2218 g_free(buf); |
2336
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
2219 } else |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2220 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2221 "Can't stat buddy icon file!\n"); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2222 } |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2223 |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2224 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2225 "Character set is %hu %hu\n", args->charset, args->charsubset); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2226 if (args->icbmflags & AIM_IMFLAGS_UNICODE) { |
3722 | 2227 /* This message is marked as UNICODE, so we have to |
2228 * convert it to utf-8 before handing it to the gaim core. | |
2229 * This conversion should *never* fail, if it does it | |
2230 * means that either the incoming ICBM is corrupted or | |
4662 | 2231 * there is something we don't understand about it. |
2232 * For the record, AIM Unicode is big-endian UCS-2 */ | |
2233 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2234 gaim_debug(GAIM_DEBUG_INFO, "oscar", "Received UNICODE IM\n"); |
4121 | 2235 |
2236 if (!args->msg || !args->msglen) | |
2237 return 1; | |
4641 | 2238 |
3659 | 2239 tmp = g_convert(args->msg, args->msglen, "UTF-8", "UCS-2BE", NULL, &convlen, &err); |
2240 if (err) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2241 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2242 "Unicode IM conversion: %s\n", err->message); |
3659 | 2243 tmp = strdup(_("(There was an error receiving this message)")); |
4800 | 2244 g_error_free(err); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2245 } |
3722 | 2246 } else { |
3850 | 2247 /* This will get executed for both AIM_IMFLAGS_ISO_8859_1 and |
3722 | 2248 * unflagged messages, which are ASCII. That's OK because |
2249 * ASCII is a strict subset of ISO-8859-1; this should | |
2250 * help with compatibility with old, broken versions of | |
2251 * gaim (everything before 0.60) and other broken clients | |
2252 * that will happily send ISO-8859-1 without marking it as | |
2253 * such */ | |
4662 | 2254 if (args->icbmflags & AIM_IMFLAGS_ISO_8859_1) |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2255 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2256 "Received ISO-8859-1 IM\n"); |
4121 | 2257 |
2258 if (!args->msg || !args->msglen) | |
2259 return 1; | |
2260 | |
3659 | 2261 tmp = g_convert(args->msg, args->msglen, "UTF-8", "ISO-8859-1", NULL, &convlen, &err); |
2262 if (err) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2263 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2264 "ISO-8859-1 IM conversion: %s\n", err->message); |
3659 | 2265 tmp = strdup(_("(There was an error receiving this message)")); |
4800 | 2266 g_error_free(err); |
3659 | 2267 } |
3642 | 2268 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2269 |
4333 | 2270 /* strip_linefeed(tmp); */ |
6982 | 2271 serv_got_im(gc, userinfo->sn, tmp, flags, time(NULL)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2272 g_free(tmp); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2273 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2274 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2275 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2276 |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2277 static int incomingim_chan2(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args) { |
5575 | 2278 GaimConnection *gc = sess->aux_data; |
4617 | 2279 struct oscar_data *od = gc->proto_data; |
5575 | 2280 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
|
2281 |
4121 | 2282 if (!args) |
2283 return 0; | |
4194 | 2284 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2285 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2286 "rendezvous with %s, status is %hu\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2287 userinfo->sn, args->status); |
2869 | 2288 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2289 if (args->reqclass & AIM_CAPS_CHAT) { |
4121 | 2290 char *name; |
5234 | 2291 GHashTable *components; |
2292 | |
4121 | 2293 if (!args->info.chat.roominfo.name || !args->info.chat.roominfo.exchange || !args->msg) |
2294 return 1; | |
5234 | 2295 components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, |
2296 g_free); | |
4121 | 2297 name = extract_name(args->info.chat.roominfo.name); |
5234 | 2298 g_hash_table_replace(components, g_strdup("room"), g_strdup(name ? name : args->info.chat.roominfo.name)); |
2299 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
|
2300 serv_got_chat_invite(gc, |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2301 name ? name : args->info.chat.roominfo.name, |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2302 userinfo->sn, |
6059 | 2303 args->msg, |
5234 | 2304 components); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2305 if (name) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2306 g_free(name); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2307 } else if (args->reqclass & AIM_CAPS_SENDFILE) { |
4617 | 2308 /* BBB */ |
2309 if (args->status == AIM_RENDEZVOUS_PROPOSE) { | |
2310 /* Someone wants to send a file (or files) to us */ | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2311 GaimXfer *xfer; |
5146 | 2312 struct aim_oft_info *oft_info; |
2313 | |
2314 if (!args->cookie || !args->port || !args->verifiedip || | |
2315 !args->info.sendfile.filename || !args->info.sendfile.totsize || | |
4656 | 2316 !args->info.sendfile.totfiles || !args->reqclass) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2317 gaim_debug(GAIM_DEBUG_WARNING, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2318 "%s tried to send you a file with incomplete " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2319 "information.\n", userinfo->sn); |
5146 | 2320 if (args->proxyip) |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2321 gaim_debug(GAIM_DEBUG_WARNING, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2322 "IP for a proxy server was given. Gaim " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2323 "does not support this yet.\n"); |
4617 | 2324 return 1; |
4656 | 2325 } |
4617 | 2326 |
2327 if (args->info.sendfile.subtype == AIM_OFT_SUBTYPE_SEND_DIR) { | |
2328 /* last char of the ft req is a star, they are sending us a | |
2329 * directory -- remove the star and trailing slash so we dont save | |
2330 * directories that look like 'dirname\*' -- arl */ | |
2331 char *tmp = strrchr(args->info.sendfile.filename, '\\'); | |
2332 if (tmp && (tmp[1] == '*')) { | |
2333 tmp[0] = '\0'; | |
2334 } | |
2335 } | |
2336 | |
2337 /* Build the file transfer handle */ | |
2338 xfer = gaim_xfer_new(gc->account, GAIM_XFER_RECEIVE, userinfo->sn); | |
5163 | 2339 xfer->remote_ip = g_strdup(args->verifiedip); |
5146 | 2340 xfer->remote_port = args->port; |
4617 | 2341 gaim_xfer_set_filename(xfer, args->info.sendfile.filename); |
2342 gaim_xfer_set_size(xfer, args->info.sendfile.totsize); | |
5146 | 2343 |
2344 /* Create the oscar-specific data */ | |
5163 | 2345 oft_info = aim_oft_createinfo(od->sess, args->cookie, userinfo->sn, args->clientip, xfer->remote_port, 0, 0, NULL); |
4898 | 2346 if (args->proxyip) |
5146 | 2347 oft_info->proxyip = g_strdup(args->proxyip); |
4898 | 2348 if (args->verifiedip) |
5146 | 2349 oft_info->verifiedip = g_strdup(args->verifiedip); |
2350 xfer->data = oft_info; | |
4617 | 2351 |
2352 /* Setup our I/O op functions */ | |
2353 gaim_xfer_set_init_fnc(xfer, oscar_xfer_init); | |
2354 gaim_xfer_set_start_fnc(xfer, oscar_xfer_start); | |
2355 gaim_xfer_set_end_fnc(xfer, oscar_xfer_end); | |
4675
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
2356 gaim_xfer_set_cancel_send_fnc(xfer, oscar_xfer_cancel_send); |
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
2357 gaim_xfer_set_cancel_recv_fnc(xfer, oscar_xfer_cancel_recv); |
4617 | 2358 gaim_xfer_set_ack_fnc(xfer, oscar_xfer_ack); |
2359 | |
2360 /* | |
2361 * XXX - Should do something with args->msg, args->encoding, and args->language | |
2362 * probably make it apply to all ch2 messages. | |
3752 | 2363 */ |
4617 | 2364 |
2365 /* Keep track of this transfer for later */ | |
2366 od->file_transfers = g_slist_append(od->file_transfers, xfer); | |
2367 | |
2368 /* Now perform the request */ | |
2369 gaim_xfer_request(xfer); | |
2370 } else if (args->status == AIM_RENDEZVOUS_CANCEL) { | |
2371 /* The other user wants to cancel a file transfer */ | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2372 GaimXfer *xfer; |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2373 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2374 "AAA - File transfer canceled by remote user\n"); |
4617 | 2375 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
|
2376 gaim_xfer_cancel_remote(xfer); |
4617 | 2377 } else if (args->status == AIM_RENDEZVOUS_ACCEPT) { |
2378 /* | |
2379 * This gets sent by the receiver of a file | |
2380 * as they connect directly to us. If we don't | |
2381 * get this, then maybe a third party connected | |
2382 * to us, and we shouldn't send them anything. | |
2383 */ | |
2384 } else { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2385 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2386 "unknown rendezvous status!\n"); |
3630 | 2387 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2388 } else if (args->reqclass & AIM_CAPS_GETFILE) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2389 } else if (args->reqclass & AIM_CAPS_VOICE) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2390 } else if (args->reqclass & AIM_CAPS_BUDDYICON) { |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
2391 gaim_buddy_icons_set_for_user(gaim_connection_get_account(gc), |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
2392 userinfo->sn, args->info.icon.icon, |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
2393 args->info.icon.length); |
6871 | 2394 } else if (args->reqclass & AIM_CAPS_DIRECTIM) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2395 struct ask_direct *d = g_new0(struct ask_direct, 1); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2396 char buf[256]; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2397 |
4212 | 2398 if (!args->verifiedip) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2399 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2400 "directim kill blocked (%s)\n", userinfo->sn); |
4650 | 2401 return 1; |
4212 | 2402 } |
2403 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2404 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2405 "%s received direct im request from %s (%s)\n", |
5575 | 2406 username, userinfo->sn, args->verifiedip); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2407 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2408 d->gc = gc; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2409 d->sn = g_strdup(userinfo->sn); |
2869 | 2410 strncpy(d->ip, args->verifiedip, sizeof(d->ip)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2411 memcpy(d->cookie, args->cookie, 8); |
5575 | 2412 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
|
2413 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2414 gaim_request_action(gc, NULL, buf, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2415 _("This requires a direct connection between " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2416 "the two computers and is necessary for IM " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2417 "Images. Because your IP address will be " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2418 "revealed, this may be considered a privacy " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2419 "risk."), 0, d, 2, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2420 _("Connect"), G_CALLBACK(accept_direct_im), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2421 _("Cancel"), G_CALLBACK(cancel_direct_im)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2422 } else { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2423 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2424 "Unknown reqclass %hu\n", args->reqclass); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2425 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2426 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2427 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2428 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2429 |
3453 | 2430 /* |
4230 | 2431 * Authorization Functions |
2432 * Most of these are callbacks from dialogs. They're used by both | |
2433 * methods of authorization (SSI and old-school channel 4 ICBM) | |
3453 | 2434 */ |
4269 | 2435 /* When you ask other people for authorization */ |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2436 static void gaim_auth_request(struct name_data *data, char *msg) { |
5575 | 2437 GaimConnection *gc = data->gc; |
4244 | 2438 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2439 if (g_list_find(gaim_connections_get_all(), gc)) { |
4244 | 2440 struct oscar_data *od = gc->proto_data; |
6695 | 2441 GaimBuddy *buddy = gaim_find_buddy(gc->account, data->name); |
2442 GaimGroup *group = gaim_find_buddys_group(buddy); | |
4244 | 2443 if (buddy && group) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2444 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2445 "ssi: adding buddy %s to group %s\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2446 buddy->name, group->name); |
4889 | 2447 aim_ssi_sendauthrequest(od->sess, data->name, msg ? msg : _("Please authorize me so I can add you to my buddy list.")); |
4269 | 2448 if (!aim_ssi_itemlist_finditem(od->sess->ssi.local, group->name, buddy->name, AIM_SSI_TYPE_BUDDY)) |
4889 | 2449 aim_ssi_addbuddy(od->sess, buddy->name, group->name, gaim_get_buddy_alias_only(buddy), NULL, NULL, 1); |
4244 | 2450 } |
4230 | 2451 } |
4337 | 2452 } |
2453 | |
2454 static void gaim_auth_request_msgprompt(struct name_data *data) { | |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2455 gaim_request_input(data->gc, NULL, _("Authorization Request Message:"), |
6035
8c44020a958e
[gaim-migrate @ 6485]
Christian Hammond <chipx86@chipx86.com>
parents:
6029
diff
changeset
|
2456 NULL, _("Please authorize me!"), TRUE, FALSE, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2457 _("OK"), G_CALLBACK(gaim_auth_request), |
5836 | 2458 _("Cancel"), G_CALLBACK(oscar_free_name_data), |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2459 data); |
4230 | 2460 } |
2461 | |
2462 static void gaim_auth_dontrequest(struct name_data *data) { | |
5575 | 2463 GaimConnection *gc = data->gc; |
4244 | 2464 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2465 if (g_list_find(gaim_connections_get_all(), gc)) { |
4244 | 2466 /* struct oscar_data *od = gc->proto_data; */ |
2467 /* XXX - Take the buddy out of our buddy list */ | |
2468 } | |
2469 | |
5836 | 2470 oscar_free_name_data(data); |
4230 | 2471 } |
2472 | |
5575 | 2473 static void gaim_auth_sendrequest(GaimConnection *gc, const char *name) { |
4269 | 2474 struct name_data *data = g_new(struct name_data, 1); |
6695 | 2475 GaimBuddy *buddy; |
4269 | 2476 gchar *dialog_msg, *nombre; |
2477 | |
4687 | 2478 buddy = gaim_find_buddy(gc->account, name); |
2479 if (buddy && (gaim_get_buddy_alias_only(buddy))) | |
2480 nombre = g_strdup_printf("%s (%s)", name, gaim_get_buddy_alias_only(buddy)); | |
4269 | 2481 else |
4830 | 2482 nombre = NULL; |
2483 | |
2484 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 | 2485 data->gc = gc; |
2486 data->name = g_strdup(name); | |
2487 data->nick = NULL; | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2488 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2489 gaim_request_action(gc, NULL, _("Request Authorization"), dialog_msg, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2490 0, data, 2, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2491 _("Request Authorization"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2492 G_CALLBACK(gaim_auth_request_msgprompt), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2493 _("Cancel"), G_CALLBACK(gaim_auth_dontrequest)); |
4269 | 2494 |
2495 g_free(dialog_msg); | |
2496 g_free(nombre); | |
2497 } | |
2498 | |
4230 | 2499 /* When other people ask you for authorization */ |
2500 static void gaim_auth_grant(struct name_data *data) { | |
5575 | 2501 GaimConnection *gc = data->gc; |
4244 | 2502 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2503 if (g_list_find(gaim_connections_get_all(), gc)) { |
4244 | 2504 struct oscar_data *od = gc->proto_data; |
4236 | 2505 #ifdef NOSSI |
6695 | 2506 GaimBuddy *buddy; |
4244 | 2507 gchar message; |
2508 message = 0; | |
4687 | 2509 buddy = gaim_find_buddy(gc->account, data->name); |
4617 | 2510 aim_im_sendch4(od->sess, data->name, AIM_ICQMSG_AUTHGRANTED, &message); |
4687 | 2511 show_got_added(gc, NULL, data->name, (buddy ? gaim_get_buddy_alias_only(buddy) : NULL), NULL); |
4230 | 2512 #else |
4889 | 2513 aim_ssi_sendauthreply(od->sess, data->name, 0x01, NULL); |
4230 | 2514 #endif |
4244 | 2515 } |
2516 | |
5836 | 2517 oscar_free_name_data(data); |
3141 | 2518 } |
2519 | |
4230 | 2520 /* When other people ask you for authorization */ |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2521 static void gaim_auth_dontgrant(struct name_data *data, char *msg) { |
5575 | 2522 GaimConnection *gc = data->gc; |
4244 | 2523 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2524 if (g_list_find(gaim_connections_get_all(), gc)) { |
4244 | 2525 struct oscar_data *od = gc->proto_data; |
4230 | 2526 #ifdef NOSSI |
4617 | 2527 aim_im_sendch4(od->sess, data->name, AIM_ICQMSG_AUTHDENIED, msg ? msg : _("No reason given.")); |
4230 | 2528 #else |
4889 | 2529 aim_ssi_sendauthreply(od->sess, data->name, 0x00, msg ? msg : _("No reason given.")); |
4230 | 2530 #endif |
4244 | 2531 } |
4337 | 2532 } |
2533 | |
2534 static void gaim_auth_dontgrant_msgprompt(struct name_data *data) { | |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2535 gaim_request_input(data->gc, NULL, _("Authorization Denied Message:"), |
6035
8c44020a958e
[gaim-migrate @ 6485]
Christian Hammond <chipx86@chipx86.com>
parents:
6029
diff
changeset
|
2536 NULL, _("No reason given."), TRUE, FALSE, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2537 _("OK"), G_CALLBACK(gaim_auth_dontgrant), |
5836 | 2538 _("Cancel"), G_CALLBACK(oscar_free_name_data), |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2539 data); |
3141 | 2540 } |
2541 | |
4230 | 2542 /* When someone sends you contacts */ |
2543 static void gaim_icq_contactadd(struct name_data *data) { | |
5575 | 2544 GaimConnection *gc = data->gc; |
4244 | 2545 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2546 if (g_list_find(gaim_connections_get_all(), gc)) { |
4244 | 2547 show_add_buddy(gc, data->name, NULL, data->nick); |
2548 } | |
2549 | |
5836 | 2550 oscar_free_name_data(data); |
3453 | 2551 } |
2552 | |
4075 | 2553 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 | 2554 GaimConnection *gc = sess->aux_data; |
4076 | 2555 gchar **msg1, **msg2; |
2556 GError *err = NULL; | |
6051 | 2557 int i, numtoks; |
4076 | 2558 |
4121 | 2559 if (!args->type || !args->msg || !args->uin) |
2560 return 1; | |
4194 | 2561 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2562 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2563 "Received a channel 4 message of type 0x%02hhx.\n", args->type); |
4076 | 2564 |
2565 /* Split up the message at the delimeter character, then convert each string to UTF-8 */ | |
4173 | 2566 msg1 = g_strsplit(args->msg, "\376", 0); |
6051 | 2567 for (numtoks=0; msg1[numtoks]; numtoks++); |
2568 msg2 = (gchar **)g_malloc((numtoks+1)*sizeof(gchar *)); | |
4076 | 2569 for (i=0; msg1[i]; i++) { |
2570 strip_linefeed(msg1[i]); | |
2571 msg2[i] = g_convert(msg1[i], strlen(msg1[i]), "UTF-8", "ISO-8859-1", NULL, NULL, &err); | |
4800 | 2572 if (err) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2573 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2574 "Error converting a string from ISO-8859-1 to " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2575 "UTF-8 in oscar ICBM channel 4 parsing\n"); |
4800 | 2576 g_error_free(err); |
2577 } | |
4076 | 2578 } |
2579 msg2[i] = NULL; | |
2580 | |
3952 | 2581 switch (args->type) { |
4173 | 2582 case 0x01: { /* MacICQ message or basic offline message */ |
4076 | 2583 if (i >= 1) { |
5556 | 2584 gchar *uin = g_strdup_printf("%u", args->uin); |
4076 | 2585 if (t) { /* This is an offline message */ |
2586 /* I think this timestamp is in UTC, or something */ | |
6982 | 2587 serv_got_im(gc, uin, msg2[0], 0, t); |
4076 | 2588 } else { /* This is a message from MacICQ/Miranda */ |
6982 | 2589 serv_got_im(gc, uin, msg2[0], 0, time(NULL)); |
4076 | 2590 } |
2591 g_free(uin); | |
4075 | 2592 } |
3316 | 2593 } break; |
2594 | |
4173 | 2595 case 0x04: { /* Someone sent you a URL */ |
4076 | 2596 if (i >= 2) { |
5556 | 2597 gchar *uin = g_strdup_printf("%u", args->uin); |
4076 | 2598 gchar *message = g_strdup_printf("<A HREF=\"%s\">%s</A>", msg2[1], msg2[0]); |
6982 | 2599 serv_got_im(gc, uin, message, 0, time(NULL)); |
3453 | 2600 g_free(uin); |
2601 g_free(message); | |
2602 } | |
2603 } break; | |
2604 | |
4173 | 2605 case 0x06: { /* Someone requested authorization */ |
4076 | 2606 if (i >= 6) { |
4230 | 2607 struct name_data *data = g_new(struct name_data, 1); |
5556 | 2608 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
|
2609 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
5556 | 2610 "Received an authorization request from UIN %u\n", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2611 args->uin); |
4076 | 2612 data->gc = gc; |
5556 | 2613 data->name = g_strdup_printf("%u", args->uin); |
4230 | 2614 data->nick = NULL; |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2615 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2616 gaim_request_action(gc, NULL, _("Authorization Request"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2617 dialog_msg, 0, data, 2, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2618 _("Authorize"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2619 G_CALLBACK(gaim_auth_grant), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2620 _("Deny"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2621 G_CALLBACK(gaim_auth_dontgrant_msgprompt)); |
4076 | 2622 g_free(dialog_msg); |
2623 } | |
3141 | 2624 } break; |
2625 | |
4173 | 2626 case 0x07: { /* Someone has denied you authorization */ |
4076 | 2627 if (i >= 1) { |
5556 | 2628 gchar *dialog_msg = g_strdup_printf(_("The user %u has denied your request to add them to your contact list for the following reason:\n%s"), args->uin, msg2[0] ? msg2[0] : _("No reason given.")); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2629 gaim_notify_info(gc, NULL, _("ICQ authorization denied."), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2630 dialog_msg); |
4076 | 2631 g_free(dialog_msg); |
2632 } | |
3141 | 2633 } break; |
2634 | |
4173 | 2635 case 0x08: { /* Someone has granted you authorization */ |
5556 | 2636 gchar *dialog_msg = g_strdup_printf(_("The user %u has granted your request to add them to your contact list."), args->uin); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2637 gaim_notify_info(gc, NULL, "ICQ authorization accepted.", |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2638 dialog_msg); |
3141 | 2639 g_free(dialog_msg); |
2640 } break; | |
2641 | |
4333 | 2642 case 0x09: { /* Message from the Godly ICQ server itself, I think */ |
2643 if (i >= 5) { | |
2644 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
|
2645 gaim_notify_info(gc, NULL, "ICQ Server Message", dialog_msg); |
4333 | 2646 g_free(dialog_msg); |
2647 } | |
2648 } break; | |
2649 | |
4173 | 2650 case 0x0d: { /* Someone has sent you a pager message from http://www.icq.com/your_uin */ |
4076 | 2651 if (i >= 6) { |
4194 | 2652 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
|
2653 gaim_notify_info(gc, NULL, "ICQ Page", dialog_msg); |
4076 | 2654 g_free(dialog_msg); |
2655 } | |
4075 | 2656 } break; |
2657 | |
4173 | 2658 case 0x0e: { /* Someone has emailed you at your_uin@pager.icq.com */ |
4076 | 2659 if (i >= 6) { |
4308 | 2660 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
|
2661 gaim_notify_info(gc, NULL, "ICQ Email", dialog_msg); |
4076 | 2662 g_free(dialog_msg); |
2663 } | |
4075 | 2664 } break; |
2665 | |
4173 | 2666 case 0x12: { |
3141 | 2667 /* Ack for authorizing/denying someone. Or possibly an ack for sending any system notice */ |
4173 | 2668 /* Someone added you to their contact list? */ |
3141 | 2669 } break; |
2670 | |
4173 | 2671 case 0x13: { /* Someone has sent you some ICQ contacts */ |
3453 | 2672 int i, num; |
2673 gchar **text; | |
4173 | 2674 text = g_strsplit(args->msg, "\376", 0); |
3453 | 2675 if (text) { |
2676 num = 0; | |
2677 for (i=0; i<strlen(text[0]); i++) | |
2678 num = num*10 + text[0][i]-48; | |
2679 for (i=0; i<num; i++) { | |
4230 | 2680 struct name_data *data = g_new(struct name_data, 1); |
5556 | 2681 gchar *message = g_strdup_printf(_("ICQ user %u has sent you a contact: %s (%s)"), args->uin, text[i*2+2], text[i*2+1]); |
3453 | 2682 data->gc = gc; |
4790 | 2683 data->name = g_strdup(text[i*2+1]); |
2684 data->nick = g_strdup(text[i*2+2]); | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2685 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2686 gaim_request_action(gc, NULL, message, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2687 _("Do you want to add this contact " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2688 "to your Buddy List?"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2689 0, data, 2, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2690 _("Add"), G_CALLBACK(gaim_icq_contactadd), |
5836 | 2691 _("Decline"), G_CALLBACK(oscar_free_name_data)); |
3453 | 2692 g_free(message); |
2693 } | |
2694 g_strfreev(text); | |
2695 } | |
2696 } break; | |
2697 | |
4173 | 2698 case 0x1a: { /* Someone has sent you a greeting card or requested contacts? */ |
3453 | 2699 /* This is boring and silly. */ |
2700 } break; | |
2701 | |
3141 | 2702 default: { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2703 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2704 "Received a channel 4 message of unknown type " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2705 "(type 0x%02hhx).\n", args->type); |
3141 | 2706 } break; |
2707 } | |
2708 | |
4076 | 2709 g_strfreev(msg1); |
2710 g_strfreev(msg2); | |
2711 | |
3141 | 2712 return 1; |
2713 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2714 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2715 static int gaim_parse_incoming_im(aim_session_t *sess, aim_frame_t *fr, ...) { |
4200 | 2716 fu16_t channel; |
2717 int ret = 0; | |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2718 aim_userinfo_t *userinfo; |
2086 | 2719 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2720 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2721 va_start(ap, fr); |
4200 | 2722 channel = (fu16_t)va_arg(ap, unsigned int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2723 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 2724 |
3141 | 2725 switch (channel) { |
2726 case 1: { /* standard message */ | |
2727 struct aim_incomingim_ch1_args *args; | |
2728 args = va_arg(ap, struct aim_incomingim_ch1_args *); | |
2729 ret = incomingim_chan1(sess, fr->conn, userinfo, args); | |
2730 } break; | |
2731 | |
2732 case 2: { /* rendevous */ | |
2733 struct aim_incomingim_ch2_args *args; | |
2734 args = va_arg(ap, struct aim_incomingim_ch2_args *); | |
2735 ret = incomingim_chan2(sess, fr->conn, userinfo, args); | |
2736 } break; | |
2737 | |
2738 case 4: { /* ICQ */ | |
2739 struct aim_incomingim_ch4_args *args; | |
2740 args = va_arg(ap, struct aim_incomingim_ch4_args *); | |
4075 | 2741 ret = incomingim_chan4(sess, fr->conn, userinfo, args, 0); |
3141 | 2742 } break; |
2743 | |
2744 default: { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2745 gaim_debug(GAIM_DEBUG_WARNING, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2746 "ICBM received on unsupported channel (channel " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2747 "0x%04hx).", channel); |
3141 | 2748 } break; |
2086 | 2749 } |
2750 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2751 va_end(ap); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2752 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2753 return ret; |
2086 | 2754 } |
2755 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2756 static int gaim_parse_misses(aim_session_t *sess, aim_frame_t *fr, ...) { |
5420 | 2757 char *buf; |
2086 | 2758 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2759 fu16_t chan, nummissed, reason; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2760 aim_userinfo_t *userinfo; |
2086 | 2761 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2762 va_start(ap, fr); |
4200 | 2763 chan = (fu16_t)va_arg(ap, unsigned int); |
2764 userinfo = va_arg(ap, aim_userinfo_t *); | |
2765 nummissed = (fu16_t)va_arg(ap, unsigned int); | |
2766 reason = (fu16_t)va_arg(ap, unsigned int); | |
2086 | 2767 va_end(ap); |
2768 | |
2769 switch(reason) { | |
5420 | 2770 case 0: /* Invalid (0) */ |
2771 buf = g_strdup_printf( | |
2772 ngettext( | |
4276 | 2773 "You missed %hu message from %s because it was invalid.", |
2774 "You missed %hu messages from %s because they were invalid.", | |
2775 nummissed), | |
4282 | 2776 nummissed, |
2777 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2778 break; |
5420 | 2779 case 1: /* Message too large */ |
2780 buf = g_strdup_printf( | |
2781 ngettext( | |
4276 | 2782 "You missed %hu message from %s because it was too large.", |
2783 "You missed %hu messages from %s because they were too large.", | |
2784 nummissed), | |
4282 | 2785 nummissed, |
2786 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2787 break; |
5420 | 2788 case 2: /* Rate exceeded */ |
2789 buf = g_strdup_printf( | |
2790 ngettext( | |
4276 | 2791 "You missed %hu message from %s because the rate limit has been exceeded.", |
2792 "You missed %hu messages from %s because the rate limit has been exceeded.", | |
2793 nummissed), | |
4282 | 2794 nummissed, |
2795 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2796 break; |
5420 | 2797 case 3: /* Evil Sender */ |
2798 buf = g_strdup_printf( | |
2799 ngettext( | |
4276 | 2800 "You missed %hu message from %s because he/she was too evil.", |
2801 "You missed %hu messages from %s because he/she was too evil.", | |
2802 nummissed), | |
4282 | 2803 nummissed, |
2804 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2805 break; |
5420 | 2806 case 4: /* Evil Receiver */ |
2807 buf = g_strdup_printf( | |
2808 ngettext( | |
4276 | 2809 "You missed %hu message from %s because you are too evil.", |
2810 "You missed %hu messages from %s because you are too evil.", | |
2811 nummissed), | |
4282 | 2812 nummissed, |
2813 userinfo->sn); | |
2086 | 2814 break; |
2815 default: | |
5420 | 2816 buf = g_strdup_printf( |
2817 ngettext( | |
4276 | 2818 "You missed %hu message from %s for an unknown reason.", |
2819 "You missed %hu messages from %s for an unknown reason.", | |
2820 nummissed), | |
4282 | 2821 nummissed, |
2822 userinfo->sn); | |
2086 | 2823 break; |
2824 } | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2825 gaim_notify_error(sess->aux_data, NULL, buf, NULL); |
5420 | 2826 g_free(buf); |
2086 | 2827 |
2828 return 1; | |
2829 } | |
2830 | |
3212 | 2831 static char *gaim_icq_status(int state) { |
2832 /* Make a cute little string that shows the status of the dude or dudet */ | |
2833 if (state & AIM_ICQ_STATE_CHAT) | |
4342 | 2834 return g_strdup_printf(_("Free For Chat")); |
3212 | 2835 else if (state & AIM_ICQ_STATE_DND) |
4342 | 2836 return g_strdup_printf(_("Do Not Disturb")); |
3212 | 2837 else if (state & AIM_ICQ_STATE_OUT) |
4342 | 2838 return g_strdup_printf(_("Not Available")); |
3212 | 2839 else if (state & AIM_ICQ_STATE_BUSY) |
4342 | 2840 return g_strdup_printf(_("Occupied")); |
3212 | 2841 else if (state & AIM_ICQ_STATE_AWAY) |
4342 | 2842 return g_strdup_printf(_("Away")); |
3212 | 2843 else if (state & AIM_ICQ_STATE_WEBAWARE) |
4342 | 2844 return g_strdup_printf(_("Web Aware")); |
3212 | 2845 else if (state & AIM_ICQ_STATE_INVISIBLE) |
4342 | 2846 return g_strdup_printf(_("Invisible")); |
3212 | 2847 else |
4342 | 2848 return g_strdup_printf(_("Online")); |
3212 | 2849 } |
2850 | |
4194 | 2851 static int gaim_parse_clientauto_ch2(aim_session_t *sess, const char *who, fu16_t reason, const char *cookie) { |
5575 | 2852 GaimConnection *gc = sess->aux_data; |
4617 | 2853 struct oscar_data *od = gc->proto_data; |
2854 | |
2855 /* BBB */ | |
3630 | 2856 switch (reason) { |
4151 | 2857 case 3: { /* Decline sendfile. */ |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2858 GaimXfer *xfer; |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2859 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2860 "AAA - Other user declined file transfer\n"); |
4617 | 2861 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
|
2862 gaim_xfer_cancel_remote(xfer); |
4151 | 2863 } break; |
2864 | |
2865 default: { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2866 gaim_debug(GAIM_DEBUG_WARNING, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2867 "Received an unknown rendezvous client auto-response " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2868 "from %s. Type 0x%04hx\n", who, reason); |
4151 | 2869 } |
3630 | 2870 |
2871 } | |
2872 | |
2873 return 0; | |
2874 } | |
2875 | |
4194 | 2876 static int gaim_parse_clientauto_ch4(aim_session_t *sess, char *who, fu16_t reason, fu32_t state, char *msg) { |
5575 | 2877 GaimConnection *gc = sess->aux_data; |
4151 | 2878 |
2879 switch(reason) { | |
2880 case 0x0003: { /* Reply from an ICQ status message request */ | |
2881 char *status_msg = gaim_icq_status(state); | |
2882 char *dialog_msg, **splitmsg; | |
2883 struct oscar_data *od = gc->proto_data; | |
2884 GSList *l = od->evilhack; | |
2885 gboolean evilhack = FALSE; | |
2886 | |
2887 /* Split at (carriage return/newline)'s, then rejoin later with BRs between. */ | |
2888 splitmsg = g_strsplit(msg, "\r\n", 0); | |
2889 | |
2890 /* If who is in od->evilhack, then we're just getting the away message, otherwise this | |
2891 * will just get appended to the info box (which is already showing). */ | |
2892 while (l) { | |
2893 char *x = l->data; | |
2894 if (!strcmp(x, normalize(who))) { | |
2895 evilhack = TRUE; | |
2896 g_free(x); | |
2897 od->evilhack = g_slist_remove(od->evilhack, x); | |
2898 break; | |
2899 } | |
2900 l = l->next; | |
2901 } | |
2902 | |
2903 if (evilhack) | |
4344 | 2904 dialog_msg = g_strdup_printf(_("<B>UIN:</B> %s<BR><B>Status:</B> %s<HR>%s"), who, status_msg, g_strjoinv("<BR>", splitmsg)); |
4151 | 2905 else |
4344 | 2906 dialog_msg = g_strdup_printf(_("<B>Status:</B> %s<HR>%s"), status_msg, g_strjoinv("<BR>", splitmsg)); |
4151 | 2907 g_show_info_text(gc, who, 2, dialog_msg, NULL); |
2908 | |
2909 g_free(status_msg); | |
2910 g_free(dialog_msg); | |
2911 g_strfreev(splitmsg); | |
2912 } break; | |
2913 | |
2914 default: { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2915 gaim_debug(GAIM_DEBUG_WARNING, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2916 "Received an unknown client auto-response from %s. " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2917 "Type 0x%04hx\n", who, reason); |
4151 | 2918 } break; |
2919 } /* end of switch */ | |
2920 | |
2921 return 0; | |
2922 } | |
2923 | |
3212 | 2924 static int gaim_parse_clientauto(aim_session_t *sess, aim_frame_t *fr, ...) { |
2925 va_list ap; | |
2926 fu16_t chan, reason; | |
2927 char *who; | |
2928 | |
2929 va_start(ap, fr); | |
4200 | 2930 chan = (fu16_t)va_arg(ap, unsigned int); |
3212 | 2931 who = va_arg(ap, char *); |
4200 | 2932 reason = (fu16_t)va_arg(ap, unsigned int); |
3212 | 2933 |
3952 | 2934 if (chan == 0x0002) { /* File transfer declined */ |
3630 | 2935 char *cookie = va_arg(ap, char *); |
4151 | 2936 return gaim_parse_clientauto_ch2(sess, who, reason, cookie); |
3952 | 2937 } else if (chan == 0x0004) { /* ICQ message */ |
4200 | 2938 fu32_t state = 0; |
4151 | 2939 char *msg = NULL; |
2940 if (reason == 0x0003) { | |
4200 | 2941 state = va_arg(ap, fu32_t); |
4151 | 2942 msg = va_arg(ap, char *); |
2943 } | |
2944 return gaim_parse_clientauto_ch4(sess, who, reason, state, msg); | |
2945 } | |
3952 | 2946 |
3212 | 2947 va_end(ap); |
2948 | |
2949 return 1; | |
2950 } | |
2951 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2952 static int gaim_parse_genericerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2953 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2954 fu16_t reason; |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
2955 char *m; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2956 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2957 va_start(ap, fr); |
4199 | 2958 reason = (fu16_t) va_arg(ap, unsigned int); |
2086 | 2959 va_end(ap); |
2960 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2961 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2962 "snac threw error (reason 0x%04hx: %s)\n", reason, |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2963 (reason < msgerrreasonlen) ? msgerrreason[reason] : "unknown"); |
2086 | 2964 |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
2965 m = g_strdup_printf(_("SNAC threw error: %s\n"), |
5411 | 2966 reason < msgerrreasonlen ? _(msgerrreason[reason]) : _("Unknown error")); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2967 gaim_notify_error(sess->aux_data, NULL, m, NULL); |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
2968 g_free(m); |
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
2969 |
2086 | 2970 return 1; |
2971 } | |
2972 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2973 static int gaim_parse_msgerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
4617 | 2974 #if 0 |
5575 | 2975 GaimConnection *gc = sess->aux_data; |
4617 | 2976 struct oscar_data *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2977 GaimXfer *xfer; |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
2978 #endif |
4617 | 2979 va_list ap; |
2980 fu16_t reason; | |
2981 char *data, *buf; | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
2982 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2983 va_start(ap, fr); |
4617 | 2984 reason = (fu16_t)va_arg(ap, unsigned int); |
3752 | 2985 data = va_arg(ap, char *); |
2086 | 2986 va_end(ap); |
2987 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2988 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2989 "Message error with data %s and reason %hu\n", data, reason); |
4617 | 2990 |
2991 /* BBB */ | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
2992 #if 0 |
4617 | 2993 /* If this was a file transfer request, data is a cookie */ |
2994 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
|
2995 gaim_xfer_cancel_remote(xfer); |
3630 | 2996 return 1; |
2997 } | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
2998 #endif |
3630 | 2999 |
4617 | 3000 /* Data is assumed to be the destination sn */ |
3001 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
|
3002 gaim_notify_error(sess->aux_data, NULL, buf, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3003 (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("No reason given.")); |
4617 | 3004 g_free(buf); |
2086 | 3005 |
3006 return 1; | |
3007 } | |
3008 | |
3595 | 3009 static int gaim_parse_mtn(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3010 GaimConnection *gc = sess->aux_data; |
3595 | 3011 va_list ap; |
3012 fu16_t type1, type2; | |
3013 char *sn; | |
3014 | |
3015 va_start(ap, fr); | |
4199 | 3016 type1 = (fu16_t) va_arg(ap, unsigned int); |
3595 | 3017 sn = va_arg(ap, char *); |
4199 | 3018 type2 = (fu16_t) va_arg(ap, unsigned int); |
3595 | 3019 va_end(ap); |
3020 | |
3021 switch (type2) { | |
3022 case 0x0000: { /* Text has been cleared */ | |
3023 serv_got_typing_stopped(gc, sn); | |
3024 } break; | |
3025 | |
3026 case 0x0001: { /* Paused typing */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
3027 serv_got_typing(gc, sn, 0, GAIM_TYPED); |
3595 | 3028 } break; |
3029 | |
3030 case 0x0002: { /* Typing */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
3031 serv_got_typing(gc, sn, 0, GAIM_TYPING); |
3595 | 3032 } break; |
3033 | |
3034 default: { | |
5435 | 3035 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 | 3036 } break; |
3037 } | |
3038 | |
3039 return 1; | |
3040 } | |
3041 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3042 static int gaim_parse_locerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
5420 | 3043 char *buf; |
2086 | 3044 va_list ap; |
5420 | 3045 fu16_t reason; |
2086 | 3046 char *destn; |
3047 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3048 va_start(ap, fr); |
4199 | 3049 reason = (fu16_t) va_arg(ap, unsigned int); |
2086 | 3050 destn = va_arg(ap, char *); |
3051 va_end(ap); | |
3052 | |
5420 | 3053 buf = g_strdup_printf(_("User information for %s unavailable:"), destn); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3054 gaim_notify_error(sess->aux_data, NULL, buf, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3055 (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("No reason given.")); |
5420 | 3056 g_free(buf); |
2086 | 3057 |
3058 return 1; | |
3059 } | |
3060 | |
6982 | 3061 #if 0 |
2086 | 3062 static char *images(int flags) { |
3063 static char buf[1024]; | |
3101 | 3064 g_snprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s", |
2679 | 3065 (flags & AIM_FLAG_ACTIVEBUDDY) ? "<IMG SRC=\"ab_icon.gif\">" : "", |
2086 | 3066 (flags & AIM_FLAG_UNCONFIRMED) ? "<IMG SRC=\"dt_icon.gif\">" : "", |
3067 (flags & AIM_FLAG_AOL) ? "<IMG SRC=\"aol_icon.gif\">" : "", | |
3101 | 3068 (flags & AIM_FLAG_ICQ) ? "<IMG SRC=\"icq_icon.gif\">" : "", |
2086 | 3069 (flags & AIM_FLAG_ADMINISTRATOR) ? "<IMG SRC=\"admin_icon.gif\">" : "", |
3079 | 3070 (flags & AIM_FLAG_FREE) ? "<IMG SRC=\"free_icon.gif\">" : "", |
3071 (flags & AIM_FLAG_WIRELESS) ? "<IMG SRC=\"wireless_icon.gif\">" : ""); | |
2086 | 3072 return buf; |
3073 } | |
6982 | 3074 #endif |
3101 | 3075 |
2920 | 3076 static char *caps_string(guint caps) |
3077 { | |
3078 static char buf[512], *tmp; | |
3079 int count = 0, i = 0; | |
3080 guint bit = 1; | |
4742 | 3081 |
3082 if (!caps) { | |
4744 | 3083 return NULL; |
6318 | 3084 } else while (bit <= AIM_CAPS_LAST) { |
2920 | 3085 if (bit & caps) { |
3086 switch (bit) { | |
6871 | 3087 case AIM_CAPS_BUDDYICON: |
2920 | 3088 tmp = _("Buddy Icon"); |
3089 break; | |
6871 | 3090 case AIM_CAPS_VOICE: |
2920 | 3091 tmp = _("Voice"); |
3092 break; | |
6871 | 3093 case AIM_CAPS_DIRECTIM: |
4898 | 3094 tmp = _("Direct IM"); |
2920 | 3095 break; |
6871 | 3096 case AIM_CAPS_CHAT: |
2920 | 3097 tmp = _("Chat"); |
3098 break; | |
6871 | 3099 case AIM_CAPS_GETFILE: |
2920 | 3100 tmp = _("Get File"); |
3101 break; | |
6871 | 3102 case AIM_CAPS_SENDFILE: |
2920 | 3103 tmp = _("Send File"); |
3104 break; | |
6871 | 3105 case AIM_CAPS_GAMES: |
3106 case AIM_CAPS_GAMES2: | |
2920 | 3107 tmp = _("Games"); |
3108 break; | |
6871 | 3109 case AIM_CAPS_SAVESTOCKS: |
4898 | 3110 tmp = _("Add-Ins"); |
2920 | 3111 break; |
6871 | 3112 case AIM_CAPS_SENDBUDDYLIST: |
2920 | 3113 tmp = _("Send Buddy List"); |
3114 break; | |
6871 | 3115 case AIM_CAPS_ICQ: |
2920 | 3116 tmp = _("EveryBuddy Bug"); |
3117 break; | |
6871 | 3118 case AIM_CAPS_APINFO: |
2920 | 3119 tmp = _("AP User"); |
3120 break; | |
6871 | 3121 case AIM_CAPS_ICQRTF: |
2920 | 3122 tmp = _("ICQ RTF"); |
3123 break; | |
6871 | 3124 case AIM_CAPS_EMPTY: |
2920 | 3125 tmp = _("Nihilist"); |
3126 break; | |
6871 | 3127 case AIM_CAPS_ICQSERVERRELAY: |
2920 | 3128 tmp = _("ICQ Server Relay"); |
3129 break; | |
6871 | 3130 case AIM_CAPS_ICQUTF8OLD: |
3131 tmp = _("Old ICQ UTF8"); | |
2920 | 3132 break; |
6871 | 3133 case AIM_CAPS_TRILLIANCRYPT: |
2920 | 3134 tmp = _("Trillian Encryption"); |
3135 break; | |
6871 | 3136 case AIM_CAPS_ICQUTF8: |
4742 | 3137 tmp = _("ICQ UTF8"); |
3138 break; | |
6318 | 3139 case AIM_CAPS_HIPTOP: |
3140 tmp = _("Hiptop"); | |
3141 break; | |
6871 | 3142 case AIM_CAPS_SECUREIM: |
3143 tmp = _("Secure IM"); | |
3144 break; | |
2920 | 3145 default: |
3146 tmp = NULL; | |
3147 break; | |
3148 } | |
3149 if (tmp) | |
3150 i += g_snprintf(buf + i, sizeof(buf) - i, "%s%s", (count ? ", " : ""), | |
3151 tmp); | |
3152 count++; | |
3153 } | |
3154 bit <<= 1; | |
3155 } | |
4744 | 3156 return buf; |
2920 | 3157 } |
3158 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3159 static int gaim_parse_user_info(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3160 GaimConnection *gc = sess->aux_data; |
4791 | 3161 struct oscar_data *od = gc->proto_data; |
5420 | 3162 gchar *header; |
4791 | 3163 GSList *l = od->evilhack; |
3164 gboolean evilhack = FALSE; | |
3165 gchar *membersince = NULL, *onlinesince = NULL, *idle = NULL; | |
3166 va_list ap; | |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3167 aim_userinfo_t *info; |
4791 | 3168 fu16_t infotype; |
4151 | 3169 char *text_enc = NULL, *text = NULL, *utf8 = NULL; |
3170 int text_len; | |
5575 | 3171 const char *username = gaim_account_get_username(gaim_connection_get_account(gc)); |
2086 | 3172 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3173 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3174 info = va_arg(ap, aim_userinfo_t *); |
4199 | 3175 infotype = (fu16_t) va_arg(ap, unsigned int); |
4151 | 3176 text_enc = va_arg(ap, char *); |
3177 text = va_arg(ap, char *); | |
3178 text_len = va_arg(ap, int); | |
2086 | 3179 va_end(ap); |
3180 | |
4151 | 3181 if (text_len > 0) { |
5129 | 3182 if (!(utf8 = oscar_encoding_to_utf8(text_enc, text, text_len))) { |
4791 | 3183 utf8 = g_strdup(_("<i>Unable to display information because it was sent in an unknown encoding.</i>")); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3184 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3185 "Encountered an unknown encoding while parsing userinfo\n"); |
4151 | 3186 } |
3187 } | |
3188 | |
2993 | 3189 if (info->present & AIM_USERINFO_PRESENT_ONLINESINCE) { |
4834 | 3190 onlinesince = g_strdup_printf(_("Online Since : <b>%s</b><br>\n"), |
5556 | 3191 asctime(localtime((time_t *)&info->onlinesince))); |
2993 | 3192 } |
3193 | |
3194 if (info->present & AIM_USERINFO_PRESENT_MEMBERSINCE) { | |
4834 | 3195 membersince = g_strdup_printf(_("Member Since : <b>%s</b><br>\n"), |
5556 | 3196 asctime(localtime((time_t *)&info->membersince))); |
2993 | 3197 } |
3198 | |
3199 if (info->present & AIM_USERINFO_PRESENT_IDLE) { | |
4426 | 3200 gchar *itime = sec_to_text(info->idletime*60); |
4834 | 3201 idle = g_strdup_printf(_("Idle : <b>%s</b>"), itime); |
4426 | 3202 g_free(itime); |
2993 | 3203 } else |
4834 | 3204 idle = g_strdup(_("Idle: <b>Active</b>")); |
2993 | 3205 |
5420 | 3206 header = g_strdup_printf(_("Username : <b>%s</b> %s <br>\n" |
4791 | 3207 "Warning Level : <b>%d %%</b><br>\n" |
2086 | 3208 "%s" |
2993 | 3209 "%s" |
4344 | 3210 "%s\n" |
4791 | 3211 "<hr>\n"), |
6982 | 3212 info->sn, |
3213 /* images(info->flags), */ | |
3214 "", | |
5630 | 3215 (int)((info->warnlevel/10.0) + 0.5), |
2993 | 3216 onlinesince ? onlinesince : "", |
3217 membersince ? membersince : "", | |
3218 idle ? idle : ""); | |
3219 | |
3220 g_free(onlinesince); | |
3221 g_free(membersince); | |
3222 g_free(idle); | |
2773
a0fd8f91e294
[gaim-migrate @ 2786]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2768
diff
changeset
|
3223 |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3224 while (l) { |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3225 char *x = l->data; |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3226 if (!strcmp(x, normalize(info->sn))) { |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3227 evilhack = TRUE; |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3228 g_free(x); |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3229 od->evilhack = g_slist_remove(od->evilhack, x); |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3230 break; |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3231 } |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3232 l = l->next; |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3233 } |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3234 |
2920 | 3235 if (infotype == AIM_GETINFO_AWAYMESSAGE) { |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3236 if (evilhack) { |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3237 g_show_info_text(gc, info->sn, 2, |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3238 header, |
5575 | 3239 (utf8 && *utf8) ? away_subs(utf8, username) : |
4207 | 3240 _("<i>User has no away message</i>"), NULL); |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3241 } else { |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3242 g_show_info_text(gc, info->sn, 0, |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3243 header, |
5575 | 3244 (utf8 && *utf8) ? away_subs(utf8, username) : NULL, |
4791 | 3245 (utf8 && *utf8) ? "<hr>" : NULL, |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3246 NULL); |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3247 } |
2920 | 3248 } else if (infotype == AIM_GETINFO_CAPABILITIES) { |
3249 g_show_info_text(gc, info->sn, 2, | |
3250 header, | |
3251 "<i>", _("Client Capabilities: "), | |
3252 caps_string(info->capabilities), | |
3253 "</i>", | |
3254 NULL); | |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3255 } else { |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3256 g_show_info_text(gc, info->sn, 1, |
5575 | 3257 (utf8 && *utf8) ? away_subs(utf8, username) : _("<i>No Information Provided</i>"), |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3258 NULL); |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3259 } |
2086 | 3260 |
5420 | 3261 g_free(header); |
4151 | 3262 g_free(utf8); |
3263 | |
2086 | 3264 return 1; |
3265 } | |
3266 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3267 static int gaim_parse_motd(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3268 char *msg; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3269 fu16_t id; |
2086 | 3270 va_list ap; |
3271 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3272 va_start(ap, fr); |
4199 | 3273 id = (fu16_t) va_arg(ap, unsigned int); |
2086 | 3274 msg = va_arg(ap, char *); |
3275 va_end(ap); | |
3276 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3277 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3278 "MOTD: %s (%hu)\n", msg ? msg : "Unknown", id); |
2092
59b0377d18aa
[gaim-migrate @ 2102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
3279 if (id < 4) |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3280 gaim_notify_warning(sess->aux_data, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3281 _("Your AIM connection may be lost."), NULL); |
2086 | 3282 |
3283 return 1; | |
3284 } | |
3285 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3286 static int gaim_chatnav_info(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3287 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3288 fu16_t type; |
5575 | 3289 GaimConnection *gc = sess->aux_data; |
4617 | 3290 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
2086 | 3291 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3292 va_start(ap, fr); |
4199 | 3293 type = (fu16_t) va_arg(ap, unsigned int); |
2086 | 3294 |
3295 switch(type) { | |
3296 case 0x0002: { | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3297 fu8_t maxrooms; |
2086 | 3298 struct aim_chat_exchangeinfo *exchanges; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3299 int exchangecount, i; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3300 |
4199 | 3301 maxrooms = (fu8_t) va_arg(ap, unsigned int); |
2086 | 3302 exchangecount = va_arg(ap, int); |
3303 exchanges = va_arg(ap, struct aim_chat_exchangeinfo *); | |
3304 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3305 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3306 "chat info: Chat Rights:\n"); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3307 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3308 "chat info: \tMax Concurrent Rooms: %hhd\n", maxrooms); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3309 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3310 "chat info: \tExchange List: (%d total)\n", exchangecount); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3311 for (i = 0; i < exchangecount; i++) |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3312 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3313 "chat info: \t\t%hu %s\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3314 exchanges[i].number, exchanges[i].name ? exchanges[i].name : ""); |
4617 | 3315 while (od->create_rooms) { |
3316 struct create_room *cr = od->create_rooms->data; | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3317 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3318 "creating room %s\n", cr->name); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
3319 aim_chatnav_createroom(sess, fr->conn, cr->name, cr->exchange); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
3320 g_free(cr->name); |
4617 | 3321 od->create_rooms = g_slist_remove(od->create_rooms, cr); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
3322 g_free(cr); |
2086 | 3323 } |
3324 } | |
3325 break; | |
3326 case 0x0008: { | |
3327 char *fqcn, *name, *ck; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3328 fu16_t instance, flags, maxmsglen, maxoccupancy, unknown, exchange; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3329 fu8_t createperms; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3330 fu32_t createtime; |
2086 | 3331 |
3332 fqcn = va_arg(ap, char *); | |
4200 | 3333 instance = (fu16_t)va_arg(ap, unsigned int); |
3334 exchange = (fu16_t)va_arg(ap, unsigned int); | |
3335 flags = (fu16_t)va_arg(ap, unsigned int); | |
3336 createtime = va_arg(ap, fu32_t); | |
3337 maxmsglen = (fu16_t)va_arg(ap, unsigned int); | |
3338 maxoccupancy = (fu16_t)va_arg(ap, unsigned int); | |
3339 createperms = (fu8_t)va_arg(ap, unsigned int); | |
3340 unknown = (fu16_t)va_arg(ap, unsigned int); | |
3341 name = va_arg(ap, char *); | |
3342 ck = va_arg(ap, char *); | |
4194 | 3343 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3344 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
5556 | 3345 "created room: %s %hu %hu %hu %u %hu %hu %hhu %hu %s %s\n", |
2086 | 3346 fqcn, |
3347 exchange, instance, flags, | |
3348 createtime, | |
3349 maxmsglen, maxoccupancy, createperms, unknown, | |
3350 name, ck); | |
4617 | 3351 aim_chat_join(od->sess, od->conn, exchange, ck, instance); |
2086 | 3352 } |
3353 break; | |
3354 default: | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3355 gaim_debug(GAIM_DEBUG_WARNING, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3356 "chatnav info: unknown type (%04hx)\n", type); |
2086 | 3357 break; |
3358 } | |
4194 | 3359 |
3360 va_end(ap); | |
3361 | |
2086 | 3362 return 1; |
3363 } | |
3364 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3365 static int gaim_chat_join(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3366 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3367 int count, i; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3368 aim_userinfo_t *info; |
5575 | 3369 GaimConnection *g = sess->aux_data; |
2086 | 3370 |
3371 struct chat_connection *c = NULL; | |
3372 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3373 va_start(ap, fr); |
2086 | 3374 count = va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3375 info = va_arg(ap, aim_userinfo_t *); |
2086 | 3376 va_end(ap); |
3377 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3378 c = find_oscar_chat_by_conn(g, fr->conn); |
2086 | 3379 if (!c) |
3380 return 1; | |
3381 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3382 for (i = 0; i < count; i++) |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
3383 gaim_chat_add_user(GAIM_CHAT(c->cnv), info[i].sn, NULL); |
2086 | 3384 |
3385 return 1; | |
3386 } | |
3387 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3388 static int gaim_chat_leave(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3389 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3390 int count, i; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3391 aim_userinfo_t *info; |
5575 | 3392 GaimConnection *g = sess->aux_data; |
2086 | 3393 |
3394 struct chat_connection *c = NULL; | |
3395 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3396 va_start(ap, fr); |
2086 | 3397 count = va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3398 info = va_arg(ap, aim_userinfo_t *); |
2086 | 3399 va_end(ap); |
3400 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3401 c = find_oscar_chat_by_conn(g, fr->conn); |
2086 | 3402 if (!c) |
3403 return 1; | |
3404 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3405 for (i = 0; i < count; i++) |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
3406 gaim_chat_remove_user(GAIM_CHAT(c->cnv), info[i].sn, NULL); |
2086 | 3407 |
3408 return 1; | |
3409 } | |
3410 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3411 static int gaim_chat_info_update(aim_session_t *sess, aim_frame_t *fr, ...) { |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3412 va_list ap; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3413 aim_userinfo_t *userinfo; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3414 struct aim_chat_roominfo *roominfo; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3415 char *roomname; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3416 int usercount; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3417 char *roomdesc; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3418 fu16_t unknown_c9, unknown_d2, unknown_d5, maxmsglen, maxvisiblemsglen; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3419 fu32_t creationtime; |
5575 | 3420 GaimConnection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3421 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
|
3422 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3423 va_start(ap, fr); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3424 roominfo = va_arg(ap, struct aim_chat_roominfo *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3425 roomname = va_arg(ap, char *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3426 usercount= va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3427 userinfo = va_arg(ap, aim_userinfo_t *); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3428 roomdesc = va_arg(ap, char *); |
4200 | 3429 unknown_c9 = (fu16_t)va_arg(ap, unsigned int); |
3430 creationtime = va_arg(ap, fu32_t); | |
3431 maxmsglen = (fu16_t)va_arg(ap, unsigned int); | |
3432 unknown_d2 = (fu16_t)va_arg(ap, unsigned int); | |
3433 unknown_d5 = (fu16_t)va_arg(ap, unsigned int); | |
3434 maxvisiblemsglen = (fu16_t)va_arg(ap, unsigned int); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3435 va_end(ap); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3436 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3437 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3438 "inside chat_info_update (maxmsglen = %hu, maxvislen = %hu)\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3439 maxmsglen, maxvisiblemsglen); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3440 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3441 ccon->maxlen = maxmsglen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3442 ccon->maxvis = maxvisiblemsglen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3443 |
2086 | 3444 return 1; |
3445 } | |
3446 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3447 static int gaim_chat_incoming_msg(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3448 GaimConnection *gc = sess->aux_data; |
2086 | 3449 va_list ap; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3450 aim_userinfo_t *info; |
2086 | 3451 char *msg; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3452 struct chat_connection *ccon = find_oscar_chat_by_conn(gc, fr->conn); |
2086 | 3453 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3454 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3455 info = va_arg(ap, aim_userinfo_t *); |
4194 | 3456 msg = va_arg(ap, char *); |
3457 va_end(ap); | |
2086 | 3458 |
4269 | 3459 serv_got_chat_in(gc, ccon->id, info->sn, 0, msg, time((time_t)NULL)); |
2086 | 3460 |
3461 return 1; | |
3462 } | |
3463 | |
3694 | 3464 static int gaim_email_parseupdate(aim_session_t *sess, aim_frame_t *fr, ...) { |
3465 va_list ap; | |
5575 | 3466 GaimConnection *gc = sess->aux_data; |
3694 | 3467 struct aim_emailinfo *emailinfo; |
3725 | 3468 int havenewmail; |
3694 | 3469 |
3470 va_start(ap, fr); | |
3471 emailinfo = va_arg(ap, struct aim_emailinfo *); | |
3725 | 3472 havenewmail = va_arg(ap, int); |
3694 | 3473 va_end(ap); |
3474 | |
5628 | 3475 if (emailinfo && gaim_account_get_check_mail(gc->account)) { |
5575 | 3476 gchar *to = g_strdup_printf("%s@%s", gaim_account_get_username(gaim_connection_get_account(gc)), emailinfo->domain); |
5542 | 3477 if (emailinfo->unread && havenewmail) |
3478 gaim_notify_emails(gc, emailinfo->nummsgs, FALSE, NULL, NULL, (const char **)&to, (const char **)&emailinfo->url, NULL, NULL); | |
5537 | 3479 g_free(to); |
3694 | 3480 } |
3481 | |
3482 return 1; | |
3483 } | |
3484 | |
4804 | 3485 static int gaim_icon_error(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3486 GaimConnection *gc = sess->aux_data; |
4804 | 3487 struct oscar_data *od = gc->proto_data; |
3488 char *sn; | |
3489 | |
3490 sn = od->requesticon->data; | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3491 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3492 "removing %s from hash table\n", sn); |
4804 | 3493 od->requesticon = g_slist_remove(od->requesticon, sn); |
3494 free(sn); | |
3495 | |
3496 if (od->icontimer) | |
3497 g_source_remove(od->icontimer); | |
3498 od->icontimer = g_timeout_add(500, gaim_icon_timerfunc, gc); | |
3499 | |
3500 return 1; | |
3501 } | |
3502 | |
3503 static int gaim_icon_parseicon(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 3504 GaimConnection *gc = sess->aux_data; |
4804 | 3505 struct oscar_data *od = gc->proto_data; |
3506 GSList *cur; | |
3507 va_list ap; | |
3508 char *sn; | |
4853 | 3509 fu8_t *iconcsum, *icon; |
3510 fu16_t iconcsumlen, iconlen; | |
4804 | 3511 |
3512 va_start(ap, fr); | |
3513 sn = va_arg(ap, char *); | |
4853 | 3514 iconcsum = va_arg(ap, fu8_t *); |
3515 iconcsumlen = va_arg(ap, int); | |
4804 | 3516 icon = va_arg(ap, fu8_t *); |
3517 iconlen = va_arg(ap, int); | |
3518 va_end(ap); | |
3519 | |
4853 | 3520 if (iconlen > 0) { |
3521 char *b16; | |
6695 | 3522 GaimBuddy *b = gaim_find_buddy(gc->account, sn); |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
3523 gaim_buddy_icons_set_for_user(gaim_connection_get_account(gc), |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
3524 sn, icon, iconlen); |
4853 | 3525 b16 = tobase16(iconcsum, iconcsumlen); |
5129 | 3526 if (b16) { |
3527 gaim_buddy_set_setting(b, "icon_checksum", b16); | |
3528 gaim_blist_save(); | |
5125 | 3529 free(b16); |
5129 | 3530 } |
4853 | 3531 } |
4804 | 3532 |
3533 cur = od->requesticon; | |
3534 while (cur) { | |
3535 char *cursn = cur->data; | |
3536 if (!aim_sncmp(cursn, sn)) { | |
3537 od->requesticon = g_slist_remove(od->requesticon, cursn); | |
3538 free(cursn); | |
3539 cur = od->requesticon; | |
3540 } else | |
3541 cur = cur->next; | |
3542 } | |
3543 | |
3544 if (od->icontimer) | |
3545 g_source_remove(od->icontimer); | |
3546 od->icontimer = g_timeout_add(250, gaim_icon_timerfunc, gc); | |
3547 | |
3548 return 1; | |
3549 } | |
3550 | |
3551 static gboolean gaim_icon_timerfunc(gpointer data) { | |
5575 | 3552 GaimConnection *gc = data; |
4804 | 3553 struct oscar_data *od = gc->proto_data; |
3554 struct buddyinfo *bi; | |
3555 aim_conn_t *conn; | |
3556 | |
3557 conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_ICON); | |
5892 | 3558 if (!conn) { |
3559 if (!od->iconconnecting) { | |
3560 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_ICON); | |
3561 od->iconconnecting = TRUE; | |
3562 } | |
4804 | 3563 return FALSE; |
3564 } | |
3565 | |
5842 | 3566 if (od->set_icon) { |
6039 | 3567 struct stat st; |
3568 const char *iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc)); | |
3569 if (iconfile == NULL) { | |
3570 /* Set an empty icon, or something */ | |
3571 } else if (!stat(iconfile, &st)) { | |
3572 char *buf = g_malloc(st.st_size); | |
3573 FILE *file = fopen(iconfile, "rb"); | |
3574 if (file) { | |
3575 fread(buf, 1, st.st_size, file); | |
3576 fclose(file); | |
3577 gaim_debug(GAIM_DEBUG_INFO, "oscar", | |
3578 "Uploading icon to icon server\n"); | |
6879 | 3579 aim_bart_upload(od->sess, buf, st.st_size); |
5842 | 3580 } else |
3581 gaim_debug(GAIM_DEBUG_ERROR, "oscar", | |
6039 | 3582 "Can't open buddy icon file!\n"); |
3583 g_free(buf); | |
3584 } else { | |
3585 gaim_debug(GAIM_DEBUG_ERROR, "oscar", | |
3586 "Can't stat buddy icon file!\n"); | |
5842 | 3587 } |
3588 od->set_icon = FALSE; | |
3589 } | |
3590 | |
3591 if (!od->requesticon) { | |
3592 gaim_debug(GAIM_DEBUG_MISC, "oscar", | |
3593 "no more icons to request\n"); | |
3594 return FALSE; | |
3595 } | |
3596 | |
4804 | 3597 bi = g_hash_table_lookup(od->buddyinfo, (char *)od->requesticon->data); |
4853 | 3598 if (bi && (bi->iconcsumlen > 0)) { |
6879 | 3599 aim_bart_request(od->sess, od->requesticon->data, bi->iconcsum, bi->iconcsumlen); |
4804 | 3600 return FALSE; |
3601 } else { | |
3602 char *sn = od->requesticon->data; | |
3603 od->requesticon = g_slist_remove(od->requesticon, sn); | |
3604 free(sn); | |
3605 } | |
3606 | |
3607 return TRUE; | |
3608 } | |
3609 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3610 /* |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3611 * 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
|
3612 */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3613 static int gaim_parse_msgack(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3614 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3615 fu16_t type; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3616 char *sn; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3617 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3618 va_start(ap, fr); |
4199 | 3619 type = (fu16_t) va_arg(ap, unsigned int); |
2086 | 3620 sn = va_arg(ap, char *); |
3621 va_end(ap); | |
3622 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3623 gaim_debug(GAIM_DEBUG_INFO, "oscar", "Sent message to %s.\n", sn); |
2086 | 3624 |
3625 return 1; | |
3626 } | |
3627 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3628 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
|
3629 static const char *codes[5] = { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3630 "invalid", |
4194 | 3631 "change", |
3632 "warning", | |
3633 "limit", | |
3634 "limit cleared", | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3635 }; |
2086 | 3636 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3637 fu16_t code, rateclass; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3638 fu32_t windowsize, clear, alert, limit, disconnect, currentavg, maxavg; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3639 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3640 va_start(ap, fr); |
4200 | 3641 code = (fu16_t)va_arg(ap, unsigned int); |
3642 rateclass= (fu16_t)va_arg(ap, unsigned int); | |
3643 windowsize = va_arg(ap, fu32_t); | |
3644 clear = va_arg(ap, fu32_t); | |
3645 alert = va_arg(ap, fu32_t); | |
3646 limit = va_arg(ap, fu32_t); | |
3647 disconnect = va_arg(ap, fu32_t); | |
3648 currentavg = va_arg(ap, fu32_t); | |
3649 maxavg = va_arg(ap, fu32_t); | |
2086 | 3650 va_end(ap); |
3651 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3652 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
5556 | 3653 "rate %s (param ID 0x%04hx): curavg = %u, maxavg = %u, alert at %u, " |
3654 "clear warning at %u, limit at %u, disconnect at %u (window size = %u)\n", | |
2086 | 3655 (code < 5) ? codes[code] : codes[0], |
3656 rateclass, | |
3657 currentavg, maxavg, | |
3658 alert, clear, | |
3659 limit, disconnect, | |
3660 windowsize); | |
3661 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3662 /* XXX fix these values */ |
2086 | 3663 if (code == AIM_RATE_CODE_CHANGE) { |
3664 if (currentavg >= clear) | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3665 aim_conn_setlatency(fr->conn, 0); |
2086 | 3666 } else if (code == AIM_RATE_CODE_WARNING) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3667 aim_conn_setlatency(fr->conn, windowsize/4); |
2909
48ec70928d7f
[gaim-migrate @ 2922]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2906
diff
changeset
|
3668 } else if (code == AIM_RATE_CODE_LIMIT) { |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3669 gaim_notify_error(sess->aux_data, NULL, _("Rate limiting error."), |
6040 | 3670 _("The last action you attempted could not be " |
3671 "performed because you are over the rate limit. " | |
3672 "Please wait 10 seconds and try again.")); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3673 aim_conn_setlatency(fr->conn, windowsize/2); |
2086 | 3674 } else if (code == AIM_RATE_CODE_CLEARLIMIT) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3675 aim_conn_setlatency(fr->conn, 0); |
2086 | 3676 } |
3677 | |
3678 return 1; | |
3679 } | |
3680 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3681 static int gaim_parse_evilnotify(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3682 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3683 fu16_t newevil; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3684 aim_userinfo_t *userinfo; |
5575 | 3685 GaimConnection *gc = sess->aux_data; |
2086 | 3686 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3687 va_start(ap, fr); |
4199 | 3688 newevil = (fu16_t) va_arg(ap, unsigned int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3689 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 3690 va_end(ap); |
3691 | |
5628 | 3692 serv_got_eviled(gc, (userinfo && userinfo->sn[0]) ? userinfo->sn : NULL, (newevil/10.0) + 0.5); |
2086 | 3693 |
3694 return 1; | |
3695 } | |
3696 | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3697 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
|
3698 va_list ap; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3699 aim_userinfo_t *info; |
5575 | 3700 GaimConnection *gc = sess->aux_data; |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3701 |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3702 va_start(ap, fr); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3703 info = va_arg(ap, aim_userinfo_t *); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3704 va_end(ap); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3705 |
5628 | 3706 gc->evil = (info->warnlevel/10.0) + 0.5; |
4841 | 3707 |
3708 if (info->onlinesince) | |
3709 gc->login_time_official = info->onlinesince; | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3710 |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3711 return 1; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3712 } |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3713 |
4649 | 3714 static int gaim_connerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3715 GaimConnection *gc = sess->aux_data; |
4666 | 3716 struct oscar_data *od = gc->proto_data; |
4649 | 3717 va_list ap; |
3718 fu16_t code; | |
3719 char *msg; | |
3720 | |
3721 va_start(ap, fr); | |
3722 code = (fu16_t)va_arg(ap, int); | |
3723 msg = va_arg(ap, char *); | |
3724 va_end(ap); | |
3725 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3726 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3727 "Disconnected. Code is 0x%04x and msg is %s\n", code, msg); |
4649 | 3728 if ((fr) && (fr->conn) && (fr->conn->type == AIM_CONN_TYPE_BOS)) { |
4651 | 3729 if (code == 0x0001) { |
6113 | 3730 gc->wants_to_die = TRUE; |
5579 | 3731 gaim_connection_error(gc, _("You have been disconnected because you have signed on with this screen name at another location.")); |
4651 | 3732 } else { |
5579 | 3733 gaim_connection_error(gc, _("You have been signed off for an unknown reason.")); |
4651 | 3734 } |
4666 | 3735 od->killme = TRUE; |
4649 | 3736 } |
3737 | |
3738 return 1; | |
3739 } | |
3740 | |
2675 | 3741 static int conninitdone_bos(aim_session_t *sess, aim_frame_t *fr, ...) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3742 |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3743 aim_reqpersonalinfo(sess, fr->conn); |
4230 | 3744 |
3745 #ifndef NOSSI | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3746 gaim_debug(GAIM_DEBUG_INFO, "oscar", "ssi: requesting ssi list\n"); |
4889 | 3747 aim_ssi_reqrights(sess); |
6350 | 3748 aim_ssi_reqdata(sess); |
4230 | 3749 #endif |
3750 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3751 aim_bos_reqlocaterights(sess, fr->conn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3752 aim_bos_reqbuddyrights(sess, fr->conn); |
4617 | 3753 aim_im_reqparams(sess); |
5948 | 3754 aim_bos_reqrights(sess, fr->conn); /* XXX - Don't call this with ssi? */ |
4230 | 3755 |
3756 #ifdef NOSSI | |
3757 aim_bos_setgroupperm(sess, fr->conn, AIM_FLAG_ALLUSERS); | |
3758 aim_bos_setprivacyflags(sess, fr->conn, AIM_PRIVFLAGS_ALLOWIDLE | AIM_PRIVFLAGS_ALLOWMEMBERSINCE); | |
3759 #endif | |
2086 | 3760 |
3761 return 1; | |
3762 } | |
3763 | |
2675 | 3764 static int conninitdone_admin(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3765 GaimConnection *gc = sess->aux_data; |
2647 | 3766 struct oscar_data *od = gc->proto_data; |
3767 | |
6905 | 3768 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ADM, 0x0003, gaim_info_change, 0); |
3769 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ADM, 0x0005, gaim_info_change, 0); | |
3770 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ADM, 0x0007, gaim_account_confirm, 0); | |
3771 | |
2672 | 3772 aim_clientready(sess, fr->conn); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3773 gaim_debug(GAIM_DEBUG_INFO, "oscar", "connected to admin\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3774 |
2647 | 3775 if (od->chpass) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3776 gaim_debug(GAIM_DEBUG_INFO, "oscar", "changing password\n"); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3777 aim_admin_changepasswd(sess, fr->conn, od->newp, od->oldp); |
2647 | 3778 g_free(od->oldp); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3779 od->oldp = NULL; |
2647 | 3780 g_free(od->newp); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3781 od->newp = NULL; |
2647 | 3782 od->chpass = FALSE; |
3783 } | |
2979 | 3784 if (od->setnick) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3785 gaim_debug(GAIM_DEBUG_INFO, "oscar", "formatting screenname\n"); |
2979 | 3786 aim_admin_setnick(sess, fr->conn, od->newsn); |
3787 g_free(od->newsn); | |
3788 od->newsn = NULL; | |
3789 od->setnick = FALSE; | |
3790 } | |
2647 | 3791 if (od->conf) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3792 gaim_debug(GAIM_DEBUG_INFO, "oscar", "confirming account\n"); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3793 aim_admin_reqconfirm(sess, fr->conn); |
2647 | 3794 od->conf = FALSE; |
3795 } | |
3796 if (od->reqemail) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3797 gaim_debug(GAIM_DEBUG_INFO, "oscar", "requesting email\n"); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3798 aim_admin_getinfo(sess, fr->conn, 0x0011); |
2647 | 3799 od->reqemail = FALSE; |
3800 } | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3801 if (od->setemail) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3802 gaim_debug(GAIM_DEBUG_INFO, "oscar", "setting email\n"); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3803 aim_admin_setemail(sess, fr->conn, od->email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3804 g_free(od->email); |
5497 | 3805 od->email = NULL; |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3806 od->setemail = FALSE; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3807 } |
2647 | 3808 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3809 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3810 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3811 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3812 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
|
3813 struct aim_icbmparameters *params; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3814 va_list ap; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3815 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3816 va_start(ap, fr); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3817 params = va_arg(ap, struct aim_icbmparameters *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3818 va_end(ap); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3819 |
4194 | 3820 /* 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
|
3821 gaim_debug(GAIM_DEBUG_MISC, "oscar", "ICBM Parameters: maxchannel = %hu, default flags = 0x%08lx, max msg len = %hu, " |
5556 | 3822 "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
|
3823 params->maxchan, params->flags, params->maxmsglen, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3824 ((float)params->maxsenderwarn)/10.0, ((float)params->maxrecverwarn)/10.0, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3825 params->minmsginterval); |
2427
5bc3b39fc0a5
[gaim-migrate @ 2440]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2421
diff
changeset
|
3826 */ |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3827 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3828 /* Maybe senderwarn and recverwarn should be user preferences... */ |
3595 | 3829 params->flags = 0x0000000b; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3830 params->maxmsglen = 8000; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3831 params->minmsginterval = 0; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3832 |
4617 | 3833 aim_im_setparams(sess, params); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3834 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3835 return 1; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3836 } |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3837 |
2993 | 3838 static int gaim_parse_locaterights(aim_session_t *sess, aim_frame_t *fr, ...) |
3839 { | |
5575 | 3840 GaimConnection *gc = sess->aux_data; |
4617 | 3841 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
5306 | 3842 va_list ap; |
3843 fu16_t maxsiglen; | |
2993 | 3844 |
3845 va_start(ap, fr); | |
4199 | 3846 maxsiglen = (fu16_t) va_arg(ap, int); |
2993 | 3847 va_end(ap); |
3848 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3849 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3850 "locate rights: max sig len = %d\n", maxsiglen); |
2993 | 3851 |
4617 | 3852 od->rights.maxsiglen = od->rights.maxawaymsglen = (guint)maxsiglen; |
3853 | |
3854 if (od->icq) | |
4151 | 3855 aim_bos_setprofile(sess, fr->conn, NULL, NULL, 0, NULL, NULL, 0, caps_icq); |
5301 | 3856 else |
5954 | 3857 oscar_set_info(gc, gc->account->user_info); |
2993 | 3858 |
3859 return 1; | |
3860 } | |
3861 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3862 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
|
3863 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3864 fu16_t maxbuddies, maxwatchers; |
5575 | 3865 GaimConnection *gc = sess->aux_data; |
4617 | 3866 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3867 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3868 va_start(ap, fr); |
4199 | 3869 maxbuddies = (fu16_t) va_arg(ap, unsigned int); |
3870 maxwatchers = (fu16_t) va_arg(ap, unsigned int); | |
2086 | 3871 va_end(ap); |
3872 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3873 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3874 "buddy list rights: Max buddies = %hu / Max watchers = %hu\n", maxbuddies, maxwatchers); |
2086 | 3875 |
4617 | 3876 od->rights.maxbuddies = (guint)maxbuddies; |
3877 od->rights.maxwatchers = (guint)maxwatchers; | |
2993 | 3878 |
2086 | 3879 return 1; |
3880 } | |
3881 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3882 static int gaim_bosrights(aim_session_t *sess, aim_frame_t *fr, ...) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3883 fu16_t maxpermits, maxdenies; |
2086 | 3884 va_list ap; |
5575 | 3885 GaimConnection *gc = sess->aux_data; |
4617 | 3886 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
2086 | 3887 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3888 va_start(ap, fr); |
4199 | 3889 maxpermits = (fu16_t) va_arg(ap, unsigned int); |
3890 maxdenies = (fu16_t) va_arg(ap, unsigned int); | |
2086 | 3891 va_end(ap); |
3892 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3893 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3894 "BOS rights: Max permit = %hu / Max deny = %hu\n", maxpermits, maxdenies); |
2086 | 3895 |
4617 | 3896 od->rights.maxpermits = (guint)maxpermits; |
3897 od->rights.maxdenies = (guint)maxdenies; | |
2993 | 3898 |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
3899 gaim_connection_set_state(gc, GAIM_CONNECTED); |
2993 | 3900 serv_finish_login(gc); |
3901 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3902 gaim_debug(GAIM_DEBUG_INFO, "oscar", "buddy list loaded\n"); |
2993 | 3903 |
2672 | 3904 aim_clientready(sess, fr->conn); |
5948 | 3905 aim_srv_setavailmsg(sess, NULL); |
5917 | 3906 aim_bos_setidle(sess, fr->conn, 0); |
4617 | 3907 |
4664 | 3908 if (od->icq) { |
3909 aim_icq_reqofflinemsgs(sess); | |
3910 aim_icq_hideip(sess); | |
3911 } | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3912 |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3913 aim_reqservice(sess, fr->conn, AIM_CONN_TYPE_CHATNAV); |
4102 | 3914 if (sess->authinfo->email) |
3915 aim_reqservice(sess, fr->conn, AIM_CONN_TYPE_EMAIL); | |
2086 | 3916 |
3917 return 1; | |
3918 } | |
3919 | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3920 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
|
3921 va_list ap; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3922 struct aim_icq_offlinemsg *msg; |
4075 | 3923 struct aim_incomingim_ch4_args args; |
3924 time_t t; | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3925 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3926 va_start(ap, fr); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3927 msg = va_arg(ap, struct aim_icq_offlinemsg *); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3928 va_end(ap); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3929 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3930 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3931 "Received offline message. Converting to channel 4 ICBM...\n"); |
4075 | 3932 args.uin = msg->sender; |
3933 args.type = msg->type; | |
4173 | 3934 args.flags = msg->flags; |
4076 | 3935 args.msglen = msg->msglen; |
4075 | 3936 args.msg = msg->msg; |
3937 t = get_time(msg->year, msg->month, msg->day, msg->hour, msg->minute, 0); | |
3938 incomingim_chan4(sess, fr->conn, NULL, &args, t); | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3939 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3940 return 1; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3941 } |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3942 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3943 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
|
3944 { |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3945 aim_icq_ackofflinemsgs(sess); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3946 return 1; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3947 } |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3948 |
4624 | 3949 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
|
3950 { |
5575 | 3951 GaimConnection *gc = sess->aux_data; |
4819 | 3952 gchar *buf, *tmp, *utf8; |
4624 | 3953 gchar who[16]; |
6873 | 3954 GaimBuddy *buddy; |
3955 gchar *primary; | |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3956 va_list ap; |
4151 | 3957 struct aim_icq_info *info; |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3958 |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3959 va_start(ap, fr); |
4151 | 3960 info = va_arg(ap, struct aim_icq_info *); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3961 va_end(ap); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3962 |
4664 | 3963 if (!info->uin) |
3964 return 0; | |
3965 | |
5556 | 3966 g_snprintf(who, sizeof(who), "%u", info->uin); |
6623 | 3967 buf = g_strdup_printf("<b>%s:</b> %s", _("UIN"), who); |
4819 | 3968 if (info->nick && info->nick[0] && (utf8 = gaim_try_conv_to_utf8(info->nick))) { |
6623 | 3969 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Nick"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4819 | 3970 } |
3971 if (info->first && info->first[0] && (utf8 = gaim_try_conv_to_utf8(info->first))) { | |
6623 | 3972 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("First Name"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4819 | 3973 } |
3974 if (info->last && info->last[0] && (utf8 = gaim_try_conv_to_utf8(info->last))) { | |
6623 | 3975 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Last Name"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4819 | 3976 } |
3977 if (info->email && info->email[0] && (utf8 = gaim_try_conv_to_utf8(info->email))) { | |
6623 | 3978 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 | 3979 } |
3980 if (info->numaddresses && info->email2) { | |
3981 int i; | |
3982 for (i = 0; i < info->numaddresses; i++) { | |
4819 | 3983 if (info->email2[i] && info->email2[i][0] && (utf8 = gaim_try_conv_to_utf8(info->email2[i]))) { |
6623 | 3984 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 | 3985 } |
4625 | 3986 } |
4624 | 3987 } |
4819 | 3988 if (info->mobile && info->mobile[0] && (utf8 = gaim_try_conv_to_utf8(info->mobile))) { |
6623 | 3989 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Mobile Phone"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4625 | 3990 } |
3991 if (info->gender) { | |
6623 | 3992 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Gender"), ":</b> ", info->gender==1 ? _("Female") : _("Male"), NULL); g_free(tmp); |
4151 | 3993 } |
4624 | 3994 if (info->birthyear || info->birthmonth || info->birthday) { |
4627 | 3995 char date[30]; |
3996 struct tm tm; | |
3997 tm.tm_mday = (int)info->birthday; | |
3998 tm.tm_mon = (int)info->birthmonth-1; | |
3999 tm.tm_year = (int)info->birthyear-1900; | |
4628 | 4000 strftime(date, sizeof(date), "%x", &tm); |
6623 | 4001 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Birthday"), ":</b> ", date, NULL); g_free(tmp); |
4151 | 4002 } |
4624 | 4003 if (info->age) { |
4004 char age[5]; | |
4005 snprintf(age, sizeof(age), "%hhd", info->age); | |
6623 | 4006 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Age"), ":</b> ", age, NULL); g_free(tmp); |
4819 | 4007 } |
4008 if (info->personalwebpage && info->personalwebpage[0] && (utf8 = gaim_try_conv_to_utf8(info->personalwebpage))) { | |
6623 | 4009 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 | 4010 } |
4011 if (info->info && info->info[0] && (utf8 = gaim_try_conv_to_utf8(info->info))) { | |
6623 | 4012 tmp = buf; buf = g_strconcat(tmp, "<hr><b>", _("Additional Information"), ":</b><br>", utf8, NULL); g_free(tmp); g_free(utf8); |
4624 | 4013 } |
4014 tmp = buf; buf = g_strconcat(tmp, "<hr>\n", NULL); g_free(tmp); | |
4641 | 4015 if ((info->homeaddr && (info->homeaddr[0])) || (info->homecity && info->homecity[0]) || (info->homestate && info->homestate[0]) || (info->homezip && info->homezip[0])) { |
6623 | 4016 tmp = buf; buf = g_strconcat(tmp, "<b>", _("Home Address"), ":</b>", NULL); g_free(tmp); |
4819 | 4017 if (info->homeaddr && info->homeaddr[0] && (utf8 = gaim_try_conv_to_utf8(info->homeaddr))) { |
6623 | 4018 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Address"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4624 | 4019 } |
4819 | 4020 if (info->homecity && info->homecity[0] && (utf8 = gaim_try_conv_to_utf8(info->homecity))) { |
6623 | 4021 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("City"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4624 | 4022 } |
4819 | 4023 if (info->homestate && info->homestate[0] && (utf8 = gaim_try_conv_to_utf8(info->homestate))) { |
6623 | 4024 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("State"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4624 | 4025 } |
4819 | 4026 if (info->homezip && info->homezip[0] && (utf8 = gaim_try_conv_to_utf8(info->homezip))) { |
6623 | 4027 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Zip Code"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4624 | 4028 } |
4029 tmp = buf; buf = g_strconcat(tmp, "\n<hr>\n", NULL); g_free(tmp); | |
4151 | 4030 } |
4641 | 4031 if ((info->workaddr && info->workaddr[0]) || (info->workcity && info->workcity[0]) || (info->workstate && info->workstate[0]) || (info->workzip && info->workzip[0])) { |
6623 | 4032 tmp = buf; buf = g_strconcat(tmp, "<b>", _("Work Address"), ":</b>", NULL); g_free(tmp); |
4819 | 4033 if (info->workaddr && info->workaddr[0] && (utf8 = gaim_try_conv_to_utf8(info->workaddr))) { |
6623 | 4034 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Address"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4624 | 4035 } |
4819 | 4036 if (info->workcity && info->workcity[0] && (utf8 = gaim_try_conv_to_utf8(info->workcity))) { |
6623 | 4037 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("City"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4624 | 4038 } |
4819 | 4039 if (info->workstate && info->workstate[0] && (utf8 = gaim_try_conv_to_utf8(info->workstate))) { |
6623 | 4040 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("State"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4624 | 4041 } |
4819 | 4042 if (info->workzip && info->workzip[0] && (utf8 = gaim_try_conv_to_utf8(info->workzip))) { |
6623 | 4043 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Zip Code"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4624 | 4044 } |
4045 tmp = buf; buf = g_strconcat(tmp, "\n<hr>\n", NULL); g_free(tmp); | |
4046 } | |
4641 | 4047 if ((info->workcompany && info->workcompany[0]) || (info->workdivision && info->workdivision[0]) || (info->workposition && info->workposition[0]) || (info->workwebpage && info->workwebpage[0])) { |
6623 | 4048 tmp = buf; buf = g_strconcat(tmp, "<b>", _("Work Information"), ":</b>", NULL); g_free(tmp); |
4819 | 4049 if (info->workcompany && info->workcompany[0] && (utf8 = gaim_try_conv_to_utf8(info->workcompany))) { |
6623 | 4050 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Company"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4624 | 4051 } |
4819 | 4052 if (info->workdivision && info->workdivision[0] && (utf8 = gaim_try_conv_to_utf8(info->workdivision))) { |
6623 | 4053 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Division"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4624 | 4054 } |
4819 | 4055 if (info->workposition && info->workposition[0] && (utf8 = gaim_try_conv_to_utf8(info->workposition))) { |
6623 | 4056 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Position"), ":</b> ", utf8, NULL); g_free(tmp); g_free(utf8); |
4624 | 4057 } |
4819 | 4058 if (info->workwebpage && info->workwebpage[0] && (utf8 = gaim_try_conv_to_utf8(info->workwebpage))) { |
6623 | 4059 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 | 4060 } |
4061 tmp = buf; buf = g_strconcat(tmp, "\n<hr>\n", NULL); g_free(tmp); | |
4151 | 4062 } |
4063 | |
6873 | 4064 buddy = gaim_find_buddy(gaim_connection_get_account(gc), who); |
4065 primary = g_strdup_printf(_("ICQ Info for %s"), gaim_get_buddy_alias(buddy)); | |
4066 gaim_notify_formatted(gc, NULL, primary, NULL, buf, NULL, NULL); | |
4067 g_free(primary); | |
4151 | 4068 g_free(buf); |
4069 | |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4070 return 1; |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4071 } |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4072 |
4759 | 4073 static int gaim_icqalias(aim_session_t *sess, aim_frame_t *fr, ...) |
4074 { | |
5575 | 4075 GaimConnection *gc = sess->aux_data; |
4820 | 4076 gchar who[16], *utf8; |
6695 | 4077 GaimBuddy *b; |
4759 | 4078 va_list ap; |
4079 struct aim_icq_info *info; | |
4080 | |
4081 va_start(ap, fr); | |
4082 info = va_arg(ap, struct aim_icq_info *); | |
4083 va_end(ap); | |
4084 | |
4822 | 4085 if (info->uin && info->nick && info->nick[0] && (utf8 = gaim_try_conv_to_utf8(info->nick))) { |
5556 | 4086 g_snprintf(who, sizeof(who), "%u", info->uin); |
4820 | 4087 serv_got_alias(gc, who, utf8); |
4759 | 4088 if ((b = gaim_find_buddy(gc->account, who))) { |
4820 | 4089 gaim_buddy_set_setting(b, "servernick", utf8); |
4759 | 4090 gaim_blist_save(); |
4091 } | |
4820 | 4092 g_free(utf8); |
4759 | 4093 } |
4094 | |
4095 return 1; | |
4096 } | |
4097 | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4098 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
|
4099 { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4100 char *msg, *url; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4101 fu16_t wid, hei, delay; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4102 va_list ap; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4103 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4104 va_start(ap, fr); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4105 msg = va_arg(ap, char *); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4106 url = va_arg(ap, char *); |
4199 | 4107 wid = (fu16_t) va_arg(ap, int); |
4108 hei = (fu16_t) va_arg(ap, int); | |
4109 delay = (fu16_t) va_arg(ap, int); | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4110 va_end(ap); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4111 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4112 serv_got_popup(msg, url, wid, hei); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4113 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4114 return 1; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4115 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4116 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4117 static int gaim_parse_searchreply(aim_session_t *sess, aim_frame_t *fr, ...) { |
6873 | 4118 GaimConnection *gc = sess->aux_data; |
4119 gchar *secondary; | |
4120 GString *text; | |
4121 int i, num; | |
2086 | 4122 va_list ap; |
6873 | 4123 char *email, *SNs; |
2086 | 4124 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4125 va_start(ap, fr); |
6873 | 4126 email = va_arg(ap, char *); |
2086 | 4127 num = va_arg(ap, int); |
4128 SNs = va_arg(ap, char *); | |
4129 va_end(ap); | |
4130 | |
6873 | 4131 secondary = g_strdup_printf(_("The following screennames are associated with %s"), email); |
4132 text = g_string_new(""); | |
2086 | 4133 for (i = 0; i < num; i++) |
6873 | 4134 g_string_append_printf(text, "%s<br>", &SNs[i * (MAXSNLEN + 1)]); |
4135 gaim_notify_formatted(gc, NULL, _("Search Results"), secondary, text->str, NULL, NULL); | |
4136 | |
4137 g_free(secondary); | |
4138 g_string_free(text, TRUE); | |
2086 | 4139 |
4140 return 1; | |
4141 } | |
4142 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4143 static int gaim_parse_searcherror(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 4144 va_list ap; |
6873 | 4145 char *email; |
5420 | 4146 char *buf; |
2086 | 4147 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4148 va_start(ap, fr); |
6873 | 4149 email = va_arg(ap, char *); |
2086 | 4150 va_end(ap); |
4151 | |
6873 | 4152 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
|
4153 gaim_notify_error(sess->aux_data, NULL, buf, NULL); |
5420 | 4154 g_free(buf); |
2086 | 4155 |
4156 return 1; | |
4157 } | |
4158 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4159 static int gaim_account_confirm(aim_session_t *sess, aim_frame_t *fr, ...) { |
6873 | 4160 GaimConnection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4161 fu16_t status; |
2086 | 4162 va_list ap; |
4163 char msg[256]; | |
4164 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4165 va_start(ap, fr); |
4199 | 4166 status = (fu16_t) va_arg(ap, unsigned int); /* status code of confirmation request */ |
2086 | 4167 va_end(ap); |
4168 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4169 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4170 "account confirmation returned status 0x%04x (%s)\n", status, |
3912 | 4171 status ? "unknown" : "email sent"); |
4172 if (!status) { | |
5302 | 4173 g_snprintf(msg, sizeof(msg), _("You should receive an email asking to confirm %s."), |
5575 | 4174 gaim_account_get_username(gaim_connection_get_account(gc))); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4175 gaim_notify_info(gc, NULL, _("Account Confirmation Requested"), msg); |
2086 | 4176 } |
4177 | |
4178 return 1; | |
4179 } | |
4180 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4181 static int gaim_info_change(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4182 GaimConnection *gc = sess->aux_data; |
2086 | 4183 va_list ap; |
3912 | 4184 fu16_t perms, err; |
4185 char *url, *sn, *email; | |
4186 int change; | |
2086 | 4187 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4188 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4189 change = va_arg(ap, int); |
4199 | 4190 perms = (fu16_t) va_arg(ap, unsigned int); |
4191 err = (fu16_t) va_arg(ap, unsigned int); | |
3912 | 4192 url = va_arg(ap, char *); |
4193 sn = va_arg(ap, char *); | |
4194 email = va_arg(ap, char *); | |
2086 | 4195 va_end(ap); |
4196 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4197 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4198 "account info: because of %s, perms=0x%04x, err=0x%04x, url=%s, sn=%s, email=%s\n", |
3912 | 4199 change ? "change" : "request", perms, err, url, sn, email); |
4200 | |
4201 if (err && url) { | |
4202 char *dialog_msg; | |
4203 char *dialog_top = g_strdup_printf(_("Error Changing Account Info")); | |
4204 switch (err) { | |
4205 case 0x0001: { | |
4206 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name differs from the original."), err); | |
4207 } break; | |
4208 case 0x0006: { | |
4209 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name ends in a space."), err); | |
4210 } break; | |
4211 case 0x000b: { | |
4212 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name is too long."), err); | |
4213 } break; | |
4214 case 0x001d: { | |
4215 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); | |
4216 } break; | |
4217 case 0x0021: { | |
4218 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); | |
4219 } break; | |
4220 case 0x0023: { | |
4221 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to change email address because the given address is invalid."), err); | |
4222 } break; | |
4223 default: { | |
4224 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unknown error."), err); | |
4225 } break; | |
4226 } | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4227 gaim_notify_error(gc, NULL, dialog_top, dialog_msg); |
3912 | 4228 g_free(dialog_top); |
4229 g_free(dialog_msg); | |
4230 return 1; | |
4231 } | |
4232 | |
4233 if (sn) { | |
4585 | 4234 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
|
4235 gaim_notify_info(gc, NULL, _("Account Info"), dialog_msg); |
3912 | 4236 g_free(dialog_msg); |
4237 } | |
4238 | |
4239 if (email) { | |
5575 | 4240 char *dialog_msg = g_strdup_printf(_("The email address for %s is %s"), |
4241 gaim_account_get_username(gaim_connection_get_account(gc)), email); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4242 gaim_notify_info(gc, NULL, _("Account Info"), dialog_msg); |
3912 | 4243 g_free(dialog_msg); |
2086 | 4244 } |
4245 | |
4246 return 1; | |
4247 } | |
4248 | |
5575 | 4249 static void oscar_keepalive(GaimConnection *gc) { |
4617 | 4250 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
4251 aim_flap_nop(od->sess, od->conn); | |
2086 | 4252 } |
4253 | |
6059 | 4254 static int oscar_send_typing(GaimConnection *gc, const char *name, int typing) { |
4617 | 4255 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
4256 struct direct_im *dim = find_direct_im(od, name); | |
3595 | 4257 if (dim) |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
4258 if (typing == GAIM_TYPING) |
4870 | 4259 aim_odc_send_typing(od->sess, dim->conn, 0x0002); |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
4260 else if (typing == GAIM_TYPED) |
4870 | 4261 aim_odc_send_typing(od->sess, dim->conn, 0x0001); |
4262 else | |
4263 aim_odc_send_typing(od->sess, dim->conn, 0x0000); | |
3595 | 4264 else { |
5300 | 4265 /* Don't send if this turkey is in our deny list */ |
4266 GSList *list; | |
4267 for (list=gc->account->deny; (list && aim_sncmp(name, list->data)); list=list->next); | |
4268 if (!list) { | |
4269 struct buddyinfo *bi = g_hash_table_lookup(od->buddyinfo, normalize(name)); | |
4270 if (bi && bi->typingnot) { | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
4271 if (typing == GAIM_TYPING) |
5300 | 4272 aim_im_sendmtn(od->sess, 0x0001, name, 0x0002); |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
4273 else if (typing == GAIM_TYPED) |
5300 | 4274 aim_im_sendmtn(od->sess, 0x0001, name, 0x0001); |
4275 else | |
4276 aim_im_sendmtn(od->sess, 0x0001, name, 0x0000); | |
4277 } | |
3595 | 4278 } |
4279 } | |
2993 | 4280 return 0; |
4281 } | |
5575 | 4282 static void oscar_ask_direct_im(GaimConnection *gc, const char *name); |
6982 | 4283 static int gaim_odc_send_im(aim_session_t *, aim_conn_t *, const char *, GaimImFlags); |
4284 | |
4285 static int oscar_send_im(GaimConnection *gc, const char *name, const char *message, GaimImFlags imflags) { | |
4617 | 4286 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
4287 struct direct_im *dim = find_direct_im(od, name); | |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
4288 int ret = 0; |
3659 | 4289 GError *err = NULL; |
5575 | 4290 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
|
4291 char *tmpmsg = NULL; |
3458 | 4292 |
4838 | 4293 if (dim && dim->connected) { |
4294 /* If we're directly connected, send a direct IM */ | |
6982 | 4295 ret = gaim_odc_send_im(od->sess, dim->conn, message, imflags); |
4296 } else if (imflags & GAIM_IM_IMAGES) { | |
3044 | 4297 /* Trying to send an IM image outside of a direct connection. */ |
4298 oscar_ask_direct_im(gc, name); | |
4838 | 4299 ret = -ENOTCONN; |
2086 | 4300 } else { |
4738 | 4301 struct buddyinfo *bi; |
3008 | 4302 struct aim_sendimext_args args; |
4303 struct stat st; | |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
4304 gsize len; |
4269 | 4305 |
4738 | 4306 bi = g_hash_table_lookup(od->buddyinfo, normalize(name)); |
4307 if (!bi) { | |
4308 bi = g_new0(struct buddyinfo, 1); | |
4309 g_hash_table_insert(od->buddyinfo, g_strdup(normalize(name)), bi); | |
4310 } | |
4311 | |
3008 | 4312 args.flags = AIM_IMFLAGS_ACK | AIM_IMFLAGS_CUSTOMFEATURES; |
4665 | 4313 if (od->icq) { |
4314 args.features = features_icq; | |
4315 args.featureslen = sizeof(features_icq); | |
3008 | 4316 args.flags |= AIM_IMFLAGS_OFFLINE; |
4665 | 4317 } else { |
4318 args.features = features_aim; | |
4319 args.featureslen = sizeof(features_aim); | |
4972 | 4320 |
6622 | 4321 if (imflags & GAIM_IM_AUTO_RESP) |
4972 | 4322 args.flags |= AIM_IMFLAGS_AWAY; |
4665 | 4323 } |
4269 | 4324 |
4738 | 4325 if (bi->ico_need) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4326 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4327 "Sending buddy icon request with message\n"); |
3008 | 4328 args.flags |= AIM_IMFLAGS_BUDDYREQ; |
4738 | 4329 bi->ico_need = FALSE; |
3008 | 4330 } |
4269 | 4331 |
5575 | 4332 if (iconfile && !stat(iconfile, &st)) { |
4333 FILE *file = fopen(iconfile, "r"); | |
3008 | 4334 if (file) { |
4335 char *buf = g_malloc(st.st_size); | |
4336 fread(buf, 1, st.st_size, file); | |
6039 | 4337 fclose(file); |
4269 | 4338 |
3008 | 4339 args.iconlen = st.st_size; |
4617 | 4340 args.iconsum = aimutil_iconsum(buf, st.st_size); |
3008 | 4341 args.iconstamp = st.st_mtime; |
4342 | |
4738 | 4343 if ((args.iconlen != bi->ico_me_len) || (args.iconsum != bi->ico_me_csum) || (args.iconstamp != bi->ico_me_time)) |
4344 bi->ico_informed = FALSE; | |
4345 | |
4346 if (!bi->ico_informed) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4347 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4348 "Claiming to have a buddy icon\n"); |
4738 | 4349 args.flags |= AIM_IMFLAGS_HASICON; |
4350 bi->ico_me_len = args.iconlen; | |
4351 bi->ico_me_csum = args.iconsum; | |
4352 bi->ico_me_time = args.iconstamp; | |
4353 bi->ico_informed = TRUE; | |
4354 } | |
4355 | |
3008 | 4356 g_free(buf); |
2086 | 4357 } |
4358 } | |
4269 | 4359 |
3008 | 4360 args.destsn = name; |
4269 | 4361 |
6310 | 4362 /* For ICQ send newlines as CR/LF, for AIM send newlines as <BR> */ |
4363 if (isdigit(name[0])) | |
4364 tmpmsg = add_cr(message); | |
4365 else | |
4366 tmpmsg = strdup_withhtml(message); | |
4367 len = strlen(tmpmsg); | |
4368 | |
4369 args.flags |= oscar_encoding_check(tmpmsg); | |
3642 | 4370 if (args.flags & AIM_IMFLAGS_UNICODE) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4371 gaim_debug(GAIM_DEBUG_INFO, "oscar", "Sending Unicode IM\n"); |
4662 | 4372 args.charset = 0x0002; |
4665 | 4373 args.charsubset = 0x0000; |
6310 | 4374 args.msg = g_convert(tmpmsg, len, "UCS-2BE", "UTF-8", NULL, &len, &err); |
3659 | 4375 if (err) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4376 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4377 "Error converting a unicode message: %s\n", err->message); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4378 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4379 "This really shouldn't happen!\n"); |
3659 | 4380 /* We really shouldn't try to send the |
4381 * IM now, but I'm not sure what to do */ | |
4800 | 4382 g_error_free(err); |
3659 | 4383 } |
3850 | 4384 } else if (args.flags & AIM_IMFLAGS_ISO_8859_1) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4385 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4386 "Sending ISO-8859-1 IM\n"); |
4662 | 4387 args.charset = 0x0003; |
4665 | 4388 args.charsubset = 0x0000; |
6310 | 4389 args.msg = g_convert(tmpmsg, len, "ISO-8859-1", "UTF-8", NULL, &len, &err); |
3659 | 4390 if (err) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4391 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4392 "conversion error: %s\n", err->message); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4393 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4394 "Someone tell Ethan his 8859-1 detection is wrong\n"); |
3642 | 4395 args.flags ^= AIM_IMFLAGS_ISO_8859_1 | AIM_IMFLAGS_UNICODE; |
6310 | 4396 len = strlen(tmpmsg); |
4800 | 4397 g_error_free(err); |
6310 | 4398 args.msg = g_convert(tmpmsg, len, "UCS-2BE", "UTF8", NULL, &len, &err); |
3659 | 4399 if (err) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4400 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4401 "Error in unicode fallback: %s\n", err->message); |
4800 | 4402 g_error_free(err); |
3659 | 4403 } |
3642 | 4404 } |
4405 } else { | |
4662 | 4406 args.charset = 0x0000; |
4407 args.charsubset = 0x0000; | |
6310 | 4408 args.msg = tmpmsg; |
3642 | 4409 } |
4410 args.msglen = len; | |
4269 | 4411 |
4617 | 4412 ret = aim_im_sendch1_ext(od->sess, &args); |
2086 | 4413 } |
4838 | 4414 |
6310 | 4415 g_free(tmpmsg); |
4416 | |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
4417 if (ret >= 0) |
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
4418 return 1; |
6310 | 4419 |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
4420 return ret; |
2086 | 4421 } |
4422 | |
5575 | 4423 static void oscar_get_info(GaimConnection *g, const char *name) { |
4617 | 4424 struct oscar_data *od = (struct oscar_data *)g->proto_data; |
4425 if (od->icq) | |
4624 | 4426 aim_icq_getallinfo(od->sess, name); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4427 else |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4428 /* people want the away message on the top, so we get the away message |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4429 * first and then get the regular info, since it's too difficult to |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4430 * insert in the middle. i hate people. */ |
4617 | 4431 aim_getinfo(od->sess, od->conn, name, AIM_GETINFO_AWAYMESSAGE); |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4432 } |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4433 |
5575 | 4434 static void oscar_get_away(GaimConnection *g, const char *who) { |
4617 | 4435 struct oscar_data *od = (struct oscar_data *)g->proto_data; |
4436 if (od->icq) { | |
6695 | 4437 GaimBuddy *budlight = gaim_find_buddy(g->account, who); |
3212 | 4438 if (budlight) |
3595 | 4439 if ((budlight->uc & 0xffff0000) >> 16) |
4687 | 4440 aim_im_sendch2_geticqaway(od->sess, who, (budlight->uc & 0xffff0000) >> 16); |
3212 | 4441 else |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4442 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4443 "Error: The user %s has no status message, therefore not requesting.\n", who); |
3212 | 4444 else |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4445 gaim_debug(GAIM_DEBUG_ERROR, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4446 "Error: Could not find %s in local contact list, therefore unable to request status message.\n", who); |
3212 | 4447 } else |
4617 | 4448 aim_getinfo(od->sess, od->conn, who, AIM_GETINFO_GENERALINFO); |
2086 | 4449 } |
4450 | |
5575 | 4451 static void oscar_set_dir(GaimConnection *g, const char *first, const char *middle, const char *last, |
3466 | 4452 const char *maiden, const char *city, const char *state, const char *country, int web) { |
4617 | 4453 /* XXX - some of these things are wrong, but i'm lazy */ |
4454 struct oscar_data *od = (struct oscar_data *)g->proto_data; | |
4455 aim_setdirectoryinfo(od->sess, od->conn, first, middle, last, | |
2086 | 4456 maiden, NULL, NULL, city, state, NULL, 0, web); |
4457 } | |
4458 | |
5575 | 4459 static void oscar_set_idle(GaimConnection *gc, int time) { |
5129 | 4460 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
4617 | 4461 aim_bos_setidle(od->sess, od->conn, time); |
2086 | 4462 } |
4463 | |
5954 | 4464 static void oscar_set_info(GaimConnection *gc, const char *text) { |
5129 | 4465 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
4466 fu32_t flags = 0; | |
6019 | 4467 char *text_html = NULL; |
5129 | 4468 char *msg = NULL; |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
4469 gsize msglen = 0; |
2993 | 4470 |
4617 | 4471 if (od->rights.maxsiglen == 0) |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4472 gaim_notify_warning(gc, NULL, _("Unable to set AIM profile."), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4473 _("You have probably requested to set your " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4474 "profile before the login procedure completed. " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4475 "Your profile remains unset; try setting it " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4476 "again when you are fully connected.")); |
4617 | 4477 |
4478 if (od->icq) | |
4479 aim_bos_setprofile(od->sess, od->conn, NULL, NULL, 0, NULL, NULL, 0, caps_icq); | |
4151 | 4480 else { |
5129 | 4481 if (!text) { |
4482 aim_bos_setprofile(od->sess, od->conn, NULL, NULL, 0, NULL, NULL, 0, caps_aim); | |
4483 return; | |
4484 } | |
6019 | 4485 |
4486 text_html = strdup_withhtml(text); | |
4487 flags = oscar_encoding_check(text_html); | |
5129 | 4488 if (flags & AIM_IMFLAGS_UNICODE) { |
6019 | 4489 msg = g_convert(text_html, strlen(text_html), "UCS-2BE", "UTF-8", NULL, &msglen, NULL); |
5129 | 4490 aim_bos_setprofile(od->sess, od->conn, "unicode-2-0", msg, (msglen > od->rights.maxsiglen ? od->rights.maxsiglen : msglen), NULL, NULL, 0, caps_aim); |
4491 g_free(msg); | |
4492 } else if (flags & AIM_IMFLAGS_ISO_8859_1) { | |
6019 | 4493 msg = g_convert(text_html, strlen(text_html), "ISO-8859-1", "UTF-8", NULL, &msglen, NULL); |
5129 | 4494 aim_bos_setprofile(od->sess, od->conn, "iso-8859-1", msg, (msglen > od->rights.maxsiglen ? od->rights.maxsiglen : msglen), NULL, NULL, 0, caps_aim); |
4495 g_free(msg); | |
4151 | 4496 } else { |
6019 | 4497 msglen = strlen(text_html); |
4498 aim_bos_setprofile(od->sess, od->conn, "us-ascii", text_html, (msglen > od->rights.maxsiglen ? od->rights.maxsiglen : msglen), NULL, NULL, 0, caps_aim); | |
4151 | 4499 } |
5129 | 4500 |
4501 if (msglen > od->rights.maxsiglen) { | |
4502 gchar *errstr; | |
6308 | 4503 errstr = g_strdup_printf(ngettext("The maximum profile length of %d byte " |
4504 "has been exceeded. Gaim has truncated it for you.", | |
4505 "The maximum profile length of %d bytes " | |
4506 "has been exceeded. Gaim has truncated it for you.", | |
4507 od->rights.maxsiglen), od->rights.maxsiglen); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4508 gaim_notify_warning(gc, NULL, _("Profile too long."), errstr); |
5129 | 4509 g_free(errstr); |
4510 } | |
4511 | |
6019 | 4512 g_free(text_html); |
4513 | |
5129 | 4514 } |
2993 | 4515 |
4516 return; | |
2086 | 4517 } |
4518 | |
5575 | 4519 static void oscar_set_away_aim(GaimConnection *gc, struct oscar_data *od, const char *text) |
2993 | 4520 { |
5129 | 4521 fu32_t flags = 0; |
6019 | 4522 gchar *text_html = NULL; |
5129 | 4523 char *msg = NULL; |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
4524 gsize msglen = 0; |
2993 | 4525 |
4526 if (od->rights.maxawaymsglen == 0) | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4527 gaim_notify_warning(gc, NULL, _("Unable to set AIM away message."), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4528 _("You have probably requested to set your " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4529 "away message before the login procedure " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4530 "completed. You remain in a \"present\" " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4531 "state; try setting it again when you are " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4532 "fully connected.")); |
5129 | 4533 |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4534 if (gc->away) { |
2993 | 4535 g_free(gc->away); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4536 gc->away = NULL; |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4537 } |
2993 | 4538 |
5129 | 4539 if (!text) { |
4151 | 4540 aim_bos_setprofile(od->sess, od->conn, NULL, NULL, 0, NULL, "", 0, caps_aim); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4541 return; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4542 } |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4543 |
6037 | 4544 text_html = strdup_withhtml(text); |
6019 | 4545 flags = oscar_encoding_check(text_html); |
5129 | 4546 if (flags & AIM_IMFLAGS_UNICODE) { |
6019 | 4547 msg = g_convert(text_html, strlen(text_html), "UCS-2BE", "UTF-8", NULL, &msglen, NULL); |
5129 | 4548 aim_bos_setprofile(od->sess, od->conn, NULL, NULL, 0, "unicode-2-0", msg, |
4549 (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen), caps_aim); | |
4550 g_free(msg); | |
4551 gc->away = g_strndup(text, od->rights.maxawaymsglen/2); | |
4552 } else if (flags & AIM_IMFLAGS_ISO_8859_1) { | |
6019 | 4553 msg = g_convert(text_html, strlen(text_html), "ISO-8859-1", "UTF-8", NULL, &msglen, NULL); |
5129 | 4554 aim_bos_setprofile(od->sess, od->conn, NULL, NULL, 0, "iso-8859-1", msg, |
4555 (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen), caps_aim); | |
4556 g_free(msg); | |
6019 | 4557 gc->away = g_strndup(text_html, od->rights.maxawaymsglen); |
5129 | 4558 } else { |
6019 | 4559 msglen = strlen(text_html); |
4560 aim_bos_setprofile(od->sess, od->conn, NULL, NULL, 0, "us-ascii", text_html, | |
5129 | 4561 (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen), caps_aim); |
6019 | 4562 gc->away = g_strndup(text_html, od->rights.maxawaymsglen); |
5129 | 4563 } |
4564 | |
4565 if (msglen > od->rights.maxawaymsglen) { | |
2993 | 4566 gchar *errstr; |
4567 | |
6308 | 4568 errstr = g_strdup_printf(ngettext("The maximum away message length of %d byte " |
4569 "has been exceeded. Gaim has truncated it for you.", | |
4570 "The maximum away message length of %d bytes " | |
4571 "has been exceeded. Gaim has truncated it for you.", | |
4572 od->rights.maxawaymsglen), od->rights.maxawaymsglen); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4573 gaim_notify_warning(gc, NULL, _("Away message too long."), errstr); |
2993 | 4574 g_free(errstr); |
4575 } | |
6019 | 4576 |
4577 g_free(text_html); | |
2993 | 4578 return; |
4579 } | |
4580 | |
5575 | 4581 static void oscar_set_away_icq(GaimConnection *gc, struct oscar_data *od, const char *state, const char *message) |
2993 | 4582 { |
5575 | 4583 GaimAccount *account = gaim_connection_get_account(gc); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4584 if (gc->away) { |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4585 g_free(gc->away); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4586 gc->away = NULL; |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4587 } |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4588 |
4342 | 4589 if (strcmp(state, _("Invisible"))) { |
5575 | 4590 if ((od->sess->ssi.received_data) && (aim_ssi_getpermdeny(od->sess->ssi.local) != account->perm_deny)) |
4591 aim_ssi_setpermdeny(od->sess, account->perm_deny, 0xffffffff); | |
4592 account->perm_deny = 4; | |
4342 | 4593 } else { |
5542 | 4594 if ((od->sess->ssi.received_data) && (aim_ssi_getpermdeny(od->sess->ssi.local) != 0x03)) |
4889 | 4595 aim_ssi_setpermdeny(od->sess, 0x03, 0xffffffff); |
5575 | 4596 account->perm_deny = 3; |
4342 | 4597 } |
4598 | |
4599 if (!strcmp(state, _("Online"))) | |
4901 | 4600 aim_setextstatus(od->sess, AIM_ICQ_STATE_NORMAL); |
4342 | 4601 else if (!strcmp(state, _("Away"))) { |
4901 | 4602 aim_setextstatus(od->sess, AIM_ICQ_STATE_AWAY); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4603 gc->away = g_strdup(""); |
4342 | 4604 } else if (!strcmp(state, _("Do Not Disturb"))) { |
4901 | 4605 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
|
4606 gc->away = g_strdup(""); |
4342 | 4607 } else if (!strcmp(state, _("Not Available"))) { |
4901 | 4608 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
|
4609 gc->away = g_strdup(""); |
4342 | 4610 } else if (!strcmp(state, _("Occupied"))) { |
4901 | 4611 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
|
4612 gc->away = g_strdup(""); |
4342 | 4613 } else if (!strcmp(state, _("Free For Chat"))) { |
4901 | 4614 aim_setextstatus(od->sess, AIM_ICQ_STATE_CHAT); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4615 gc->away = g_strdup(""); |
4342 | 4616 } else if (!strcmp(state, _("Invisible"))) { |
4901 | 4617 aim_setextstatus(od->sess, AIM_ICQ_STATE_INVISIBLE); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4618 gc->away = g_strdup(""); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4619 } else if (!strcmp(state, GAIM_AWAY_CUSTOM)) { |
2998 | 4620 if (message) { |
4901 | 4621 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
|
4622 gc->away = g_strdup(""); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4623 } else { |
4901 | 4624 aim_setextstatus(od->sess, AIM_ICQ_STATE_NORMAL); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4625 } |
2086 | 4626 } |
2993 | 4627 |
4628 return; | |
4629 } | |
4630 | |
6059 | 4631 static void oscar_set_away(GaimConnection *gc, const char *state, const char *message) |
2993 | 4632 { |
4633 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
4634 | |
4635 if (od->icq) | |
4636 oscar_set_away_icq(gc, od, state, message); | |
4637 else | |
4638 oscar_set_away_aim(gc, od, message); | |
4639 | |
4640 return; | |
2086 | 4641 } |
4642 | |
6059 | 4643 static void oscar_warn(GaimConnection *gc, const char *name, int anon) { |
4617 | 4644 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
4645 aim_im_warn(od->sess, od->conn, name, anon ? AIM_WARN_ANON : 0); | |
2086 | 4646 } |
4647 | |
5575 | 4648 static void oscar_dir_search(GaimConnection *gc, const char *first, const char *middle, const char *last, |
3466 | 4649 const char *maiden, const char *city, const char *state, const char *country, const char *email) { |
4617 | 4650 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
2086 | 4651 if (strlen(email)) |
6879 | 4652 aim_search_address(od->sess, od->conn, email); |
2086 | 4653 } |
4654 | |
6787
faa491042c66
[gaim-migrate @ 7326]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
4655 static void oscar_add_buddy(GaimConnection *gc, const char *name, GaimGroup *g) { |
4230 | 4656 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
4657 #ifdef NOSSI | |
4658 aim_add_buddy(od->sess, od->conn, name); | |
4659 #else | |
4660 if ((od->sess->ssi.received_data) && !(aim_ssi_itemlist_exists(od->sess->ssi.local, name))) { | |
6695 | 4661 GaimBuddy *buddy = gaim_find_buddy(gc->account, name); |
4662 GaimGroup *group = gaim_find_buddys_group(buddy); | |
4230 | 4663 if (buddy && group) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4664 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4665 "ssi: adding buddy %s to group %s\n", name, group->name); |
4889 | 4666 aim_ssi_addbuddy(od->sess, buddy->name, group->name, gaim_get_buddy_alias_only(buddy), NULL, NULL, 0); |
4230 | 4667 } |
4668 } | |
4669 #endif | |
4759 | 4670 if (od->icq) |
4671 aim_icq_getalias(od->sess, name); | |
4230 | 4672 } |
4673 | |
5575 | 4674 static void oscar_add_buddies(GaimConnection *gc, GList *buddies) { |
4230 | 4675 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
4676 #ifdef NOSSI | |
4677 char buf[MSG_LEN]; | |
4678 int n=0; | |
4679 while (buddies) { | |
4680 if (n > MSG_LEN - 18) { | |
4681 aim_bos_setbuddylist(od->sess, od->conn, buf); | |
4682 n = 0; | |
3092 | 4683 } |
4230 | 4684 n += g_snprintf(buf + n, sizeof(buf) - n, "%s&", (char *)buddies->data); |
4685 buddies = buddies->next; | |
4686 } | |
4687 aim_bos_setbuddylist(od->sess, od->conn, buf); | |
4688 #else | |
4689 if (od->sess->ssi.received_data) { | |
4690 while (buddies) { | |
6695 | 4691 GaimBuddy *buddy = gaim_find_buddy(gc->account, (const char *)buddies->data); |
4692 GaimGroup *group = gaim_find_buddys_group(buddy); | |
4230 | 4693 if (buddy && group) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4694 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4695 "ssi: adding buddy %s to group %s\n", (const char *)buddies->data, group->name); |
4889 | 4696 aim_ssi_addbuddy(od->sess, buddy->name, group->name, gaim_get_buddy_alias_only(buddy), NULL, NULL, 0); |
4230 | 4697 } |
4698 buddies = buddies->next; | |
4699 } | |
4700 } | |
4701 #endif | |
4702 } | |
4703 | |
6059 | 4704 static void oscar_remove_buddy(GaimConnection *gc, const char *name, const char *group) { |
4230 | 4705 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
4706 #ifdef NOSSI | |
4707 aim_remove_buddy(od->sess, od->conn, name); | |
4708 #else | |
4709 if (od->sess->ssi.received_data) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4710 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4711 "ssi: deleting buddy %s from group %s\n", name, group); |
4889 | 4712 aim_ssi_delbuddy(od->sess, name, group); |
4230 | 4713 } |
4714 #endif | |
4715 } | |
4716 | |
5575 | 4717 static void oscar_remove_buddies(GaimConnection *gc, GList *buddies, const char *group) { |
4230 | 4718 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
4719 #ifdef NOSSI | |
4720 GList *cur; | |
4721 for (cur=buddies; cur; cur=cur->next) | |
4722 aim_remove_buddy(od->sess, od->conn, cur->data); | |
4723 #else | |
4724 if (od->sess->ssi.received_data) { | |
3092 | 4725 while (buddies) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4726 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4727 "ssi: deleting buddy %s from group %s\n", (char *)buddies->data, group); |
4889 | 4728 aim_ssi_delbuddy(od->sess, buddies->data, group); |
3092 | 4729 buddies = buddies->next; |
4730 } | |
4230 | 4731 } |
4732 #endif | |
4733 } | |
4734 | |
4735 #ifndef NOSSI | |
5575 | 4736 static void oscar_move_buddy(GaimConnection *gc, const char *name, const char *old_group, const char *new_group) { |
4269 | 4737 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
4303 | 4738 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
|
4739 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4740 "ssi: moving buddy %s from group %s to group %s\n", name, old_group, new_group); |
4889 | 4741 aim_ssi_movebuddy(od->sess, old_group, new_group, name); |
4269 | 4742 } |
4743 } | |
4744 | |
5575 | 4745 static void oscar_alias_buddy(GaimConnection *gc, const char *name, const char *alias) { |
4269 | 4746 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
4747 if (od->sess->ssi.received_data) { | |
4748 char *gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, name); | |
4749 if (gname) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4750 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4751 "ssi: changing the alias for buddy %s to %s\n", name, alias); |
4889 | 4752 aim_ssi_aliasbuddy(od->sess, gname, name, alias); |
4269 | 4753 } |
4754 } | |
4755 } | |
4756 | |
5575 | 4757 static void oscar_rename_group(GaimConnection *g, const char *old_group, const char *new_group, GList *members) { |
4230 | 4758 struct oscar_data *od = (struct oscar_data *)g->proto_data; |
4759 | |
4760 if (od->sess->ssi.received_data) { | |
4761 if (aim_ssi_itemlist_finditem(od->sess->ssi.local, new_group, NULL, AIM_SSI_TYPE_GROUP)) { | |
4762 oscar_remove_buddies(g, members, old_group); | |
4763 oscar_add_buddies(g, members); | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4764 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4765 "ssi: moved all buddies from group %s to %s\n", old_group, new_group); |
4230 | 4766 } else { |
4889 | 4767 aim_ssi_rename_group(od->sess, old_group, new_group); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4768 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4769 "ssi: renamed group %s to %s\n", old_group, new_group); |
2995 | 4770 } |
4771 } | |
4772 } | |
4773 | |
5968 | 4774 static gboolean gaim_ssi_rerequestdata(gpointer data) { |
4775 aim_session_t *sess = data; | |
6350 | 4776 aim_ssi_reqdata(sess); |
5968 | 4777 return FALSE; |
4778 } | |
4779 | |
4642 | 4780 static int gaim_ssi_parseerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4781 GaimConnection *gc = sess->aux_data; |
4642 | 4782 struct oscar_data *od = gc->proto_data; |
4783 va_list ap; | |
4784 fu16_t reason; | |
4785 | |
4786 va_start(ap, fr); | |
4787 reason = (fu16_t)va_arg(ap, unsigned int); | |
4788 va_end(ap); | |
4789 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4790 gaim_debug(GAIM_DEBUG_ERROR, "oscar", "ssi: SNAC error %hu\n", reason); |
4642 | 4791 |
4792 if (reason == 0x0005) { | |
5892 | 4793 gaim_notify_error(gc, NULL, _("Unable To Retrieve Buddy List"), |
5828 | 4794 _("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.")); |
5968 | 4795 od->getblisttimer = g_timeout_add(300000, gaim_ssi_rerequestdata, od->sess); |
4642 | 4796 } |
4797 | |
4798 /* Activate SSI */ | |
4799 /* Sending the enable causes other people to be able to see you, and you to see them */ | |
4800 /* Make sure your privacy setting/invisibility is set how you want it before this! */ | |
5968 | 4801 gaim_debug(GAIM_DEBUG_INFO, "oscar", "ssi: activating server-stored buddy list\n"); |
4642 | 4802 aim_ssi_enable(od->sess); |
4803 | |
4804 return 1; | |
4805 } | |
4806 | |
2991 | 4807 static int gaim_ssi_parserights(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4808 GaimConnection *gc = sess->aux_data; |
4230 | 4809 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
4810 int numtypes, i; | |
4811 fu16_t *maxitems; | |
2991 | 4812 va_list ap; |
4813 | |
4814 va_start(ap, fr); | |
4230 | 4815 numtypes = va_arg(ap, int); |
4816 maxitems = va_arg(ap, fu16_t *); | |
2991 | 4817 va_end(ap); |
4818 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4819 gaim_debug(GAIM_DEBUG_MISC, "oscar", "ssi rights:"); |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
4820 |
4230 | 4821 for (i=0; i<numtypes; i++) |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
4822 gaim_debug(GAIM_DEBUG_MISC, NULL, " max type 0x%04x=%hd,", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
4823 i, maxitems[i]); |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
4824 |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
4825 gaim_debug(GAIM_DEBUG_MISC, NULL, "\n"); |
4230 | 4826 |
4827 if (numtypes >= 0) | |
4828 od->rights.maxbuddies = maxitems[0]; | |
4829 if (numtypes >= 1) | |
4830 od->rights.maxgroups = maxitems[1]; | |
4831 if (numtypes >= 2) | |
4832 od->rights.maxpermits = maxitems[2]; | |
4833 if (numtypes >= 3) | |
4834 od->rights.maxdenies = maxitems[3]; | |
2991 | 4835 |
4836 return 1; | |
4837 } | |
4838 | |
4839 static int gaim_ssi_parselist(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 4840 GaimConnection *gc = sess->aux_data; |
4841 GaimAccount *account = gaim_connection_get_account(gc); | |
4230 | 4842 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
2995 | 4843 struct aim_ssi_item *curitem; |
2991 | 4844 int tmp; |
4778 | 4845 gboolean export = FALSE; |
4617 | 4846 /* XXX - use these? |
4230 | 4847 va_list ap; |
4848 | |
4849 va_start(ap, fr); | |
4850 fmtver = (fu16_t)va_arg(ap, int); | |
4851 numitems = (fu16_t)va_arg(ap, int); | |
4852 items = va_arg(ap, struct aim_ssi_item); | |
4853 timestamp = va_arg(ap, fu32_t); | |
4854 va_end(ap); */ | |
2991 | 4855 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4856 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4857 "ssi: syncing local list and server list\n"); |
2991 | 4858 |
4859 /* Clean the buddy list */ | |
4889 | 4860 aim_ssi_cleanlist(sess); |
2991 | 4861 |
4862 /* Add from server list to local list */ | |
4230 | 4863 for (curitem=sess->ssi.local; curitem; curitem=curitem->next) { |
2991 | 4864 switch (curitem->type) { |
4230 | 4865 case 0x0000: { /* Buddy */ |
4251 | 4866 if (curitem->name) { |
4292 | 4867 char *gname = aim_ssi_itemlist_findparentname(sess->ssi.local, curitem->name); |
4458 | 4868 char *gname_utf8 = gaim_try_conv_to_utf8(gname); |
4282 | 4869 char *alias = aim_ssi_getalias(sess->ssi.local, gname, curitem->name); |
4458 | 4870 char *alias_utf8 = gaim_try_conv_to_utf8(alias); |
6695 | 4871 GaimBuddy *buddy = gaim_find_buddy(gc->account, curitem->name); |
4458 | 4872 /* Should gname be freed here? -- elb */ |
4754 | 4873 /* Not with the current code, but that might be cleaner -- med */ |
4458 | 4874 free(alias); |
4282 | 4875 if (buddy) { |
4292 | 4876 /* Get server stored alias */ |
4705 | 4877 if (alias_utf8) { |
4878 g_free(buddy->alias); | |
4879 buddy->alias = g_strdup(alias_utf8); | |
4880 } | |
4282 | 4881 } else { |
6695 | 4882 GaimGroup *g; |
4687 | 4883 buddy = gaim_buddy_new(gc->account, curitem->name, alias_utf8); |
5146 | 4884 |
4754 | 4885 if (!(g = gaim_find_group(gname_utf8 ? gname_utf8 : _("Orphans")))) { |
4687 | 4886 g = gaim_group_new(gname_utf8 ? gname_utf8 : _("Orphans")); |
4754 | 4887 gaim_blist_add_group(g, NULL); |
4888 } | |
5146 | 4889 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4890 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4891 "ssi: adding buddy %s to group %s to local list\n", curitem->name, gname_utf8 ? gname_utf8 : _("Orphans")); |
6695 | 4892 gaim_blist_add_buddy(buddy, NULL, g, NULL); |
4778 | 4893 export = TRUE; |
4251 | 4894 } |
4458 | 4895 free(gname_utf8); |
4896 free(alias_utf8); | |
2991 | 4897 } |
4230 | 4898 } break; |
4899 | |
4900 case 0x0001: { /* Group */ | |
4282 | 4901 /* Shouldn't add empty groups */ |
4230 | 4902 } break; |
4903 | |
4904 case 0x0002: { /* Permit buddy */ | |
2991 | 4905 if (curitem->name) { |
4230 | 4906 /* if (!find_permdeny_by_name(gc->permit, curitem->name)) { AAA */ |
2991 | 4907 GSList *list; |
5575 | 4908 for (list=account->permit; (list && aim_sncmp(curitem->name, list->data)); list=list->next); |
2991 | 4909 if (!list) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4910 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4911 "ssi: adding permit buddy %s to local list\n", curitem->name); |
6400
588e88bcdac5
[gaim-migrate @ 6905]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
4912 gaim_privacy_permit_add(account, curitem->name, TRUE); |
4778 | 4913 export = TRUE; |
2991 | 4914 } |
4915 } | |
4230 | 4916 } break; |
4917 | |
4918 case 0x0003: { /* Deny buddy */ | |
2991 | 4919 if (curitem->name) { |
4920 GSList *list; | |
5575 | 4921 for (list=account->deny; (list && aim_sncmp(curitem->name, list->data)); list=list->next); |
2991 | 4922 if (!list) { |
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: adding deny buddy %s to local list\n", curitem->name); |
6400
588e88bcdac5
[gaim-migrate @ 6905]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
4925 gaim_privacy_deny_add(account, curitem->name, TRUE); |
4778 | 4926 export = TRUE; |
2991 | 4927 } |
4928 } | |
4230 | 4929 } break; |
4930 | |
4931 case 0x0004: { /* Permit/deny setting */ | |
2991 | 4932 if (curitem->data) { |
4933 fu8_t permdeny; | |
5575 | 4934 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
|
4935 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
5575 | 4936 "ssi: changing permdeny from %d to %hhu\n", account->perm_deny, permdeny); |
4937 account->perm_deny = permdeny; | |
4938 if (od->icq && account->perm_deny == 0x03) { | |
4342 | 4939 serv_set_away(gc, "Invisible", ""); |
4940 } | |
4778 | 4941 export = TRUE; |
2991 | 4942 } |
4943 } | |
4230 | 4944 } break; |
4945 | |
4946 case 0x0005: { /* Presence setting */ | |
3109 | 4947 /* We don't want to change Gaim's setting because it applies to all accounts */ |
4230 | 4948 } break; |
2991 | 4949 } /* End of switch on curitem->type */ |
4950 } /* End of for loop */ | |
4230 | 4951 |
4952 /* If changes were made, then flush buddy list to file */ | |
4778 | 4953 if (export) |
4349 | 4954 gaim_blist_save(); |
2991 | 4955 |
4759 | 4956 { /* Add from local list to server list */ |
6695 | 4957 GaimBlistNode *gnode, *cnode, *bnode; |
4958 GaimGroup *group; | |
4959 GaimBuddy *buddy; | |
4759 | 4960 struct gaim_buddy_list *blist; |
3017 | 4961 GSList *cur; |
4962 | |
2991 | 4963 /* Buddies */ |
4759 | 4964 if ((blist = gaim_get_blist())) |
4965 for (gnode = blist->root; gnode; gnode = gnode->next) { | |
5234 | 4966 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) |
4967 continue; | |
6695 | 4968 group = (GaimGroup *)gnode; |
4969 for (cnode = gnode->child; cnode; cnode = cnode->next) { | |
4970 if(!GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
5234 | 4971 continue; |
6695 | 4972 for (bnode = cnode->child; bnode; bnode = bnode->next) { |
4973 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
4974 continue; | |
4975 buddy = (GaimBuddy *)bnode; | |
4976 if (buddy->account == gc->account) { | |
4977 gchar *servernick = gaim_buddy_get_setting(buddy, "servernick"); | |
4978 if (servernick) { | |
4979 serv_got_alias(gc, buddy->name, servernick); | |
4980 g_free(servernick); | |
4981 } | |
4982 if (aim_ssi_itemlist_exists(sess->ssi.local, buddy->name)) { | |
4983 /* Store local alias on server */ | |
4984 char *alias = aim_ssi_getalias(sess->ssi.local, group->name, buddy->name); | |
4985 if (!alias && buddy->alias && strlen(buddy->alias)) | |
4986 aim_ssi_aliasbuddy(sess, group->name, buddy->name, buddy->alias); | |
4987 free(alias); | |
4988 } else { | |
4989 gaim_debug(GAIM_DEBUG_INFO, "oscar", | |
4990 "ssi: adding buddy %s from local list to server list\n", buddy->name); | |
4991 aim_ssi_addbuddy(sess, buddy->name, group->name, gaim_get_buddy_alias_only(buddy), NULL, NULL, 0); | |
4992 } | |
4759 | 4993 } |
4349 | 4994 } |
4230 | 4995 } |
4292 | 4996 } |
6695 | 4997 |
2991 | 4998 /* Permit list */ |
4491 | 4999 if (gc->account->permit) { |
5000 for (cur=gc->account->permit; cur; cur=cur->next) | |
4230 | 5001 if (!aim_ssi_itemlist_finditem(sess->ssi.local, NULL, cur->data, AIM_SSI_TYPE_PERMIT)) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5002 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
6695 | 5003 "ssi: adding permit %s from local list to server list\n", (char *)cur->data); |
4889 | 5004 aim_ssi_addpermit(sess, cur->data); |
4230 | 5005 } |
2991 | 5006 } |
5007 | |
5008 /* Deny list */ | |
4491 | 5009 if (gc->account->deny) { |
5010 for (cur=gc->account->deny; cur; cur=cur->next) | |
4230 | 5011 if (!aim_ssi_itemlist_finditem(sess->ssi.local, NULL, cur->data, AIM_SSI_TYPE_DENY)) { |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5012 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
6695 | 5013 "ssi: adding deny %s from local list to server list\n", (char *)cur->data); |
4889 | 5014 aim_ssi_adddeny(sess, cur->data); |
4230 | 5015 } |
2991 | 5016 } |
3109 | 5017 /* Presence settings (idle time visibility) */ |
4230 | 5018 if ((tmp = aim_ssi_getpresence(sess->ssi.local)) != 0xFFFFFFFF) |
5631 | 5019 if (!(tmp & 0x400)) |
4889 | 5020 aim_ssi_setpresence(sess, tmp | 0x400); |
4778 | 5021 } /* end adding buddies from local list to server list */ |
5022 | |
4901 | 5023 /* Set our ICQ status */ |
5024 if (od->icq && !gc->away) { | |
5025 aim_setextstatus(sess, AIM_ICQ_STATE_NORMAL); | |
5026 } | |
5027 | |
4342 | 5028 /* Activate SSI */ |
5029 /* Sending the enable causes other people to be able to see you, and you to see them */ | |
5030 /* 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
|
5031 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5032 "ssi: activating server-stored buddy list\n"); |
4642 | 5033 aim_ssi_enable(sess); |
4342 | 5034 |
2991 | 5035 return 1; |
2086 | 5036 } |
4230 | 5037 |
5038 static int gaim_ssi_parseack(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 5039 GaimConnection *gc = sess->aux_data; |
4230 | 5040 va_list ap; |
5041 struct aim_ssi_tmp *retval; | |
5042 | |
5043 va_start(ap, fr); | |
5044 retval = va_arg(ap, struct aim_ssi_tmp *); | |
5045 va_end(ap); | |
5046 | |
5047 while (retval) { | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5048 gaim_debug(GAIM_DEBUG_MISC, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5049 "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 | 5050 |
5051 if (retval->ack != 0xffff) | |
5052 switch (retval->ack) { | |
5053 case 0x0000: { /* added successfully */ | |
5054 } break; | |
5055 | |
4829 | 5056 case 0x000c: { /* you are over the limit, the cheat is to the limit, come on fhqwhgads */ |
5057 gchar *buf; | |
5058 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
|
5059 gaim_notify_error(gc, NULL, _("Unable To Add"), buf); |
4829 | 5060 g_free(buf); |
5061 } | |
5062 | |
4230 | 5063 case 0x000e: { /* contact requires authorization */ |
4828 | 5064 if ((retval->action == AIM_CB_SSI_ADD) && (retval->name)) |
4269 | 5065 gaim_auth_sendrequest(gc, retval->name); |
4230 | 5066 } break; |
5067 | |
5068 default: { /* La la la */ | |
5197 | 5069 gchar *buf; |
5402 | 5070 gaim_debug(GAIM_DEBUG_ERROR, "oscar", "ssi: Action 0x%04hx was unsuccessful with error 0x%04hx\n", retval->action, retval->ack); |
5071 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
|
5072 gaim_notify_error(gc, NULL, _("Unable To Add"), buf); |
5197 | 5073 g_free(buf); |
5402 | 5074 /* XXX - Should remove buddy from local list */ |
4230 | 5075 } break; |
5076 } | |
5077 | |
5078 retval = retval->next; | |
5079 } | |
5080 | |
5081 return 1; | |
5082 } | |
5083 | |
5084 static int gaim_ssi_authgiven(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 5085 GaimConnection *gc = sess->aux_data; |
4230 | 5086 va_list ap; |
5087 char *sn, *msg; | |
4236 | 5088 gchar *dialog_msg, *nombre; |
4230 | 5089 struct name_data *data; |
6695 | 5090 GaimBuddy *buddy; |
4230 | 5091 |
5092 va_start(ap, fr); | |
5093 sn = va_arg(ap, char *); | |
5094 msg = va_arg(ap, char *); | |
5095 va_end(ap); | |
5096 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5097 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5098 "ssi: %s has given you permission to add him to your buddy list\n", sn); |
4230 | 5099 |
4687 | 5100 buddy = gaim_find_buddy(gc->account, sn); |
5101 if (buddy && (gaim_get_buddy_alias_only(buddy))) | |
5102 nombre = g_strdup_printf("%s (%s)", sn, gaim_get_buddy_alias_only(buddy)); | |
4236 | 5103 else |
5104 nombre = g_strdup(sn); | |
5105 | |
5106 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 | 5107 data = g_new(struct name_data, 1); |
5108 data->gc = gc; | |
5109 data->name = g_strdup(sn); | |
5110 data->nick = NULL; | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5111 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5112 gaim_request_yes_no(gc, NULL, _("Authorization Given"), dialog_msg, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5113 0, data, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5114 G_CALLBACK(gaim_icq_contactadd), |
5836 | 5115 G_CALLBACK(oscar_free_name_data)); |
4236 | 5116 |
4230 | 5117 g_free(dialog_msg); |
4236 | 5118 g_free(nombre); |
4230 | 5119 |
5120 return 1; | |
5121 } | |
5122 | |
5123 static int gaim_ssi_authrequest(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 5124 GaimConnection *gc = sess->aux_data; |
4230 | 5125 va_list ap; |
5126 char *sn, *msg; | |
4236 | 5127 gchar *dialog_msg, *nombre; |
4230 | 5128 struct name_data *data; |
6695 | 5129 GaimBuddy *buddy; |
4230 | 5130 |
5131 va_start(ap, fr); | |
5132 sn = va_arg(ap, char *); | |
5133 msg = va_arg(ap, char *); | |
5134 va_end(ap); | |
5135 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5136 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5137 "ssi: received authorization request from %s\n", sn); |
4230 | 5138 |
4687 | 5139 buddy = gaim_find_buddy(gc->account, sn); |
5140 if (buddy && (gaim_get_buddy_alias_only(buddy))) | |
5141 nombre = g_strdup_printf("%s (%s)", sn, gaim_get_buddy_alias_only(buddy)); | |
4236 | 5142 else |
5143 nombre = g_strdup(sn); | |
5144 | |
4337 | 5145 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 | 5146 data = g_new(struct name_data, 1); |
5147 data->gc = gc; | |
5148 data->name = g_strdup(sn); | |
5149 data->nick = NULL; | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5150 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5151 gaim_request_action(gc, NULL, _("Authorization Request"), dialog_msg, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5152 0, data, 2, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5153 _("Authorize"), G_CALLBACK(gaim_auth_grant), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5154 _("Deny"), G_CALLBACK(gaim_auth_dontgrant_msgprompt)); |
4236 | 5155 |
4230 | 5156 g_free(dialog_msg); |
4236 | 5157 g_free(nombre); |
4230 | 5158 |
5159 return 1; | |
5160 } | |
5161 | |
5162 static int gaim_ssi_authreply(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 5163 GaimConnection *gc = sess->aux_data; |
4230 | 5164 va_list ap; |
5165 char *sn, *msg; | |
4236 | 5166 gchar *dialog_msg, *nombre; |
4230 | 5167 fu8_t reply; |
6695 | 5168 GaimBuddy *buddy; |
4230 | 5169 |
5170 va_start(ap, fr); | |
5171 sn = va_arg(ap, char *); | |
5172 reply = (fu8_t)va_arg(ap, int); | |
5173 msg = va_arg(ap, char *); | |
5174 va_end(ap); | |
5175 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5176 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5177 "ssi: received authorization reply from %s. Reply is 0x%04hhx\n", sn, reply); |
4236 | 5178 |
4687 | 5179 buddy = gaim_find_buddy(gc->account, sn); |
5180 if (buddy && (gaim_get_buddy_alias_only(buddy))) | |
5181 nombre = g_strdup_printf("%s (%s)", sn, gaim_get_buddy_alias_only(buddy)); | |
4236 | 5182 else |
5183 nombre = g_strdup(sn); | |
5184 | |
4230 | 5185 if (reply) { |
5186 /* Granted */ | |
4236 | 5187 dialog_msg = g_strdup_printf(_("The user %s has granted your request to add them to your contact list."), nombre); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5188 gaim_notify_info(gc, NULL, _("Authorization Granted"), dialog_msg); |
4230 | 5189 } else { |
5190 /* Denied */ | |
4236 | 5191 dialog_msg = g_strdup_printf(_("The user %s has denied your request to add them to your contact list for the following reason:\n%s"), nombre, msg ? msg : _("No reason given.")); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5192 gaim_notify_info(gc, NULL, _("Authorization Denied"), dialog_msg); |
4230 | 5193 } |
5194 g_free(dialog_msg); | |
4236 | 5195 g_free(nombre); |
4230 | 5196 |
5197 return 1; | |
5198 } | |
5199 | |
5200 static int gaim_ssi_gotadded(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 5201 GaimConnection *gc = sess->aux_data; |
4230 | 5202 va_list ap; |
5203 char *sn; | |
6695 | 5204 GaimBuddy *buddy; |
4230 | 5205 |
5206 va_start(ap, fr); | |
5207 sn = va_arg(ap, char *); | |
5208 va_end(ap); | |
5209 | |
4687 | 5210 buddy = gaim_find_buddy(gc->account, sn); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5211 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5212 "ssi: %s added you to their buddy list\n", sn); |
4687 | 5213 show_got_added(gc, NULL, sn, (buddy ? gaim_get_buddy_alias_only(buddy) : NULL), NULL); |
4230 | 5214 |
5215 return 1; | |
5216 } | |
4269 | 5217 #endif |
2086 | 5218 |
5575 | 5219 static GList *oscar_chat_info(GaimConnection *gc) { |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5220 GList *m = NULL; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5221 struct proto_chat_entry *pce; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5222 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5223 pce = g_new0(struct proto_chat_entry, 1); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5224 pce->label = _("Join what group:"); |
5234 | 5225 pce->identifier = "room"; |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5226 m = g_list_append(m, pce); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5227 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5228 pce = g_new0(struct proto_chat_entry, 1); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5229 pce->label = _("Exchange:"); |
5234 | 5230 pce->identifier = "exchange"; |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5231 pce->is_int = TRUE; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5232 pce->min = 4; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5233 pce->max = 20; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5234 m = g_list_append(m, pce); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5235 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5236 return m; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5237 } |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5238 |
5575 | 5239 static void oscar_join_chat(GaimConnection *g, GHashTable *data) { |
4617 | 5240 struct oscar_data *od = (struct oscar_data *)g->proto_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5241 aim_conn_t *cur; |
5234 | 5242 char *name, *exchange; |
5243 | |
5244 name = g_hash_table_lookup(data, "room"); | |
5245 exchange = g_hash_table_lookup(data, "exchange"); | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5246 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5247 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5248 "Attempting to join chat room %s.\n", name); |
4617 | 5249 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
|
5250 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5251 "chatnav exists, creating room\n"); |
5234 | 5252 aim_chatnav_createroom(od->sess, cur, name, atoi(exchange)); |
2086 | 5253 } else { |
5254 /* this gets tricky */ | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
5255 struct create_room *cr = g_new0(struct create_room, 1); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5256 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5257 "chatnav does not exist, opening chatnav\n"); |
5234 | 5258 cr->exchange = atoi(exchange); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
5259 cr->name = g_strdup(name); |
4617 | 5260 od->create_rooms = g_slist_append(od->create_rooms, cr); |
5261 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_CHATNAV); | |
2086 | 5262 } |
5263 } | |
5264 | |
5575 | 5265 static void oscar_chat_invite(GaimConnection *g, int id, const char *message, const char *name) { |
4617 | 5266 struct oscar_data *od = (struct oscar_data *)g->proto_data; |
2086 | 5267 struct chat_connection *ccon = find_oscar_chat(g, id); |
5268 | |
5269 if (!ccon) | |
5270 return; | |
5271 | |
4617 | 5272 aim_chat_invite(od->sess, od->conn, name, message ? message : "", |
2086 | 5273 ccon->exchange, ccon->name, 0x0); |
5274 } | |
5275 | |
5575 | 5276 static void oscar_chat_leave(GaimConnection *g, int id) { |
4617 | 5277 struct oscar_data *od = g ? (struct oscar_data *)g->proto_data : NULL; |
2086 | 5278 GSList *bcs = g->buddy_chats; |
5679 | 5279 GaimConversation *b = NULL; |
2086 | 5280 struct chat_connection *c = NULL; |
5281 int count = 0; | |
5282 | |
5283 while (bcs) { | |
5284 count++; | |
5679 | 5285 b = (GaimConversation *)bcs->data; |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
5286 if (id == gaim_chat_get_id(GAIM_CHAT(b))) |
2086 | 5287 break; |
5288 bcs = bcs->next; | |
5289 b = NULL; | |
5290 } | |
5291 | |
5292 if (!b) | |
5293 return; | |
5294 | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5295 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5296 "Attempting to leave room %s (currently in %d rooms)\n", b->name, count); |
2086 | 5297 |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
5298 c = find_oscar_chat(g, gaim_chat_get_id(GAIM_CHAT(b))); |
2086 | 5299 if (c != NULL) { |
4617 | 5300 if (od) |
5301 od->oscar_chats = g_slist_remove(od->oscar_chats, c); | |
2086 | 5302 if (c->inpa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
5303 gaim_input_remove(c->inpa); |
4617 | 5304 if (g && od->sess) |
5305 aim_conn_kill(od->sess, &c->conn); | |
2086 | 5306 g_free(c->name); |
5307 g_free(c->show); | |
5308 g_free(c); | |
5309 } | |
5310 /* we do this because with Oscar it doesn't tell us we left */ | |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
5311 serv_got_chat_left(g, gaim_chat_get_id(GAIM_CHAT(b))); |
2086 | 5312 } |
5313 | |
6059 | 5314 static int oscar_chat_send(GaimConnection *g, int id, const char *message) { |
4617 | 5315 struct oscar_data *od = (struct oscar_data *)g->proto_data; |
2086 | 5316 GSList *bcs = g->buddy_chats; |
5679 | 5317 GaimConversation *b = NULL; |
2086 | 5318 struct chat_connection *c = NULL; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5319 char *buf, *buf2; |
2086 | 5320 int i, j; |
5321 | |
5322 while (bcs) { | |
5679 | 5323 b = (GaimConversation *)bcs->data; |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
5324 if (id == gaim_chat_get_id(GAIM_CHAT(b))) |
2086 | 5325 break; |
5326 bcs = bcs->next; | |
5327 b = NULL; | |
5328 } | |
5329 if (!b) | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5330 return -EINVAL; |
2086 | 5331 |
4617 | 5332 bcs = od->oscar_chats; |
2086 | 5333 while (bcs) { |
5334 c = (struct chat_connection *)bcs->data; | |
5335 if (b == c->cnv) | |
5336 break; | |
5337 bcs = bcs->next; | |
5338 c = NULL; | |
5339 } | |
5340 if (!c) | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5341 return -EINVAL; |
2086 | 5342 |
5343 buf = g_malloc(strlen(message) * 4 + 1); | |
5344 for (i = 0, j = 0; i < strlen(message); i++) { | |
5345 if (message[i] == '\n') { | |
5346 buf[j++] = '<'; | |
5347 buf[j++] = 'B'; | |
5348 buf[j++] = 'R'; | |
5349 buf[j++] = '>'; | |
5350 } else { | |
5351 buf[j++] = message[i]; | |
5352 } | |
5353 } | |
5354 buf[j] = '\0'; | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5355 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5356 if (strlen(buf) > c->maxlen) |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5357 return -E2BIG; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5358 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5359 buf2 = strip_html(buf); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5360 if (strlen(buf2) > c->maxvis) { |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5361 g_free(buf2); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5362 return -E2BIG; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5363 } |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5364 g_free(buf2); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5365 |
4617 | 5366 aim_chat_send_im(od->sess, c->conn, 0, buf, strlen(buf)); |
2086 | 5367 g_free(buf); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5368 return 0; |
2086 | 5369 } |
5370 | |
6695 | 5371 static const char *oscar_list_icon(GaimAccount *a, GaimBuddy *b) { |
4766 | 5372 if (!b || (b && b->name && b->name[0] == '+')) { |
5646
48c63ee49961
[gaim-migrate @ 6060]
Christian Hammond <chipx86@chipx86.com>
parents:
5638
diff
changeset
|
5373 if (a != NULL && isdigit(*gaim_account_get_username(a))) |
4687 | 5374 return "icq"; |
5375 else | |
5376 return "aim"; | |
5377 } | |
5646
48c63ee49961
[gaim-migrate @ 6060]
Christian Hammond <chipx86@chipx86.com>
parents:
5638
diff
changeset
|
5378 |
48c63ee49961
[gaim-migrate @ 6060]
Christian Hammond <chipx86@chipx86.com>
parents:
5638
diff
changeset
|
5379 if (b != NULL && isdigit(b->name[0])) |
4687 | 5380 return "icq"; |
5381 return "aim"; | |
5382 } | |
5383 | |
6695 | 5384 static void oscar_list_emblems(GaimBuddy *b, char **se, char **sw, char **nw, char **ne) |
4687 | 5385 { |
5386 char *emblems[4] = {NULL,NULL,NULL,NULL}; | |
5387 int i = 0; | |
5388 | |
5131 | 5389 if (!GAIM_BUDDY_IS_ONLINE(b)) { |
5575 | 5390 GaimAccount *account; |
5391 GaimConnection *gc; | |
5131 | 5392 struct oscar_data *od; |
5393 char *gname; | |
5394 if ((b->name) && (account = b->account) && (gc = account->gc) && | |
5395 (od = gc->proto_data) && (od->sess->ssi.received_data) && | |
5396 (gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, b->name)) && | |
5397 (aim_ssi_waitingforauth(od->sess->ssi.local, gname, b->name))) { | |
5398 emblems[i++] = "notauthorized"; | |
5399 } else { | |
5400 emblems[i++] = "offline"; | |
5401 } | |
5402 } | |
4916 | 5403 |
4766 | 5404 if (b->name && (b->uc & 0xffff0000) && isdigit(b->name[0])) { |
4960 | 5405 int uc = b->uc >> 16; |
4766 | 5406 if (uc & AIM_ICQ_STATE_INVISIBLE) |
4960 | 5407 emblems[i++] = "invisible"; |
4766 | 5408 else if (uc & AIM_ICQ_STATE_CHAT) |
4960 | 5409 emblems[i++] = "freeforchat"; |
4766 | 5410 else if (uc & AIM_ICQ_STATE_DND) |
4960 | 5411 emblems[i++] = "dnd"; |
4766 | 5412 else if (uc & AIM_ICQ_STATE_OUT) |
4960 | 5413 emblems[i++] = "na"; |
4766 | 5414 else if (uc & AIM_ICQ_STATE_BUSY) |
4960 | 5415 emblems[i++] = "occupied"; |
4766 | 5416 else if (uc & AIM_ICQ_STATE_AWAY) |
5417 emblems[i++] = "away"; | |
5418 } else { | |
5419 if (b->uc & UC_UNAVAILABLE) | |
5420 emblems[i++] = "away"; | |
5421 } | |
4687 | 5422 if (b->uc & UC_WIRELESS) |
5423 emblems[i++] = "wireless"; | |
5424 if (b->uc & UC_AOL) | |
5425 emblems[i++] = "aol"; | |
5426 if (b->uc & UC_ADMIN) | |
5427 emblems[i++] = "admin"; | |
5428 if (b->uc & UC_AB && i < 4) | |
5429 emblems[i++] = "activebuddy"; | |
6318 | 5430 if (b->uc & UC_HIPTOP && i < 4) |
5431 emblems[i++] = "hiptop"; | |
4766 | 5432 /* if (b->uc & UC_UNCONFIRMED && i < 4) |
5433 emblems[i++] = "unconfirmed"; */ | |
4687 | 5434 *se = emblems[0]; |
5435 *sw = emblems[1]; | |
5436 *nw = emblems[2]; | |
5437 *ne = emblems[3]; | |
5438 } | |
5439 | |
6695 | 5440 static char *oscar_tooltip_text(GaimBuddy *b) { |
5575 | 5441 GaimConnection *gc = b->account->gc; |
5131 | 5442 struct oscar_data *od = gc->proto_data; |
5443 struct buddyinfo *bi = g_hash_table_lookup(od->buddyinfo, normalize(b->name)); | |
5444 gchar *tmp, *yay = g_strdup(""); | |
5445 | |
5446 if (GAIM_BUDDY_IS_ONLINE(b)) { | |
5447 if (isdigit(b->name[0])) { | |
5448 char *tmp, *status; | |
5449 status = gaim_icq_status((b->uc & 0xffff0000) >> 16); | |
5450 tmp = yay; | |
5451 yay = g_strconcat(tmp, _("<b>Status:</b> "), status, "\n", NULL); | |
5452 g_free(tmp); | |
5453 g_free(status); | |
5454 } | |
5455 | |
5456 if (bi) { | |
5457 char *tstr = sec_to_text(time(NULL) - bi->signon + | |
5458 (gc->login_time_official ? gc->login_time_official - gc->login_time : 0)); | |
5459 tmp = yay; | |
5460 yay = g_strconcat(tmp, _("<b>Logged In:</b> "), tstr, "\n", NULL); | |
5461 free(tmp); | |
5462 free(tstr); | |
5463 | |
6857 | 5464 if (bi->ipaddr) { |
5465 char *tstr = g_strdup_printf("%hhd.%hhd.%hhd.%hhd", | |
5466 (bi->ipaddr & 0xff000000) >> 24, | |
5467 (bi->ipaddr & 0x00ff0000) >> 16, | |
5468 (bi->ipaddr & 0x0000ff00) >> 8, | |
5469 (bi->ipaddr & 0x000000ff)); | |
5470 tmp = yay; | |
5471 yay = g_strconcat(tmp, _("<b>IP Address:</b> "), tstr, "\n", NULL); | |
5472 free(tmp); | |
5473 free(tstr); | |
5474 } | |
5475 | |
5131 | 5476 if (bi->caps) { |
5477 char *caps = caps_string(bi->caps); | |
5478 tmp = yay; | |
5479 yay = g_strconcat(tmp, _("<b>Capabilities:</b> "), caps, "\n", NULL); | |
5480 free(tmp); | |
5481 } | |
5836 | 5482 |
6292 | 5483 if (bi->availmsg && !(b->uc & UC_UNAVAILABLE)) { |
5484 gchar *escaped = g_markup_escape_text(bi->availmsg, strlen(bi->availmsg)); | |
5836 | 5485 tmp = yay; |
6173 | 5486 yay = g_strconcat(tmp, _("<b>Available:</b> "), escaped, "\n", NULL); |
5836 | 5487 free(tmp); |
6173 | 5488 g_free(escaped); |
5836 | 5489 } |
5131 | 5490 } |
5491 } else { | |
5492 char *gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, b->name); | |
5493 if (aim_ssi_waitingforauth(od->sess->ssi.local, gname, b->name)) { | |
5494 tmp = yay; | |
5495 yay = g_strconcat(tmp, _("<b>Status:</b> Not Authorized"), "\n", NULL); | |
5496 g_free(tmp); | |
5497 } else { | |
5498 tmp = yay; | |
5499 yay = g_strconcat(tmp, _("<b>Status:</b> Offline"), "\n", NULL); | |
5500 g_free(tmp); | |
5501 } | |
5502 } | |
5503 | |
5504 /* remove the trailing newline character */ | |
5505 if (yay) | |
5506 yay[strlen(yay)-1] = '\0'; | |
5507 return yay; | |
5508 } | |
5509 | |
6695 | 5510 static char *oscar_status_text(GaimBuddy *b) { |
5575 | 5511 GaimConnection *gc = b->account->gc; |
5167 | 5512 struct oscar_data *od = gc->proto_data; |
5513 gchar *ret = NULL; | |
5514 | |
5515 if ((b->uc & UC_UNAVAILABLE) || (((b->uc & 0xffff0000) >> 16) & AIM_ICQ_STATE_CHAT)) { | |
5516 if (isdigit(b->name[0])) | |
5517 ret = gaim_icq_status((b->uc & 0xffff0000) >> 16); | |
5518 else | |
5519 ret = g_strdup(_("Away")); | |
5836 | 5520 } else if (GAIM_BUDDY_IS_ONLINE(b)) { |
5521 struct buddyinfo *bi = g_hash_table_lookup(od->buddyinfo, normalize(b->name)); | |
6292 | 5522 if (bi->availmsg) |
5523 ret = g_markup_escape_text(bi->availmsg, strlen(bi->availmsg)); | |
5836 | 5524 } else { |
5167 | 5525 char *gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, b->name); |
5526 if (aim_ssi_waitingforauth(od->sess->ssi.local, gname, b->name)) | |
5527 ret = g_strdup(_("Not Authorized")); | |
5528 else | |
5529 ret = g_strdup(_("Offline")); | |
5530 } | |
5531 | |
5532 return ret; | |
5533 } | |
5534 | |
5842 | 5535 |
5844 | 5536 static int oscar_icon_req(aim_session_t *sess, aim_frame_t *fr, ...) { |
5842 | 5537 GaimConnection *gc = sess->aux_data; |
5538 struct oscar_data *od = gc->proto_data; | |
5892 | 5539 va_list ap; |
5842 | 5540 fu16_t type; |
5892 | 5541 fu8_t flags = 0, length = 0; |
5542 char *md5 = NULL; | |
5543 | |
5842 | 5544 va_start(ap, fr); |
5545 type = va_arg(ap, int); | |
5892 | 5546 |
5547 switch(type) { | |
5548 case 0x0000: | |
5549 case 0x0001: { | |
5550 flags = va_arg(ap, int); | |
5551 length = va_arg(ap, int); | |
5552 md5 = va_arg(ap, char *); | |
5553 | |
5554 if (flags == 0x41) { | |
5555 if (!aim_getconn_type(od->sess, AIM_CONN_TYPE_ICON) && !od->iconconnecting) { | |
5556 od->iconconnecting = TRUE; | |
5557 od->set_icon = TRUE; | |
5558 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_ICON); | |
5559 } else { | |
6039 | 5560 struct stat st; |
5561 const char *iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc)); | |
5562 if (iconfile == NULL) { | |
5563 /* Set an empty icon, or something */ | |
5564 } else if (!stat(iconfile, &st)) { | |
5565 char *buf = g_malloc(st.st_size); | |
5566 FILE *file = fopen(iconfile, "rb"); | |
5567 if (file) { | |
5568 fread(buf, 1, st.st_size, file); | |
5569 fclose(file); | |
5570 gaim_debug(GAIM_DEBUG_INFO, "oscar", | |
5571 "Uploading icon to icon server\n"); | |
6879 | 5572 aim_bart_upload(od->sess, buf, st.st_size); |
5892 | 5573 } else |
5574 gaim_debug(GAIM_DEBUG_ERROR, "oscar", | |
6039 | 5575 "Can't open buddy icon file!\n"); |
5576 g_free(buf); | |
5577 } else { | |
5578 gaim_debug(GAIM_DEBUG_ERROR, "oscar", | |
5579 "Can't stat buddy icon file!\n"); | |
5892 | 5580 } |
5581 } | |
5893 | 5582 } else if (flags == 0x81) |
5583 aim_ssi_seticon(od->sess, md5, length); | |
5892 | 5584 } break; |
5585 | |
5586 case 0x0002: { /* We just set an "available" message? */ | |
5587 } break; | |
5588 } | |
5589 | |
5842 | 5590 va_end(ap); |
5844 | 5591 |
5592 return 0; | |
5842 | 5593 } |
5892 | 5594 |
3952 | 5595 /* |
4617 | 5596 * We have just established a socket with the other dude, so set up some handlers. |
3952 | 5597 */ |
4617 | 5598 static int gaim_odc_initiate(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 5599 GaimConnection *gc = sess->aux_data; |
2086 | 5600 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
5679 | 5601 GaimConversation *cnv; |
2086 | 5602 struct direct_im *dim; |
5603 char buf[256]; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5604 char *sn; |
4617 | 5605 va_list ap; |
5606 aim_conn_t *newconn, *listenerconn; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5607 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5608 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5609 newconn = va_arg(ap, aim_conn_t *); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5610 listenerconn = va_arg(ap, aim_conn_t *); |
2086 | 5611 va_end(ap); |
5612 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5613 aim_conn_close(listenerconn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5614 aim_conn_kill(sess, &listenerconn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5615 |
4617 | 5616 sn = g_strdup(aim_odc_getsn(newconn)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5617 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5618 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5619 "DirectIM: initiate success to %s\n", sn); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5620 dim = find_direct_im(od, sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5621 |
6640
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6623
diff
changeset
|
5622 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
|
5623 gaim_input_remove(dim->watcher); |
2086 | 5624 dim->conn = newconn; |
4617 | 5625 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, oscar_callback, dim->conn); |
3008 | 5626 dim->connected = TRUE; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5627 g_snprintf(buf, sizeof buf, _("Direct IM with %s established"), sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5628 g_free(sn); |
6982 | 5629 gaim_conversation_write(cnv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL)); |
2086 | 5630 |
4617 | 5631 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, gaim_odc_incoming, 0); |
5632 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, gaim_odc_typing, 0); | |
6982 | 5633 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER, gaim_odc_update_ui, 0); |
4617 | 5634 |
2993 | 5635 return 1; |
5636 } | |
5637 | |
6982 | 5638 /* |
5639 * This is called when each chunk of an image is received. It can be used to | |
5640 * update a progress bar, or to eat lots of dry cat food. Wet cat food is | |
5641 * nasty, you sicko. | |
5642 */ | |
5643 static int gaim_odc_update_ui(aim_session_t *sess, aim_frame_t *fr, ...) { | |
2993 | 5644 va_list ap; |
5645 char *sn; | |
5646 double percent; | |
5575 | 5647 GaimConnection *gc = sess->aux_data; |
2993 | 5648 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
5679 | 5649 GaimConversation *c; |
2993 | 5650 struct direct_im *dim; |
5651 | |
5652 va_start(ap, fr); | |
5653 sn = va_arg(ap, char *); | |
5654 percent = va_arg(ap, double); | |
5655 va_end(ap); | |
6873 | 5656 |
2994 | 5657 if (!(dim = find_direct_im(od, sn))) |
5658 return 1; | |
3059 | 5659 if (dim->watcher) { |
5660 gaim_input_remove(dim->watcher); /* Otherwise, the callback will callback */ | |
5661 dim->watcher = 0; | |
5662 } | |
6982 | 5663 /* XXX is this really necessary? */ |
3044 | 5664 while (gtk_events_pending()) |
5665 gtk_main_iteration(); | |
6640
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6623
diff
changeset
|
5666 |
6982 | 5667 c = gaim_find_conversation_with_account(sn, gaim_connection_get_account(gc)); |
6873 | 5668 if (c != NULL) |
5669 gaim_conversation_update_progress(c, percent); | |
2993 | 5670 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, |
5671 oscar_callback, dim->conn); | |
2086 | 5672 |
5673 return 1; | |
5674 } | |
5675 | |
6982 | 5676 /* |
5677 * This is called after a direct IM has been received in its entirety. This | |
5678 * function is passed a long chunk of data which contains the IM with any | |
5679 * data chunks (images) appended to it. | |
5680 * | |
5681 * This function rips out all the data chunks and creates an imgstore for | |
5682 * each one. In order to do this, it first goes through the IM and takes | |
5683 * out all the IMG tags. When doing so, it rewrites the original IMG tag | |
5684 * with one compatable with the imgstore Gaim core code. For each one, we | |
5685 * then read in chunks of data from the end of the message and actually | |
5686 * create the img store using the given data. | |
5687 * | |
5688 * For somewhat easy reference, here's a sample message | |
5689 * (without the whitespace and asterisks): | |
5690 * | |
5691 * <HTML><BODY BGCOLOR="#ffffff"> | |
5692 * <FONT LANG="0"> | |
5693 * This is a really stupid picture:<BR> | |
5694 * <IMG SRC="Sample.jpg" ID="1" WIDTH="283" HEIGHT="212" DATASIZE="9894"><BR> | |
5695 * Yeah it is<BR> | |
5696 * Here is another one:<BR> | |
5697 * <IMG SRC="Soap Bubbles.bmp" ID="2" WIDTH="256" HEIGHT="256" DATASIZE="65978"> | |
5698 * </FONT> | |
5699 * </BODY></HTML> | |
5700 * <BINARY> | |
5701 * <DATA ID="1" SIZE="9894">datadatadatadata</DATA> | |
5702 * <DATA ID="2" SIZE="65978">datadatadatadata</DATA> | |
5703 * </BINARY> | |
5704 */ | |
4617 | 5705 static int gaim_odc_incoming(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 5706 GaimConnection *gc = sess->aux_data; |
6622 | 5707 GaimImFlags imflags = 0; |
6982 | 5708 GString *newmsg = g_string_new(""); |
5709 GSList *images = NULL; | |
2086 | 5710 va_list ap; |
6982 | 5711 const char *sn, *msg, *msgend, *binary; |
5712 size_t len; | |
5713 int encoding, isawaymsg; | |
2086 | 5714 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5715 va_start(ap, fr); |
6982 | 5716 sn = va_arg(ap, const char *); |
5717 msg = va_arg(ap, const char *); | |
5718 len = va_arg(ap, size_t); | |
3952 | 5719 encoding = va_arg(ap, int); |
4870 | 5720 isawaymsg = va_arg(ap, int); |
2086 | 5721 va_end(ap); |
6982 | 5722 msgend = msg + len; |
2086 | 5723 |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5724 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5725 "Got DirectIM message from %s\n", sn); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5726 |
4870 | 5727 if (isawaymsg) |
6622 | 5728 imflags |= GAIM_IM_AUTO_RESP; |
4870 | 5729 |
6982 | 5730 /* message has a binary trailer */ |
5731 if ((binary = gaim_strcasestr(msg, "<binary>"))) { | |
5732 GData *attribs; | |
5733 const char *tmp, *start, *end, *last = NULL; | |
5734 | |
5735 tmp = msg; | |
5736 | |
5737 /* for each valid image tag... */ | |
5738 while (gaim_markup_find_tag("img", tmp, &start, &end, &attribs)) { | |
5739 const char *id, *src, *datasize; | |
5740 const char *tag = NULL, *data = NULL; | |
5741 size_t size; | |
5742 int imgid = 0; | |
5743 | |
5744 /* update the location of the last img tag */ | |
5745 last = end; | |
5746 | |
5747 /* grab attributes */ | |
5748 id = g_datalist_get_data(&attribs, "id"); | |
5749 src = g_datalist_get_data(&attribs, "src"); | |
5750 datasize = g_datalist_get_data(&attribs, "datasize"); | |
5751 | |
5752 /* if we have id & datasize, build the data tag */ | |
5753 if (id && datasize) | |
5754 tag = g_strdup_printf("<data id=\"%s\" size=\"%s\">", id, datasize); | |
5755 | |
5756 /* if we have a tag, find the start of the data */ | |
5757 if (tag && (data = gaim_strcasestr(binary, tag))) | |
5758 data += strlen(tag); | |
5759 | |
5760 /* check the data is here and store it */ | |
5761 if (data + (size = atoi(datasize)) <= msgend) | |
5762 imgid = gaim_imgstore_add(data, size, src); | |
5763 | |
5764 /* if we have a stored image... */ | |
5765 if (imgid) { | |
5766 /* append the message up to the tag */ | |
5767 newmsg = g_string_append_len(newmsg, tmp, start - tmp); | |
5768 | |
5769 /* write the new image tag */ | |
5770 g_string_append_printf(newmsg, "<IMG ID=\"%d\">", imgid); | |
5771 | |
5772 /* and record the image number */ | |
5773 images = g_slist_append(images, GINT_TO_POINTER(imgid)); | |
5774 } else { | |
5775 /* otherwise, copy up to the end of the tag */ | |
5776 newmsg = g_string_append_len(newmsg, tmp, (end + 1) - tmp); | |
5777 } | |
5778 | |
5779 /* clear the attribute list */ | |
5780 g_datalist_clear(&attribs); | |
5781 | |
5782 /* continue from the end of the tag */ | |
5783 tmp = end + 1; | |
5784 } | |
5785 | |
5786 /* append any remaining message data (without the > :-) */ | |
5787 if (last++ && (last < binary)) | |
5788 newmsg = g_string_append_len(newmsg, last, binary - last); | |
5789 | |
5790 /* set the flag if we caught any images */ | |
5791 if (images) | |
5792 imflags |= GAIM_IM_IMAGES; | |
5793 } else { | |
5794 g_string_append_len(newmsg, msg, len); | |
5795 } | |
5796 | |
4617 | 5797 /* XXX - I imagine Paco-Paco will want to do some voodoo with the encoding here */ |
6982 | 5798 serv_got_im(gc, sn, newmsg->str, imflags, time(NULL)); |
5799 | |
5800 /* free up the message */ | |
5801 g_string_free(newmsg, TRUE); | |
5802 | |
5803 /* unref any images we allocated */ | |
5804 if (images) { | |
5805 GSList *tmp; | |
5806 int id; | |
5807 | |
5808 for (tmp = images; tmp != NULL; tmp = tmp->next) { | |
5809 id = GPOINTER_TO_INT(tmp->data); | |
5810 gaim_imgstore_unref(id); | |
5811 } | |
5812 | |
5813 g_slist_free(images); | |
5814 } | |
2086 | 5815 |
5816 return 1; | |
5817 } | |
5818 | |
4617 | 5819 static int gaim_odc_typing(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 5820 va_list ap; |
5821 char *sn; | |
2993 | 5822 int typing; |
5575 | 5823 GaimConnection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5824 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5825 va_start(ap, fr); |
2086 | 5826 sn = va_arg(ap, char *); |
2993 | 5827 typing = va_arg(ap, int); |
2086 | 5828 va_end(ap); |
5829 | |
4870 | 5830 if (typing == 0x0002) { |
2993 | 5831 /* 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
|
5832 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5833 "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
|
5834 serv_got_typing(gc, sn, 0, GAIM_TYPING); |
4870 | 5835 } else if (typing == 0x0001) |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
5836 serv_got_typing(gc, sn, 0, GAIM_TYPED); |
4870 | 5837 else |
4342 | 5838 serv_got_typing_stopped(gc, sn); |
2086 | 5839 return 1; |
5840 } | |
5841 | |
6982 | 5842 static int gaim_odc_send_im(aim_session_t *sess, aim_conn_t *conn, const char *message, GaimImFlags imflags) { |
5843 char *buf; | |
5844 size_t len; | |
5845 int ret; | |
5846 | |
5847 if (imflags & GAIM_IM_IMAGES) { | |
5848 GString *msg = g_string_new(""); | |
5849 GString *data = g_string_new("<BINARY>"); | |
5850 GData *attribs; | |
5851 const char *tmp, *start, *end, *last = NULL; | |
5852 int oscar_id = 0; | |
5853 | |
5854 tmp = message; | |
5855 | |
5856 /* for each valid IMG tag... */ | |
5857 while (gaim_markup_find_tag("img", tmp, &start, &end, &attribs)) { | |
5858 GaimStoredImage *image = NULL; | |
5859 const char *id; | |
5860 | |
5861 last = end; | |
5862 id = g_datalist_get_data(&attribs, "id"); | |
5863 | |
5864 /* ... if it refers to a valid gaim image ... */ | |
5865 if (id && (image = gaim_imgstore_get(atoi(id)))) { | |
5866 /* ... append the message from start to the tag ... */ | |
5867 msg = g_string_append_len(msg, tmp, start - tmp); | |
5868 oscar_id++; | |
5869 | |
5870 /* ... insert a new img tag with the oscar id ... */ | |
5871 if (image->filename) | |
5872 g_string_append_printf(msg, | |
5873 "<IMG SRC=\"file://%s\" ID=\"%d\" DATASIZE=\"%d\">", | |
5874 image->filename, oscar_id, image->size); | |
5875 else | |
5876 g_string_append_printf(msg, | |
5877 "<IMG ID=\"%d\" DATASIZE=\"%d\">", | |
5878 oscar_id, image->size); | |
5879 | |
5880 /* ... and append the data to the binary section ... */ | |
5881 g_string_append_printf(data, "<DATA ID=\"%d\" SIZE=\"%d\">", | |
5882 oscar_id, image->size); | |
5883 data = g_string_append_len(data, image->data, image->size); | |
5884 data = g_string_append(data, "</DATA>"); | |
5885 } else { | |
5886 /* ... otherwise, allow the possibly invalid img tag through. */ | |
5887 /* should we do something else? */ | |
5888 msg = g_string_append_len(msg, tmp, (end + 1) - tmp); | |
5889 } | |
5890 | |
5891 g_datalist_clear(&attribs); | |
5892 | |
5893 /* continue from the end of the tag */ | |
5894 tmp = end + 1; | |
5895 } | |
5896 | |
5897 /* append any remaining message data (without the > :-) */ | |
5898 if (last++ && *last) | |
5899 msg = g_string_append(msg, last); | |
5900 | |
5901 /* if we inserted any images in the binary section, append it */ | |
5902 if (oscar_id) { | |
5903 msg = g_string_append_len(msg, data->str, data->len); | |
5904 msg = g_string_append(msg, "</BINARY>"); | |
5905 } | |
5906 | |
5907 len = msg->len; | |
5908 buf = msg->str; | |
5909 g_string_free(msg, FALSE); | |
5910 g_string_free(data, TRUE); | |
5911 } else { | |
5912 len = strlen(message); | |
5913 buf = g_memdup(message, len+1); | |
5914 } | |
5915 | |
5916 /* XXX - The last parameter below is the encoding. Let Paco-Paco do something with it. */ | |
5917 if (imflags & GAIM_IM_AUTO_RESP) | |
5918 ret = aim_odc_send_im(sess, conn, buf, len, 0, 1); | |
5919 else | |
5920 ret = aim_odc_send_im(sess, conn, buf, len, 0, 0); | |
5921 | |
5922 g_free(buf); | |
5923 | |
5924 return ret; | |
5925 } | |
5926 | |
2086 | 5927 struct ask_do_dir_im { |
5928 char *who; | |
5575 | 5929 GaimConnection *gc; |
2086 | 5930 }; |
5931 | |
3730 | 5932 static void oscar_cancel_direct_im(struct ask_do_dir_im *data) { |
5136 | 5933 g_free(data->who); |
2086 | 5934 g_free(data); |
5935 } | |
5936 | |
3730 | 5937 static void oscar_direct_im(struct ask_do_dir_im *data) { |
5575 | 5938 GaimConnection *gc = data->gc; |
4244 | 5939 struct oscar_data *od; |
2086 | 5940 struct direct_im *dim; |
5941 | |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
5942 if (!g_list_find(gaim_connections_get_all(), gc)) { |
5136 | 5943 g_free(data->who); |
4244 | 5944 g_free(data); |
5945 return; | |
5946 } | |
5947 | |
5948 od = (struct oscar_data *)gc->proto_data; | |
5949 | |
2086 | 5950 dim = find_direct_im(od, data->who); |
5951 if (dim) { | |
3008 | 5952 if (!(dim->connected)) { /* We'll free the old, unconnected dim, and start over */ |
5953 od->direct_ims = g_slist_remove(od->direct_ims, dim); | |
5954 gaim_input_remove(dim->watcher); | |
5955 g_free(dim); | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5956 gaim_debug(GAIM_DEBUG_INFO, "oscar", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5957 "Gave up on old direct IM, trying again\n"); |
3008 | 5958 } else { |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5959 gaim_notify_error(gc, NULL, "DirectIM already open.", NULL); |
5136 | 5960 g_free(data->who); |
4244 | 5961 g_free(data); |
3008 | 5962 return; |
5963 } | |
2086 | 5964 } |
5965 dim = g_new0(struct direct_im, 1); | |
5966 dim->gc = gc; | |
5967 g_snprintf(dim->name, sizeof dim->name, "%s", data->who); | |
5968 | |
4617 | 5969 dim->conn = aim_odc_initiate(od->sess, data->who); |
2086 | 5970 if (dim->conn != NULL) { |
5971 od->direct_ims = g_slist_append(od->direct_ims, dim); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
5972 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, |
2086 | 5973 oscar_callback, dim->conn); |
4617 | 5974 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIM_ESTABLISHED, |
5975 gaim_odc_initiate, 0); | |
2086 | 5976 } else { |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5977 gaim_notify_error(gc, NULL, _("Unable to open Direct IM"), NULL); |
2086 | 5978 g_free(dim); |
5979 } | |
4244 | 5980 |
5136 | 5981 g_free(data->who); |
4244 | 5982 g_free(data); |
2086 | 5983 } |
5984 | |
5575 | 5985 static void oscar_ask_direct_im(GaimConnection *gc, const char *who) { |
5420 | 5986 gchar *buf; |
2086 | 5987 struct ask_do_dir_im *data = g_new0(struct ask_do_dir_im, 1); |
5136 | 5988 data->who = g_strdup(who); |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
5989 data->gc = gc; |
5420 | 5990 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
|
5991 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5992 gaim_request_action(gc, NULL, buf, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5993 _("Because this reveals your IP address, it " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5994 "may be considered a privacy risk. Do you " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5995 "wish to continue?"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5996 0, data, 2, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5997 _("Connect"), G_CALLBACK(oscar_direct_im), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5998 _("Cancel"), G_CALLBACK(oscar_cancel_direct_im)); |
5420 | 5999 g_free(buf); |
2086 | 6000 } |
6001 | |
5575 | 6002 static void oscar_set_permit_deny(GaimConnection *gc) { |
6003 GaimAccount *account = gaim_connection_get_account(gc); | |
2086 | 6004 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
4230 | 6005 #ifdef NOSSI |
4770 | 6006 GSList *list, *g = gaim_blist_groups(), *g1; |
4230 | 6007 char buf[MAXMSGLEN]; |
6008 int at; | |
6009 | |
5575 | 6010 switch(account->perm_deny) { |
4687 | 6011 case 1: |
5575 | 6012 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_DENYADD, gaim_account_get_username(account)); |
4230 | 6013 break; |
6014 case 2: | |
5575 | 6015 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_PERMITADD, gaim_account_get_username(account)); |
4230 | 6016 break; |
6017 case 3: | |
5575 | 6018 list = account->permit; |
4230 | 6019 at = 0; |
6020 while (list) { | |
6021 at += g_snprintf(buf + at, sizeof(buf) - at, "%s&", (char *)list->data); | |
6022 list = list->next; | |
6023 } | |
6024 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_PERMITADD, buf); | |
6025 break; | |
6026 case 4: | |
5575 | 6027 list = account->deny; |
4230 | 6028 at = 0; |
6029 while (list) { | |
6030 at += g_snprintf(buf + at, sizeof(buf) - at, "%s&", (char *)list->data); | |
6031 list = list->next; | |
6032 } | |
6033 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_DENYADD, buf); | |
6034 break; | |
6035 case 5: | |
4770 | 6036 g1 = g; |
4230 | 6037 at = 0; |
4770 | 6038 while (g1) { |
6039 list = gaim_blist_members((struct group *)g->data); | |
6040 GSList list1 = list; | |
6041 while (list1) { | |
6042 struct buddy *b = list1->data; | |
5575 | 6043 if(b->account == account) |
4349 | 6044 at += g_snprintf(buf + at, sizeof(buf) - at, "%s&", b->name); |
4770 | 6045 list1 = list1->next; |
2995 | 6046 } |
4770 | 6047 g_slist_free(list); |
6048 g1 = g1->next; | |
4349 | 6049 } |
4770 | 6050 g_slist_free(g); |
4230 | 6051 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_PERMITADD, buf); |
6052 break; | |
6053 default: | |
6054 break; | |
2086 | 6055 } |
4230 | 6056 signoff_blocked(gc); |
6057 #else | |
6058 if (od->sess->ssi.received_data) | |
5575 | 6059 aim_ssi_setpermdeny(od->sess, account->perm_deny, 0xffffffff); |
4230 | 6060 #endif |
2086 | 6061 } |
6062 | |
5575 | 6063 static void oscar_add_permit(GaimConnection *gc, const char *who) { |
4269 | 6064 #ifdef NOSSI |
4491 | 6065 if (gc->account->permdeny == 3) |
4269 | 6066 oscar_set_permit_deny(gc); |
6067 #else | |
2991 | 6068 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6069 gaim_debug(GAIM_DEBUG_INFO, "oscar", "ssi: About to add a permit\n"); |
4230 | 6070 if (od->sess->ssi.received_data) |
4889 | 6071 aim_ssi_addpermit(od->sess, who); |
4230 | 6072 #endif |
2086 | 6073 } |
6074 | |
5575 | 6075 static void oscar_add_deny(GaimConnection *gc, const char *who) { |
4269 | 6076 #ifdef NOSSI |
4491 | 6077 if (gc->account->permdeny == 4) |
4269 | 6078 oscar_set_permit_deny(gc); |
6079 #else | |
2991 | 6080 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6081 gaim_debug(GAIM_DEBUG_INFO, "oscar", "ssi: About to add a deny\n"); |
4230 | 6082 if (od->sess->ssi.received_data) |
4889 | 6083 aim_ssi_adddeny(od->sess, who); |
4230 | 6084 #endif |
2086 | 6085 } |
6086 | |
5575 | 6087 static void oscar_rem_permit(GaimConnection *gc, const char *who) { |
4269 | 6088 #ifdef NOSSI |
4491 | 6089 if (gc->account->permdeny == 3) |
4269 | 6090 oscar_set_permit_deny(gc); |
6091 #else | |
2991 | 6092 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6093 gaim_debug(GAIM_DEBUG_INFO, "oscar", "ssi: About to delete a permit\n"); |
4230 | 6094 if (od->sess->ssi.received_data) |
4889 | 6095 aim_ssi_delpermit(od->sess, who); |
4230 | 6096 #endif |
2086 | 6097 } |
6098 | |
5575 | 6099 static void oscar_rem_deny(GaimConnection *gc, const char *who) { |
4269 | 6100 #ifdef NOSSI |
4491 | 6101 if (gc->account->permdeny == 4) |
4269 | 6102 oscar_set_permit_deny(gc); |
6103 #else | |
2991 | 6104 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6105 gaim_debug(GAIM_DEBUG_INFO, "oscar", "ssi: About to delete a deny\n"); |
4230 | 6106 if (od->sess->ssi.received_data) |
4889 | 6107 aim_ssi_deldeny(od->sess, who); |
4230 | 6108 #endif |
2086 | 6109 } |
6110 | |
5575 | 6111 static GList *oscar_away_states(GaimConnection *gc) |
2086 | 6112 { |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
6113 struct oscar_data *od = gc->proto_data; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
6114 GList *m = NULL; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
6115 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
6116 if (!od->icq) |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
6117 return g_list_append(m, GAIM_AWAY_CUSTOM); |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
6118 |
4333 | 6119 m = g_list_append(m, _("Online")); |
6120 m = g_list_append(m, _("Away")); | |
6121 m = g_list_append(m, _("Do Not Disturb")); | |
6122 m = g_list_append(m, _("Not Available")); | |
6123 m = g_list_append(m, _("Occupied")); | |
6124 m = g_list_append(m, _("Free For Chat")); | |
6125 m = g_list_append(m, _("Invisible")); | |
6126 | |
6127 return m; | |
6128 } | |
6129 | |
5575 | 6130 static GList *oscar_buddy_menu(GaimConnection *gc, const char *who) { |
4333 | 6131 struct oscar_data *od = gc->proto_data; |
6132 GList *m = NULL; | |
6133 struct proto_buddy_menu *pbm; | |
6134 | |
6135 if (od->icq) { | |
4624 | 6136 #if 0 |
4333 | 6137 pbm = g_new0(struct proto_buddy_menu, 1); |
6138 pbm->label = _("Get Status Msg"); | |
4969 | 6139 pbm->callback = oscar_get_icqstatusmsg; |
4333 | 6140 pbm->gc = gc; |
6141 m = g_list_append(m, pbm); | |
4624 | 6142 #endif |
4333 | 6143 } else { |
6695 | 6144 GaimBuddy *b = gaim_find_buddy(gc->account, who); |
5975 | 6145 struct buddyinfo *bi; |
6146 | |
6147 if (b) | |
6148 bi = g_hash_table_lookup(od->buddyinfo, normalize(b->name)); | |
5917 | 6149 |
6150 if (b && bi && aim_sncmp(gaim_account_get_username(gaim_connection_get_account(gc)), who) && GAIM_BUDDY_IS_ONLINE(b)) { | |
6871 | 6151 if (bi->caps & AIM_CAPS_DIRECTIM) { |
5917 | 6152 pbm = g_new0(struct proto_buddy_menu, 1); |
6153 pbm->label = _("Direct IM"); | |
6154 pbm->callback = oscar_ask_direct_im; | |
6155 pbm->gc = gc; | |
6156 m = g_list_append(m, pbm); | |
6157 } | |
6158 | |
6159 if (bi->caps & AIM_CAPS_SENDFILE) { | |
6160 pbm = g_new0(struct proto_buddy_menu, 1); | |
6161 pbm->label = _("Send File"); | |
6162 pbm->callback = oscar_ask_sendfile; | |
6163 pbm->gc = gc; | |
6164 m = g_list_append(m, pbm); | |
6165 } | |
4826 | 6166 #if 0 |
5917 | 6167 if (bi->caps & AIM_CAPS_GETFILE) { |
6168 pbm = g_new0(struct proto_buddy_menu, 1); | |
6169 pbm->label = _("Get File"); | |
6170 pbm->callback = oscar_ask_getfile; | |
6171 pbm->gc = gc; | |
6172 m = g_list_append(m, pbm); | |
6173 } | |
4826 | 6174 #endif |
4333 | 6175 } |
5131 | 6176 } |
5197 | 6177 |
5131 | 6178 if (od->sess->ssi.received_data) { |
6179 char *gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, who); | |
6180 if (gname && aim_ssi_waitingforauth(od->sess->ssi.local, gname, who)) { | |
6181 pbm = g_new0(struct proto_buddy_menu, 1); | |
6873 | 6182 pbm->label = _("Re-request Authorization"); |
5131 | 6183 pbm->callback = gaim_auth_sendrequest; |
6184 pbm->gc = gc; | |
6185 m = g_list_append(m, pbm); | |
4333 | 6186 } |
4916 | 6187 } |
6188 | |
4333 | 6189 return m; |
6190 } | |
6191 | |
5575 | 6192 static void oscar_format_screenname(GaimConnection *gc, const char *nick) { |
4333 | 6193 struct oscar_data *od = gc->proto_data; |
5575 | 6194 if (!aim_sncmp(gaim_account_get_username(gaim_connection_get_account(gc)), nick)) { |
4333 | 6195 if (!aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH)) { |
6196 od->setnick = TRUE; | |
6197 od->newsn = g_strdup(nick); | |
6198 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
6199 } else { | |
6200 aim_admin_setnick(od->sess, aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH), nick); | |
6201 } | |
6202 } else { | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
6203 gaim_notify_error(gc, NULL, _("The new formatting is invalid."), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
6204 _("Screenname formatting can change only capitalization and whitespace.")); |
4333 | 6205 } |
6206 } | |
6207 | |
5575 | 6208 static void oscar_show_format_screenname(GaimConnection *gc) |
4333 | 6209 { |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
6210 gaim_request_input(gc, NULL, _("New screenname formatting:"), NULL, |
6035
8c44020a958e
[gaim-migrate @ 6485]
Christian Hammond <chipx86@chipx86.com>
parents:
6029
diff
changeset
|
6211 gaim_connection_get_display_name(gc), FALSE, FALSE, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
6212 _("OK"), G_CALLBACK(oscar_format_screenname), |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
6213 _("Cancel"), NULL, |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
6214 gc); |
4333 | 6215 } |
6216 | |
5575 | 6217 static void oscar_confirm_account(GaimConnection *gc) |
4333 | 6218 { |
6219 struct oscar_data *od = gc->proto_data; | |
6220 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); | |
6221 | |
6222 if (conn) { | |
6223 aim_admin_reqconfirm(od->sess, conn); | |
6224 } else { | |
6225 od->conf = TRUE; | |
6226 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
6227 } | |
6228 } | |
6229 | |
5575 | 6230 static void oscar_show_email(GaimConnection *gc) |
4333 | 6231 { |
6232 struct oscar_data *od = gc->proto_data; | |
6233 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); | |
6234 | |
6235 if (conn) { | |
6236 aim_admin_getinfo(od->sess, conn, 0x11); | |
6237 } else { | |
6238 od->reqemail = TRUE; | |
6239 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
6240 } | |
6241 } | |
6242 | |
5575 | 6243 static void oscar_change_email(GaimConnection *gc, const char *email) |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6244 { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6245 struct oscar_data *od = gc->proto_data; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6246 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
|
6247 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6248 if (conn) { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6249 aim_admin_setemail(od->sess, conn, email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6250 } else { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6251 od->setemail = TRUE; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6252 od->email = g_strdup(email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6253 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6254 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6255 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6256 |
5575 | 6257 static void oscar_show_change_email(GaimConnection *gc) |
4333 | 6258 { |
6035
8c44020a958e
[gaim-migrate @ 6485]
Christian Hammond <chipx86@chipx86.com>
parents:
6029
diff
changeset
|
6259 gaim_request_input(gc, NULL, _("Change Address To:"), NULL, NULL, |
8c44020a958e
[gaim-migrate @ 6485]
Christian Hammond <chipx86@chipx86.com>
parents:
6029
diff
changeset
|
6260 FALSE, FALSE, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
6261 _("OK"), G_CALLBACK(oscar_change_email), |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
6262 _("Cancel"), NULL, |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
6263 gc); |
4333 | 6264 } |
6265 | |
5575 | 6266 static void oscar_show_awaitingauth(GaimConnection *gc) |
4333 | 6267 { |
2979 | 6268 struct oscar_data *od = gc->proto_data; |
4333 | 6269 gchar *nombre, *text, *tmp; |
6695 | 6270 GaimBlistNode *gnode, *cnode, *bnode; |
4333 | 6271 int num=0; |
6272 | |
6873 | 6273 text = g_strdup(""); |
4333 | 6274 |
4785 | 6275 for (gnode = gaim_get_blist()->root; gnode; gnode = gnode->next) { |
6695 | 6276 GaimGroup *group = (GaimGroup *)gnode; |
4785 | 6277 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) |
6278 continue; | |
6695 | 6279 for (cnode = gnode->child; cnode; cnode = cnode->next) { |
6280 if(!GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
4785 | 6281 continue; |
6695 | 6282 for (bnode = cnode->child; bnode; bnode = bnode->next) { |
6283 GaimBuddy *buddy = (GaimBuddy *)bnode; | |
6284 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
6285 continue; | |
6286 if (buddy->account == gc->account && aim_ssi_waitingforauth(od->sess->ssi.local, group->name, buddy->name)) { | |
6287 if (gaim_get_buddy_alias_only(buddy)) | |
6288 nombre = g_strdup_printf(" %s (%s)", buddy->name, gaim_get_buddy_alias_only(buddy)); | |
6289 else | |
6290 nombre = g_strdup_printf(" %s", buddy->name); | |
6873 | 6291 tmp = g_strdup_printf("%s%s<br>", text, nombre); |
6695 | 6292 g_free(text); |
6293 text = tmp; | |
6294 g_free(nombre); | |
6295 num++; | |
6296 } | |
4333 | 6297 } |
2979 | 6298 } |
4333 | 6299 } |
6300 | |
6301 if (!num) { | |
6302 g_free(text); | |
6873 | 6303 text = g_strdup(_("<i>you are not waiting for authorization</i>")); |
6304 } | |
6305 | |
6306 gaim_notify_formatted(gc, NULL, _("You are awaiting authorization from " | |
6307 "the following buddies"), _("You can re-request " | |
6308 "authorization from these buddies by " | |
6309 "right-clicking on them and selecting " | |
6310 "\"Re-request Authorization.\""), text, NULL, NULL); | |
4333 | 6311 g_free(text); |
2979 | 6312 } |
6313 | |
5975 | 6314 #if 0 |
5917 | 6315 static void oscar_setavailmsg(GaimConnection *gc, char *text) { |
6316 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
6317 | |
6318 aim_srv_setavailmsg(od->sess, text); | |
6319 } | |
6320 | |
6321 static void oscar_show_setavailmsg(GaimConnection *gc) | |
6322 { | |
6323 gaim_request_input(gc, NULL, _("Available Message:"), | |
6035
8c44020a958e
[gaim-migrate @ 6485]
Christian Hammond <chipx86@chipx86.com>
parents:
6029
diff
changeset
|
6324 NULL, _("Please talk to me, I'm lonely! (and single)"), TRUE, FALSE, |
5917 | 6325 _("OK"), G_CALLBACK(oscar_setavailmsg), |
6326 _("Cancel"), NULL, | |
6327 gc); | |
6328 } | |
5975 | 6329 #endif |
5917 | 6330 |
5575 | 6331 static void oscar_show_chpassurl(GaimConnection *gc) |
4333 | 6332 { |
6333 struct oscar_data *od = gc->proto_data; | |
5575 | 6334 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
|
6335 gaim_notify_uri(gc, substituted); |
5517 | 6336 g_free(substituted); |
4333 | 6337 } |
6338 | |
5842 | 6339 static void oscar_set_icon(GaimConnection *gc, const char *iconfile) |
6340 { | |
5844 | 6341 struct oscar_data *od = gc->proto_data; |
6342 aim_session_t *sess = od->sess; | |
5842 | 6343 FILE *file; |
6344 struct stat st; | |
5844 | 6345 |
6039 | 6346 if (iconfile == NULL) { |
6347 /* Set an empty icon, or something */ | |
6348 } else if (!stat(iconfile, &st)) { | |
5842 | 6349 char *buf = g_malloc(st.st_size); |
6350 file = fopen(iconfile, "rb"); | |
6351 if (file) { | |
6052 | 6352 md5_state_t *state; |
6039 | 6353 char md5[16]; |
5842 | 6354 int len = fread(buf, 1, st.st_size, file); |
6039 | 6355 fclose(file); |
6052 | 6356 state = g_malloc(sizeof(md5_state_t)); |
5842 | 6357 md5_init(state); |
6358 md5_append(state, buf, len); | |
6359 md5_finish(state, md5); | |
6360 g_free(state); | |
6361 aim_ssi_seticon(sess, md5, 16); | |
6362 } else | |
6363 gaim_debug(GAIM_DEBUG_ERROR, "oscar", | |
6364 "Can't open buddy icon file!\n"); | |
6365 g_free(buf); | |
6366 } else | |
6367 gaim_debug(GAIM_DEBUG_ERROR, "oscar", | |
6368 "Can't stat buddy icon file!\n"); | |
6369 } | |
6370 | |
6371 | |
5575 | 6372 static GList *oscar_actions(GaimConnection *gc) |
2086 | 6373 { |
6374 struct oscar_data *od = gc->proto_data; | |
4333 | 6375 struct proto_actions_menu *pam; |
6376 GList *m = NULL; | |
6377 | |
6378 pam = g_new0(struct proto_actions_menu, 1); | |
6379 pam->label = _("Set User Info"); | |
6380 pam->callback = show_set_info; | |
6381 pam->gc = gc; | |
6382 m = g_list_append(m, pam); | |
6383 | |
5917 | 6384 #if 0 |
6385 pam = g_new0(struct proto_actions_menu, 1); | |
6386 pam->label = _("Set Available Message"); | |
6387 pam->callback = oscar_show_setavailmsg; | |
6388 pam->gc = gc; | |
6389 m = g_list_append(m, pam); | |
6390 #endif | |
6391 | |
5238 | 6392 pam = g_new0(struct proto_actions_menu, 1); |
6393 pam->label = _("Change Password"); | |
6394 pam->callback = show_change_passwd; | |
6395 pam->gc = gc; | |
6396 m = g_list_append(m, pam); | |
4617 | 6397 |
6398 if (od->sess->authinfo->chpassurl) { | |
6399 pam = g_new0(struct proto_actions_menu, 1); | |
6400 pam->label = _("Change Password (URL)"); | |
6401 pam->callback = oscar_show_chpassurl; | |
6402 pam->gc = gc; | |
6403 m = g_list_append(m, pam); | |
6404 } | |
6405 | |
5238 | 6406 if (!od->icq) { |
4617 | 6407 /* AIM actions */ |
6408 m = g_list_append(m, NULL); | |
4333 | 6409 |
5917 | 6410 pam = g_new0(struct proto_actions_menu, 1); |
4333 | 6411 pam->label = _("Format Screenname"); |
5844 | 6412 pam->callback = oscar_show_format_screenname; |
4333 | 6413 pam->gc = gc; |
6414 m = g_list_append(m, pam); | |
6415 | |
6416 pam = g_new0(struct proto_actions_menu, 1); | |
6417 pam->label = _("Confirm Account"); | |
6418 pam->callback = oscar_confirm_account; | |
6419 pam->gc = gc; | |
6420 m = g_list_append(m, pam); | |
6421 | |
6422 pam = g_new0(struct proto_actions_menu, 1); | |
6423 pam->label = _("Display Current Registered Address"); | |
6424 pam->callback = oscar_show_email; | |
6425 pam->gc = gc; | |
6426 m = g_list_append(m, pam); | |
6427 | |
6428 pam = g_new0(struct proto_actions_menu, 1); | |
6429 pam->label = _("Change Current Registered Address"); | |
6430 pam->callback = oscar_show_change_email; | |
6431 pam->gc = gc; | |
6432 m = g_list_append(m, pam); | |
2086 | 6433 } |
4333 | 6434 |
6435 m = g_list_append(m, NULL); | |
6436 | |
6437 pam = g_new0(struct proto_actions_menu, 1); | |
6438 pam->label = _("Show Buddies Awaiting Authorization"); | |
6439 pam->callback = oscar_show_awaitingauth; | |
6440 pam->gc = gc; | |
6441 m = g_list_append(m, pam); | |
6442 | |
2086 | 6443 m = g_list_append(m, NULL); |
4333 | 6444 |
6445 pam = g_new0(struct proto_actions_menu, 1); | |
6446 pam->label = _("Search for Buddy by Email"); | |
6447 pam->callback = show_find_email; | |
6448 pam->gc = gc; | |
6449 m = g_list_append(m, pam); | |
6450 | |
4336 | 6451 /* pam = g_new0(struct proto_actions_menu, 1); |
4333 | 6452 pam->label = _("Search for Buddy by Information"); |
6453 pam->callback = show_find_info; | |
6454 pam->gc = gc; | |
4336 | 6455 m = g_list_append(m, pam); */ |
2086 | 6456 |
6457 return m; | |
6458 } | |
6459 | |
5575 | 6460 static void oscar_change_passwd(GaimConnection *gc, const char *old, const char *new) |
2086 | 6461 { |
6462 struct oscar_data *od = gc->proto_data; | |
4617 | 6463 |
6464 if (od->icq) { | |
6465 aim_icq_changepasswd(od->sess, new); | |
2086 | 6466 } else { |
4617 | 6467 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); |
6468 if (conn) { | |
6469 aim_admin_changepasswd(od->sess, conn, new, old); | |
6470 } else { | |
6471 od->chpass = TRUE; | |
6472 od->oldp = g_strdup(old); | |
6473 od->newp = g_strdup(new); | |
6474 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
6475 } | |
2086 | 6476 } |
6477 } | |
6478 | |
6059 | 6479 static void oscar_convo_closed(GaimConnection *gc, const char *who) |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6480 { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6481 struct oscar_data *od = gc->proto_data; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6482 struct direct_im *dim = find_direct_im(od, who); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6483 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6484 if (!dim) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6485 return; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6486 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6487 od->direct_ims = g_slist_remove(od->direct_ims, dim); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6488 gaim_input_remove(dim->watcher); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6489 aim_conn_kill(od->sess, &dim->conn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6490 g_free(dim); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6491 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6492 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6493 static GaimPluginProtocolInfo prpl_info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6494 { |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6495 GAIM_PROTO_OSCAR, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6496 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
|
6497 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6498 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6499 oscar_list_icon, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6500 oscar_list_emblems, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6501 oscar_status_text, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6502 oscar_tooltip_text, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6503 oscar_away_states, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6504 oscar_actions, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6505 oscar_buddy_menu, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6506 oscar_chat_info, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6507 oscar_login, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6508 oscar_close, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6509 oscar_send_im, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6510 oscar_set_info, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6511 oscar_send_typing, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6512 oscar_get_info, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6513 oscar_set_away, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6514 oscar_get_away, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6515 oscar_set_dir, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6516 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6517 oscar_dir_search, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6518 oscar_set_idle, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6519 oscar_change_passwd, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6520 oscar_add_buddy, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6521 oscar_add_buddies, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6522 oscar_remove_buddy, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6523 oscar_remove_buddies, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6524 oscar_add_permit, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6525 oscar_add_deny, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6526 oscar_rem_permit, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6527 oscar_rem_deny, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6528 oscar_set_permit_deny, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6529 oscar_warn, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6530 oscar_join_chat, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6531 oscar_chat_invite, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6532 oscar_chat_leave, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6533 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6534 oscar_chat_send, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6535 oscar_keepalive, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6536 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6537 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6538 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6539 #ifndef NOSSI |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6540 oscar_alias_buddy, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6541 oscar_move_buddy, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6542 oscar_rename_group, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6543 #else |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6544 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6545 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6546 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6547 #endif |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6548 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6549 oscar_convo_closed, |
5842 | 6550 NULL, |
6551 oscar_set_icon | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6552 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6553 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6554 static GaimPluginInfo info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6555 { |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6556 2, /**< api_version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6557 GAIM_PLUGIN_PROTOCOL, /**< type */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6558 NULL, /**< ui_requirement */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6559 0, /**< flags */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6560 NULL, /**< dependencies */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6561 GAIM_PRIORITY_DEFAULT, /**< priority */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6562 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6563 "prpl-oscar", /**< id */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6564 "AIM/ICQ", /**< name */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6565 VERSION, /**< version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6566 /** summary */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6567 N_("AIM/ICQ Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6568 /** description */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6569 N_("AIM/ICQ Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6570 NULL, /**< author */ |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6350
diff
changeset
|
6571 GAIM_WEBSITE, /**< homepage */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6572 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6573 NULL, /**< load */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6574 NULL, /**< unload */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6575 NULL, /**< destroy */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6576 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6577 NULL, /**< ui_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6578 &prpl_info /**< extra_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6579 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6580 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6581 static void |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5917
diff
changeset
|
6582 init_plugin(GaimPlugin *plugin) |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6583 { |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
6584 GaimAccountOption *option; |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
6585 |
5685
43ea75092684
[gaim-migrate @ 6106]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
6586 option = gaim_account_option_string_new(_("Auth host"), "server", |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
6587 "login.oscar.aol.com"); |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
6588 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
6589 option); |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
6590 |
5685
43ea75092684
[gaim-migrate @ 6106]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
6591 option = gaim_account_option_int_new(_("Auth port"), "port", 5190); |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
6592 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
6593 option); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6594 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6595 my_protocol = plugin; |
2086 | 6596 } |
6597 | |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5917
diff
changeset
|
6598 GAIM_INIT_PLUGIN(oscar, init_plugin, info); |