Mercurial > pidgin.yaz
annotate src/protocols/oscar/oscar.c @ 10738:55af3fa46329
[gaim-migrate @ 12340]
Lots of changes here. A lot of it stems from chaning
gaim_account_connect() so that it DOES NOT have the GaimStatus
parameter. It will attempt to use the GaimStatus of your
account from the last time it was connected (which doesn't
work quite right yet).
My goal here was to save and load each account's GaimStatuses
to accounts.xml, so if you were "away" when you signed off then
you'll be "away" when you sign back on. Not quite there yet.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sat, 26 Mar 2005 20:08:43 +0000 |
parents | c4cb90065e1d |
children | 94cc67130789 |
rev | line source |
---|---|
2086 | 1 /* |
2 * gaim | |
3 * | |
4 * Some code copyright (C) 1998-1999, Mark Spencer <markster@marko.net> | |
6302 | 5 * Some code copyright (C) 1999-2001, Eric Warmenhoven |
6 * Some code copyright (C) 2001-2003, Sean Egan | |
8151 | 7 * Some code copyright (C) 2001-2004, Mark Doliner <thekingant@users.sourceforge.net> |
6302 | 8 * |
9 * Most libfaim code copyright (C) 1998-2001 Adam Fritzler <afritz@auk.cx> | |
8151 | 10 * Some libfaim code copyright (C) 2001-2004 Mark Doliner <thekingant@users.sourceforge.net> |
2086 | 11 * |
12 * This program is free software; you can redistribute it and/or modify | |
13 * it under the terms of the GNU General Public License as published by | |
14 * the Free Software Foundation; either version 2 of the License, or | |
15 * (at your option) any later version. | |
16 * | |
17 * This program is distributed in the hope that it will be useful, | |
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
10485 | 19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
2086 | 20 * GNU General Public License for more details. |
21 * | |
22 * You should have received a copy of the GNU General Public License | |
23 * along with this program; if not, write to the Free Software | |
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
25 * | |
26 */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
27 #include "internal.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
28 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
29 #include "account.h" |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
30 #include "accountopt.h" |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
31 #include "buddyicon.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
32 #include "conversation.h" |
7083
3100a6e03644
[gaim-migrate @ 7648]
Christian Hammond <chipx86@chipx86.com>
parents:
7082
diff
changeset
|
33 #include "core.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
34 #include "debug.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
35 #include "ft.h" |
6982 | 36 #include "imgstore.h" |
8231
f50c059b6384
[gaim-migrate @ 8954]
Christian Hammond <chipx86@chipx86.com>
parents:
8227
diff
changeset
|
37 #include "network.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
38 #include "notify.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
39 #include "privacy.h" |
2086 | 40 #include "prpl.h" |
4889 | 41 #include "proxy.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
42 #include "request.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
43 #include "util.h" |
9943 | 44 #include "version.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
45 |
2086 | 46 #include "aim.h" |
5842 | 47 #include "md5.h" |
2086 | 48 |
9976 | 49 #define OSCAR_STATUS_ID_INVISIBLE "invisible" |
50 #define OSCAR_STATUS_ID_OFFLINE "offline" | |
51 #define OSCAR_STATUS_ID_ONLINE "online" | |
9991 | 52 #define OSCAR_STATUS_ID_AVAILABLE "available" |
9976 | 53 #define OSCAR_STATUS_ID_AWAY "away" |
54 #define OSCAR_STATUS_ID_DND "dnd" | |
55 #define OSCAR_STATUS_ID_NA "na" | |
56 #define OSCAR_STATUS_ID_OCCUPIED "occupied" | |
57 #define OSCAR_STATUS_ID_FREE4CHAT "free4chat" | |
58 #define OSCAR_STATUS_ID_CUSTOM "custom" | |
9975 | 59 |
2086 | 60 #define AIMHASHDATA "http://gaim.sourceforge.net/aim_data.php3" |
61 | |
7283 | 62 #define OSCAR_CONNECT_STEPS 6 |
9830 | 63 #define OSCAR_DEFAULT_CUSTOM_ENCODING "ISO-8859-1" |
10570 | 64 #define OSCAR_DEFAULT_AUTHORIZATION TRUE |
65 #define OSCAR_DEFAULT_HIDE_IP TRUE | |
66 #define OSCAR_DEFAULT_WEB_AWARE FALSE | |
7283 | 67 |
10329 | 68 #define FAIM_DEBUG_LEVEL 0 |
69 | |
7376 | 70 static int caps_aim = AIM_CAPS_CHAT | AIM_CAPS_BUDDYICON | AIM_CAPS_DIRECTIM | AIM_CAPS_SENDFILE | AIM_CAPS_INTEROPERATE | AIM_CAPS_ICHAT; |
71 static int caps_icq = AIM_CAPS_BUDDYICON | AIM_CAPS_DIRECTIM | AIM_CAPS_SENDFILE | AIM_CAPS_ICQUTF8 | AIM_CAPS_INTEROPERATE | AIM_CAPS_ICHAT; | |
3458 | 72 |
4665 | 73 static fu8_t features_aim[] = {0x01, 0x01, 0x01, 0x02}; |
74 static fu8_t features_icq[] = {0x01, 0x06}; | |
8341 | 75 static fu8_t ck[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; |
2086 | 76 |
7283 | 77 typedef struct _OscarData OscarData; |
78 struct _OscarData { | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
79 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
80 aim_conn_t *conn; |
2086 | 81 |
82 guint cnpa; | |
83 guint paspa; | |
3694 | 84 guint emlpa; |
4804 | 85 guint icopa; |
2086 | 86 |
4823 | 87 gboolean iconconnecting; |
5842 | 88 gboolean set_icon; |
4823 | 89 |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
90 GSList *create_rooms; |
2086 | 91 |
92 gboolean conf; | |
93 gboolean reqemail; | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
94 gboolean setemail; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
95 char *email; |
2979 | 96 gboolean setnick; |
97 char *newsn; | |
2086 | 98 gboolean chpass; |
99 char *oldp; | |
100 char *newp; | |
9971 | 101 |
2086 | 102 GSList *oscar_chats; |
103 GSList *direct_ims; | |
3630 | 104 GSList *file_transfers; |
4738 | 105 GHashTable *buddyinfo; |
4804 | 106 GSList *requesticon; |
2086 | 107 |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
108 gboolean killme; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
109 gboolean icq; |
4804 | 110 guint icontimer; |
5968 | 111 guint getblisttimer; |
8341 | 112 guint getinfotimer; |
10567 | 113 gint timeoffset; |
2993 | 114 |
115 struct { | |
4230 | 116 guint maxwatchers; /* max users who can watch you */ |
2993 | 117 guint maxbuddies; /* max users you can watch */ |
4230 | 118 guint maxgroups; /* max groups in server list */ |
2993 | 119 guint maxpermits; /* max users on permit list */ |
120 guint maxdenies; /* max users on deny list */ | |
121 guint maxsiglen; /* max size (bytes) of profile */ | |
122 guint maxawaymsglen; /* max size (bytes) of posted away message */ | |
123 } rights; | |
2086 | 124 }; |
125 | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
126 struct create_room { |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
127 char *name; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
128 int exchange; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
129 }; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
130 |
2086 | 131 struct chat_connection { |
132 char *name; | |
133 char *show; /* AOL did something funny to us */ | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
134 fu16_t exchange; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
135 fu16_t instance; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
136 aim_conn_t *conn; |
2086 | 137 int inpa; |
138 int id; | |
5575 | 139 GaimConnection *gc; /* i hate this. */ |
8733 | 140 GaimConversation *conv; /* bah. */ |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
141 int maxlen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
142 int maxvis; |
2086 | 143 }; |
144 | |
8971 | 145 struct oscar_direct_im { |
5575 | 146 GaimConnection *gc; |
2086 | 147 char name[80]; |
148 int watcher; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
149 aim_conn_t *conn; |
3008 | 150 gboolean connected; |
8978 | 151 gboolean gpc_pend; |
152 gboolean killme; | |
8984 | 153 gboolean donttryagain; |
2086 | 154 }; |
155 | |
156 struct ask_direct { | |
5575 | 157 GaimConnection *gc; |
2086 | 158 char *sn; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
159 char ip[64]; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
160 fu8_t cookie[8]; |
8984 | 161 gboolean donttryagain; |
2086 | 162 }; |
163 | |
7011 | 164 /* |
165 * Various PRPL-specific buddy info that we want to keep track of | |
166 * Some other info is maintained by locate.c, and I'd like to move | |
167 * the rest of this to libfaim, mostly im.c | |
168 */ | |
4738 | 169 struct buddyinfo { |
170 gboolean typingnot; | |
6292 | 171 gchar *availmsg; |
6857 | 172 fu32_t ipaddr; |
5836 | 173 |
174 unsigned long ico_me_len; | |
175 unsigned long ico_me_csum; | |
176 time_t ico_me_time; | |
177 gboolean ico_informed; | |
4738 | 178 |
179 unsigned long ico_len; | |
180 unsigned long ico_csum; | |
181 time_t ico_time; | |
182 gboolean ico_need; | |
7406 | 183 gboolean ico_sent; |
2086 | 184 }; |
185 | |
4230 | 186 struct name_data { |
5575 | 187 GaimConnection *gc; |
4230 | 188 gchar *name; |
3453 | 189 gchar *nick; |
3141 | 190 }; |
191 | |
5129 | 192 static char *msgerrreason[] = { |
193 N_("Invalid error"), | |
194 N_("Invalid SNAC"), | |
195 N_("Rate to host"), | |
196 N_("Rate to client"), | |
197 N_("Not logged in"), | |
198 N_("Service unavailable"), | |
199 N_("Service not defined"), | |
200 N_("Obsolete SNAC"), | |
201 N_("Not supported by host"), | |
202 N_("Not supported by client"), | |
203 N_("Refused by client"), | |
204 N_("Reply too big"), | |
205 N_("Responses lost"), | |
206 N_("Request denied"), | |
207 N_("Busted SNAC payload"), | |
208 N_("Insufficient rights"), | |
209 N_("In local permit/deny"), | |
210 N_("Too evil (sender)"), | |
211 N_("Too evil (receiver)"), | |
212 N_("User temporarily unavailable"), | |
213 N_("No match"), | |
214 N_("List overflow"), | |
215 N_("Request ambiguous"), | |
216 N_("Queue full"), | |
217 N_("Not while on AOL") | |
218 }; | |
219 static int msgerrreasonlen = 25; | |
220 | |
221 /* All the libfaim->gaim callback functions */ | |
222 static int gaim_parse_auth_resp (aim_session_t *, aim_frame_t *, ...); | |
223 static int gaim_parse_login (aim_session_t *, aim_frame_t *, ...); | |
10464 | 224 static int gaim_parse_auth_securid_request(aim_session_t *, aim_frame_t *, ...); |
5129 | 225 static int gaim_handle_redirect (aim_session_t *, aim_frame_t *, ...); |
226 static int gaim_info_change (aim_session_t *, aim_frame_t *, ...); | |
227 static int gaim_account_confirm (aim_session_t *, aim_frame_t *, ...); | |
228 static int gaim_parse_oncoming (aim_session_t *, aim_frame_t *, ...); | |
229 static int gaim_parse_offgoing (aim_session_t *, aim_frame_t *, ...); | |
230 static int gaim_parse_incoming_im(aim_session_t *, aim_frame_t *, ...); | |
231 static int gaim_parse_misses (aim_session_t *, aim_frame_t *, ...); | |
232 static int gaim_parse_clientauto (aim_session_t *, aim_frame_t *, ...); | |
7011 | 233 static int gaim_parse_userinfo (aim_session_t *, aim_frame_t *, ...); |
8341 | 234 static int gaim_reqinfo_timeout (aim_session_t *, aim_frame_t *, ...); |
5129 | 235 static int gaim_parse_motd (aim_session_t *, aim_frame_t *, ...); |
236 static int gaim_chatnav_info (aim_session_t *, aim_frame_t *, ...); | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
237 static int gaim_conv_chat_join (aim_session_t *, aim_frame_t *, ...); |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
238 static int gaim_conv_chat_leave (aim_session_t *, aim_frame_t *, ...); |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
239 static int gaim_conv_chat_info_update (aim_session_t *, aim_frame_t *, ...); |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
240 static int gaim_conv_chat_incoming_msg(aim_session_t *, aim_frame_t *, ...); |
5129 | 241 static int gaim_email_parseupdate(aim_session_t *, aim_frame_t *, ...); |
242 static int gaim_icon_error (aim_session_t *, aim_frame_t *, ...); | |
243 static int gaim_icon_parseicon (aim_session_t *, aim_frame_t *, ...); | |
5844 | 244 static int oscar_icon_req (aim_session_t *, aim_frame_t *, ...); |
5129 | 245 static int gaim_parse_msgack (aim_session_t *, aim_frame_t *, ...); |
246 static int gaim_parse_ratechange (aim_session_t *, aim_frame_t *, ...); | |
247 static int gaim_parse_evilnotify (aim_session_t *, aim_frame_t *, ...); | |
248 static int gaim_parse_searcherror(aim_session_t *, aim_frame_t *, ...); | |
249 static int gaim_parse_searchreply(aim_session_t *, aim_frame_t *, ...); | |
250 static int gaim_bosrights (aim_session_t *, aim_frame_t *, ...); | |
251 static int gaim_connerr (aim_session_t *, aim_frame_t *, ...); | |
252 static int conninitdone_admin (aim_session_t *, aim_frame_t *, ...); | |
253 static int conninitdone_bos (aim_session_t *, aim_frame_t *, ...); | |
254 static int conninitdone_chatnav (aim_session_t *, aim_frame_t *, ...); | |
255 static int conninitdone_chat (aim_session_t *, aim_frame_t *, ...); | |
256 static int conninitdone_email (aim_session_t *, aim_frame_t *, ...); | |
257 static int conninitdone_icon (aim_session_t *, aim_frame_t *, ...); | |
258 static int gaim_parse_msgerr (aim_session_t *, aim_frame_t *, ...); | |
259 static int gaim_parse_mtn (aim_session_t *, aim_frame_t *, ...); | |
260 static int gaim_parse_locaterights(aim_session_t *, aim_frame_t *, ...); | |
261 static int gaim_parse_buddyrights(aim_session_t *, aim_frame_t *, ...); | |
262 static int gaim_parse_locerr (aim_session_t *, aim_frame_t *, ...); | |
263 static int gaim_icbm_param_info (aim_session_t *, aim_frame_t *, ...); | |
264 static int gaim_parse_genericerr (aim_session_t *, aim_frame_t *, ...); | |
265 static int gaim_memrequest (aim_session_t *, aim_frame_t *, ...); | |
266 static int gaim_selfinfo (aim_session_t *, aim_frame_t *, ...); | |
267 static int gaim_offlinemsg (aim_session_t *, aim_frame_t *, ...); | |
268 static int gaim_offlinemsgdone (aim_session_t *, aim_frame_t *, ...); | |
269 static int gaim_icqalias (aim_session_t *, aim_frame_t *, ...); | |
270 static int gaim_icqinfo (aim_session_t *, aim_frame_t *, ...); | |
271 static int gaim_popup (aim_session_t *, aim_frame_t *, ...); | |
272 #ifndef NOSSI | |
273 static int gaim_ssi_parseerr (aim_session_t *, aim_frame_t *, ...); | |
274 static int gaim_ssi_parserights (aim_session_t *, aim_frame_t *, ...); | |
275 static int gaim_ssi_parselist (aim_session_t *, aim_frame_t *, ...); | |
276 static int gaim_ssi_parseack (aim_session_t *, aim_frame_t *, ...); | |
8227 | 277 static int gaim_ssi_parseadd (aim_session_t *, aim_frame_t *, ...); |
5129 | 278 static int gaim_ssi_authgiven (aim_session_t *, aim_frame_t *, ...); |
279 static int gaim_ssi_authrequest (aim_session_t *, aim_frame_t *, ...); | |
280 static int gaim_ssi_authreply (aim_session_t *, aim_frame_t *, ...); | |
281 static int gaim_ssi_gotadded (aim_session_t *, aim_frame_t *, ...); | |
282 #endif | |
283 | |
284 /* for DirectIM/image transfer */ | |
285 static int gaim_odc_initiate (aim_session_t *, aim_frame_t *, ...); | |
286 static int gaim_odc_incoming (aim_session_t *, aim_frame_t *, ...); | |
287 static int gaim_odc_typing (aim_session_t *, aim_frame_t *, ...); | |
6982 | 288 static int gaim_odc_update_ui (aim_session_t *, aim_frame_t *, ...); |
5129 | 289 |
290 /* for file transfer */ | |
291 static int oscar_sendfile_estblsh(aim_session_t *, aim_frame_t *, ...); | |
292 static int oscar_sendfile_prompt (aim_session_t *, aim_frame_t *, ...); | |
293 static int oscar_sendfile_ack (aim_session_t *, aim_frame_t *, ...); | |
294 static int oscar_sendfile_done (aim_session_t *, aim_frame_t *, ...); | |
295 | |
296 static gboolean gaim_icon_timerfunc(gpointer data); | |
8971 | 297 static void oscar_callback(gpointer data, gint source, GaimInputCondition condition); |
8983 | 298 static void oscar_direct_im_initiate(GaimConnection *gc, const char *who, const char *cookie); |
5954 | 299 static void oscar_set_info(GaimConnection *gc, const char *text); |
9935 | 300 static void recent_buddies_cb(const char *name, GaimPrefType type, gpointer value, gpointer data); |
301 | |
5836 | 302 static void oscar_free_name_data(struct name_data *data) { |
4230 | 303 g_free(data->name); |
304 g_free(data->nick); | |
305 g_free(data); | |
306 } | |
307 | |
5836 | 308 static void oscar_free_buddyinfo(void *data) { |
309 struct buddyinfo *bi = data; | |
6292 | 310 g_free(bi->availmsg); |
5836 | 311 g_free(bi); |
312 } | |
313 | |
9807 | 314 static fu32_t oscar_charset_check(const char *utf8) |
5129 | 315 { |
316 int i = 0; | |
9826 | 317 int charset = AIM_CHARSET_ASCII; |
5129 | 318 |
319 /* Determine how we can send this message. Per the warnings elsewhere | |
320 * in this file, these little checks determine the simplest encoding | |
321 * we can use for a given message send using it. */ | |
322 while (utf8[i]) { | |
323 if ((unsigned char)utf8[i] > 0x7f) { | |
324 /* not ASCII! */ | |
9826 | 325 charset = AIM_CHARSET_CUSTOM; |
5129 | 326 break; |
327 } | |
328 i++; | |
329 } | |
330 while (utf8[i]) { | |
331 /* ISO-8859-1 is 0x00-0xbf in the first byte | |
332 * followed by 0xc0-0xc3 in the second */ | |
333 if ((unsigned char)utf8[i] < 0x80) { | |
334 i++; | |
335 continue; | |
336 } else if (((unsigned char)utf8[i] & 0xfc) == 0xc0 && | |
337 ((unsigned char)utf8[i + 1] & 0xc0) == 0x80) { | |
338 i += 2; | |
339 continue; | |
340 } | |
9826 | 341 charset = AIM_CHARSET_UNICODE; |
5129 | 342 break; |
343 } | |
344 | |
9807 | 345 return charset; |
5129 | 346 } |
347 | |
8225 | 348 /* |
349 * Take a string of the form charset="bleh" where bleh is | |
350 * one of us-ascii, utf-8, iso-8859-1, or unicode-2-0, and | |
351 * return a newly allocated string containing bleh. | |
352 */ | |
353 static gchar *oscar_encoding_extract(const char *encoding) | |
5129 | 354 { |
8225 | 355 gchar *ret = NULL; |
356 char *begin, *end; | |
357 | |
9933 | 358 g_return_val_if_fail(encoding != NULL, NULL); |
359 | |
8735
92cbf9713795
[gaim-migrate @ 9490]
Christian Hammond <chipx86@chipx86.com>
parents:
8733
diff
changeset
|
360 /* Make sure encoding begins with charset= */ |
10540 | 361 if (strncmp(encoding, "text/aolrtf; charset=", 21) && |
362 strncmp(encoding, "text/x-aolrtf; charset=", 23)) | |
363 { | |
8225 | 364 return NULL; |
10540 | 365 } |
8225 | 366 |
367 begin = strchr(encoding, '"'); | |
368 end = strrchr(encoding, '"'); | |
369 | |
370 if ((begin == NULL) || (end == NULL) || (begin >= end)) | |
371 return NULL; | |
372 | |
373 ret = g_strndup(begin+1, (end-1) - begin); | |
374 | |
375 return ret; | |
376 } | |
377 | |
9830 | 378 static gchar * |
379 oscar_encoding_to_utf8(const char *encoding, const char *text, int textlen) | |
5129 | 380 { |
381 gchar *utf8 = NULL; | |
9595 | 382 |
383 if ((encoding == NULL) || encoding[0] == '\0') { | |
384 gaim_debug_info("oscar", "Empty encoding, assuming UTF-8\n"); | |
10396 | 385 } else if (!strcasecmp(encoding, "iso-8859-1")) { |
10376 | 386 utf8 = g_convert(text, textlen, "UTF-8", "iso-8859-1", NULL, NULL, NULL); |
10396 | 387 } else if (!strcasecmp(encoding, "ISO-8859-1-Windows-3.1-Latin-1")) { |
10375 | 388 utf8 = g_convert(text, textlen, "UTF-8", "Windows-1252", NULL, NULL, NULL); |
10396 | 389 } else if (!strcasecmp(encoding, "unicode-2-0")) { |
9595 | 390 utf8 = g_convert(text, textlen, "UTF-8", "UCS-2BE", NULL, NULL, NULL); |
10396 | 391 } else if (strcasecmp(encoding, "us-ascii") && strcmp(encoding, "utf-8")) { |
9595 | 392 gaim_debug_warning("oscar", "Unrecognized character encoding \"%s\", " |
10096 | 393 "attempting to convert to UTF-8 anyway\n", encoding); |
9595 | 394 utf8 = g_convert(text, textlen, "UTF-8", encoding, NULL, NULL, NULL); |
395 } | |
396 | |
397 /* | |
398 * If utf8 is still NULL then either the encoding is us-ascii/utf-8 or | |
399 * we have been unable to convert the text to utf-8 from the encoding | |
400 * that was specified. So we check if the text is valid utf-8 then | |
401 * just copy it. | |
402 */ | |
403 if (utf8 == NULL) { | |
9638 | 404 if (textlen != 0 && *text != '\0' |
405 && !g_utf8_validate(text, textlen, NULL)) | |
9908 | 406 utf8 = g_strdup(_("(There was an error receiving this message. The buddy you are speaking to most likely has a buggy client.)")); |
9476 | 407 else |
9481 | 408 utf8 = g_strndup(text, textlen); |
5129 | 409 } |
410 | |
411 return utf8; | |
412 } | |
413 | |
9830 | 414 static gchar * |
9908 | 415 gaim_plugin_oscar_convert_to_utf8(const fu8_t *data, fu16_t datalen, const char *charsetstr, gboolean fallback) |
9830 | 416 { |
417 gchar *ret = NULL; | |
418 GError *err = NULL; | |
419 | |
9908 | 420 if ((charsetstr == NULL) || (*charsetstr == '\0')) |
421 return NULL; | |
422 | |
423 if (strcasecmp("UTF-8", charsetstr)) { | |
424 if (fallback) | |
425 ret = g_convert_with_fallback(data, datalen, "UTF-8", charsetstr, "?", NULL, NULL, &err); | |
426 else | |
427 ret = g_convert(data, datalen, "UTF-8", charsetstr, NULL, NULL, &err); | |
428 if (err != NULL) { | |
429 gaim_debug_warning("oscar", "Conversation from %s failed: %s.\n", | |
430 charsetstr, err->message); | |
431 g_error_free(err); | |
432 } | |
433 } else { | |
434 if (g_utf8_validate(data, datalen, NULL)) | |
435 ret = g_strndup(data, datalen); | |
436 else | |
437 gaim_debug_warning("oscar", "String is not valid UTF-8.\n"); | |
438 } | |
439 | |
440 return ret; | |
441 } | |
442 | |
443 /* | |
444 * We try decoding using two different character sets. The charset | |
445 * specified in the IM determines the order in which we attempt to | |
446 * decode. We do this because there are lots of broken ICQ clients | |
447 * that don't correctly send non-ASCII messages. And if Gaim isn't | |
448 * able to deal with that crap, then people complain like banshees. | |
449 * charsetstr1 is always set to what the correct encoding should be. | |
450 */ | |
451 static gchar * | |
452 gaim_plugin_oscar_decode_im_part(GaimAccount *account, const char *sourcesn, fu16_t charset, fu16_t charsubset, fu8_t *data, fu16_t datalen) | |
453 { | |
454 gchar *ret = NULL; | |
455 const gchar *charsetstr1, *charsetstr2; | |
456 | |
457 gaim_debug_info("oscar", "Parsing IM part, charset=0x%04hx, charsubset=0x%04hx, datalen=%hd\n", charset, charsubset, datalen); | |
9830 | 458 |
459 if ((datalen == 0) || (data == NULL)) | |
460 return NULL; | |
461 | |
9908 | 462 if (charset == AIM_CHARSET_UNICODE) { |
463 charsetstr1 = "UCS-2BE"; | |
464 charsetstr2 = "UTF-8"; | |
465 } else if (charset == AIM_CHARSET_CUSTOM) { | |
9975 | 466 if ((sourcesn != NULL) && aim_sn_is_icq(sourcesn)) |
9908 | 467 charsetstr1 = gaim_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); |
9830 | 468 else |
9908 | 469 charsetstr1 = "ISO-8859-1"; |
470 charsetstr2 = "UTF-8"; | |
471 } else if (charset == AIM_CHARSET_ASCII) { | |
472 /* Should just be "ASCII" */ | |
9914 | 473 charsetstr1 = "ASCII"; |
9908 | 474 charsetstr2 = gaim_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); |
475 } else if (charset == 0x000d) { | |
9830 | 476 /* Mobile AIM client on a Nokia 3100 and an LG VX6000 */ |
9908 | 477 charsetstr1 = "ISO-8859-1"; |
478 charsetstr2 = gaim_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); | |
479 } else { | |
9830 | 480 /* Unknown, hope for valid UTF-8... */ |
9908 | 481 charsetstr1 = "UTF-8"; |
482 charsetstr2 = gaim_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); | |
483 } | |
484 | |
485 ret = gaim_plugin_oscar_convert_to_utf8(data, datalen, charsetstr1, FALSE); | |
486 if (ret == NULL) | |
487 ret = gaim_plugin_oscar_convert_to_utf8(data, datalen, charsetstr2, TRUE); | |
488 if (ret == NULL) | |
489 ret = g_strdup(_("(There was an error receiving this message. The buddy you are speaking to most likely has a buggy client.)")); | |
9830 | 490 |
491 return ret; | |
492 } | |
493 | |
494 static void | |
495 gaim_plugin_oscar_convert_to_best_encoding(GaimConnection *gc, const char *destsn, const gchar *from, | |
10039 | 496 gchar **msg, int *msglen_int, |
9830 | 497 fu16_t *charset, fu16_t *charsubset) |
498 { | |
499 OscarData *od = gc->proto_data; | |
500 GaimAccount *account = gaim_connection_get_account(gc); | |
501 GError *err = NULL; | |
502 aim_userinfo_t *userinfo = NULL; | |
503 const gchar *charsetstr; | |
10039 | 504 gsize msglen; |
9830 | 505 |
506 /* Attempt to send as ASCII */ | |
10098 | 507 if (oscar_charset_check(from) == AIM_CHARSET_ASCII) { |
10097 | 508 *msg = g_convert(from, strlen(from), "ASCII", "UTF-8", NULL, &msglen, NULL); |
10098 | 509 *charset = AIM_CHARSET_ASCII; |
9830 | 510 *charsubset = 0x0000; |
10039 | 511 *msglen_int = msglen; |
9830 | 512 return; |
513 } | |
514 | |
515 /* | |
10565 | 516 * If we're sending to an ICQ user, and they are in our |
517 * buddy list, and they are advertising the Unicode | |
518 * capability, and they are online, then attempt to send | |
519 * as UCS-2BE. | |
9830 | 520 */ |
9975 | 521 if ((destsn != NULL) && aim_sn_is_icq(destsn)) |
9830 | 522 userinfo = aim_locate_finduserinfo(od->sess, destsn); |
523 | |
10565 | 524 if ((userinfo != NULL) && (userinfo->capabilities & AIM_CAPS_ICQUTF8)) |
525 { | |
526 GaimBuddy *b; | |
527 b = gaim_find_buddy(account, destsn); | |
528 if ((b != NULL) && (GAIM_BUDDY_IS_ONLINE(b))) | |
529 { | |
530 *msg = g_convert(from, strlen(from), "UCS-2BE", "UTF-8", NULL, &msglen, NULL); | |
531 if (*msg != NULL) | |
532 { | |
533 *charset = AIM_CHARSET_UNICODE; | |
534 *charsubset = 0x0000; | |
535 *msglen_int = msglen; | |
536 return; | |
537 } | |
9830 | 538 } |
539 } | |
540 | |
541 /* | |
542 * If this is AIM then attempt to send as ISO-8859-1. If this is | |
543 * ICQ then attempt to send as the user specified character encoding. | |
544 */ | |
545 charsetstr = "ISO-8859-1"; | |
9975 | 546 if ((destsn != NULL) && aim_sn_is_icq(destsn)) |
9830 | 547 charsetstr = gaim_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); |
548 | |
10097 | 549 /* |
550 * XXX - We need a way to only attempt to convert if we KNOW "from" | |
551 * can be converted to "charsetstr" | |
552 */ | |
10039 | 553 *msg = g_convert(from, strlen(from), charsetstr, "UTF-8", NULL, &msglen, NULL); |
9830 | 554 if (*msg != NULL) { |
555 *charset = AIM_CHARSET_CUSTOM; | |
556 *charsubset = 0x0000; | |
10039 | 557 *msglen_int = msglen; |
9830 | 558 return; |
559 } | |
560 | |
561 /* | |
562 * Nothing else worked, so send as UCS-2BE. | |
563 */ | |
10039 | 564 *msg = g_convert(from, strlen(from), "UCS-2BE", "UTF-8", NULL, &msglen, &err); |
9830 | 565 if (*msg != NULL) { |
566 *charset = AIM_CHARSET_UNICODE; | |
567 *charsubset = 0x0000; | |
10039 | 568 *msglen_int = msglen; |
9830 | 569 return; |
570 } | |
571 | |
9908 | 572 gaim_debug_error("oscar", "Error converting a Unicode message: %s\n", err->message); |
9830 | 573 g_error_free(err); |
574 | |
575 gaim_debug_error("oscar", "This should NEVER happen! Sending UTF-8 text flagged as ASCII.\n"); | |
576 *msg = g_strdup(from); | |
10039 | 577 *msglen_int = strlen(*msg); |
9830 | 578 *charset = AIM_CHARSET_ASCII; |
579 *charsubset = 0x0000; | |
580 return; | |
581 } | |
582 | |
9407 | 583 gchar *oscar_caps_to_string(guint caps) |
8701 | 584 { |
9407 | 585 GString *str; |
586 gchar *tmp; | |
8701 | 587 guint bit = 1; |
588 | |
9407 | 589 str = g_string_new(""); |
590 | |
8701 | 591 if (!caps) { |
592 return NULL; | |
593 } else while (bit <= AIM_CAPS_LAST) { | |
594 if (bit & caps) { | |
595 switch (bit) { | |
596 case AIM_CAPS_BUDDYICON: | |
597 tmp = _("Buddy Icon"); | |
598 break; | |
599 case AIM_CAPS_TALK: | |
600 tmp = _("Voice"); | |
601 break; | |
602 case AIM_CAPS_DIRECTIM: | |
603 tmp = _("AIM Direct IM"); | |
604 break; | |
605 case AIM_CAPS_CHAT: | |
606 tmp = _("Chat"); | |
607 break; | |
608 case AIM_CAPS_GETFILE: | |
609 tmp = _("Get File"); | |
610 break; | |
611 case AIM_CAPS_SENDFILE: | |
612 tmp = _("Send File"); | |
613 break; | |
614 case AIM_CAPS_GAMES: | |
615 case AIM_CAPS_GAMES2: | |
616 tmp = _("Games"); | |
617 break; | |
618 case AIM_CAPS_ADDINS: | |
619 tmp = _("Add-Ins"); | |
620 break; | |
621 case AIM_CAPS_SENDBUDDYLIST: | |
622 tmp = _("Send Buddy List"); | |
623 break; | |
624 case AIM_CAPS_ICQ_DIRECT: | |
625 tmp = _("ICQ Direct Connect"); | |
626 break; | |
627 case AIM_CAPS_APINFO: | |
628 tmp = _("AP User"); | |
629 break; | |
630 case AIM_CAPS_ICQRTF: | |
631 tmp = _("ICQ RTF"); | |
632 break; | |
633 case AIM_CAPS_EMPTY: | |
634 tmp = _("Nihilist"); | |
635 break; | |
636 case AIM_CAPS_ICQSERVERRELAY: | |
637 tmp = _("ICQ Server Relay"); | |
638 break; | |
639 case AIM_CAPS_ICQUTF8OLD: | |
640 tmp = _("Old ICQ UTF8"); | |
641 break; | |
642 case AIM_CAPS_TRILLIANCRYPT: | |
643 tmp = _("Trillian Encryption"); | |
644 break; | |
645 case AIM_CAPS_ICQUTF8: | |
646 tmp = _("ICQ UTF8"); | |
647 break; | |
648 case AIM_CAPS_HIPTOP: | |
649 tmp = _("Hiptop"); | |
650 break; | |
651 case AIM_CAPS_SECUREIM: | |
652 tmp = _("Security Enabled"); | |
653 break; | |
654 case AIM_CAPS_VIDEO: | |
655 tmp = _("Video Chat"); | |
656 break; | |
657 /* Not actually sure about this one... WinAIM doesn't show anything */ | |
658 case AIM_CAPS_ICHATAV: | |
659 tmp = _("iChat AV"); | |
660 break; | |
661 case AIM_CAPS_LIVEVIDEO: | |
662 tmp = _("Live Video"); | |
663 break; | |
664 case AIM_CAPS_CAMERA: | |
665 tmp = _("Camera"); | |
666 break; | |
667 default: | |
668 tmp = NULL; | |
669 break; | |
670 } | |
671 if (tmp) | |
9532 | 672 g_string_append_printf(str, "%s%s", (*(str->str) == '\0' ? "" : ", "), tmp); |
8701 | 673 } |
674 bit <<= 1; | |
675 } | |
9407 | 676 |
677 return g_string_free(str, FALSE); | |
8701 | 678 } |
679 | |
680 static char *oscar_icqstatus(int state) { | |
681 /* Make a cute little string that shows the status of the dude or dudet */ | |
682 if (state & AIM_ICQ_STATE_CHAT) | |
683 return g_strdup_printf(_("Free For Chat")); | |
684 else if (state & AIM_ICQ_STATE_DND) | |
685 return g_strdup_printf(_("Do Not Disturb")); | |
686 else if (state & AIM_ICQ_STATE_OUT) | |
687 return g_strdup_printf(_("Not Available")); | |
688 else if (state & AIM_ICQ_STATE_BUSY) | |
689 return g_strdup_printf(_("Occupied")); | |
690 else if (state & AIM_ICQ_STATE_AWAY) | |
691 return g_strdup_printf(_("Away")); | |
692 else if (state & AIM_ICQ_STATE_WEBAWARE) | |
693 return g_strdup_printf(_("Web Aware")); | |
694 else if (state & AIM_ICQ_STATE_INVISIBLE) | |
695 return g_strdup_printf(_("Invisible")); | |
696 else | |
697 return g_strdup_printf(_("Online")); | |
698 } | |
699 | |
9973 | 700 static void |
701 oscar_string_append(GString *str, const char *newline, const char *name, const char *value) | |
8700 | 702 { |
703 gchar *utf8; | |
704 | |
705 if (value && value[0] && (utf8 = gaim_utf8_try_convert(value))) { | |
8701 | 706 g_string_append_printf(str, "%s<b>%s:</b> %s", newline, name, utf8); |
8700 | 707 g_free(utf8); |
708 } | |
709 } | |
710 | |
9973 | 711 static void oscar_string_append_info(GaimConnection *gc, GString *str, const char *newline, GaimBuddy *b, aim_userinfo_t *userinfo) |
8701 | 712 { |
10042 | 713 OscarData *od; |
714 GaimAccount *account; | |
10517
461334f300d7
[gaim-migrate @ 11821]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10504
diff
changeset
|
715 GaimPresence *presence = NULL; |
461334f300d7
[gaim-migrate @ 11821]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10504
diff
changeset
|
716 GaimStatus *status = NULL; |
8701 | 717 GaimGroup *g = NULL; |
718 struct buddyinfo *bi = NULL; | |
719 char *tmp; | |
720 | |
10042 | 721 od = gc->proto_data; |
722 account = gaim_connection_get_account(gc); | |
723 | |
724 if ((str == NULL) || (newline == NULL) || ((b == NULL) && (userinfo == NULL))) | |
8701 | 725 return; |
726 | |
727 if (userinfo == NULL) | |
728 userinfo = aim_locate_finduserinfo(od->sess, b->name); | |
729 | |
730 if (b == NULL) | |
10042 | 731 b = gaim_find_buddy(account, userinfo->sn); |
8701 | 732 |
733 if (b != NULL) | |
10498 | 734 { |
8701 | 735 g = gaim_find_buddys_group(b); |
10498 | 736 presence = gaim_buddy_get_presence(b); |
737 status = gaim_presence_get_active_status(presence); | |
738 } | |
8701 | 739 |
740 if (userinfo != NULL) | |
741 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(account, userinfo->sn)); | |
742 | |
8733 | 743 if (b != NULL) { |
10498 | 744 if (gaim_presence_is_online(presence)) { |
9975 | 745 if (aim_sn_is_icq(b->name)) { |
8733 | 746 tmp = oscar_icqstatus((b->uc & 0xffff0000) >> 16); |
747 oscar_string_append(str, newline, _("Status"), tmp); | |
748 g_free(tmp); | |
749 } | |
750 } else { | |
9625 | 751 tmp = aim_ssi_itemlist_findparentname(od->sess->ssi.local, b->name); |
8733 | 752 if (aim_ssi_waitingforauth(od->sess->ssi.local, tmp, b->name)) |
753 oscar_string_append(str, newline, _("Status"), _("Not Authorized")); | |
754 else | |
755 oscar_string_append(str, newline, _("Status"), _("Offline")); | |
8701 | 756 } |
8733 | 757 } |
8701 | 758 |
759 if ((bi != NULL) && (bi->ipaddr != 0)) { | |
9625 | 760 tmp = g_strdup_printf("%hhu.%hhu.%hhu.%hhu", |
8701 | 761 (bi->ipaddr & 0xff000000) >> 24, |
762 (bi->ipaddr & 0x00ff0000) >> 16, | |
763 (bi->ipaddr & 0x0000ff00) >> 8, | |
764 (bi->ipaddr & 0x000000ff)); | |
765 oscar_string_append(str, newline, _("IP Address"), tmp); | |
766 g_free(tmp); | |
767 } | |
768 | |
769 if ((userinfo != NULL) && (userinfo->capabilities != 0)) { | |
770 tmp = oscar_caps_to_string(userinfo->capabilities); | |
771 oscar_string_append(str, newline, _("Capabilities"), tmp); | |
9407 | 772 g_free(tmp); |
8701 | 773 } |
774 | |
775 if ((b != NULL) && (b->name != NULL) && (g != NULL) && (g->name != NULL)) { | |
776 tmp = aim_ssi_getcomment(od->sess->ssi.local, g->name, b->name); | |
777 if (tmp != NULL) { | |
9625 | 778 char *tmp2 = g_markup_escape_text(tmp, strlen(tmp)); |
8701 | 779 g_free(tmp); |
9625 | 780 oscar_string_append(str, newline, _("Buddy Comment"), tmp2); |
781 g_free(tmp2); | |
8701 | 782 } |
783 } | |
784 | |
10498 | 785 if ((bi != NULL) && (bi->availmsg != NULL) && gaim_status_is_available(status)) { |
8701 | 786 tmp = g_markup_escape_text(bi->availmsg, strlen(bi->availmsg)); |
787 oscar_string_append(str, newline, _("Available"), tmp); | |
788 g_free(tmp); | |
789 } | |
790 } | |
791 | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
792 static char *extract_name(const char *name) { |
4121 | 793 char *tmp, *x; |
2086 | 794 int i, j; |
4120 | 795 |
796 if (!name) | |
4121 | 797 return NULL; |
10042 | 798 |
4120 | 799 x = strchr(name, '-'); |
4121 | 800 |
2086 | 801 if (!x) return NULL; |
802 x = strchr(++x, '-'); | |
803 if (!x) return NULL; | |
804 tmp = g_strdup(++x); | |
805 | |
806 for (i = 0, j = 0; x[i]; i++) { | |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
807 char hex[3]; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
808 if (x[i] != '%') { |
2086 | 809 tmp[j++] = x[i]; |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
810 continue; |
2086 | 811 } |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
812 strncpy(hex, x + ++i, 2); hex[2] = 0; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
813 i++; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
814 tmp[j++] = strtol(hex, NULL, 16); |
2086 | 815 } |
816 | |
817 tmp[j] = 0; | |
818 return tmp; | |
819 } | |
820 | |
10458 | 821 static struct chat_connection * |
822 find_oscar_chat(GaimConnection *gc, int id) | |
823 { | |
824 OscarData *od = (OscarData *)gc->proto_data; | |
825 GSList *cur; | |
826 struct chat_connection *cc; | |
827 | |
828 for (cur = od->oscar_chats; cur != NULL; cur = cur->next) | |
829 { | |
830 cc = (struct chat_connection *)cur->data; | |
831 if (cc->id == id) | |
832 return cc; | |
833 } | |
834 | |
835 return NULL; | |
836 } | |
837 | |
838 static struct chat_connection * | |
839 find_oscar_chat_by_conn(GaimConnection *gc, aim_conn_t *conn) | |
840 { | |
841 OscarData *od = (OscarData *)gc->proto_data; | |
842 GSList *cur; | |
843 struct chat_connection *cc; | |
844 | |
845 for (cur = od->oscar_chats; cur != NULL; cur = cur->next) | |
846 { | |
847 cc = (struct chat_connection *)cur->data; | |
848 if (cc->conn == conn) | |
849 return cc; | |
850 } | |
851 | |
852 return NULL; | |
853 } | |
854 | |
855 static struct chat_connection * | |
856 find_oscar_chat_by_conv(GaimConnection *gc, GaimConversation *conv) | |
857 { | |
858 OscarData *od = (OscarData *)gc->proto_data; | |
859 GSList *cur; | |
860 struct chat_connection *cc; | |
861 | |
862 for (cur = od->oscar_chats; cur != NULL; cur = cur->next) | |
863 { | |
864 cc = (struct chat_connection *)cur->data; | |
865 if (cc->conv == conv) | |
866 return cc; | |
867 } | |
868 | |
869 return NULL; | |
870 } | |
871 | |
872 static void | |
873 oscar_chat_kill(GaimConnection *gc, struct chat_connection *cc) | |
874 { | |
875 OscarData *od = (OscarData *)gc->proto_data; | |
876 | |
877 /* Notify the conversation window that we've left the chat */ | |
878 serv_got_chat_left(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(cc->conv))); | |
879 | |
880 /* Destroy the chat_connection */ | |
881 od->oscar_chats = g_slist_remove(od->oscar_chats, cc); | |
882 if (cc->inpa > 0) | |
883 gaim_input_remove(cc->inpa); | |
884 aim_conn_kill(od->sess, &cc->conn); | |
885 g_free(cc->name); | |
886 g_free(cc->show); | |
887 g_free(cc); | |
8219 | 888 } |
889 | |
8971 | 890 /***************************************************************************** |
891 * Begin scary direct im stuff | |
892 *****************************************************************************/ | |
893 | |
894 static struct oscar_direct_im *oscar_direct_im_find(OscarData *od, const char *who) { | |
895 GSList *d = od->direct_ims; | |
896 struct oscar_direct_im *m = NULL; | |
897 | |
898 while (d) { | |
899 m = (struct oscar_direct_im *)d->data; | |
900 if (!aim_sncmp(who, m->name)) | |
901 return m; | |
902 d = d->next; | |
903 } | |
904 | |
905 return NULL; | |
906 } | |
907 | |
908 static void oscar_direct_im_destroy(OscarData *od, struct oscar_direct_im *dim) | |
909 { | |
910 gaim_debug_info("oscar", | |
911 "destroying Direct IM for %s.\n", dim->name); | |
912 | |
913 od->direct_ims = g_slist_remove(od->direct_ims, dim); | |
8978 | 914 if (dim->gpc_pend) { |
915 dim->killme = TRUE; | |
916 return; | |
917 } | |
8971 | 918 if (dim->watcher) |
919 gaim_input_remove(dim->watcher); | |
920 if (dim->conn) { | |
10271 | 921 aim_conn_close(dim->conn); |
8971 | 922 aim_conn_kill(od->sess, &dim->conn); |
923 } | |
924 g_free(dim); | |
925 } | |
926 | |
927 /* the only difference between this and destroy is this writes a conv message */ | |
928 static void oscar_direct_im_disconnect(OscarData *od, struct oscar_direct_im *dim) | |
929 { | |
930 GaimConversation *conv; | |
931 char buf[256]; | |
932 | |
933 gaim_debug_info("oscar", | |
934 "%s disconnected Direct IM.\n", dim->name); | |
935 | |
936 if (dim->connected) | |
937 g_snprintf(buf, sizeof buf, _("Direct IM with %s closed"), dim->name); | |
8978 | 938 else |
8971 | 939 g_snprintf(buf, sizeof buf, _("Direct IM with %s failed"), dim->name); |
940 | |
10246 | 941 conv = gaim_find_conversation_with_account(GAIM_CONV_IM, dim->name, |
942 gaim_connection_get_account(dim->gc)); | |
8971 | 943 if (conv) { |
944 gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL)); | |
9463 | 945 gaim_conversation_update_progress(conv, 0); |
8971 | 946 } else { |
947 gaim_notify_error(dim->gc, NULL, _("Direct Connect failed"), buf); | |
948 } | |
949 | |
950 oscar_direct_im_destroy(od, dim); | |
951 | |
952 return; | |
953 } | |
954 | |
955 /* oops i made two of these. this one just calls the other one. */ | |
956 static void gaim_odc_disconnect(aim_session_t *sess, aim_conn_t *conn) | |
957 { | |
958 GaimConnection *gc = sess->aux_data; | |
959 OscarData *od = (OscarData *)gc->proto_data; | |
960 struct oscar_direct_im *dim; | |
961 char *sn; | |
962 | |
963 sn = g_strdup(aim_odc_getsn(conn)); | |
964 dim = oscar_direct_im_find(od, sn); | |
965 oscar_direct_im_disconnect(od, dim); | |
966 g_free(sn); | |
967 } | |
968 | |
969 static void destroy_direct_im_request(struct ask_direct *d) { | |
970 gaim_debug_info("oscar", "Freeing DirectIM prompts.\n"); | |
971 | |
972 g_free(d->sn); | |
973 g_free(d); | |
974 } | |
975 | |
976 /* this is just a gaim_proxy_connect cb that sets up the rest of the cbs */ | |
977 static void oscar_odc_callback(gpointer data, gint source, GaimInputCondition condition) { | |
978 struct oscar_direct_im *dim = data; | |
979 GaimConnection *gc = dim->gc; | |
980 OscarData *od = gc->proto_data; | |
981 GaimConversation *conv; | |
982 char buf[256]; | |
983 struct sockaddr name; | |
984 socklen_t name_len = 1; | |
985 | |
986 g_return_if_fail(gc != NULL); | |
987 | |
8978 | 988 dim->gpc_pend = FALSE; |
989 if (dim->killme) { | |
990 oscar_direct_im_destroy(od, dim); | |
991 return; | |
992 } | |
993 | |
8971 | 994 if (!g_list_find(gaim_connections_get_all(), gc)) { |
995 oscar_direct_im_destroy(od, dim); | |
996 return; | |
997 } | |
998 | |
999 if (source < 0) { | |
8984 | 1000 if (dim->donttryagain) { |
1001 oscar_direct_im_disconnect(od, dim); | |
1002 return; | |
1003 } else { | |
1004 fu8_t cookie[8]; | |
1005 char *who = g_strdup(dim->name); | |
1006 const char *tmp = aim_odc_getcookie(dim->conn); | |
1007 | |
1008 memcpy(cookie, tmp, 8); | |
1009 oscar_direct_im_destroy(od, dim); | |
1010 oscar_direct_im_initiate(gc, who, cookie); | |
1011 gaim_debug_info("oscar", "asking direct im initiator to connect to us\n"); | |
1012 g_free(who); | |
1013 return; | |
1014 } | |
8971 | 1015 } |
1016 | |
1017 dim->conn->fd = source; | |
1018 aim_conn_completeconnect(od->sess, dim->conn); | |
1019 conv = gaim_conversation_new(GAIM_CONV_IM, dim->gc->account, dim->name); | |
1020 | |
1021 /* This is the best way to see if we're connected or not */ | |
8983 | 1022 /* Is this really needed? */ |
8971 | 1023 if (getpeername(source, &name, &name_len) == 0) { |
1024 g_snprintf(buf, sizeof buf, _("Direct IM with %s established"), dim->name); | |
1025 dim->connected = TRUE; | |
1026 gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL)); | |
8983 | 1027 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, oscar_callback, dim->conn); |
1028 } else { | |
8984 | 1029 if (dim->donttryagain) { |
1030 oscar_direct_im_disconnect(od, dim); | |
1031 return; | |
1032 } else { | |
1033 fu8_t cookie[8]; | |
1034 char *who = g_strdup(dim->name); | |
1035 const char *tmp = aim_odc_getcookie(dim->conn); | |
1036 | |
1037 memcpy(cookie, tmp, 8); | |
1038 oscar_direct_im_destroy(od, dim); | |
1039 oscar_direct_im_initiate(gc, who, cookie); | |
1040 gaim_debug_info("oscar", "asking direct im initiator to connect to us\n"); | |
1041 g_free(who); | |
1042 return; | |
1043 } | |
8983 | 1044 } |
1045 | |
1046 | |
8971 | 1047 } |
1048 | |
1049 static void accept_direct_im_request(struct ask_direct *d) { | |
1050 GaimConnection *gc = d->gc; | |
1051 OscarData *od; | |
1052 struct oscar_direct_im *dim; | |
1053 char *host; int port = 5190; | |
1054 int i, rc; | |
8982 | 1055 char *tmp; |
1056 GaimConversation *conv; | |
8971 | 1057 |
1058 if (!g_list_find(gaim_connections_get_all(), gc)) { | |
1059 destroy_direct_im_request(d); | |
1060 return; | |
1061 } | |
1062 | |
1063 od = (OscarData *)gc->proto_data; | |
1064 gaim_debug_info("oscar", "Accepted DirectIM.\n"); | |
1065 | |
1066 dim = oscar_direct_im_find(od, d->sn); | |
1067 if (dim && dim->connected) { | |
1068 destroy_direct_im_request(d); /* 40 */ /* what does that 40 mean? */ | |
1069 gaim_debug_info("oscar", "Wait, we're already connected, ignoring DirectIM.\n"); | |
1070 return; | |
1071 } | |
1072 dim = g_new0(struct oscar_direct_im, 1); | |
1073 dim->gc = d->gc; | |
8984 | 1074 dim->donttryagain = d->donttryagain; |
8971 | 1075 g_snprintf(dim->name, sizeof dim->name, "%s", d->sn); |
1076 | |
1077 dim->conn = aim_odc_connect(od->sess, d->sn, NULL, d->cookie); | |
1078 od->direct_ims = g_slist_append(od->direct_ims, dim); | |
1079 if (!dim->conn) { | |
1080 oscar_direct_im_disconnect(od, dim); | |
1081 destroy_direct_im_request(d); | |
1082 return; | |
1083 } | |
1084 | |
1085 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, | |
1086 gaim_odc_incoming, 0); | |
1087 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, | |
1088 gaim_odc_typing, 0); | |
1089 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER, | |
1090 gaim_odc_update_ui, 0); | |
1091 | |
1092 gaim_debug_info("oscar", "ip is %s.\n", d->ip); | |
1093 for (i = 0; i < (int)strlen(d->ip); i++) { | |
1094 if (d->ip[i] == ':') { | |
1095 port = atoi(&(d->ip[i+1])); | |
1096 break; | |
1097 } | |
1098 } | |
1099 host = g_strndup(d->ip, i); | |
1100 dim->conn->status |= AIM_CONN_STATUS_INPROGRESS; | |
8978 | 1101 dim->gpc_pend = TRUE; |
8971 | 1102 rc = gaim_proxy_connect(gc->account, host, port, oscar_odc_callback, dim); |
8982 | 1103 |
1104 conv = gaim_conversation_new(GAIM_CONV_IM, dim->gc->account, d->sn); | |
1105 tmp = g_strdup_printf(_("Attempting to connect to %s at %s:%hu for Direct IM."), d->sn, host, | |
1106 port); | |
1107 gaim_conversation_write(conv, NULL, tmp, GAIM_MESSAGE_SYSTEM, time(NULL)); | |
1108 g_free(tmp); | |
8983 | 1109 |
8971 | 1110 g_free(host); |
1111 if (rc < 0) { | |
8978 | 1112 dim->gpc_pend = FALSE; |
8971 | 1113 oscar_direct_im_disconnect(od, dim); |
1114 destroy_direct_im_request(d); | |
1115 return; | |
1116 } | |
1117 | |
1118 destroy_direct_im_request(d); | |
1119 | |
1120 return; | |
1121 } | |
1122 | |
1123 /* | |
1124 * We have just established a socket with the other dude, so set up some handlers. | |
1125 */ | |
1126 static int gaim_odc_initiate(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 1127 GaimConnection *gc = sess->aux_data; |
7283 | 1128 OscarData *od = (OscarData *)gc->proto_data; |
8733 | 1129 GaimConversation *conv; |
8971 | 1130 struct oscar_direct_im *dim; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1131 char buf[256]; |
8971 | 1132 char *sn; |
1133 va_list ap; | |
1134 aim_conn_t *newconn, *listenerconn; | |
1135 | |
1136 va_start(ap, fr); | |
1137 newconn = va_arg(ap, aim_conn_t *); | |
1138 listenerconn = va_arg(ap, aim_conn_t *); | |
1139 va_end(ap); | |
1140 | |
10271 | 1141 aim_conn_close(listenerconn); |
8971 | 1142 aim_conn_kill(sess, &listenerconn); |
1143 | |
1144 sn = g_strdup(aim_odc_getsn(newconn)); | |
1145 | |
1146 gaim_debug_info("oscar", | |
1147 "DirectIM: initiate success to %s\n", sn); | |
1148 dim = oscar_direct_im_find(od, sn); | |
1149 | |
1150 conv = gaim_conversation_new(GAIM_CONV_IM, dim->gc->account, sn); | |
1151 gaim_input_remove(dim->watcher); | |
1152 dim->conn = newconn; | |
1153 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, oscar_callback, dim->conn); | |
1154 dim->connected = TRUE; | |
1155 g_snprintf(buf, sizeof buf, _("Direct IM with %s established"), sn); | |
1156 g_free(sn); | |
1157 gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL)); | |
1158 | |
1159 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, gaim_odc_incoming, 0); | |
1160 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, gaim_odc_typing, 0); | |
1161 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER, gaim_odc_update_ui, 0); | |
1162 | |
1163 return 1; | |
1164 } | |
1165 | |
1166 /* | |
1167 * This is called when each chunk of an image is received. It can be used to | |
1168 * update a progress bar, or to eat lots of dry cat food. Wet cat food is | |
1169 * nasty, you sicko. | |
1170 */ | |
1171 static int gaim_odc_update_ui(aim_session_t *sess, aim_frame_t *fr, ...) { | |
1172 va_list ap; | |
1173 char *sn; | |
1174 double percent; | |
1175 GaimConnection *gc = sess->aux_data; | |
1176 OscarData *od = (OscarData *)gc->proto_data; | |
1177 GaimConversation *c; | |
1178 struct oscar_direct_im *dim; | |
1179 | |
1180 va_start(ap, fr); | |
1181 sn = va_arg(ap, char *); | |
1182 percent = va_arg(ap, double); | |
1183 va_end(ap); | |
1184 | |
1185 if (!sn || !(dim = oscar_direct_im_find(od, sn))) | |
1186 return 1; | |
1187 if (dim->watcher) { | |
1188 gaim_input_remove(dim->watcher); /* Otherwise, the callback will callback */ | |
1189 /* The callback will callback? I don't get how that would happen here. */ | |
1190 dim->watcher = 0; | |
1191 } | |
1192 | |
10246 | 1193 c = gaim_find_conversation_with_account(GAIM_CONV_IM, sn, |
1194 gaim_connection_get_account(gc)); | |
8971 | 1195 if (c != NULL) |
1196 gaim_conversation_update_progress(c, percent); | |
1197 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, | |
1198 oscar_callback, dim->conn); | |
1199 | |
1200 return 1; | |
1201 } | |
1202 | |
1203 /* | |
1204 * This is called after a direct IM has been received in its entirety. This | |
1205 * function is passed a long chunk of data which contains the IM with any | |
1206 * data chunks (images) appended to it. | |
1207 * | |
1208 * This function rips out all the data chunks and creates an imgstore for | |
1209 * each one. In order to do this, it first goes through the IM and takes | |
1210 * out all the IMG tags. When doing so, it rewrites the original IMG tag | |
1211 * with one compatible with the imgstore Gaim core code. For each one, we | |
1212 * then read in chunks of data from the end of the message and actually | |
1213 * create the img store using the given data. | |
1214 * | |
1215 * For somewhat easy reference, here's a sample message | |
1216 * (without the whitespace and asterisks): | |
1217 * | |
1218 * <HTML><BODY BGCOLOR="#ffffff"> | |
1219 * <FONT LANG="0"> | |
1220 * This is a really stupid picture:<BR> | |
1221 * <IMG SRC="Sample.jpg" ID="1" WIDTH="283" HEIGHT="212" DATASIZE="9894"><BR> | |
1222 * Yeah it is<BR> | |
1223 * Here is another one:<BR> | |
1224 * <IMG SRC="Soap Bubbles.bmp" ID="2" WIDTH="256" HEIGHT="256" DATASIZE="65978"> | |
1225 * </FONT> | |
1226 * </BODY></HTML> | |
1227 * <BINARY> | |
1228 * <DATA ID="1" SIZE="9894">datadatadatadata</DATA> | |
1229 * <DATA ID="2" SIZE="65978">datadatadatadata</DATA> | |
1230 * </BINARY> | |
1231 */ | |
1232 static int gaim_odc_incoming(aim_session_t *sess, aim_frame_t *fr, ...) { | |
1233 GaimConnection *gc = sess->aux_data; | |
1234 GaimConvImFlags imflags = 0; | |
1235 gchar *utf8; | |
1236 GString *newmsg = g_string_new(""); | |
1237 GSList *images = NULL; | |
1238 va_list ap; | |
1239 const char *sn, *msg, *msgend, *binary; | |
1240 size_t len; | |
1241 int encoding, isawaymsg; | |
1242 | |
1243 va_start(ap, fr); | |
1244 sn = va_arg(ap, const char *); | |
1245 msg = va_arg(ap, const char *); | |
1246 len = va_arg(ap, size_t); | |
1247 encoding = va_arg(ap, int); | |
1248 isawaymsg = va_arg(ap, int); | |
1249 va_end(ap); | |
1250 msgend = msg + len; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1251 |
8660 | 1252 gaim_debug_info("oscar", |
8971 | 1253 "Got DirectIM message from %s\n", sn); |
1254 | |
1255 if (isawaymsg) | |
1256 imflags |= GAIM_CONV_IM_AUTO_RESP; | |
1257 | |
1258 /* message has a binary trailer */ | |
1259 if ((binary = gaim_strcasestr(msg, "<binary>"))) { | |
1260 GData *attribs; | |
1261 const char *tmp, *start, *end, *last = NULL; | |
1262 | |
1263 tmp = msg; | |
1264 | |
1265 /* for each valid image tag... */ | |
1266 while (gaim_markup_find_tag("img", tmp, &start, &end, &attribs)) { | |
1267 const char *id, *src, *datasize; | |
10504 | 1268 const char *data = NULL; |
1269 char *tag = NULL; | |
8971 | 1270 size_t size; |
1271 int imgid = 0; | |
1272 | |
1273 /* update the location of the last img tag */ | |
1274 last = end; | |
1275 | |
1276 /* grab attributes */ | |
1277 id = g_datalist_get_data(&attribs, "id"); | |
1278 src = g_datalist_get_data(&attribs, "src"); | |
1279 datasize = g_datalist_get_data(&attribs, "datasize"); | |
1280 | |
1281 /* if we have id & datasize, build the data tag */ | |
1282 if (id && datasize) | |
1283 tag = g_strdup_printf("<data id=\"%s\" size=\"%s\">", id, datasize); | |
1284 | |
1285 /* if we have a tag, find the start of the data */ | |
1286 if (tag && (data = gaim_strcasestr(binary, tag))) | |
1287 data += strlen(tag); | |
1288 | |
10504 | 1289 g_free(tag); |
1290 | |
8971 | 1291 /* check the data is here and store it */ |
1292 if (data + (size = atoi(datasize)) <= msgend) | |
1293 imgid = gaim_imgstore_add(data, size, src); | |
1294 | |
1295 /* | |
1296 * XXX - The code below contains some calls to oscar_encoding_to_utf8 | |
1297 * The hardcoded "us-ascii" value REALLY needs to be removed. | |
1298 */ | |
1299 /* if we have a stored image... */ | |
1300 if (imgid) { | |
1301 /* append the message up to the tag */ | |
1302 utf8 = oscar_encoding_to_utf8("us-ascii", tmp, start - tmp); | |
1303 if (utf8 != NULL) { | |
1304 newmsg = g_string_append(newmsg, utf8); | |
1305 g_free(utf8); | |
1306 } | |
1307 | |
1308 /* write the new image tag */ | |
1309 g_string_append_printf(newmsg, "<IMG ID=\"%d\">", imgid); | |
1310 | |
1311 /* and record the image number */ | |
1312 images = g_slist_append(images, GINT_TO_POINTER(imgid)); | |
1313 } else { | |
1314 /* otherwise, copy up to the end of the tag */ | |
1315 utf8 = oscar_encoding_to_utf8("us-ascii", tmp, (end + 1) - tmp); | |
1316 if (utf8 != NULL) { | |
1317 newmsg = g_string_append(newmsg, utf8); | |
1318 g_free(utf8); | |
1319 } | |
1320 } | |
1321 | |
1322 /* clear the attribute list */ | |
1323 g_datalist_clear(&attribs); | |
1324 | |
1325 /* continue from the end of the tag */ | |
1326 tmp = end + 1; | |
1327 } | |
1328 | |
1329 /* append any remaining message data (without the > :-) */ | |
1330 if (last++ && (last < binary)) | |
1331 newmsg = g_string_append_len(newmsg, last, binary - last); | |
1332 | |
1333 /* set the flag if we caught any images */ | |
1334 if (images) | |
1335 imflags |= GAIM_CONV_IM_IMAGES; | |
1336 } else { | |
1337 g_string_append_len(newmsg, msg, len); | |
1338 } | |
1339 | |
10318 | 1340 /* Convert to UTF8 */ |
1341 /* (This hasn't been tested very much) */ | |
1342 utf8 = gaim_plugin_oscar_decode_im_part(gc->account, sn, encoding, 0x0000, newmsg->str, len); | |
1343 if (utf8 != NULL) { | |
1344 serv_got_im(gc, sn, utf8, imflags, time(NULL)); | |
1345 g_free(utf8); | |
1346 } | |
1347 | |
1348 /* free the message */ | |
8971 | 1349 g_string_free(newmsg, TRUE); |
1350 | |
1351 /* unref any images we allocated */ | |
1352 if (images) { | |
1353 GSList *tmp; | |
1354 int id; | |
1355 | |
1356 for (tmp = images; tmp != NULL; tmp = tmp->next) { | |
1357 id = GPOINTER_TO_INT(tmp->data); | |
1358 gaim_imgstore_unref(id); | |
1359 } | |
1360 | |
1361 g_slist_free(images); | |
1362 } | |
1363 | |
1364 return 1; | |
1365 } | |
1366 | |
1367 static int gaim_odc_typing(aim_session_t *sess, aim_frame_t *fr, ...) { | |
1368 va_list ap; | |
1369 char *sn; | |
1370 int typing; | |
1371 GaimConnection *gc = sess->aux_data; | |
1372 | |
1373 va_start(ap, fr); | |
1374 sn = va_arg(ap, char *); | |
1375 typing = va_arg(ap, int); | |
1376 va_end(ap); | |
1377 | |
1378 if (typing == 0x0002) { | |
1379 /* I had to leave this. It's just too funny. It reminds me of my sister. */ | |
1380 gaim_debug_info("oscar", | |
1381 "ohmigod! %s has started typing (DirectIM). He's going to send you a message! *squeal*\n", sn); | |
1382 serv_got_typing(gc, sn, 0, GAIM_TYPING); | |
1383 } else if (typing == 0x0001) | |
1384 serv_got_typing(gc, sn, 0, GAIM_TYPED); | |
1385 else | |
1386 serv_got_typing_stopped(gc, sn); | |
1387 return 1; | |
1388 } | |
1389 | |
1390 static int gaim_odc_send_im(aim_session_t *sess, aim_conn_t *conn, const char *message, GaimConvImFlags imflags) { | |
1391 char *buf; | |
1392 size_t len; | |
1393 int ret; | |
1394 GString *msg = g_string_new("<HTML><BODY>"); | |
1395 GString *data = g_string_new("</BODY></HTML><BINARY>"); | |
1396 GData *attribs; | |
1397 const char *start, *end, *last; | |
1398 int oscar_id = 0; | |
1399 | |
1400 last = message; | |
1401 | |
1402 /* for each valid IMG tag... */ | |
1403 while (last && *last && gaim_markup_find_tag("img", last, &start, &end, &attribs)) { | |
1404 GaimStoredImage *image = NULL; | |
1405 const char *id; | |
1406 | |
1407 if (start - last) { | |
1408 g_string_append_len(msg, last, start - last); | |
1409 } | |
1410 | |
1411 id = g_datalist_get_data(&attribs, "id"); | |
1412 | |
1413 /* ... if it refers to a valid gaim image ... */ | |
1414 if (id && (image = gaim_imgstore_get(atoi(id)))) { | |
1415 /* ... append the message from start to the tag ... */ | |
9126 | 1416 unsigned long size = gaim_imgstore_get_size(image); |
8971 | 1417 const char *filename = gaim_imgstore_get_filename(image); |
1418 gpointer imgdata = gaim_imgstore_get_data(image); | |
1419 | |
1420 oscar_id++; | |
1421 | |
1422 /* ... insert a new img tag with the oscar id ... */ | |
1423 if (filename) | |
1424 g_string_append_printf(msg, | |
9126 | 1425 "<IMG SRC=\"%s\" ID=\"%d\" DATASIZE=\"%lu\">", |
8971 | 1426 filename, oscar_id, size); |
1427 else | |
1428 g_string_append_printf(msg, | |
9126 | 1429 "<IMG ID=\"%d\" DATASIZE=\"%lu\">", |
8971 | 1430 oscar_id, size); |
1431 | |
1432 /* ... and append the data to the binary section ... */ | |
9126 | 1433 g_string_append_printf(data, "<DATA ID=\"%d\" SIZE=\"%lu\">", |
8971 | 1434 oscar_id, size); |
1435 data = g_string_append_len(data, imgdata, size); | |
1436 data = g_string_append(data, "</DATA>"); | |
1437 } | |
1438 /* If the tag is invalid, skip it, thus no else here */ | |
1439 | |
1440 g_datalist_clear(&attribs); | |
1441 | |
1442 /* continue from the end of the tag */ | |
1443 last = end + 1; | |
1444 } | |
1445 | |
1446 /* append any remaining message data (without the > :-) */ | |
1447 if (last && *last) | |
1448 msg = g_string_append(msg, last); | |
1449 | |
1450 /* if we inserted any images in the binary section, append it */ | |
1451 if (oscar_id) { | |
1452 msg = g_string_append_len(msg, data->str, data->len); | |
1453 msg = g_string_append(msg, "</BINARY>"); | |
1454 } | |
1455 | |
1456 len = msg->len; | |
1457 buf = msg->str; | |
1458 g_string_free(msg, FALSE); | |
1459 g_string_free(data, TRUE); | |
1460 | |
1461 | |
1462 /* XXX - The last parameter below is the encoding. Let Paco-Paco do something with it. */ | |
1463 if (imflags & GAIM_CONV_IM_AUTO_RESP) | |
1464 ret = aim_odc_send_im(sess, conn, buf, len, 0, 1); | |
1465 else | |
1466 ret = aim_odc_send_im(sess, conn, buf, len, 0, 0); | |
1467 | |
1468 g_free(buf); | |
1469 | |
1470 return ret; | |
1471 } | |
1472 | |
1473 struct ask_do_dir_im { | |
1474 char *who; | |
1475 GaimConnection *gc; | |
1476 }; | |
1477 | |
1478 static void oscar_cancel_direct_im(struct ask_do_dir_im *data) { | |
1479 g_free(data->who); | |
1480 g_free(data); | |
1481 } | |
1482 | |
8983 | 1483 /* this function is used to initiate a direct im session with someone. |
1484 * we start listening on a port and send a request. they either connect | |
1485 * or send some kind of reply. If they can't connect, they ask us to | |
1486 * connect to them, and so we do that. | |
1487 * | |
1488 * this function will also get called if the other side initiate's a direct | |
1489 * im and we try to connect and fail. in that case cookie will not be null. | |
1490 * | |
1491 * note that cookie is an 8 byte string that isn't NULL terminated | |
1492 */ | |
1493 static void oscar_direct_im_initiate(GaimConnection *gc, const char *who, const char *cookie) { | |
8971 | 1494 OscarData *od; |
1495 struct oscar_direct_im *dim; | |
1496 int listenfd; | |
8982 | 1497 const char *ip; |
8971 | 1498 |
1499 od = (OscarData *)gc->proto_data; | |
1500 | |
8983 | 1501 dim = oscar_direct_im_find(od, who); |
8971 | 1502 if (dim) { |
1503 if (!(dim->connected)) { /* We'll free the old, unconnected dim, and start over */ | |
1504 oscar_direct_im_disconnect(od, dim); | |
1505 gaim_debug_info("oscar", | |
1506 "Gave up on old direct IM, trying again\n"); | |
1507 } else { | |
1508 gaim_notify_error(gc, NULL, "DirectIM already open.", NULL); | |
8980 | 1509 return; |
8971 | 1510 } |
1511 } | |
1512 dim = g_new0(struct oscar_direct_im, 1); | |
1513 dim->gc = gc; | |
8983 | 1514 g_snprintf(dim->name, sizeof dim->name, "%s", who); |
8971 | 1515 |
1516 listenfd = gaim_network_listen_range(5190, 5199); | |
8982 | 1517 ip = gaim_network_get_my_ip(od->conn ? od->conn->fd : -1); |
9455 | 1518 if (listenfd >= 0) |
1519 dim->conn = aim_odc_initiate(od->sess, who, listenfd, gaim_network_ip_atoi(ip), gaim_network_get_port_from_fd(listenfd), cookie); | |
8971 | 1520 if (dim->conn != NULL) { |
8982 | 1521 char *tmp; |
1522 GaimConversation *conv; | |
1523 | |
8971 | 1524 od->direct_ims = g_slist_append(od->direct_ims, dim); |
1525 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, | |
1526 oscar_callback, dim->conn); | |
1527 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIM_ESTABLISHED, | |
1528 gaim_odc_initiate, 0); | |
8982 | 1529 |
8983 | 1530 conv = gaim_conversation_new(GAIM_CONV_IM, dim->gc->account, who); |
1531 tmp = g_strdup_printf(_("Asking %s to connect to us at %s:%hu for Direct IM."), who, ip, | |
8982 | 1532 gaim_network_get_port_from_fd(listenfd)); |
1533 gaim_conversation_write(conv, NULL, tmp, GAIM_MESSAGE_SYSTEM, time(NULL)); | |
1534 g_free(tmp); | |
8971 | 1535 } else { |
1536 gaim_notify_error(gc, NULL, _("Unable to open Direct IM"), NULL); | |
1537 oscar_direct_im_destroy(od, dim); | |
1538 } | |
8983 | 1539 } |
1540 | |
1541 static void oscar_direct_im(struct ask_do_dir_im *data) { | |
1542 GaimConnection *gc = data->gc; | |
1543 | |
1544 if (!g_list_find(gaim_connections_get_all(), gc)) { | |
1545 g_free(data->who); | |
1546 g_free(data); | |
1547 return; | |
1548 } | |
1549 | |
1550 oscar_direct_im_initiate(gc, data->who, NULL); | |
8971 | 1551 g_free(data->who); |
1552 g_free(data); | |
1553 } | |
1554 | |
1555 /* this is the right click menu cb thingy */ | |
9030 | 1556 static void oscar_ask_direct_im(GaimBlistNode *node, gpointer ignored) { |
1557 | |
1558 GaimBuddy *buddy; | |
1559 GaimConnection *gc; | |
8971 | 1560 gchar *buf; |
9030 | 1561 struct ask_do_dir_im *data; |
1562 | |
1563 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); | |
1564 | |
1565 buddy = (GaimBuddy *) node; | |
1566 gc = gaim_account_get_connection(buddy->account); | |
1567 | |
1568 data = g_new0(struct ask_do_dir_im, 1); | |
1569 data->who = g_strdup(buddy->name); | |
8971 | 1570 data->gc = gc; |
9030 | 1571 buf = g_strdup_printf(_("You have selected to open a Direct IM connection with %s."), |
1572 buddy->name); | |
8971 | 1573 |
1574 gaim_request_action(gc, NULL, buf, | |
9030 | 1575 _("Because this reveals your IP address, it " |
1576 "may be considered a privacy risk. Do you " | |
1577 "wish to continue?"), | |
1578 0, data, 2, | |
1579 _("Connect"), G_CALLBACK(oscar_direct_im), | |
1580 _("Cancel"), G_CALLBACK(oscar_cancel_direct_im)); | |
8971 | 1581 g_free(buf); |
1582 } | |
1583 | |
1584 /***************************************************************************** | |
1585 * End scary direct im stuff | |
1586 *****************************************************************************/ | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1587 |
4617 | 1588 static void oscar_callback(gpointer data, gint source, GaimInputCondition condition) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1589 aim_conn_t *conn = (aim_conn_t *)data; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1590 aim_session_t *sess = aim_conn_getsess(conn); |
5575 | 1591 GaimConnection *gc = sess ? sess->aux_data : NULL; |
7283 | 1592 OscarData *od; |
2086 | 1593 |
1594 if (!gc) { | |
8660 | 1595 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1596 "oscar callback for closed connection (1).\n"); |
2086 | 1597 return; |
1598 } | |
10458 | 1599 |
7283 | 1600 od = (OscarData *)gc->proto_data; |
2086 | 1601 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1602 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 1603 /* oh boy. this is probably bad. i guess the only thing we |
1604 * can really do is return? */ | |
8660 | 1605 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1606 "oscar callback for closed connection (2).\n"); |
8660 | 1607 gaim_debug_misc("oscar", "gc = %p\n", gc); |
2086 | 1608 return; |
1609 } | |
1610 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1611 if (condition & GAIM_INPUT_READ) { |
4617 | 1612 if (conn->type == AIM_CONN_TYPE_LISTENER) { |
8660 | 1613 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1614 "got information on rendezvous listener\n"); |
4617 | 1615 if (aim_handlerendconnect(od->sess, conn) < 0) { |
8660 | 1616 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1617 "connection error (rendezvous listener)\n"); |
4617 | 1618 aim_conn_kill(od->sess, &conn); |
8446 | 1619 /* AAA - Don't we need to gaim_xfer_cancel here? --marv */ |
2086 | 1620 } |
1621 } else { | |
4617 | 1622 if (aim_get_command(od->sess, conn) >= 0) { |
1623 aim_rxdispatch(od->sess); | |
6029 | 1624 if (od->killme) { |
8660 | 1625 gaim_debug_error("oscar", "Waiting to be destroyed\n"); |
6029 | 1626 return; |
1627 } | |
2086 | 1628 } else { |
1629 if ((conn->type == AIM_CONN_TYPE_BOS) || | |
10444 | 1630 !(aim_getconn_type(od->sess, AIM_CONN_TYPE_BOS))) |
1631 { | |
1632 gaim_debug_error("oscar", "Major connection error. i.e. " | |
1633 "invalid data was received on the oscar TCP stream\n"); | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1634 gaim_connection_error(gc, _("Disconnected.")); |
2086 | 1635 } else if (conn->type == AIM_CONN_TYPE_CHAT) { |
10458 | 1636 struct chat_connection *cc = find_oscar_chat_by_conn(gc, conn); |
1637 GaimConversation *conv = gaim_find_chat(gc, cc->id); | |
5420 | 1638 char *buf; |
10458 | 1639 |
1640 gaim_debug_info("oscar", "Lost connection " | |
1641 "to chat room %s\n", cc->name); | |
1642 | |
1643 buf = g_strdup_printf(_("You have lost your connection " | |
1644 "to chat room %s."), cc->name); | |
1645 if (conv != NULL) | |
9627 | 1646 gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_ERROR, time(NULL)); |
1647 else | |
1648 gaim_notify_error(gc, NULL, buf, NULL); | |
5420 | 1649 g_free(buf); |
10458 | 1650 |
1651 oscar_chat_kill(gc, cc); | |
1652 | |
2086 | 1653 } else if (conn->type == AIM_CONN_TYPE_CHATNAV) { |
4617 | 1654 if (od->cnpa > 0) |
1655 gaim_input_remove(od->cnpa); | |
1656 od->cnpa = 0; | |
8660 | 1657 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1658 "removing chatnav input watcher\n"); |
4617 | 1659 while (od->create_rooms) { |
1660 struct create_room *cr = od->create_rooms->data; | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
1661 g_free(cr->name); |
4617 | 1662 od->create_rooms = |
1663 g_slist_remove(od->create_rooms, cr); | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
1664 g_free(cr); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1665 gaim_notify_error(gc, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1666 _("Chat is currently unavailable"), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1667 NULL); |
2086 | 1668 } |
4617 | 1669 aim_conn_kill(od->sess, &conn); |
2086 | 1670 } else if (conn->type == AIM_CONN_TYPE_AUTH) { |
4617 | 1671 if (od->paspa > 0) |
1672 gaim_input_remove(od->paspa); | |
1673 od->paspa = 0; | |
8660 | 1674 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1675 "removing authconn input watcher\n"); |
4617 | 1676 aim_conn_kill(od->sess, &conn); |
3694 | 1677 } else if (conn->type == AIM_CONN_TYPE_EMAIL) { |
4617 | 1678 if (od->emlpa > 0) |
1679 gaim_input_remove(od->emlpa); | |
1680 od->emlpa = 0; | |
8660 | 1681 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1682 "removing email input watcher\n"); |
4617 | 1683 aim_conn_kill(od->sess, &conn); |
4804 | 1684 } else if (conn->type == AIM_CONN_TYPE_ICON) { |
1685 if (od->icopa > 0) | |
1686 gaim_input_remove(od->icopa); | |
1687 od->icopa = 0; | |
8660 | 1688 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1689 "removing icon input watcher\n"); |
4804 | 1690 aim_conn_kill(od->sess, &conn); |
2086 | 1691 } else if (conn->type == AIM_CONN_TYPE_RENDEZVOUS) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1692 if (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM) |
4617 | 1693 gaim_odc_disconnect(od->sess, conn); |
1694 aim_conn_kill(od->sess, &conn); | |
2086 | 1695 } else { |
8660 | 1696 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1697 "holy crap! generic connection error! %hu\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1698 conn->type); |
4617 | 1699 aim_conn_kill(od->sess, &conn); |
2086 | 1700 } |
1701 } | |
1702 } | |
1703 } | |
1704 } | |
1705 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1706 static void oscar_debug(aim_session_t *sess, int level, const char *format, va_list va) { |
5575 | 1707 GaimConnection *gc = sess->aux_data; |
7285 | 1708 gchar *s = g_strdup_vprintf(format, va); |
1709 gchar *buf; | |
1710 | |
1711 buf = g_strdup_printf("%s %d: %s", gaim_account_get_username(gaim_connection_get_account(gc)), level, s); | |
8660 | 1712 gaim_debug_info("oscar", buf); |
7285 | 1713 if (buf[strlen(buf)-1] != '\n') |
8660 | 1714 gaim_debug_info(NULL, "\n"); |
7285 | 1715 g_free(buf); |
2086 | 1716 g_free(s); |
1717 } | |
1718 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1719 static void oscar_login_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 1720 { |
5575 | 1721 GaimConnection *gc = data; |
7283 | 1722 OscarData *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1723 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1724 aim_conn_t *conn; |
2086 | 1725 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1726 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 1727 close(source); |
1728 return; | |
1729 } | |
1730 | |
4617 | 1731 od = gc->proto_data; |
1732 sess = od->sess; | |
2086 | 1733 conn = aim_getconn_type_all(sess, AIM_CONN_TYPE_AUTH); |
4366 | 1734 conn->fd = source; |
2086 | 1735 |
1736 if (source < 0) { | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1737 gaim_connection_error(gc, _("Couldn't connect to host")); |
2086 | 1738 return; |
1739 } | |
1740 | |
1741 aim_conn_completeconnect(sess, conn); | |
4617 | 1742 gc->inpa = gaim_input_add(conn->fd, GAIM_INPUT_READ, oscar_callback, conn); |
7282 | 1743 aim_request_login(sess, conn, gaim_account_get_username(gaim_connection_get_account(gc))); |
1744 | |
8660 | 1745 gaim_debug_info("oscar", |
7282 | 1746 "Screen name sent, waiting for response\n"); |
7283 | 1747 gaim_connection_update_progress(gc, _("Screen name sent"), 1, OSCAR_CONNECT_STEPS); |
8341 | 1748 ck[1] = 0x65; |
2086 | 1749 } |
1750 | |
10444 | 1751 static void |
1752 oscar_login(GaimAccount *account, GaimStatus *status) | |
1753 { | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1754 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1755 aim_conn_t *conn; |
5575 | 1756 GaimConnection *gc = gaim_account_get_connection(account); |
7283 | 1757 OscarData *od = gc->proto_data = g_new0(OscarData, 1); |
10400 | 1758 GaimStatusType *status_type; |
1759 GaimStatusPrimitive primitive; | |
1760 | |
1761 status_type = gaim_status_get_type(status); | |
1762 primitive = gaim_status_type_get_primitive(status_type); | |
2086 | 1763 |
8660 | 1764 gaim_debug_misc("oscar", "oscar_login: gc = %p\n", gc); |
10444 | 1765 |
10400 | 1766 if (primitive == GAIM_STATUS_OFFLINE) |
1767 return; | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
1768 |
8437 | 1769 if (!aim_snvalid(gaim_account_get_username(account))) { |
1770 gchar *buf; | |
8590 | 1771 buf = g_strdup_printf(_("Unable to login: Could not sign on as %s because the screen name is invalid. Screen names must either start with a letter and contain only letters, numbers and spaces, or contain only numbers."), gaim_account_get_username(account)); |
8437 | 1772 gaim_connection_error(gc, buf); |
1773 g_free(buf); | |
1774 } | |
1775 | |
9975 | 1776 if (aim_sn_is_icq((gaim_account_get_username(account)))) { |
4617 | 1777 od->icq = TRUE; |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
1778 } else { |
6622 | 1779 gc->flags |= GAIM_CONNECTION_HTML; |
1780 gc->flags |= GAIM_CONNECTION_AUTO_RESP; | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
1781 } |
5836 | 1782 od->buddyinfo = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, oscar_free_buddyinfo); |
2086 | 1783 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1784 sess = g_new0(aim_session_t, 1); |
10329 | 1785 aim_session_init(sess, TRUE, FAIM_DEBUG_LEVEL); |
2086 | 1786 aim_setdebuggingcb(sess, oscar_debug); |
7282 | 1787 /* |
1788 * We need an immediate queue because we don't use a while-loop | |
1789 * to see if things need to be sent. | |
1790 */ | |
2086 | 1791 aim_tx_setenqueue(sess, AIM_TX_IMMEDIATE, NULL); |
4617 | 1792 od->sess = sess; |
2086 | 1793 sess->aux_data = gc; |
1794 | |
9935 | 1795 /* Connect to core Gaim signals */ |
10087 | 1796 gaim_prefs_connect_callback(gc, "/plugins/prpl/oscar/recent_buddies", recent_buddies_cb, gc); |
9935 | 1797 |
2086 | 1798 conn = aim_newconn(sess, AIM_CONN_TYPE_AUTH, NULL); |
1799 if (conn == NULL) { | |
10444 | 1800 gaim_debug_error("oscar", "internal connection error\n"); |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1801 gaim_connection_error(gc, _("Unable to login to AIM")); |
2086 | 1802 return; |
1803 } | |
1804 | |
4649 | 1805 aim_conn_addhandler(sess, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
10464 | 1806 aim_conn_addhandler(sess, conn, 0x0017, 0x0003, gaim_parse_auth_resp, 0); |
2086 | 1807 aim_conn_addhandler(sess, conn, 0x0017, 0x0007, gaim_parse_login, 0); |
10464 | 1808 aim_conn_addhandler(sess, conn, AIM_CB_FAM_ATH, AIM_CB_ATH_SECURID_REQUEST, gaim_parse_auth_securid_request, 0); |
2086 | 1809 |
1810 conn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1811 if (gaim_proxy_connect(account, gaim_account_get_string(account, "server", FAIM_LOGIN_SERVER), |
5575 | 1812 gaim_account_get_int(account, "port", FAIM_LOGIN_PORT), |
1813 oscar_login_connect, gc) < 0) { | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1814 gaim_connection_error(gc, _("Couldn't connect to host")); |
2086 | 1815 return; |
1816 } | |
7282 | 1817 |
7283 | 1818 gaim_connection_update_progress(gc, _("Connecting"), 0, OSCAR_CONNECT_STEPS); |
8341 | 1819 ck[0] = 0x5a; |
5575 | 1820 } |
1821 | |
1822 static void oscar_close(GaimConnection *gc) { | |
7283 | 1823 OscarData *od = (OscarData *)gc->proto_data; |
4617 | 1824 |
1825 while (od->oscar_chats) { | |
1826 struct chat_connection *n = od->oscar_chats->data; | |
2086 | 1827 if (n->inpa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1828 gaim_input_remove(n->inpa); |
2086 | 1829 g_free(n->name); |
1830 g_free(n->show); | |
4617 | 1831 od->oscar_chats = g_slist_remove(od->oscar_chats, n); |
2086 | 1832 g_free(n); |
1833 } | |
4617 | 1834 while (od->direct_ims) { |
8971 | 1835 struct oscar_direct_im *n = od->direct_ims->data; |
1836 oscar_direct_im_destroy(od, n); | |
2086 | 1837 } |
4617 | 1838 /* BBB */ |
1839 while (od->file_transfers) { | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
1840 GaimXfer *xfer; |
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
1841 xfer = (GaimXfer *)od->file_transfers->data; |
7805 | 1842 gaim_xfer_cancel_local(xfer); |
3630 | 1843 } |
4804 | 1844 while (od->requesticon) { |
1845 char *sn = od->requesticon->data; | |
1846 od->requesticon = g_slist_remove(od->requesticon, sn); | |
1847 free(sn); | |
1848 } | |
4738 | 1849 g_hash_table_destroy(od->buddyinfo); |
4617 | 1850 while (od->create_rooms) { |
1851 struct create_room *cr = od->create_rooms->data; | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
1852 g_free(cr->name); |
4617 | 1853 od->create_rooms = g_slist_remove(od->create_rooms, cr); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
1854 g_free(cr); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
1855 } |
4617 | 1856 if (od->email) |
1857 g_free(od->email); | |
1858 if (od->newp) | |
1859 g_free(od->newp); | |
1860 if (od->oldp) | |
1861 g_free(od->oldp); | |
2086 | 1862 if (gc->inpa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1863 gaim_input_remove(gc->inpa); |
4617 | 1864 if (od->cnpa > 0) |
1865 gaim_input_remove(od->cnpa); | |
1866 if (od->paspa > 0) | |
1867 gaim_input_remove(od->paspa); | |
1868 if (od->emlpa > 0) | |
1869 gaim_input_remove(od->emlpa); | |
4804 | 1870 if (od->icopa > 0) |
1871 gaim_input_remove(od->icopa); | |
6907 | 1872 if (od->icontimer > 0) |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
1873 gaim_timeout_remove(od->icontimer); |
8341 | 1874 if (od->getblisttimer > 0) |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
1875 gaim_timeout_remove(od->getblisttimer); |
8341 | 1876 if (od->getinfotimer > 0) |
1877 gaim_timeout_remove(od->getinfotimer); | |
10087 | 1878 gaim_prefs_disconnect_by_handle(gc); |
9971 | 1879 |
4617 | 1880 aim_session_kill(od->sess); |
1881 g_free(od->sess); | |
1882 od->sess = NULL; | |
2086 | 1883 g_free(gc->proto_data); |
1884 gc->proto_data = NULL; | |
8660 | 1885 gaim_debug_info("oscar", "Signed off.\n"); |
2086 | 1886 } |
1887 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1888 static void oscar_bos_connect(gpointer data, gint source, GaimInputCondition cond) { |
5575 | 1889 GaimConnection *gc = data; |
7283 | 1890 OscarData *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1891 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1892 aim_conn_t *bosconn; |
2086 | 1893 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1894 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 1895 close(source); |
1896 return; | |
1897 } | |
1898 | |
4617 | 1899 od = gc->proto_data; |
1900 sess = od->sess; | |
1901 bosconn = od->conn; | |
4366 | 1902 bosconn->fd = source; |
2086 | 1903 |
1904 if (source < 0) { | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1905 gaim_connection_error(gc, _("Could Not Connect")); |
2086 | 1906 return; |
1907 } | |
1908 | |
1909 aim_conn_completeconnect(sess, bosconn); | |
4617 | 1910 gc->inpa = gaim_input_add(bosconn->fd, GAIM_INPUT_READ, oscar_callback, bosconn); |
7283 | 1911 |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1912 gaim_connection_update_progress(gc, |
7283 | 1913 _("Connection established, cookie sent"), 4, OSCAR_CONNECT_STEPS); |
8341 | 1914 ck[4] = 0x61; |
2086 | 1915 } |
1916 | |
4617 | 1917 /* BBB */ |
4656 | 1918 /* |
1919 * This little area in oscar.c is the nexus of file transfer code, | |
1920 * so I wrote a little explanation of what happens. I am such a | |
1921 * ninja. | |
1922 * | |
1923 * The series of events for a file send is: | |
1924 * -Create xfer and call gaim_xfer_request (this happens in oscar_ask_sendfile) | |
8735
92cbf9713795
[gaim-migrate @ 9490]
Christian Hammond <chipx86@chipx86.com>
parents:
8733
diff
changeset
|
1925 * -User chooses a file and oscar_xfer_init is called. It establishes a |
4656 | 1926 * listening socket, then asks the remote user to connect to us (and |
1927 * gives them the file name, port, IP, etc.) | |
1928 * -They connect to us and we send them an AIM_CB_OFT_PROMPT (this happens | |
1929 * in oscar_sendfile_estblsh) | |
1930 * -They send us an AIM_CB_OFT_ACK and then we start sending data | |
1931 * -When we finish, they send us an AIM_CB_OFT_DONE and they close the | |
1932 * connection. | |
1933 * -We get drunk because file transfer kicks ass. | |
1934 * | |
1935 * The series of events for a file receive is: | |
1936 * -Create xfer and call gaim_xfer request (this happens in incomingim_chan2) | |
1937 * -Gaim user selects file to name and location to save file to and | |
1938 * oscar_xfer_init is called | |
1939 * -It connects to the remote user using the IP they gave us earlier | |
1940 * -After connecting, they send us an AIM_CB_OFT_PROMPT. In reply, we send | |
1941 * them an AIM_CB_OFT_ACK. | |
1942 * -They begin to send us lots of raw data. | |
1943 * -When they finish sending data we send an AIM_CB_OFT_DONE and then close | |
8735
92cbf9713795
[gaim-migrate @ 9490]
Christian Hammond <chipx86@chipx86.com>
parents:
8733
diff
changeset
|
1944 * the connection. |
4656 | 1945 */ |
1946 static void oscar_sendfile_connected(gpointer data, gint source, GaimInputCondition condition); | |
1947 | |
8446 | 1948 /* |
1949 * Miscellaneous xfer functions | |
1950 */ | |
1951 static GaimXfer *oscar_find_xfer_by_cookie(GSList *fts, const fu8_t *ck) | |
4656 | 1952 { |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
1953 GaimXfer *xfer; |
5146 | 1954 struct aim_oft_info *oft_info; |
4656 | 1955 |
1956 while (fts) { | |
1957 xfer = fts->data; | |
5146 | 1958 oft_info = xfer->data; |
1959 | |
8446 | 1960 if (oft_info && !memcmp(ck, oft_info->cookie, 8)) |
4656 | 1961 return xfer; |
1962 | |
1963 fts = g_slist_next(fts); | |
1964 } | |
1965 | |
1966 return NULL; | |
1967 } | |
1968 | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
1969 static GaimXfer *oscar_find_xfer_by_conn(GSList *fts, aim_conn_t *conn) |
4656 | 1970 { |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
1971 GaimXfer *xfer; |
5146 | 1972 struct aim_oft_info *oft_info; |
4656 | 1973 |
1974 while (fts) { | |
1975 xfer = fts->data; | |
5146 | 1976 oft_info = xfer->data; |
1977 | |
1978 if (oft_info && (conn == oft_info->conn)) | |
4656 | 1979 return xfer; |
1980 | |
1981 fts = g_slist_next(fts); | |
1982 } | |
1983 | |
1984 return NULL; | |
1985 } | |
1986 | |
8446 | 1987 static void oscar_xfer_end(GaimXfer *xfer) |
1988 { | |
1989 struct aim_oft_info *oft_info = xfer->data; | |
1990 GaimConnection *gc = oft_info->sess->aux_data; | |
1991 OscarData *od = gc->proto_data; | |
1992 | |
8660 | 1993 gaim_debug_info("oscar", "AAA - in oscar_xfer_end\n"); |
8446 | 1994 |
1995 if (gaim_xfer_get_type(xfer) == GAIM_XFER_RECEIVE) { | |
1996 oft_info->fh.nrecvd = gaim_xfer_get_bytes_sent(xfer); | |
1997 aim_oft_sendheader(oft_info->sess, AIM_CB_OFT_DONE, oft_info); | |
1998 } | |
1999 | |
2000 aim_conn_kill(oft_info->sess, &oft_info->conn); | |
2001 aim_oft_destroyinfo(oft_info); | |
2002 xfer->data = NULL; | |
2003 od->file_transfers = g_slist_remove(od->file_transfers, xfer); | |
2004 } | |
2005 | |
2006 /* | |
2007 * xfer functions used when receiving files | |
2008 */ | |
2009 | |
2010 static void oscar_xfer_init_recv(GaimXfer *xfer) | |
2011 { | |
2012 struct aim_oft_info *oft_info = xfer->data; | |
2013 GaimConnection *gc = oft_info->sess->aux_data; | |
2014 OscarData *od = gc->proto_data; | |
2015 | |
8660 | 2016 gaim_debug_info("oscar", "AAA - in oscar_xfer_recv_init\n"); |
8446 | 2017 |
2018 oft_info->conn = aim_newconn(od->sess, AIM_CONN_TYPE_RENDEZVOUS, NULL); | |
2019 if (oft_info->conn) { | |
2020 oft_info->conn->subtype = AIM_CONN_SUBTYPE_OFT_SENDFILE; | |
2021 aim_conn_addhandler(od->sess, oft_info->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_PROMPT, oscar_sendfile_prompt, 0); | |
2022 oft_info->conn->fd = xfer->fd = gaim_proxy_connect(gaim_connection_get_account(gc), | |
2023 xfer->remote_ip, xfer->remote_port, oscar_sendfile_connected, xfer); | |
2024 if (xfer->fd == -1) { | |
10654 | 2025 gaim_xfer_error(GAIM_XFER_RECEIVE, gaim_xfer_get_account(xfer), xfer->who, |
8446 | 2026 _("Unable to establish file descriptor.")); |
2027 gaim_xfer_cancel_local(xfer); | |
2028 } | |
2029 } else { | |
10654 | 2030 gaim_xfer_error(GAIM_XFER_RECEIVE, gaim_xfer_get_account(xfer), xfer->who, |
8446 | 2031 _("Unable to create new connection.")); |
2032 gaim_xfer_cancel_local(xfer); | |
2033 /* Try a different port? Ask them to connect to us? /join #gaim and whine? */ | |
2034 } | |
2035 | |
2036 } | |
2037 | |
2038 static void oscar_xfer_cancel_recv(GaimXfer *xfer) | |
2039 { | |
10405 | 2040 struct aim_oft_info *oft_info; |
2041 GaimConnection *gc; | |
2042 OscarData *od; | |
2043 | |
2044 g_return_if_fail(xfer != NULL); | |
2045 g_return_if_fail(xfer->data != NULL); | |
2046 | |
2047 oft_info = xfer->data; | |
2048 gc = oft_info->sess->aux_data; | |
2049 od = gc->proto_data; | |
8446 | 2050 |
8660 | 2051 gaim_debug_info("oscar", "AAA - in oscar_xfer_cancel_recv\n"); |
8446 | 2052 |
9771 | 2053 if (gaim_xfer_get_status(xfer) != GAIM_XFER_STATUS_CANCEL_REMOTE) |
2054 aim_im_sendch2_sendfile_cancel(oft_info->sess, oft_info); | |
8446 | 2055 |
2056 aim_conn_kill(oft_info->sess, &oft_info->conn); | |
2057 aim_oft_destroyinfo(oft_info); | |
2058 xfer->data = NULL; | |
2059 od->file_transfers = g_slist_remove(od->file_transfers, xfer); | |
2060 } | |
2061 | |
2062 static void oscar_xfer_ack_recv(GaimXfer *xfer, const char *buffer, size_t size) | |
2063 { | |
2064 struct aim_oft_info *oft_info = xfer->data; | |
2065 | |
2066 /* Update our rolling checksum. Like Walmart, yo. */ | |
2067 oft_info->fh.recvcsum = aim_oft_checksum_chunk(buffer, size, oft_info->fh.recvcsum); | |
2068 } | |
2069 | |
2070 /* | |
2071 * xfer functions used when sending files | |
2072 */ | |
2073 | |
2074 static void oscar_xfer_init_send(GaimXfer *xfer) | |
2075 { | |
2076 struct aim_oft_info *oft_info = xfer->data; | |
2077 GaimConnection *gc = oft_info->sess->aux_data; | |
2078 OscarData *od = gc->proto_data; | |
2079 int listenfd; | |
2080 | |
8660 | 2081 gaim_debug_info("oscar", "AAA - in oscar_xfer_send_init\n"); |
8446 | 2082 |
2083 xfer->filename = g_path_get_basename(xfer->local_filename); | |
2084 strncpy(oft_info->fh.name, xfer->filename, 64); | |
2085 oft_info->fh.name[63] = '\0'; | |
2086 oft_info->fh.totsize = gaim_xfer_get_size(xfer); | |
2087 oft_info->fh.size = gaim_xfer_get_size(xfer); | |
2088 oft_info->fh.checksum = aim_oft_checksum_file(xfer->local_filename); | |
2089 | |
2090 /* Create a listening socket and an associated libfaim conn */ | |
2091 if ((listenfd = gaim_network_listen_range(5190, 5199)) < 0) { | |
2092 gaim_xfer_cancel_local(xfer); | |
2093 return; | |
2094 } | |
2095 xfer->local_port = gaim_network_get_port_from_fd(listenfd); | |
2096 oft_info->port = xfer->local_port; | |
2097 if (aim_sendfile_listen(od->sess, oft_info, listenfd) != 0) { | |
2098 gaim_xfer_cancel_local(xfer); | |
2099 return; | |
2100 } | |
8660 | 2101 gaim_debug_misc("oscar", |
8446 | 2102 "port is %hu, ip is %s\n", |
2103 xfer->local_port, oft_info->clientip); | |
2104 if (oft_info->conn) { | |
2105 xfer->watcher = gaim_input_add(oft_info->conn->fd, GAIM_INPUT_READ, oscar_callback, oft_info->conn); | |
2106 aim_im_sendch2_sendfile_ask(od->sess, oft_info); | |
2107 aim_conn_addhandler(od->sess, oft_info->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_ESTABLISHED, oscar_sendfile_estblsh, 0); | |
2108 } else { | |
10654 | 2109 gaim_xfer_error(GAIM_XFER_SEND, gaim_xfer_get_account(xfer), xfer->who, |
8446 | 2110 _("Unable to establish listener socket.")); |
2111 gaim_xfer_cancel_local(xfer); | |
2112 } | |
2113 } | |
2114 | |
2115 static void oscar_xfer_cancel_send(GaimXfer *xfer) | |
2116 { | |
2117 struct aim_oft_info *oft_info = xfer->data; | |
2118 GaimConnection *gc = oft_info->sess->aux_data; | |
2119 OscarData *od = gc->proto_data; | |
2120 | |
8660 | 2121 gaim_debug_info("oscar", "AAA - in oscar_xfer_cancel_send\n"); |
8446 | 2122 |
9771 | 2123 if (gaim_xfer_get_status(xfer) != GAIM_XFER_STATUS_CANCEL_REMOTE) |
2124 aim_im_sendch2_sendfile_cancel(oft_info->sess, oft_info); | |
8446 | 2125 |
2126 aim_conn_kill(oft_info->sess, &oft_info->conn); | |
2127 aim_oft_destroyinfo(oft_info); | |
2128 xfer->data = NULL; | |
2129 od->file_transfers = g_slist_remove(od->file_transfers, xfer); | |
2130 } | |
2131 | |
2132 static void oscar_xfer_ack_send(GaimXfer *xfer, const char *buffer, size_t size) | |
2133 { | |
2134 struct aim_oft_info *oft_info = xfer->data; | |
2135 | |
2136 /* I'm not sure I like how we do this. --marv | |
2137 * I do. AIM file transfers aren't really meant to be thought | |
2138 * of as a transferring just a single file. The rendezvous | |
2139 * establishes a connection between two computers, and then | |
2140 * those computers can use the same connection for transferring | |
2141 * multiple files. So we don't want the Gaim core up and closing | |
2142 * the socket all willy-nilly. We want to do that in the oscar | |
2143 * prpl, whenever one side or the other says they're finished | |
2144 * using the connection. There might be a better way to intercept | |
2145 * the socket from the core, however... --KingAnt | |
2146 */ | |
2147 | |
2148 /* | |
2149 * If we're done sending, intercept the socket from the core ft code | |
2150 * and wait for the other guy to send the "done" OFT packet. | |
2151 */ | |
2152 if (gaim_xfer_get_bytes_remaining(xfer) <= 0) { | |
2153 gaim_input_remove(xfer->watcher); | |
2154 xfer->watcher = gaim_input_add(xfer->fd, GAIM_INPUT_READ, oscar_callback, oft_info->conn); | |
2155 xfer->fd = 0; | |
2156 gaim_xfer_set_completed(xfer, TRUE); | |
2157 } | |
2158 } | |
2159 | |
9466 | 2160 static gboolean oscar_can_receive_file(GaimConnection *gc, const char *who) { |
2161 gboolean can_receive = FALSE; | |
2162 OscarData *od = gc->proto_data; | |
2163 | |
10517
461334f300d7
[gaim-migrate @ 11821]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10504
diff
changeset
|
2164 if (od != NULL && !od->icq) { |
9466 | 2165 aim_userinfo_t *userinfo; |
2166 userinfo = aim_locate_finduserinfo(od->sess, who); | |
2167 if (userinfo && userinfo->capabilities & AIM_CAPS_SENDFILE) | |
2168 can_receive = TRUE; | |
2169 } | |
2170 | |
2171 return can_receive; | |
2172 } | |
2173 | |
2174 static void oscar_send_file(GaimConnection *gc, const char *who, const char *file) { | |
9030 | 2175 |
2176 OscarData *od; | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2177 GaimXfer *xfer; |
5146 | 2178 struct aim_oft_info *oft_info; |
8231
f50c059b6384
[gaim-migrate @ 8954]
Christian Hammond <chipx86@chipx86.com>
parents:
8227
diff
changeset
|
2179 const char *ip; |
3752 | 2180 |
9030 | 2181 od = (OscarData *)gc->proto_data; |
2182 | |
4617 | 2183 /* You want to send a file to someone else, you're so generous */ |
2184 | |
2185 /* Build the file transfer handle */ | |
9466 | 2186 xfer = gaim_xfer_new(gc->account, GAIM_XFER_SEND, who); |
4617 | 2187 |
5146 | 2188 /* Create the oscar-specific data */ |
8838 | 2189 ip = gaim_network_get_my_ip(od->conn ? od->conn->fd : -1); |
9466 | 2190 oft_info = aim_oft_createinfo(od->sess, NULL, who, ip, 0, 0, 0, NULL); |
5146 | 2191 xfer->data = oft_info; |
2192 | |
4617 | 2193 /* Setup our I/O op functions */ |
8446 | 2194 gaim_xfer_set_init_fnc(xfer, oscar_xfer_init_send); |
4617 | 2195 gaim_xfer_set_end_fnc(xfer, oscar_xfer_end); |
4675
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
2196 gaim_xfer_set_cancel_send_fnc(xfer, oscar_xfer_cancel_send); |
8446 | 2197 gaim_xfer_set_request_denied_fnc(xfer, oscar_xfer_cancel_send); |
2198 gaim_xfer_set_ack_fnc(xfer, oscar_xfer_ack_send); | |
4617 | 2199 |
2200 /* Keep track of this transfer for later */ | |
2201 od->file_transfers = g_slist_append(od->file_transfers, xfer); | |
2202 | |
2203 /* Now perform the request */ | |
9466 | 2204 if (file) |
2205 gaim_xfer_request_accepted(xfer, file); | |
2206 else | |
2207 gaim_xfer_request(xfer); | |
3630 | 2208 } |
2209 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2210 static int gaim_parse_auth_resp(aim_session_t *sess, aim_frame_t *fr, ...) { |
6029 | 2211 GaimConnection *gc = sess->aux_data; |
7283 | 2212 OscarData *od = gc->proto_data; |
6029 | 2213 GaimAccount *account = gc->account; |
2214 aim_conn_t *bosconn; | |
2215 char *host; int port; | |
2216 int i, rc; | |
2086 | 2217 va_list ap; |
2704 | 2218 struct aim_authresp_info *info; |
6029 | 2219 |
5575 | 2220 port = gaim_account_get_int(account, "port", FAIM_LOGIN_PORT); |
2086 | 2221 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2222 va_start(ap, fr); |
2704 | 2223 info = va_arg(ap, struct aim_authresp_info *); |
2086 | 2224 va_end(ap); |
2225 | |
8660 | 2226 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2227 "inside auth_resp (Screen name: %s)\n", info->sn); |
2704 | 2228 |
4293 | 2229 if (info->errorcode || !info->bosip || !info->cookielen || !info->cookie) { |
4056 | 2230 char buf[256]; |
2704 | 2231 switch (info->errorcode) { |
2086 | 2232 case 0x05: |
2233 /* Incorrect nick/password */ | |
6498 | 2234 gc->wants_to_die = TRUE; |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
2235 gaim_connection_error(gc, _("Incorrect nickname or password.")); |
2086 | 2236 break; |
2237 case 0x11: | |
2238 /* Suspended account */ | |
6498 | 2239 gc->wants_to_die = TRUE; |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
2240 gaim_connection_error(gc, _("Your account is currently suspended.")); |
2086 | 2241 break; |
3498 | 2242 case 0x14: |
2243 /* service temporarily unavailable */ | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
2244 gaim_connection_error(gc, _("The AOL Instant Messenger service is temporarily unavailable.")); |
3498 | 2245 break; |
2086 | 2246 case 0x18: |
2247 /* connecting too frequently */ | |
6498 | 2248 gc->wants_to_die = TRUE; |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
2249 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 | 2250 break; |
2251 case 0x1c: | |
2252 /* client too old */ | |
6498 | 2253 gc->wants_to_die = TRUE; |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6350
diff
changeset
|
2254 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
|
2255 gaim_connection_error(gc, buf); |
2086 | 2256 break; |
2257 default: | |
6623 | 2258 gaim_connection_error(gc, _("Authentication failed")); |
2086 | 2259 break; |
2260 } | |
8660 | 2261 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2262 "Login Error Code 0x%04hx\n", info->errorcode); |
8660 | 2263 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2264 "Error URL: %s\n", info->errorurl); |
2086 | 2265 od->killme = TRUE; |
2266 return 1; | |
2267 } | |
2268 | |
2269 | |
9992 | 2270 gaim_debug_misc("oscar", "Reg status: %hu\n", info->regstatus); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2271 |
2704 | 2272 if (info->email) { |
8660 | 2273 gaim_debug_misc("oscar", "Email: %s\n", info->email); |
2086 | 2274 } else { |
8660 | 2275 gaim_debug_misc("oscar", "Email is NULL\n"); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2276 } |
10042 | 2277 |
8660 | 2278 gaim_debug_misc("oscar", "BOSIP: %s\n", info->bosip); |
2279 gaim_debug_info("oscar", | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2280 "Closing auth connection...\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2281 aim_conn_kill(sess, &fr->conn); |
2086 | 2282 |
2283 bosconn = aim_newconn(sess, AIM_CONN_TYPE_BOS, NULL); | |
2284 if (bosconn == NULL) { | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
2285 gaim_connection_error(gc, _("Internal Error")); |
2086 | 2286 od->killme = TRUE; |
2287 return 0; | |
2288 } | |
2289 | |
4649 | 2290 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 2291 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_bos, 0); |
2086 | 2292 aim_conn_addhandler(sess, bosconn, 0x0009, 0x0003, gaim_bosrights, 0); |
2293 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ACK, AIM_CB_ACK_ACK, NULL, 0); | |
2294 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_REDIRECT, gaim_handle_redirect, 0); | |
2993 | 2295 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_RIGHTSINFO, gaim_parse_locaterights, 0); |
2086 | 2296 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_RIGHTSINFO, gaim_parse_buddyrights, 0); |
2297 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_ONCOMING, gaim_parse_oncoming, 0); | |
2298 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_OFFGOING, gaim_parse_offgoing, 0); | |
2299 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_INCOMING, gaim_parse_incoming_im, 0); | |
2300 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_ERROR, gaim_parse_locerr, 0); | |
2301 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_MISSEDCALL, gaim_parse_misses, 0); | |
3212 | 2302 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_CLIENTAUTORESP, gaim_parse_clientauto, 0); |
2086 | 2303 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_RATECHANGE, gaim_parse_ratechange, 0); |
2304 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_EVIL, gaim_parse_evilnotify, 0); | |
2305 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOK, AIM_CB_LOK_ERROR, gaim_parse_searcherror, 0); | |
2306 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOK, 0x0003, gaim_parse_searchreply, 0); | |
2307 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ERROR, gaim_parse_msgerr, 0); | |
3595 | 2308 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_MTN, gaim_parse_mtn, 0); |
7011 | 2309 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_USERINFO, gaim_parse_userinfo, 0); |
8341 | 2310 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_REQUESTINFOTIMEOUT, gaim_reqinfo_timeout, 0); |
2086 | 2311 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ACK, gaim_parse_msgack, 0); |
2312 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
|
2313 aim_conn_addhandler(sess, bosconn, 0x0004, 0x0005, gaim_icbm_param_info, 0); |
2086 | 2314 aim_conn_addhandler(sess, bosconn, 0x0001, 0x0001, gaim_parse_genericerr, 0); |
2315 aim_conn_addhandler(sess, bosconn, 0x0003, 0x0001, gaim_parse_genericerr, 0); | |
2316 aim_conn_addhandler(sess, bosconn, 0x0009, 0x0001, gaim_parse_genericerr, 0); | |
2317 aim_conn_addhandler(sess, bosconn, 0x0001, 0x001f, gaim_memrequest, 0); | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2318 aim_conn_addhandler(sess, bosconn, 0x0001, 0x000f, gaim_selfinfo, 0); |
5844 | 2319 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
|
2320 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
|
2321 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
|
2322 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_POP, 0x0002, gaim_popup, 0); |
4759 | 2323 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_ALIAS, gaim_icqalias, 0); |
4624 | 2324 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_INFO, gaim_icqinfo, 0); |
4230 | 2325 #ifndef NOSSI |
4642 | 2326 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_ERROR, gaim_ssi_parseerr, 0); |
2991 | 2327 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RIGHTSINFO, gaim_ssi_parserights, 0); |
2328 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_LIST, gaim_ssi_parselist, 0); | |
2329 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_NOLIST, gaim_ssi_parselist, 0); | |
4230 | 2330 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_SRVACK, gaim_ssi_parseack, 0); |
8227 | 2331 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_ADD, gaim_ssi_parseadd, 0); |
4230 | 2332 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RECVAUTH, gaim_ssi_authgiven, 0); |
2333 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RECVAUTHREQ, gaim_ssi_authrequest, 0); | |
2334 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RECVAUTHREP, gaim_ssi_authreply, 0); | |
2335 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_ADDED, gaim_ssi_gotadded, 0); | |
2336 #endif | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
2337 |
7283 | 2338 od->conn = bosconn; |
2704 | 2339 for (i = 0; i < (int)strlen(info->bosip); i++) { |
2340 if (info->bosip[i] == ':') { | |
2341 port = atoi(&(info->bosip[i+1])); | |
2086 | 2342 break; |
2343 } | |
2344 } | |
2704 | 2345 host = g_strndup(info->bosip, i); |
2086 | 2346 bosconn->status |= AIM_CONN_STATUS_INPROGRESS; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2347 rc = gaim_proxy_connect(gc->account, host, port, oscar_bos_connect, gc); |
2086 | 2348 g_free(host); |
4366 | 2349 if (rc < 0) { |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
2350 gaim_connection_error(gc, _("Could Not Connect")); |
2086 | 2351 od->killme = TRUE; |
2352 return 0; | |
2353 } | |
4293 | 2354 aim_sendcookie(sess, bosconn, info->cookielen, info->cookie); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
2355 gaim_input_remove(gc->inpa); |
2704 | 2356 |
7283 | 2357 gaim_connection_update_progress(gc, _("Received authorization"), 3, OSCAR_CONNECT_STEPS); |
8341 | 2358 ck[3] = 0x64; |
7282 | 2359 |
2086 | 2360 return 1; |
2361 } | |
2362 | |
10464 | 2363 static void |
2364 gaim_parse_auth_securid_request_yes_cb(gpointer user_data, const char *msg) | |
2365 { | |
2366 GaimConnection *gc = user_data; | |
2367 OscarData *od = gc->proto_data; | |
2368 aim_session_t *sess = od->sess; | |
2369 | |
2370 aim_auth_securid_send(sess, msg); | |
2371 } | |
2372 | |
2373 static void | |
2374 gaim_parse_auth_securid_request_no_cb(gpointer user_data, const char *value) | |
2375 { | |
2376 GaimConnection *gc = user_data; | |
2377 OscarData *od = gc->proto_data; | |
2378 | |
2379 /* Disconnect */ | |
2380 gc->wants_to_die = TRUE; | |
2381 gaim_connection_error(gc, _("The SecurID key entered is invalid.")); | |
2382 od->killme = TRUE; | |
2383 } | |
2384 | |
2385 static int | |
2386 gaim_parse_auth_securid_request(aim_session_t *sess, aim_frame_t *fr, ...) | |
2387 { | |
2388 GaimConnection *gc = sess->aux_data; | |
2389 GaimAccount *account = gaim_connection_get_account(gc); | |
2390 gchar *primary; | |
2391 | |
2392 gaim_debug_info("oscar", "Got SecurID request\n"); | |
2393 | |
2394 primary = g_strdup_printf("Enter the SecurID key for %s.", gaim_account_get_username(account)); | |
2395 gaim_request_input(gc, NULL, _("Enter SecurID"), primary, | |
2396 _("Enter the 6 digit number from the digital display."), | |
2397 FALSE, FALSE, NULL, | |
2398 _("OK"), G_CALLBACK(gaim_parse_auth_securid_request_yes_cb), | |
2399 _("Cancel"), G_CALLBACK(gaim_parse_auth_securid_request_no_cb), | |
2400 gc); | |
2401 g_free(primary); | |
2402 | |
2403 return 1; | |
2404 } | |
2405 | |
7285 | 2406 /* XXX - Should use gaim_url_fetch for the below stuff */ |
2086 | 2407 struct pieceofcrap { |
5575 | 2408 GaimConnection *gc; |
2086 | 2409 unsigned long offset; |
2410 unsigned long len; | |
2411 char *modname; | |
2412 int fd; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2413 aim_conn_t *conn; |
2086 | 2414 unsigned int inpa; |
2415 }; | |
2416 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
2417 static void damn_you(gpointer data, gint source, GaimInputCondition c) |
2086 | 2418 { |
2419 struct pieceofcrap *pos = data; | |
7283 | 2420 OscarData *od = pos->gc->proto_data; |
2086 | 2421 char in = '\0'; |
2422 int x = 0; | |
2423 unsigned char m[17]; | |
2424 | |
2425 while (read(pos->fd, &in, 1) == 1) { | |
2426 if (in == '\n') | |
2427 x++; | |
2428 else if (in != '\r') | |
2429 x = 0; | |
2430 if (x == 2) | |
2431 break; | |
2432 in = '\0'; | |
2433 } | |
2434 if (in != '\n') { | |
4056 | 2435 char buf[256]; |
2436 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
|
2437 "this is fixed. Check %s for updates."), GAIM_WEBSITE); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2438 gaim_notify_warning(pos->gc, NULL, |
7422 | 2439 _("Gaim was unable to get a valid AIM login hash."), |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2440 buf); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
2441 gaim_input_remove(pos->inpa); |
2086 | 2442 close(pos->fd); |
2443 g_free(pos); | |
2444 return; | |
2445 } | |
2446 read(pos->fd, m, 16); | |
2447 m[16] = '\0'; | |
8660 | 2448 gaim_debug_misc("oscar", "Sending hash: "); |
2086 | 2449 for (x = 0; x < 16; x++) |
8660 | 2450 gaim_debug_misc(NULL, "%02hhx ", (unsigned char)m[x]); |
2451 | |
2452 gaim_debug_misc(NULL, "\n"); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
2453 gaim_input_remove(pos->inpa); |
2086 | 2454 close(pos->fd); |
2455 aim_sendmemblock(od->sess, pos->conn, 0, 16, m, AIM_SENDMEMBLOCK_FLAG_ISHASH); | |
2456 g_free(pos); | |
2457 } | |
2458 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
2459 static void straight_to_hell(gpointer data, gint source, GaimInputCondition cond) { |
2086 | 2460 struct pieceofcrap *pos = data; |
5420 | 2461 gchar *buf; |
2086 | 2462 |
4366 | 2463 pos->fd = source; |
2464 | |
2086 | 2465 if (source < 0) { |
5420 | 2466 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
|
2467 "this is fixed. Check %s for updates."), GAIM_WEBSITE); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2468 gaim_notify_warning(pos->gc, NULL, |
7422 | 2469 _("Gaim was unable to get a valid AIM login hash."), |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2470 buf); |
5420 | 2471 g_free(buf); |
2086 | 2472 if (pos->modname) |
2473 g_free(pos->modname); | |
2474 g_free(pos); | |
2475 return; | |
2476 } | |
2477 | |
5420 | 2478 buf = g_strdup_printf("GET " AIMHASHDATA "?offset=%ld&len=%ld&modname=%s HTTP/1.0\n\n", |
2086 | 2479 pos->offset, pos->len, pos->modname ? pos->modname : ""); |
2480 write(pos->fd, buf, strlen(buf)); | |
5420 | 2481 g_free(buf); |
2086 | 2482 if (pos->modname) |
2483 g_free(pos->modname); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
2484 pos->inpa = gaim_input_add(pos->fd, GAIM_INPUT_READ, damn_you, pos); |
2086 | 2485 return; |
2486 } | |
2487 | |
2488 /* size of icbmui.ocm, the largest module in AIM 3.5 */ | |
2489 #define AIM_MAX_FILE_SIZE 98304 | |
2490 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2491 int gaim_memrequest(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2492 va_list ap; |
2493 struct pieceofcrap *pos; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2494 fu32_t offset, len; |
2086 | 2495 char *modname; |
2496 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2497 va_start(ap, fr); |
4200 | 2498 offset = va_arg(ap, fu32_t); |
2499 len = va_arg(ap, fu32_t); | |
2086 | 2500 modname = va_arg(ap, char *); |
2501 va_end(ap); | |
2502 | |
8660 | 2503 gaim_debug_misc("oscar", |
5556 | 2504 "offset: %u, len: %u, file: %s\n", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2505 offset, len, (modname ? modname : "aim.exe")); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2506 |
2086 | 2507 if (len == 0) { |
8660 | 2508 gaim_debug_misc("oscar", "len is 0, hashing NULL\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2509 aim_sendmemblock(sess, fr->conn, offset, len, NULL, |
2086 | 2510 AIM_SENDMEMBLOCK_FLAG_ISREQUEST); |
2511 return 1; | |
2512 } | |
9625 | 2513 /* uncomment this when you're convinced it's right. remember, it's been wrong before. */ |
2514 #if 0 | |
2086 | 2515 if (offset > AIM_MAX_FILE_SIZE || len > AIM_MAX_FILE_SIZE) { |
2516 char *buf; | |
2517 int i = 8; | |
2518 if (modname) | |
2519 i += strlen(modname); | |
2520 buf = g_malloc(i); | |
2521 i = 0; | |
2522 if (modname) { | |
2523 memcpy(buf, modname, strlen(modname)); | |
2524 i += strlen(modname); | |
2525 } | |
2526 buf[i++] = offset & 0xff; | |
2527 buf[i++] = (offset >> 8) & 0xff; | |
2528 buf[i++] = (offset >> 16) & 0xff; | |
2529 buf[i++] = (offset >> 24) & 0xff; | |
2530 buf[i++] = len & 0xff; | |
2531 buf[i++] = (len >> 8) & 0xff; | |
2532 buf[i++] = (len >> 16) & 0xff; | |
2533 buf[i++] = (len >> 24) & 0xff; | |
8660 | 2534 gaim_debug_misc("oscar", "len + offset is invalid, " |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2535 "hashing request\n"); |
2086 | 2536 aim_sendmemblock(sess, command->conn, offset, i, buf, AIM_SENDMEMBLOCK_FLAG_ISREQUEST); |
2537 g_free(buf); | |
2538 return 1; | |
2539 } | |
9625 | 2540 #endif |
2086 | 2541 |
2542 pos = g_new0(struct pieceofcrap, 1); | |
2543 pos->gc = sess->aux_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2544 pos->conn = fr->conn; |
2086 | 2545 |
2546 pos->offset = offset; | |
2547 pos->len = len; | |
2548 pos->modname = modname ? g_strdup(modname) : NULL; | |
2549 | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2550 if (gaim_proxy_connect(pos->gc->account, "gaim.sourceforge.net", 80, straight_to_hell, pos) != 0) { |
4056 | 2551 char buf[256]; |
2086 | 2552 if (pos->modname) |
2553 g_free(pos->modname); | |
2554 g_free(pos); | |
4056 | 2555 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
|
2556 "this is fixed. Check %s for updates."), GAIM_WEBSITE); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2557 gaim_notify_warning(pos->gc, NULL, |
7422 | 2558 _("Gaim was unable to get a valid login hash."), |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2559 buf); |
2086 | 2560 } |
2561 | |
2562 return 1; | |
2563 } | |
2564 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2565 static int gaim_parse_login(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 2566 GaimConnection *gc = sess->aux_data; |
7283 | 2567 OscarData *od = gc->proto_data; |
5591
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2568 GaimAccount *account = gaim_connection_get_account(gc); |
5575 | 2569 GaimAccount *ac = gaim_connection_get_account(gc); |
7282 | 2570 #if 0 |
2571 struct client_info_s info = {"gaim", 7, 3, 2003, "us", "en", 0x0004, 0x0000, 0x04b}; | |
2572 #endif | |
7011 | 2573 va_list ap; |
2574 char *key; | |
2086 | 2575 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2576 va_start(ap, fr); |
2086 | 2577 key = va_arg(ap, char *); |
2578 va_end(ap); | |
2579 | |
4617 | 2580 if (od->icq) { |
3458 | 2581 struct client_info_s info = CLIENTINFO_ICQ_KNOWNGOOD; |
5591
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2582 aim_send_login(sess, fr->conn, gaim_account_get_username(ac), |
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2583 gaim_account_get_password(account), &info, key); |
3458 | 2584 } else { |
2585 struct client_info_s info = CLIENTINFO_AIM_KNOWNGOOD; | |
5591
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2586 aim_send_login(sess, fr->conn, gaim_account_get_username(ac), |
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2587 gaim_account_get_password(account), &info, key); |
3458 | 2588 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2589 |
7283 | 2590 gaim_connection_update_progress(gc, _("Password sent"), 2, OSCAR_CONNECT_STEPS); |
8341 | 2591 ck[2] = 0x6c; |
7282 | 2592 |
2086 | 2593 return 1; |
2594 } | |
2595 | |
2675 | 2596 static int conninitdone_chat(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 2597 GaimConnection *gc = sess->aux_data; |
2647 | 2598 struct chat_connection *chatcon; |
2599 static int id = 1; | |
2600 | |
6905 | 2601 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, 0x0001, gaim_parse_genericerr, 0); |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
2602 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERJOIN, gaim_conv_chat_join, 0); |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
2603 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERLEAVE, gaim_conv_chat_leave, 0); |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
2604 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_ROOMINFOUPDATE, gaim_conv_chat_info_update, 0); |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
2605 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_INCOMINGMSG, gaim_conv_chat_incoming_msg, 0); |
2675 | 2606 |
2672 | 2607 aim_clientready(sess, fr->conn); |
2675 | 2608 |
2647 | 2609 chatcon = find_oscar_chat_by_conn(gc, fr->conn); |
2610 chatcon->id = id; | |
8733 | 2611 chatcon->conv = serv_got_joined_chat(gc, id++, chatcon->show); |
2647 | 2612 |
2613 return 1; | |
2614 } | |
2615 | |
2675 | 2616 static int conninitdone_chatnav(aim_session_t *sess, aim_frame_t *fr, ...) { |
2617 | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2618 aim_conn_addhandler(sess, fr->conn, 0x000d, 0x0001, gaim_parse_genericerr, 0); |
2647 | 2619 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CTN, AIM_CB_CTN_INFO, gaim_chatnav_info, 0); |
2675 | 2620 |
2621 aim_clientready(sess, fr->conn); | |
2622 | |
2623 aim_chatnav_reqrights(sess, fr->conn); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2624 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2625 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2626 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2627 |
3694 | 2628 static int conninitdone_email(aim_session_t *sess, aim_frame_t *fr, ...) { |
2629 | |
2630 aim_conn_addhandler(sess, fr->conn, 0x0018, 0x0001, gaim_parse_genericerr, 0); | |
2631 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_EML, AIM_CB_EML_MAILSTATUS, gaim_email_parseupdate, 0); | |
2632 | |
7282 | 2633 aim_email_sendcookies(sess); |
2634 aim_email_activate(sess); | |
3694 | 2635 aim_clientready(sess, fr->conn); |
2636 | |
2637 return 1; | |
2638 } | |
2639 | |
4804 | 2640 static int conninitdone_icon(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 2641 GaimConnection *gc = sess->aux_data; |
7283 | 2642 OscarData *od = gc->proto_data; |
4804 | 2643 |
2644 aim_conn_addhandler(sess, fr->conn, 0x0018, 0x0001, gaim_parse_genericerr, 0); | |
2645 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ICO, AIM_CB_ICO_ERROR, gaim_icon_error, 0); | |
2646 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ICO, AIM_CB_ICO_RESPONSE, gaim_icon_parseicon, 0); | |
2647 | |
2648 aim_clientready(sess, fr->conn); | |
2649 | |
4823 | 2650 od->iconconnecting = FALSE; |
2651 | |
4804 | 2652 if (od->icontimer) |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
2653 gaim_timeout_remove(od->icontimer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
2654 od->icontimer = gaim_timeout_add(100, gaim_icon_timerfunc, gc); |
4804 | 2655 |
2656 return 1; | |
2657 } | |
2658 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2659 static void oscar_chatnav_connect(gpointer data, gint source, GaimInputCondition cond) { |
5575 | 2660 GaimConnection *gc = data; |
7283 | 2661 OscarData *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2662 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2663 aim_conn_t *tstconn; |
2086 | 2664 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2665 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 2666 close(source); |
2667 return; | |
2668 } | |
2669 | |
4617 | 2670 od = gc->proto_data; |
2671 sess = od->sess; | |
2086 | 2672 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_CHATNAV); |
4366 | 2673 tstconn->fd = source; |
2086 | 2674 |
2675 if (source < 0) { | |
2676 aim_conn_kill(sess, &tstconn); | |
8660 | 2677 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2678 "unable to connect to chatnav server\n"); |
2086 | 2679 return; |
2680 } | |
2681 | |
2682 aim_conn_completeconnect(sess, tstconn); | |
4617 | 2683 od->cnpa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); |
8660 | 2684 gaim_debug_info("oscar", "chatnav: connected\n"); |
2086 | 2685 } |
2686 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
2687 static void oscar_auth_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 2688 { |
5575 | 2689 GaimConnection *gc = data; |
7283 | 2690 OscarData *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2691 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2692 aim_conn_t *tstconn; |
2086 | 2693 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2694 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 2695 close(source); |
2696 return; | |
2697 } | |
2698 | |
4617 | 2699 od = gc->proto_data; |
2700 sess = od->sess; | |
2086 | 2701 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_AUTH); |
4366 | 2702 tstconn->fd = source; |
2086 | 2703 |
2704 if (source < 0) { | |
2705 aim_conn_kill(sess, &tstconn); | |
8660 | 2706 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2707 "unable to connect to authorizer\n"); |
2086 | 2708 return; |
2709 } | |
2710 | |
2711 aim_conn_completeconnect(sess, tstconn); | |
4617 | 2712 od->paspa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); |
8660 | 2713 gaim_debug_info("oscar", "admin: connected\n"); |
2086 | 2714 } |
2715 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
2716 static void oscar_chat_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 2717 { |
2718 struct chat_connection *ccon = data; | |
5575 | 2719 GaimConnection *gc = ccon->gc; |
7283 | 2720 OscarData *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2721 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2722 aim_conn_t *tstconn; |
2086 | 2723 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2724 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 2725 close(source); |
2726 g_free(ccon->show); | |
2727 g_free(ccon->name); | |
2728 g_free(ccon); | |
2729 return; | |
2730 } | |
2731 | |
4617 | 2732 od = gc->proto_data; |
2733 sess = od->sess; | |
2086 | 2734 tstconn = ccon->conn; |
4366 | 2735 tstconn->fd = source; |
2086 | 2736 |
2737 if (source < 0) { | |
2738 aim_conn_kill(sess, &tstconn); | |
2739 g_free(ccon->show); | |
2740 g_free(ccon->name); | |
2741 g_free(ccon); | |
2742 return; | |
2743 } | |
2744 | |
2745 aim_conn_completeconnect(sess, ccon->conn); | |
4617 | 2746 ccon->inpa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); |
2747 od->oscar_chats = g_slist_append(od->oscar_chats, ccon); | |
2086 | 2748 } |
2749 | |
3694 | 2750 static void oscar_email_connect(gpointer data, gint source, GaimInputCondition cond) { |
5575 | 2751 GaimConnection *gc = data; |
7283 | 2752 OscarData *od; |
3694 | 2753 aim_session_t *sess; |
2754 aim_conn_t *tstconn; | |
2755 | |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2756 if (!g_list_find(gaim_connections_get_all(), gc)) { |
3694 | 2757 close(source); |
2758 return; | |
2759 } | |
2760 | |
4617 | 2761 od = gc->proto_data; |
2762 sess = od->sess; | |
3694 | 2763 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_EMAIL); |
4366 | 2764 tstconn->fd = source; |
3694 | 2765 |
2766 if (source < 0) { | |
2767 aim_conn_kill(sess, &tstconn); | |
8660 | 2768 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2769 "unable to connect to email server\n"); |
3694 | 2770 return; |
2771 } | |
2772 | |
2773 aim_conn_completeconnect(sess, tstconn); | |
4617 | 2774 od->emlpa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); |
8660 | 2775 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2776 "email: connected\n"); |
3694 | 2777 } |
2778 | |
4804 | 2779 static void oscar_icon_connect(gpointer data, gint source, GaimInputCondition cond) { |
5575 | 2780 GaimConnection *gc = data; |
7283 | 2781 OscarData *od; |
4804 | 2782 aim_session_t *sess; |
2783 aim_conn_t *tstconn; | |
2784 | |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2785 if (!g_list_find(gaim_connections_get_all(), gc)) { |
4804 | 2786 close(source); |
2787 return; | |
2788 } | |
2789 | |
2790 od = gc->proto_data; | |
2791 sess = od->sess; | |
2792 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_ICON); | |
2793 tstconn->fd = source; | |
2794 | |
2795 if (source < 0) { | |
2796 aim_conn_kill(sess, &tstconn); | |
8660 | 2797 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2798 "unable to connect to icon server\n"); |
4804 | 2799 return; |
2800 } | |
2801 | |
2802 aim_conn_completeconnect(sess, tstconn); | |
2803 od->icopa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); | |
8660 | 2804 gaim_debug_info("oscar", "icon: connected\n"); |
4804 | 2805 } |
2806 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2807 /* 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
|
2808 static int gaim_handle_redirect(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 2809 GaimConnection *gc = sess->aux_data; |
2810 GaimAccount *account = gaim_connection_get_account(gc); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2811 aim_conn_t *tstconn; |
4452 | 2812 int i; |
2086 | 2813 char *host; |
2814 int port; | |
4821 | 2815 va_list ap; |
2816 struct aim_redirect_data *redir; | |
2086 | 2817 |
5575 | 2818 port = gaim_account_get_int(account, "port", FAIM_LOGIN_PORT); |
2086 | 2819 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2820 va_start(ap, fr); |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2821 redir = va_arg(ap, struct aim_redirect_data *); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2822 va_end(ap); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2823 |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2824 for (i = 0; i < (int)strlen(redir->ip); i++) { |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2825 if (redir->ip[i] == ':') { |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2826 port = atoi(&(redir->ip[i+1])); |
2086 | 2827 break; |
2828 } | |
2829 } | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2830 host = g_strndup(redir->ip, i); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2831 |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2832 switch(redir->group) { |
2086 | 2833 case 0x7: /* Authorizer */ |
8660 | 2834 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2835 "Reconnecting with authorizor...\n"); |
2086 | 2836 tstconn = aim_newconn(sess, AIM_CONN_TYPE_AUTH, NULL); |
2837 if (tstconn == NULL) { | |
8660 | 2838 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2839 "unable to reconnect with authorizer\n"); |
2086 | 2840 g_free(host); |
2841 return 1; | |
2842 } | |
4649 | 2843 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 2844 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_admin, 0); |
2086 | 2845 |
2846 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2847 if (gaim_proxy_connect(account, host, port, oscar_auth_connect, gc) != 0) { |
2086 | 2848 aim_conn_kill(sess, &tstconn); |
8660 | 2849 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2850 "unable to reconnect with authorizer\n"); |
2086 | 2851 g_free(host); |
2852 return 1; | |
2853 } | |
4293 | 2854 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
4194 | 2855 break; |
2856 | |
2086 | 2857 case 0xd: /* ChatNav */ |
2858 tstconn = aim_newconn(sess, AIM_CONN_TYPE_CHATNAV, NULL); | |
2859 if (tstconn == NULL) { | |
8660 | 2860 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2861 "unable to connect to chatnav server\n"); |
2086 | 2862 g_free(host); |
2863 return 1; | |
2864 } | |
4649 | 2865 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 2866 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_chatnav, 0); |
2086 | 2867 |
2868 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2869 if (gaim_proxy_connect(account, host, port, oscar_chatnav_connect, gc) != 0) { |
2086 | 2870 aim_conn_kill(sess, &tstconn); |
8660 | 2871 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2872 "unable to connect to chatnav server\n"); |
2086 | 2873 g_free(host); |
2874 return 1; | |
2875 } | |
4293 | 2876 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
4194 | 2877 break; |
2878 | |
2879 case 0xe: { /* Chat */ | |
2086 | 2880 struct chat_connection *ccon; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2881 |
2086 | 2882 tstconn = aim_newconn(sess, AIM_CONN_TYPE_CHAT, NULL); |
2883 if (tstconn == NULL) { | |
8660 | 2884 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2885 "unable to connect to chat server\n"); |
2086 | 2886 g_free(host); |
2887 return 1; | |
2888 } | |
2889 | |
4649 | 2890 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 2891 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_chat, 0); |
2892 | |
2086 | 2893 ccon = g_new0(struct chat_connection, 1); |
2894 ccon->conn = tstconn; | |
2895 ccon->gc = gc; | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2896 ccon->name = g_strdup(redir->chat.room); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2897 ccon->exchange = redir->chat.exchange; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2898 ccon->instance = redir->chat.instance; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2899 ccon->show = extract_name(redir->chat.room); |
4634 | 2900 |
2086 | 2901 ccon->conn->status |= AIM_CONN_STATUS_INPROGRESS; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2902 if (gaim_proxy_connect(account, host, port, oscar_chat_connect, ccon) != 0) { |
2086 | 2903 aim_conn_kill(sess, &tstconn); |
8660 | 2904 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2905 "unable to connect to chat server\n"); |
2086 | 2906 g_free(host); |
2907 g_free(ccon->show); | |
2908 g_free(ccon->name); | |
2909 g_free(ccon); | |
2910 return 1; | |
2911 } | |
4293 | 2912 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
8660 | 2913 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2914 "Connected to chat room %s exchange %hu\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2915 ccon->name, ccon->exchange); |
4194 | 2916 } break; |
3694 | 2917 |
4804 | 2918 case 0x0010: { /* icon */ |
2919 if (!(tstconn = aim_newconn(sess, AIM_CONN_TYPE_ICON, NULL))) { | |
8660 | 2920 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2921 "unable to connect to icon server\n"); |
4804 | 2922 g_free(host); |
2923 return 1; | |
2924 } | |
2925 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); | |
2926 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_icon, 0); | |
2927 | |
2928 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2929 if (gaim_proxy_connect(account, host, port, oscar_icon_connect, gc) != 0) { |
4804 | 2930 aim_conn_kill(sess, &tstconn); |
8660 | 2931 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2932 "unable to connect to icon server\n"); |
4804 | 2933 g_free(host); |
2934 return 1; | |
2935 } | |
2936 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); | |
2937 } break; | |
2938 | |
3694 | 2939 case 0x0018: { /* email */ |
2940 if (!(tstconn = aim_newconn(sess, AIM_CONN_TYPE_EMAIL, NULL))) { | |
8660 | 2941 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2942 "unable to connect to email server\n"); |
3694 | 2943 g_free(host); |
2944 return 1; | |
2945 } | |
4649 | 2946 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
3694 | 2947 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_email, 0); |
2948 | |
2949 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2950 if (gaim_proxy_connect(account, host, port, oscar_email_connect, gc) != 0) { |
3694 | 2951 aim_conn_kill(sess, &tstconn); |
8660 | 2952 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2953 "unable to connect to email server\n"); |
3694 | 2954 g_free(host); |
2955 return 1; | |
2956 } | |
4293 | 2957 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
3694 | 2958 } break; |
2959 | |
2086 | 2960 default: /* huh? */ |
8660 | 2961 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2962 "got redirect for unknown service 0x%04hx\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2963 redir->group); |
2086 | 2964 break; |
2965 } | |
2966 | |
2967 g_free(host); | |
2968 return 1; | |
2969 } | |
2970 | |
10042 | 2971 static int gaim_parse_oncoming(aim_session_t *sess, aim_frame_t *fr, ...) |
2972 { | |
2973 GaimConnection *gc; | |
2974 GaimAccount *account; | |
2975 OscarData *od; | |
4738 | 2976 struct buddyinfo *bi; |
2993 | 2977 time_t time_idle = 0, signon = 0; |
2978 int type = 0; | |
2979 int caps = 0; | |
2086 | 2980 va_list ap; |
4738 | 2981 aim_userinfo_t *info; |
10042 | 2982 gboolean buddy_is_away = FALSE; |
2983 | |
2984 gc = sess->aux_data; | |
2985 account = gaim_connection_get_account(gc); | |
2986 od = gc->proto_data; | |
4194 | 2987 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2988 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2989 info = va_arg(ap, aim_userinfo_t *); |
2086 | 2990 va_end(ap); |
2991 | |
10130 | 2992 g_return_val_if_fail(info != NULL, 1); |
2993 g_return_val_if_fail(info->sn != NULL, 1); | |
2994 | |
2993 | 2995 if (info->present & AIM_USERINFO_PRESENT_CAPABILITIES) |
2996 caps = info->capabilities; | |
3267 | 2997 |
4766 | 2998 if (info->present & AIM_USERINFO_PRESENT_FLAGS) { |
2999 if (info->flags & AIM_FLAG_AWAY) | |
10042 | 3000 buddy_is_away = TRUE; |
3001 } | |
3002 | |
2993 | 3003 if (info->present & AIM_USERINFO_PRESENT_ICQEXTSTATUS) { |
3595 | 3004 type = (info->icqinfo.status << 16); |
3013 | 3005 if (!(info->icqinfo.status & AIM_ICQ_STATE_CHAT) && |
3006 (info->icqinfo.status != AIM_ICQ_STATE_NORMAL)) { | |
10042 | 3007 buddy_is_away = TRUE; |
3013 | 3008 } |
2993 | 3009 } |
3010 | |
7141 | 3011 if (caps & AIM_CAPS_ICQ_DIRECT) |
3012 caps ^= AIM_CAPS_ICQ_DIRECT; | |
2993 | 3013 |
3014 if (info->present & AIM_USERINFO_PRESENT_IDLE) { | |
2086 | 3015 time(&time_idle); |
3016 time_idle -= info->idletime*60; | |
9295 | 3017 /* time_idle should be the seconds since epoch at which the user became idle */ |
2993 | 3018 } |
3019 | |
5836 | 3020 if (info->present & AIM_USERINFO_PRESENT_ONLINESINCE) |
3021 signon = info->onlinesince; | |
3022 else if (info->present & AIM_USERINFO_PRESENT_SESSIONLEN) | |
2993 | 3023 signon = time(NULL) - info->sessionlen; |
2086 | 3024 |
10567 | 3025 if (!aim_sncmp(gaim_account_get_username(account), info->sn)) { |
5575 | 3026 gaim_connection_set_display_name(gc, info->sn); |
10567 | 3027 od->timeoffset = signon - gc->login_time; |
3028 } | |
2305
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
3029 |
9982 | 3030 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(account, info->sn)); |
4738 | 3031 if (!bi) { |
3032 bi = g_new0(struct buddyinfo, 1); | |
9982 | 3033 g_hash_table_insert(od->buddyinfo, g_strdup(gaim_normalize(account, info->sn)), bi); |
4738 | 3034 } |
4739 | 3035 bi->typingnot = FALSE; |
3036 bi->ico_informed = FALSE; | |
6857 | 3037 bi->ipaddr = info->icqinfo.ipaddr; |
3038 | |
10563 | 3039 /* |
3040 * Handle the available message. If info->avail is NULL then the user | |
3041 * may or may not have an available message, so don't do anything. If | |
3042 * info->avail is set to the empty string, then the user's client DOES | |
3043 * support available messages and the user DOES NOT have one set. | |
3044 * Otherwise info->avail contains the available message. | |
3045 */ | |
7011 | 3046 if (info->avail != NULL) |
10563 | 3047 { |
3048 free(bi->availmsg); | |
3049 if (info->avail[0] != '\0') | |
3050 bi->availmsg = oscar_encoding_to_utf8(info->avail_encoding, info->avail, info->avail_len); | |
3051 else | |
3052 bi->availmsg = NULL; | |
3053 } | |
4732 | 3054 |
4804 | 3055 /* Server stored icon stuff */ |
4853 | 3056 if (info->iconcsumlen) { |
7125 | 3057 const char *filename = NULL, *saved_b16 = NULL; |
9801 | 3058 char *b16 = NULL, *filepath = NULL; |
7093 | 3059 GaimBuddy *b = NULL; |
4853 | 3060 |
7106
db6bd3e794d8
[gaim-migrate @ 7671]
Christian Hammond <chipx86@chipx86.com>
parents:
7098
diff
changeset
|
3061 b16 = gaim_base16_encode(info->iconcsum, info->iconcsumlen); |
9982 | 3062 b = gaim_find_buddy(account, info->sn); |
7093 | 3063 /* |
3064 * If for some reason the checksum is valid, but cached file is not.. | |
3065 * we want to know. | |
3066 */ | |
7693 | 3067 filename = gaim_blist_node_get_string((GaimBlistNode*)b, "buddy_icon"); |
7093 | 3068 if (filename != NULL) { |
3069 if (g_file_test(filename, G_FILE_TEST_EXISTS)) | |
7693 | 3070 saved_b16 = gaim_blist_node_get_string((GaimBlistNode*)b, |
3071 "icon_checksum"); | |
9801 | 3072 else { |
3073 filepath = g_build_filename(gaim_buddy_icons_get_cache_dir(), | |
3074 filename, NULL); | |
3075 if (g_file_test(filepath, G_FILE_TEST_EXISTS)) | |
3076 saved_b16 = gaim_blist_node_get_string((GaimBlistNode*)b, | |
3077 "icon_checksum"); | |
3078 g_free(filepath); | |
3079 } | |
7093 | 3080 } else |
3081 saved_b16 = NULL; | |
7054
7c04a0775918
[gaim-migrate @ 7617]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
7045
diff
changeset
|
3082 |
4853 | 3083 if (!b16 || !saved_b16 || strcmp(b16, saved_b16)) { |
3084 GSList *cur = od->requesticon; | |
3085 while (cur && aim_sncmp((char *)cur->data, info->sn)) | |
3086 cur = cur->next; | |
3087 if (!cur) { | |
9982 | 3088 od->requesticon = g_slist_append(od->requesticon, g_strdup(gaim_normalize(account, info->sn))); |
4853 | 3089 if (od->icontimer) |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
3090 gaim_timeout_remove(od->icontimer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
3091 od->icontimer = gaim_timeout_add(500, gaim_icon_timerfunc, gc); |
4853 | 3092 } |
3093 } | |
6053 | 3094 g_free(b16); |
4853 | 3095 } |
3096 | |
10042 | 3097 /* XXX - Represent other ICQ statuses */ |
3098 if (buddy_is_away == TRUE) | |
3099 gaim_prpl_got_user_status(account, info->sn, OSCAR_STATUS_ID_AWAY, NULL); | |
3100 else | |
3101 gaim_prpl_got_user_status(account, info->sn, OSCAR_STATUS_ID_AVAILABLE, NULL); | |
10567 | 3102 gaim_prpl_got_user_login_time(account, info->sn, signon - od->timeoffset); |
9982 | 3103 gaim_prpl_got_user_warning_level(account, info->sn, info->warnlevel/10.0 + 0.5); |
3104 | |
3105 if (time_idle > 0) | |
3106 gaim_prpl_got_user_idle(account, info->sn, TRUE, time_idle); | |
10009 | 3107 else |
3108 gaim_prpl_got_user_idle(account, info->sn, FALSE, 0); | |
2086 | 3109 |
3110 return 1; | |
3111 } | |
3112 | |
8341 | 3113 static void gaim_check_comment(OscarData *od, const char *str) { |
3114 if ((str == NULL) || strcmp(str, ck)) | |
3115 aim_locate_setcaps(od->sess, caps_aim); | |
3116 else | |
3117 aim_locate_setcaps(od->sess, caps_aim | AIM_CAPS_SECUREIM); | |
3118 } | |
3119 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3120 static int gaim_parse_offgoing(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3121 GaimConnection *gc = sess->aux_data; |
7283 | 3122 OscarData *od = gc->proto_data; |
9982 | 3123 GaimAccount *account = gaim_connection_get_account(gc); |
2086 | 3124 va_list ap; |
4739 | 3125 aim_userinfo_t *info; |
2086 | 3126 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3127 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3128 info = va_arg(ap, aim_userinfo_t *); |
2086 | 3129 va_end(ap); |
3130 | |
9982 | 3131 gaim_prpl_got_user_status(account, info->sn, OSCAR_STATUS_ID_OFFLINE, NULL); |
2086 | 3132 |
7261 | 3133 g_hash_table_remove(od->buddyinfo, gaim_normalize(gc->account, info->sn)); |
5837 | 3134 |
2086 | 3135 return 1; |
3136 } | |
3137 | |
4617 | 3138 /* BBB */ |
3952 | 3139 /* |
4617 | 3140 * This is called after a remote AIM user has connected to us. We |
3141 * want to do some voodoo with the socket file descriptors, add a | |
3142 * callback or two, and then send the AIM_CB_OFT_PROMPT. | |
3952 | 3143 */ |
4656 | 3144 static int oscar_sendfile_estblsh(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3145 GaimConnection *gc = sess->aux_data; |
7283 | 3146 OscarData *od = (OscarData *)gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
3147 GaimXfer *xfer; |
5146 | 3148 struct aim_oft_info *oft_info; |
3630 | 3149 va_list ap; |
3150 aim_conn_t *conn, *listenerconn; | |
4656 | 3151 |
8660 | 3152 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3153 "AAA - in oscar_sendfile_estblsh\n"); |
3630 | 3154 va_start(ap, fr); |
3155 conn = va_arg(ap, aim_conn_t *); | |
3156 listenerconn = va_arg(ap, aim_conn_t *); | |
3157 va_end(ap); | |
3158 | |
4617 | 3159 if (!(xfer = oscar_find_xfer_by_conn(od->file_transfers, listenerconn))) |
3160 return 1; | |
3161 | |
5146 | 3162 if (!(oft_info = xfer->data)) |
4617 | 3163 return 1; |
3164 | |
3630 | 3165 /* Stop watching listener conn; watch transfer conn instead */ |
4617 | 3166 gaim_input_remove(xfer->watcher); |
3630 | 3167 aim_conn_kill(sess, &listenerconn); |
3168 | |
5146 | 3169 oft_info->conn = conn; |
3170 xfer->fd = oft_info->conn->fd; | |
3171 | |
3172 aim_conn_addhandler(sess, oft_info->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_ACK, oscar_sendfile_ack, 0); | |
3173 aim_conn_addhandler(sess, oft_info->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DONE, oscar_sendfile_done, 0); | |
3174 xfer->watcher = gaim_input_add(oft_info->conn->fd, GAIM_INPUT_READ, oscar_callback, oft_info->conn); | |
4617 | 3175 |
3176 /* Inform the other user that we are connected and ready to transfer */ | |
5146 | 3177 aim_oft_sendheader(sess, AIM_CB_OFT_PROMPT, oft_info); |
3630 | 3178 |
3179 return 0; | |
3180 } | |
3181 | |
3952 | 3182 /* |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
3183 * This is the gaim callback passed to gaim_proxy_connect when connecting to another AIM |
4617 | 3184 * user in order to transfer a file. |
3952 | 3185 */ |
4617 | 3186 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
|
3187 GaimXfer *xfer; |
5146 | 3188 struct aim_oft_info *oft_info; |
4656 | 3189 |
8660 | 3190 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3191 "AAA - in oscar_sendfile_connected\n"); |
4617 | 3192 if (!(xfer = data)) |
3193 return; | |
5146 | 3194 if (!(oft_info = xfer->data)) |
3630 | 3195 return; |
8446 | 3196 if (source < 0) { |
3197 gaim_xfer_cancel_remote(xfer); | |
4617 | 3198 return; |
8446 | 3199 } |
4617 | 3200 |
3201 xfer->fd = source; | |
5146 | 3202 oft_info->conn->fd = source; |
3203 | |
3204 aim_conn_completeconnect(oft_info->sess, oft_info->conn); | |
3205 xfer->watcher = gaim_input_add(xfer->fd, GAIM_INPUT_READ, oscar_callback, oft_info->conn); | |
4617 | 3206 |
3207 /* Inform the other user that we are connected and ready to transfer */ | |
5146 | 3208 aim_im_sendch2_sendfile_accept(oft_info->sess, oft_info); |
4617 | 3209 |
3210 return; | |
3630 | 3211 } |
3212 | |
3952 | 3213 /* |
4617 | 3214 * This is called when a buddy sends us some file info. This happens when they |
3215 * are sending a file to you, and you have just established a connection to them. | |
4650 | 3216 * You should send them the exact same info except use the real cookie. We also |
4617 | 3217 * get like totally ready to like, receive the file, kay? |
3952 | 3218 */ |
4617 | 3219 static int oscar_sendfile_prompt(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3220 GaimConnection *gc = sess->aux_data; |
7283 | 3221 OscarData *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
3222 GaimXfer *xfer; |
5146 | 3223 struct aim_oft_info *oft_info; |
4617 | 3224 va_list ap; |
3225 aim_conn_t *conn; | |
3226 fu8_t *cookie; | |
3227 struct aim_fileheader_t *fh; | |
4656 | 3228 |
8660 | 3229 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3230 "AAA - in oscar_sendfile_prompt\n"); |
4617 | 3231 va_start(ap, fr); |
3232 conn = va_arg(ap, aim_conn_t *); | |
3233 cookie = va_arg(ap, fu8_t *); | |
3234 fh = va_arg(ap, struct aim_fileheader_t *); | |
3235 va_end(ap); | |
3236 | |
3237 if (!(xfer = oscar_find_xfer_by_conn(od->file_transfers, conn))) | |
3238 return 1; | |
3239 | |
5146 | 3240 if (!(oft_info = xfer->data)) |
4617 | 3241 return 1; |
3242 | |
3243 /* We want to stop listening with a normal thingy */ | |
3244 gaim_input_remove(xfer->watcher); | |
3245 xfer->watcher = 0; | |
3246 | |
5146 | 3247 /* They sent us some information about the file they're sending */ |
3248 memcpy(&oft_info->fh, fh, sizeof(*fh)); | |
3249 | |
3250 /* Fill in the cookie */ | |
3251 memcpy(&oft_info->fh.bcookie, oft_info->cookie, 8); | |
3252 | |
4617 | 3253 /* XXX - convert the name from UTF-8 to UCS-2 if necessary, and pass the encoding to the call below */ |
5146 | 3254 aim_oft_sendheader(oft_info->sess, AIM_CB_OFT_ACK, oft_info); |
4617 | 3255 gaim_xfer_start(xfer, xfer->fd, NULL, 0); |
3256 | |
3257 return 0; | |
3630 | 3258 } |
3259 | |
3952 | 3260 /* |
4657 | 3261 * We are sending a file to someone else. They have just acknowledged our |
4617 | 3262 * prompt, so we want to start sending data like there's no tomorrow. |
3952 | 3263 */ |
4617 | 3264 static int oscar_sendfile_ack(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3265 GaimConnection *gc = sess->aux_data; |
7283 | 3266 OscarData *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
3267 GaimXfer *xfer; |
4617 | 3268 va_list ap; |
3269 aim_conn_t *conn; | |
3270 fu8_t *cookie; | |
3271 struct aim_fileheader_t *fh; | |
4656 | 3272 |
8660 | 3273 gaim_debug_info("oscar", "AAA - in oscar_sendfile_ack\n"); |
4617 | 3274 va_start(ap, fr); |
3275 conn = va_arg(ap, aim_conn_t *); | |
3276 cookie = va_arg(ap, fu8_t *); | |
3277 fh = va_arg(ap, struct aim_fileheader_t *); | |
3278 va_end(ap); | |
3279 | |
3280 if (!(xfer = oscar_find_xfer_by_cookie(od->file_transfers, cookie))) | |
3281 return 1; | |
3282 | |
4656 | 3283 /* We want to stop listening with a normal thingy */ |
3284 gaim_input_remove(xfer->watcher); | |
3285 xfer->watcher = 0; | |
3286 | |
4617 | 3287 gaim_xfer_start(xfer, xfer->fd, NULL, 0); |
3288 | |
3289 return 0; | |
3630 | 3290 } |
4617 | 3291 |
3292 /* | |
3293 * We just sent a file to someone. They said they got it and everything, | |
3294 * so we can close our direct connection and what not. | |
3295 */ | |
3296 static int oscar_sendfile_done(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 3297 GaimConnection *gc = sess->aux_data; |
7283 | 3298 OscarData *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
3299 GaimXfer *xfer; |
4617 | 3300 va_list ap; |
3301 aim_conn_t *conn; | |
3302 fu8_t *cookie; | |
3303 struct aim_fileheader_t *fh; | |
4656 | 3304 |
8660 | 3305 gaim_debug_info("oscar", "AAA - in oscar_sendfile_done\n"); |
4617 | 3306 va_start(ap, fr); |
3307 conn = va_arg(ap, aim_conn_t *); | |
3308 cookie = va_arg(ap, fu8_t *); | |
3309 fh = va_arg(ap, struct aim_fileheader_t *); | |
3310 va_end(ap); | |
3311 | |
3312 if (!(xfer = oscar_find_xfer_by_conn(od->file_transfers, conn))) | |
3313 return 1; | |
3314 | |
4656 | 3315 xfer->fd = conn->fd; |
4617 | 3316 gaim_xfer_end(xfer); |
3317 | |
3318 return 0; | |
3319 } | |
3630 | 3320 |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3321 static int incomingim_chan1(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch1_args *args) { |
5575 | 3322 GaimConnection *gc = sess->aux_data; |
7283 | 3323 OscarData *od = gc->proto_data; |
8708 | 3324 GaimAccount *account = gaim_connection_get_account(gc); |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
3325 GaimConvImFlags flags = 0; |
4738 | 3326 struct buddyinfo *bi; |
5575 | 3327 const char *iconfile; |
9806 | 3328 GString *message; |
3329 gchar *tmp; | |
3330 aim_mpmsg_section_t *curpart; | |
3331 | |
10472 | 3332 gaim_debug_misc("oscar", "Received IM from %s with %d parts\n", |
9806 | 3333 userinfo->sn, args->mpmsg.numparts); |
4738 | 3334 |
10595 | 3335 if (args->mpmsg.numparts == 0) |
3336 return 1; | |
3337 | |
8708 | 3338 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(account, userinfo->sn)); |
4738 | 3339 if (!bi) { |
3340 bi = g_new0(struct buddyinfo, 1); | |
8708 | 3341 g_hash_table_insert(od->buddyinfo, g_strdup(gaim_normalize(account, userinfo->sn)), bi); |
4738 | 3342 } |
2273
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
3343 |
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
3344 if (args->icbmflags & AIM_IMFLAGS_AWAY) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
3345 flags |= GAIM_CONV_IM_AUTO_RESP; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3346 |
4738 | 3347 if (args->icbmflags & AIM_IMFLAGS_TYPINGNOT) |
3348 bi->typingnot = TRUE; | |
3349 else | |
3350 bi->typingnot = FALSE; | |
3351 | |
4380 | 3352 if ((args->icbmflags & AIM_IMFLAGS_HASICON) && (args->iconlen) && (args->iconsum) && (args->iconstamp)) { |
8660 | 3353 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3354 "%s has an icon\n", userinfo->sn); |
4738 | 3355 if ((args->iconlen != bi->ico_len) || (args->iconsum != bi->ico_csum) || (args->iconstamp != bi->ico_time)) { |
3356 bi->ico_need = TRUE; | |
3357 bi->ico_len = args->iconlen; | |
3358 bi->ico_csum = args->iconsum; | |
3359 bi->ico_time = args->iconstamp; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3360 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3361 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3362 |
10458 | 3363 if ((iconfile = gaim_account_get_buddy_icon(account)) && |
7406 | 3364 (args->icbmflags & AIM_IMFLAGS_BUDDYREQ) && !bi->ico_sent && bi->ico_informed) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3365 FILE *file; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3366 struct stat st; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3367 |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
3368 if (!g_stat(iconfile, &st)) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3369 char *buf = g_malloc(st.st_size); |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
3370 file = g_fopen(iconfile, "rb"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3371 if (file) { |
9532 | 3372 /* XXX - Use g_file_get_contents() */ |
2603
24664768a739
[gaim-migrate @ 2616]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2597
diff
changeset
|
3373 int len = fread(buf, 1, st.st_size, file); |
8660 | 3374 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3375 "Sending buddy icon to %s (%d bytes, " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3376 "%lu reported)\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3377 userinfo->sn, len, st.st_size); |
4617 | 3378 aim_im_sendch2_icon(sess, userinfo->sn, buf, st.st_size, |
3379 st.st_mtime, aimutil_iconsum(buf, st.st_size)); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3380 fclose(file); |
2336
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
3381 } else |
8660 | 3382 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3383 "Can't open buddy icon file!\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3384 g_free(buf); |
2336
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
3385 } else |
8660 | 3386 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3387 "Can't stat buddy icon file!\n"); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3388 } |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3389 |
9806 | 3390 message = g_string_new(""); |
3391 curpart = args->mpmsg.parts; | |
3392 while (curpart != NULL) { | |
9908 | 3393 tmp = gaim_plugin_oscar_decode_im_part(account, userinfo->sn, curpart->charset, curpart->charsubset, |
9806 | 3394 curpart->data, curpart->datalen); |
3395 if (tmp != NULL) { | |
3396 g_string_append(message, tmp); | |
3397 g_free(tmp); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3398 } |
9806 | 3399 |
3400 curpart = curpart->next; | |
3401 } | |
3402 tmp = g_string_free(message, FALSE); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3403 |
8666 | 3404 /* |
8995 | 3405 * If the message is being received by an ICQ user then escape any HTML, |
9016 | 3406 * because HTML is not sent over ICQ as a means to format a message. |
8995 | 3407 * so any HTML we receive is intended to be displayed |
3408 * | |
3409 * Note: There *may* be some clients which send messages as HTML formatted - | |
3410 * they need to be special-cased somehow. | |
8666 | 3411 */ |
9982 | 3412 if (aim_sn_is_icq(gaim_account_get_username(account)) && aim_sn_is_icq(userinfo->sn)) { |
8995 | 3413 /* being recevied by ICQ from ICQ - escape HTML so it is displayed as sent */ |
10732
c4cb90065e1d
[gaim-migrate @ 12334]
Luke Schierer <lschiere@pidgin.im>
parents:
10715
diff
changeset
|
3414 gchar *tmp2 = g_markup_escape_text(tmp, -1); |
8493 | 3415 g_free(tmp); |
3416 tmp = tmp2; | |
3417 } | |
3418 | |
6982 | 3419 serv_got_im(gc, userinfo->sn, tmp, flags, time(NULL)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3420 g_free(tmp); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3421 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3422 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3423 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3424 |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3425 static int incomingim_chan2(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args) { |
9070 | 3426 GaimConnection *gc; |
9933 | 3427 GaimAccount *account; |
9070 | 3428 OscarData *od; |
9933 | 3429 const char *username = NULL; |
3430 char *message = NULL; | |
9070 | 3431 |
3432 g_return_val_if_fail(sess != NULL, 0); | |
3433 g_return_val_if_fail(sess->aux_data != NULL, 0); | |
3434 | |
3435 gc = sess->aux_data; | |
9933 | 3436 account = gaim_connection_get_account(gc); |
9070 | 3437 od = gc->proto_data; |
9933 | 3438 username = gaim_account_get_username(account); |
3439 | |
3440 if (args == NULL) | |
4121 | 3441 return 0; |
4194 | 3442 |
9933 | 3443 gaim_debug_misc("oscar", "rendezvous with %s, status is %hu\n", |
3444 userinfo->sn, args->status); | |
3445 | |
3446 if (args->msg != NULL) | |
3447 { | |
3448 if (args->encoding != NULL) | |
3449 { | |
3450 char *encoding = NULL; | |
3451 encoding = oscar_encoding_extract(args->encoding); | |
3452 message = oscar_encoding_to_utf8(encoding, args->msg, args->msglen); | |
3453 g_free(encoding); | |
3454 } else { | |
3455 if (g_utf8_validate(args->msg, args->msglen, NULL)) | |
3456 message = g_strdup(args->msg); | |
3457 } | |
3458 } | |
2869 | 3459 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3460 if (args->reqclass & AIM_CAPS_CHAT) { |
4121 | 3461 char *name; |
5234 | 3462 GHashTable *components; |
3463 | |
9933 | 3464 if (!args->info.chat.roominfo.name || !args->info.chat.roominfo.exchange) { |
3465 g_free(message); | |
4121 | 3466 return 1; |
9933 | 3467 } |
5234 | 3468 components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, |
3469 g_free); | |
4121 | 3470 name = extract_name(args->info.chat.roominfo.name); |
5234 | 3471 g_hash_table_replace(components, g_strdup("room"), g_strdup(name ? name : args->info.chat.roominfo.name)); |
3472 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
|
3473 serv_got_chat_invite(gc, |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3474 name ? name : args->info.chat.roominfo.name, |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3475 userinfo->sn, |
9933 | 3476 message, |
5234 | 3477 components); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3478 if (name) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3479 g_free(name); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3480 } else if (args->reqclass & AIM_CAPS_SENDFILE) { |
4617 | 3481 /* BBB */ |
3482 if (args->status == AIM_RENDEZVOUS_PROPOSE) { | |
3483 /* Someone wants to send a file (or files) to us */ | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
3484 GaimXfer *xfer; |
5146 | 3485 struct aim_oft_info *oft_info; |
3486 | |
3487 if (!args->cookie || !args->port || !args->verifiedip || | |
3488 !args->info.sendfile.filename || !args->info.sendfile.totsize || | |
4656 | 3489 !args->info.sendfile.totfiles || !args->reqclass) { |
8660 | 3490 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3491 "%s tried to send you a file with incomplete " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3492 "information.\n", userinfo->sn); |
5146 | 3493 if (args->proxyip) |
8660 | 3494 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3495 "IP for a proxy server was given. Gaim " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3496 "does not support this yet.\n"); |
9933 | 3497 g_free(message); |
4617 | 3498 return 1; |
4656 | 3499 } |
4617 | 3500 |
3501 if (args->info.sendfile.subtype == AIM_OFT_SUBTYPE_SEND_DIR) { | |
3502 /* last char of the ft req is a star, they are sending us a | |
8735
92cbf9713795
[gaim-migrate @ 9490]
Christian Hammond <chipx86@chipx86.com>
parents:
8733
diff
changeset
|
3503 * directory -- remove the star and trailing slash so we don't save |
4617 | 3504 * directories that look like 'dirname\*' -- arl */ |
3505 char *tmp = strrchr(args->info.sendfile.filename, '\\'); | |
3506 if (tmp && (tmp[1] == '*')) { | |
3507 tmp[0] = '\0'; | |
3508 } | |
8660 | 3509 gaim_debug_warning("oscar", |
8446 | 3510 "We're receiving a whole directory! What fun! " |
3511 "Especially since we don't support that!\n"); | |
4617 | 3512 } |
3513 | |
3514 /* Build the file transfer handle */ | |
3515 xfer = gaim_xfer_new(gc->account, GAIM_XFER_RECEIVE, userinfo->sn); | |
5163 | 3516 xfer->remote_ip = g_strdup(args->verifiedip); |
5146 | 3517 xfer->remote_port = args->port; |
4617 | 3518 gaim_xfer_set_filename(xfer, args->info.sendfile.filename); |
3519 gaim_xfer_set_size(xfer, args->info.sendfile.totsize); | |
9933 | 3520 gaim_xfer_set_message(xfer, message); |
5146 | 3521 |
3522 /* Create the oscar-specific data */ | |
5163 | 3523 oft_info = aim_oft_createinfo(od->sess, args->cookie, userinfo->sn, args->clientip, xfer->remote_port, 0, 0, NULL); |
4898 | 3524 if (args->proxyip) |
5146 | 3525 oft_info->proxyip = g_strdup(args->proxyip); |
4898 | 3526 if (args->verifiedip) |
5146 | 3527 oft_info->verifiedip = g_strdup(args->verifiedip); |
3528 xfer->data = oft_info; | |
4617 | 3529 |
3530 /* Setup our I/O op functions */ | |
8446 | 3531 gaim_xfer_set_init_fnc(xfer, oscar_xfer_init_recv); |
4617 | 3532 gaim_xfer_set_end_fnc(xfer, oscar_xfer_end); |
8446 | 3533 gaim_xfer_set_request_denied_fnc(xfer, oscar_xfer_cancel_recv); |
4675
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
3534 gaim_xfer_set_cancel_recv_fnc(xfer, oscar_xfer_cancel_recv); |
8446 | 3535 gaim_xfer_set_ack_fnc(xfer, oscar_xfer_ack_recv); |
4617 | 3536 |
3537 /* Keep track of this transfer for later */ | |
3538 od->file_transfers = g_slist_append(od->file_transfers, xfer); | |
3539 | |
3540 /* Now perform the request */ | |
3541 gaim_xfer_request(xfer); | |
3542 } else if (args->status == AIM_RENDEZVOUS_CANCEL) { | |
3543 /* The other user wants to cancel a file transfer */ | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
3544 GaimXfer *xfer; |
8660 | 3545 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3546 "AAA - File transfer canceled by remote user\n"); |
4617 | 3547 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
|
3548 gaim_xfer_cancel_remote(xfer); |
4617 | 3549 } else if (args->status == AIM_RENDEZVOUS_ACCEPT) { |
3550 /* | |
3551 * This gets sent by the receiver of a file | |
3552 * as they connect directly to us. If we don't | |
3553 * get this, then maybe a third party connected | |
3554 * to us, and we shouldn't send them anything. | |
3555 */ | |
3556 } else { | |
8660 | 3557 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3558 "unknown rendezvous status!\n"); |
3630 | 3559 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3560 } else if (args->reqclass & AIM_CAPS_GETFILE) { |
8092 | 3561 } else if (args->reqclass & AIM_CAPS_TALK) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3562 } else if (args->reqclass & AIM_CAPS_BUDDYICON) { |
9933 | 3563 gaim_buddy_icons_set_for_user(account, userinfo->sn, |
3564 args->info.icon.icon, | |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
3565 args->info.icon.length); |
6871 | 3566 } else if (args->reqclass & AIM_CAPS_DIRECTIM) { |
8971 | 3567 /* Consider moving all this into a helper func in the direct im block way up there */ |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3568 struct ask_direct *d = g_new0(struct ask_direct, 1); |
8971 | 3569 struct oscar_direct_im *dim = oscar_direct_im_find(od, userinfo->sn); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3570 char buf[256]; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3571 |
4212 | 3572 if (!args->verifiedip) { |
8983 | 3573 /* TODO: do something about this, after figuring out what it means */ |
8660 | 3574 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3575 "directim kill blocked (%s)\n", userinfo->sn); |
9933 | 3576 g_free(message); |
4650 | 3577 return 1; |
4212 | 3578 } |
3579 | |
8660 | 3580 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3581 "%s received direct im request from %s (%s)\n", |
10594 | 3582 username, userinfo->sn, args->verifiedip); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3583 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3584 d->gc = gc; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3585 d->sn = g_strdup(userinfo->sn); |
8983 | 3586 /* Let's use the clientip here, because I think that's what AIM does. |
3587 * Besides, if the clientip is wrong, we'll probably timeout faster, | |
3588 * and then ask them to connect to us. */ | |
10594 | 3589 /* |
3590 * I disagree, let's use the verifiedip. I think AIM tries the | |
3591 * verified IP first, then tries the client IP if that fails. In | |
3592 * any case, there's a better chance the verified IP will be correct. | |
3593 * The client IP is what the other person _thinks_ their IP address | |
3594 * is. The verified IP is the address that the AIM server sees the | |
3595 * other person using. | |
3596 */ | |
3597 snprintf(d->ip, sizeof(d->ip), "%s:%d", args->verifiedip, args->port?args->port:5190); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3598 memcpy(d->cookie, args->cookie, 8); |
9070 | 3599 if (dim && !dim->connected && aim_odc_getcookie(dim->conn) && args->cookie && |
3600 (!memcmp(aim_odc_getcookie(dim->conn), args->cookie, 8))) { | |
3601 | |
8971 | 3602 oscar_direct_im_destroy(od, dim); |
8984 | 3603 d->donttryagain = TRUE; |
8971 | 3604 accept_direct_im_request(d); |
3605 } else { | |
8983 | 3606 if (dim && !dim->connected) |
8971 | 3607 gaim_debug_warning("oscar", "DirectIM: received direct im request while " |
3608 "already connected to that buddy!"); | |
5575 | 3609 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
|
3610 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3611 gaim_request_action(gc, NULL, buf, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3612 _("This requires a direct connection between " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3613 "the two computers and is necessary for IM " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3614 "Images. Because your IP address will be " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3615 "revealed, this may be considered a privacy " |
9972 | 3616 "risk."), |
3617 GAIM_DEFAULT_ACTION_NONE, d, 2, | |
8971 | 3618 _("Connect"), G_CALLBACK(accept_direct_im_request), |
3619 _("Cancel"), G_CALLBACK(destroy_direct_im_request)); | |
3620 /* FIXME: we should actually send a packet on cancel */ | |
3621 } | |
8708 | 3622 } else if (args->reqclass & AIM_CAPS_ICQSERVERRELAY) { |
3623 gaim_debug_error("oscar", "Got an ICQ Server Relay message of type %d\n", args->info.rtfmsg.msgtype); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3624 } else { |
8660 | 3625 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3626 "Unknown reqclass %hu\n", args->reqclass); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3627 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3628 |
9933 | 3629 g_free(message); |
3630 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3631 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3632 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3633 |
3453 | 3634 /* |
4230 | 3635 * Authorization Functions |
3636 * Most of these are callbacks from dialogs. They're used by both | |
3637 * methods of authorization (SSI and old-school channel 4 ICBM) | |
3453 | 3638 */ |
4269 | 3639 /* When you ask other people for authorization */ |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3640 static void gaim_auth_request(struct name_data *data, char *msg) { |
5575 | 3641 GaimConnection *gc = data->gc; |
4244 | 3642 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
3643 if (g_list_find(gaim_connections_get_all(), gc)) { |
7283 | 3644 OscarData *od = gc->proto_data; |
6695 | 3645 GaimBuddy *buddy = gaim_find_buddy(gc->account, data->name); |
3646 GaimGroup *group = gaim_find_buddys_group(buddy); | |
4244 | 3647 if (buddy && group) { |
8660 | 3648 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3649 "ssi: adding buddy %s to group %s\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3650 buddy->name, group->name); |
4889 | 3651 aim_ssi_sendauthrequest(od->sess, data->name, msg ? msg : _("Please authorize me so I can add you to my buddy list.")); |
4269 | 3652 if (!aim_ssi_itemlist_finditem(od->sess->ssi.local, group->name, buddy->name, AIM_SSI_TYPE_BUDDY)) |
9620 | 3653 aim_ssi_addbuddy(od->sess, buddy->name, group->name, gaim_buddy_get_alias_only(buddy), NULL, NULL, 1); |
4244 | 3654 } |
4230 | 3655 } |
4337 | 3656 } |
3657 | |
3658 static void gaim_auth_request_msgprompt(struct name_data *data) { | |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
3659 gaim_request_input(data->gc, NULL, _("Authorization Request Message:"), |
8697 | 3660 NULL, _("Please authorize me!"), TRUE, FALSE, NULL, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
3661 _("OK"), G_CALLBACK(gaim_auth_request), |
5836 | 3662 _("Cancel"), G_CALLBACK(oscar_free_name_data), |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
3663 data); |
4230 | 3664 } |
3665 | |
3666 static void gaim_auth_dontrequest(struct name_data *data) { | |
5575 | 3667 GaimConnection *gc = data->gc; |
4244 | 3668 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
3669 if (g_list_find(gaim_connections_get_all(), gc)) { |
8151 | 3670 /* Remove from local list */ |
3671 GaimBuddy *b = gaim_find_buddy(gaim_connection_get_account(gc), data->name); | |
3672 gaim_blist_remove_buddy(b); | |
4244 | 3673 } |
3674 | |
5836 | 3675 oscar_free_name_data(data); |
4230 | 3676 } |
3677 | |
9030 | 3678 |
3679 static void gaim_auth_sendrequest(GaimConnection *gc, char *name) { | |
4269 | 3680 struct name_data *data = g_new(struct name_data, 1); |
6695 | 3681 GaimBuddy *buddy; |
4269 | 3682 gchar *dialog_msg, *nombre; |
3683 | |
4687 | 3684 buddy = gaim_find_buddy(gc->account, name); |
9620 | 3685 if (buddy && (gaim_buddy_get_alias_only(buddy))) |
3686 nombre = g_strdup_printf("%s (%s)", name, gaim_buddy_get_alias_only(buddy)); | |
4269 | 3687 else |
4830 | 3688 nombre = NULL; |
3689 | |
3690 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 | 3691 data->gc = gc; |
3692 data->name = g_strdup(name); | |
3693 data->nick = NULL; | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3694 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3695 gaim_request_action(gc, NULL, _("Request Authorization"), dialog_msg, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3696 0, data, 2, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3697 _("Request Authorization"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3698 G_CALLBACK(gaim_auth_request_msgprompt), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3699 _("Cancel"), G_CALLBACK(gaim_auth_dontrequest)); |
4269 | 3700 |
3701 g_free(dialog_msg); | |
3702 g_free(nombre); | |
3703 } | |
3704 | |
9030 | 3705 |
3706 static void gaim_auth_sendrequest_menu(GaimBlistNode *node, gpointer ignored) { | |
3707 GaimBuddy *buddy; | |
3708 GaimConnection *gc; | |
3709 | |
3710 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); | |
3711 | |
3712 buddy = (GaimBuddy *) node; | |
3713 gc = gaim_account_get_connection(buddy->account); | |
3714 gaim_auth_sendrequest(gc, buddy->name); | |
3715 } | |
3716 | |
4230 | 3717 /* When other people ask you for authorization */ |
3718 static void gaim_auth_grant(struct name_data *data) { | |
5575 | 3719 GaimConnection *gc = data->gc; |
4244 | 3720 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
3721 if (g_list_find(gaim_connections_get_all(), gc)) { |
7283 | 3722 OscarData *od = gc->proto_data; |
4236 | 3723 #ifdef NOSSI |
6695 | 3724 GaimBuddy *buddy; |
4244 | 3725 gchar message; |
3726 message = 0; | |
4687 | 3727 buddy = gaim_find_buddy(gc->account, data->name); |
4617 | 3728 aim_im_sendch4(od->sess, data->name, AIM_ICQMSG_AUTHGRANTED, &message); |
9620 | 3729 gaim_account_notify_added(gc->account, NULL, data->name, (buddy ? gaim_buddy_get_alias_only(buddy) : NULL), NULL); |
4230 | 3730 #else |
4889 | 3731 aim_ssi_sendauthreply(od->sess, data->name, 0x01, NULL); |
4230 | 3732 #endif |
4244 | 3733 } |
3734 | |
5836 | 3735 oscar_free_name_data(data); |
3141 | 3736 } |
3737 | |
4230 | 3738 /* When other people ask you for authorization */ |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3739 static void gaim_auth_dontgrant(struct name_data *data, char *msg) { |
5575 | 3740 GaimConnection *gc = data->gc; |
4244 | 3741 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
3742 if (g_list_find(gaim_connections_get_all(), gc)) { |
7283 | 3743 OscarData *od = gc->proto_data; |
4230 | 3744 #ifdef NOSSI |
4617 | 3745 aim_im_sendch4(od->sess, data->name, AIM_ICQMSG_AUTHDENIED, msg ? msg : _("No reason given.")); |
4230 | 3746 #else |
4889 | 3747 aim_ssi_sendauthreply(od->sess, data->name, 0x00, msg ? msg : _("No reason given.")); |
4230 | 3748 #endif |
4244 | 3749 } |
4337 | 3750 } |
3751 | |
3752 static void gaim_auth_dontgrant_msgprompt(struct name_data *data) { | |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
3753 gaim_request_input(data->gc, NULL, _("Authorization Denied Message:"), |
8697 | 3754 NULL, _("No reason given."), TRUE, FALSE, NULL, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
3755 _("OK"), G_CALLBACK(gaim_auth_dontgrant), |
5836 | 3756 _("Cancel"), G_CALLBACK(oscar_free_name_data), |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
3757 data); |
3141 | 3758 } |
3759 | |
7023 | 3760 /* When someone sends you buddies */ |
3761 static void gaim_icq_buddyadd(struct name_data *data) { | |
5575 | 3762 GaimConnection *gc = data->gc; |
4244 | 3763 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
3764 if (g_list_find(gaim_connections_get_all(), gc)) { |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7054
diff
changeset
|
3765 gaim_blist_request_add_buddy(gaim_connection_get_account(gc), data->name, NULL, data->nick); |
4244 | 3766 } |
3767 | |
5836 | 3768 oscar_free_name_data(data); |
3453 | 3769 } |
3770 | |
4075 | 3771 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 | 3772 GaimConnection *gc = sess->aux_data; |
9908 | 3773 GaimAccount *account = gaim_connection_get_account(gc); |
4076 | 3774 gchar **msg1, **msg2; |
6051 | 3775 int i, numtoks; |
4076 | 3776 |
4121 | 3777 if (!args->type || !args->msg || !args->uin) |
3778 return 1; | |
4194 | 3779 |
8660 | 3780 gaim_debug_info("oscar", |
9908 | 3781 "Received a channel 4 message of type 0x%02hhx.\n", |
3782 args->type); | |
4076 | 3783 |
9919 | 3784 /* |
3785 * Split up the message at the delimeter character, then convert each | |
3786 * string to UTF-8. Unless, of course, this is a type 1 message. If | |
3787 * this is a type 1 message, then the delimiter 0xfe could be a valid | |
3788 * character in whatever encoding the message was sent in. Type 1 | |
3789 * messages are always made up of only one part, so we can easily account | |
3790 * for this suck-ass part of the protocol by splitting the string into at | |
3791 * most 1 baby string. | |
3792 */ | |
3793 msg1 = g_strsplit(args->msg, "\376", (args->type == 0x01 ? 1 : 0)); | |
6051 | 3794 for (numtoks=0; msg1[numtoks]; numtoks++); |
3795 msg2 = (gchar **)g_malloc((numtoks+1)*sizeof(gchar *)); | |
4076 | 3796 for (i=0; msg1[i]; i++) { |
7478
3c21f3084ff0
[gaim-migrate @ 8091]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
7475
diff
changeset
|
3797 gaim_str_strip_cr(msg1[i]); |
9908 | 3798 msg2[i] = gaim_plugin_oscar_decode_im_part(account, "1", AIM_CHARSET_ASCII, 0x0000, msg1[i], strlen(msg1[i])); |
4076 | 3799 } |
3800 msg2[i] = NULL; | |
3801 | |
3952 | 3802 switch (args->type) { |
4173 | 3803 case 0x01: { /* MacICQ message or basic offline message */ |
4076 | 3804 if (i >= 1) { |
5556 | 3805 gchar *uin = g_strdup_printf("%u", args->uin); |
8493 | 3806 gchar *tmp; |
3807 | |
3808 /* If the message came from an ICQ user then escape any HTML */ | |
10732
c4cb90065e1d
[gaim-migrate @ 12334]
Luke Schierer <lschiere@pidgin.im>
parents:
10715
diff
changeset
|
3809 tmp = g_markup_escape_text(msg2[0], -1); |
8493 | 3810 |
4076 | 3811 if (t) { /* This is an offline message */ |
9680 | 3812 /* The timestamp is UTC-ish, so we need to get the offset */ |
9698 | 3813 #ifdef HAVE_TM_GMTOFF |
9724 | 3814 time_t now; |
3815 struct tm *tm; | |
3816 now = time(NULL); | |
3817 tm = localtime(&now); | |
3818 t += tm->tm_gmtoff; | |
9698 | 3819 #else |
3820 # ifdef HAVE_TIMEZONE | |
9680 | 3821 tzset(); |
3822 t -= timezone; | |
9698 | 3823 # endif |
3824 #endif | |
8514 | 3825 serv_got_im(gc, uin, tmp, 0, t); |
4076 | 3826 } else { /* This is a message from MacICQ/Miranda */ |
8514 | 3827 serv_got_im(gc, uin, tmp, 0, time(NULL)); |
4076 | 3828 } |
3829 g_free(uin); | |
8493 | 3830 g_free(tmp); |
4075 | 3831 } |
3316 | 3832 } break; |
3833 | |
4173 | 3834 case 0x04: { /* Someone sent you a URL */ |
4076 | 3835 if (i >= 2) { |
7385 | 3836 if (msg2[1] != NULL) { |
3837 gchar *uin = g_strdup_printf("%u", args->uin); | |
3838 gchar *message = g_strdup_printf("<A HREF=\"%s\">%s</A>", | |
3839 msg2[1], | |
3840 (msg2[0] && msg2[0][0]) ? msg2[0] : msg2[1]); | |
3841 serv_got_im(gc, uin, message, 0, time(NULL)); | |
3842 g_free(uin); | |
3843 g_free(message); | |
3844 } | |
3453 | 3845 } |
3846 } break; | |
3847 | |
4173 | 3848 case 0x06: { /* Someone requested authorization */ |
4076 | 3849 if (i >= 6) { |
4230 | 3850 struct name_data *data = g_new(struct name_data, 1); |
5556 | 3851 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.")); |
8660 | 3852 gaim_debug_info("oscar", |
5556 | 3853 "Received an authorization request from UIN %u\n", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3854 args->uin); |
4076 | 3855 data->gc = gc; |
5556 | 3856 data->name = g_strdup_printf("%u", args->uin); |
4230 | 3857 data->nick = NULL; |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3858 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3859 gaim_request_action(gc, NULL, _("Authorization Request"), |
9948 | 3860 dialog_msg, GAIM_DEFAULT_ACTION_NONE, data, |
3861 2, _("Authorize"), | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3862 G_CALLBACK(gaim_auth_grant), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3863 _("Deny"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3864 G_CALLBACK(gaim_auth_dontgrant_msgprompt)); |
4076 | 3865 g_free(dialog_msg); |
3866 } | |
3141 | 3867 } break; |
3868 | |
4173 | 3869 case 0x07: { /* Someone has denied you authorization */ |
4076 | 3870 if (i >= 1) { |
7023 | 3871 gchar *dialog_msg = g_strdup_printf(_("The user %u has denied your request to add them to your buddy list for the following reason:\n%s"), args->uin, msg2[0] ? msg2[0] : _("No reason given.")); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3872 gaim_notify_info(gc, NULL, _("ICQ authorization denied."), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3873 dialog_msg); |
4076 | 3874 g_free(dialog_msg); |
3875 } | |
3141 | 3876 } break; |
3877 | |
4173 | 3878 case 0x08: { /* Someone has granted you authorization */ |
7023 | 3879 gchar *dialog_msg = g_strdup_printf(_("The user %u has granted your request to add them to your buddy list."), args->uin); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3880 gaim_notify_info(gc, NULL, "ICQ authorization accepted.", |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3881 dialog_msg); |
3141 | 3882 g_free(dialog_msg); |
3883 } break; | |
3884 | |
4333 | 3885 case 0x09: { /* Message from the Godly ICQ server itself, I think */ |
3886 if (i >= 5) { | |
3887 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
|
3888 gaim_notify_info(gc, NULL, "ICQ Server Message", dialog_msg); |
4333 | 3889 g_free(dialog_msg); |
3890 } | |
3891 } break; | |
3892 | |
4173 | 3893 case 0x0d: { /* Someone has sent you a pager message from http://www.icq.com/your_uin */ |
4076 | 3894 if (i >= 6) { |
4194 | 3895 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
|
3896 gaim_notify_info(gc, NULL, "ICQ Page", dialog_msg); |
4076 | 3897 g_free(dialog_msg); |
3898 } | |
4075 | 3899 } break; |
3900 | |
4173 | 3901 case 0x0e: { /* Someone has emailed you at your_uin@pager.icq.com */ |
4076 | 3902 if (i >= 6) { |
4308 | 3903 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
|
3904 gaim_notify_info(gc, NULL, "ICQ Email", dialog_msg); |
4076 | 3905 g_free(dialog_msg); |
3906 } | |
4075 | 3907 } break; |
3908 | |
4173 | 3909 case 0x12: { |
3141 | 3910 /* Ack for authorizing/denying someone. Or possibly an ack for sending any system notice */ |
7023 | 3911 /* Someone added you to their buddy list? */ |
3141 | 3912 } break; |
3913 | |
7023 | 3914 case 0x13: { /* Someone has sent you some ICQ buddies */ |
7631 | 3915 guint i, num; |
3453 | 3916 gchar **text; |
4173 | 3917 text = g_strsplit(args->msg, "\376", 0); |
3453 | 3918 if (text) { |
3919 num = 0; | |
3920 for (i=0; i<strlen(text[0]); i++) | |
3921 num = num*10 + text[0][i]-48; | |
3922 for (i=0; i<num; i++) { | |
4230 | 3923 struct name_data *data = g_new(struct name_data, 1); |
7023 | 3924 gchar *message = g_strdup_printf(_("ICQ user %u has sent you a buddy: %s (%s)"), args->uin, text[i*2+2], text[i*2+1]); |
3453 | 3925 data->gc = gc; |
4790 | 3926 data->name = g_strdup(text[i*2+1]); |
3927 data->nick = g_strdup(text[i*2+2]); | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3928 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3929 gaim_request_action(gc, NULL, message, |
7023 | 3930 _("Do you want to add this buddy " |
3931 "to your buddy list?"), | |
9972 | 3932 GAIM_DEFAULT_ACTION_NONE, data, 2, |
7023 | 3933 _("Add"), G_CALLBACK(gaim_icq_buddyadd), |
5836 | 3934 _("Decline"), G_CALLBACK(oscar_free_name_data)); |
3453 | 3935 g_free(message); |
3936 } | |
3937 g_strfreev(text); | |
3938 } | |
3939 } break; | |
3940 | |
7023 | 3941 case 0x1a: { /* Someone has sent you a greeting card or requested buddies? */ |
3453 | 3942 /* This is boring and silly. */ |
3943 } break; | |
3944 | |
3141 | 3945 default: { |
8660 | 3946 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3947 "Received a channel 4 message of unknown type " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3948 "(type 0x%02hhx).\n", args->type); |
3141 | 3949 } break; |
3950 } | |
3951 | |
4076 | 3952 g_strfreev(msg1); |
3953 g_strfreev(msg2); | |
3954 | |
3141 | 3955 return 1; |
3956 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3957 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3958 static int gaim_parse_incoming_im(aim_session_t *sess, aim_frame_t *fr, ...) { |
4200 | 3959 fu16_t channel; |
3960 int ret = 0; | |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3961 aim_userinfo_t *userinfo; |
2086 | 3962 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3963 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3964 va_start(ap, fr); |
4200 | 3965 channel = (fu16_t)va_arg(ap, unsigned int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3966 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 3967 |
3141 | 3968 switch (channel) { |
3969 case 1: { /* standard message */ | |
3970 struct aim_incomingim_ch1_args *args; | |
3971 args = va_arg(ap, struct aim_incomingim_ch1_args *); | |
3972 ret = incomingim_chan1(sess, fr->conn, userinfo, args); | |
3973 } break; | |
3974 | |
8735
92cbf9713795
[gaim-migrate @ 9490]
Christian Hammond <chipx86@chipx86.com>
parents:
8733
diff
changeset
|
3975 case 2: { /* rendezvous */ |
3141 | 3976 struct aim_incomingim_ch2_args *args; |
3977 args = va_arg(ap, struct aim_incomingim_ch2_args *); | |
3978 ret = incomingim_chan2(sess, fr->conn, userinfo, args); | |
3979 } break; | |
3980 | |
3981 case 4: { /* ICQ */ | |
3982 struct aim_incomingim_ch4_args *args; | |
3983 args = va_arg(ap, struct aim_incomingim_ch4_args *); | |
4075 | 3984 ret = incomingim_chan4(sess, fr->conn, userinfo, args, 0); |
3141 | 3985 } break; |
3986 | |
3987 default: { | |
8660 | 3988 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3989 "ICBM received on unsupported channel (channel " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3990 "0x%04hx).", channel); |
3141 | 3991 } break; |
2086 | 3992 } |
3993 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3994 va_end(ap); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3995 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3996 return ret; |
2086 | 3997 } |
3998 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3999 static int gaim_parse_misses(aim_session_t *sess, aim_frame_t *fr, ...) { |
8733 | 4000 GaimConnection *gc = sess->aux_data; |
4001 GaimAccount *account = gaim_connection_get_account(gc); | |
5420 | 4002 char *buf; |
2086 | 4003 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4004 fu16_t chan, nummissed, reason; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4005 aim_userinfo_t *userinfo; |
2086 | 4006 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4007 va_start(ap, fr); |
4200 | 4008 chan = (fu16_t)va_arg(ap, unsigned int); |
4009 userinfo = va_arg(ap, aim_userinfo_t *); | |
4010 nummissed = (fu16_t)va_arg(ap, unsigned int); | |
4011 reason = (fu16_t)va_arg(ap, unsigned int); | |
2086 | 4012 va_end(ap); |
4013 | |
4014 switch(reason) { | |
5420 | 4015 case 0: /* Invalid (0) */ |
4016 buf = g_strdup_printf( | |
4017 ngettext( | |
4276 | 4018 "You missed %hu message from %s because it was invalid.", |
4019 "You missed %hu messages from %s because they were invalid.", | |
4020 nummissed), | |
4282 | 4021 nummissed, |
4022 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4023 break; |
5420 | 4024 case 1: /* Message too large */ |
4025 buf = g_strdup_printf( | |
4026 ngettext( | |
4276 | 4027 "You missed %hu message from %s because it was too large.", |
4028 "You missed %hu messages from %s because they were too large.", | |
4029 nummissed), | |
4282 | 4030 nummissed, |
4031 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4032 break; |
5420 | 4033 case 2: /* Rate exceeded */ |
4034 buf = g_strdup_printf( | |
4035 ngettext( | |
4276 | 4036 "You missed %hu message from %s because the rate limit has been exceeded.", |
4037 "You missed %hu messages from %s because the rate limit has been exceeded.", | |
4038 nummissed), | |
4282 | 4039 nummissed, |
4040 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4041 break; |
5420 | 4042 case 3: /* Evil Sender */ |
4043 buf = g_strdup_printf( | |
4044 ngettext( | |
4276 | 4045 "You missed %hu message from %s because he/she was too evil.", |
4046 "You missed %hu messages from %s because he/she was too evil.", | |
4047 nummissed), | |
4282 | 4048 nummissed, |
4049 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4050 break; |
5420 | 4051 case 4: /* Evil Receiver */ |
4052 buf = g_strdup_printf( | |
4053 ngettext( | |
4276 | 4054 "You missed %hu message from %s because you are too evil.", |
4055 "You missed %hu messages from %s because you are too evil.", | |
4056 nummissed), | |
4282 | 4057 nummissed, |
4058 userinfo->sn); | |
2086 | 4059 break; |
4060 default: | |
5420 | 4061 buf = g_strdup_printf( |
4062 ngettext( | |
4276 | 4063 "You missed %hu message from %s for an unknown reason.", |
4064 "You missed %hu messages from %s for an unknown reason.", | |
4065 nummissed), | |
4282 | 4066 nummissed, |
4067 userinfo->sn); | |
2086 | 4068 break; |
4069 } | |
8733 | 4070 |
9627 | 4071 if (!gaim_conv_present_error(userinfo->sn, account, buf)) |
8733 | 4072 gaim_notify_error(sess->aux_data, NULL, buf, NULL); |
5420 | 4073 g_free(buf); |
2086 | 4074 |
4075 return 1; | |
4076 } | |
4077 | |
4194 | 4078 static int gaim_parse_clientauto_ch2(aim_session_t *sess, const char *who, fu16_t reason, const char *cookie) { |
5575 | 4079 GaimConnection *gc = sess->aux_data; |
7283 | 4080 OscarData *od = gc->proto_data; |
4617 | 4081 |
4082 /* BBB */ | |
3630 | 4083 switch (reason) { |
4151 | 4084 case 3: { /* Decline sendfile. */ |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
4085 GaimXfer *xfer; |
8971 | 4086 struct oscar_direct_im *dim; |
4087 | |
8660 | 4088 gaim_debug_info("oscar", |
9070 | 4089 "AAA - Other user declined some sort of direct " |
8971 | 4090 "connect attempt (automaticly?)\n"); |
4617 | 4091 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
|
4092 gaim_xfer_cancel_remote(xfer); |
8971 | 4093 else if ((dim = oscar_direct_im_find(od, who))) { |
4094 /* AAA should use find by cookie or something here */ | |
4095 oscar_direct_im_disconnect(od, dim); | |
4096 } | |
4151 | 4097 } break; |
4098 | |
4099 default: { | |
8660 | 4100 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4101 "Received an unknown rendezvous client auto-response " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4102 "from %s. Type 0x%04hx\n", who, reason); |
4151 | 4103 } |
3630 | 4104 |
4105 } | |
4106 | |
4107 return 0; | |
4108 } | |
4109 | |
4194 | 4110 static int gaim_parse_clientauto_ch4(aim_session_t *sess, char *who, fu16_t reason, fu32_t state, char *msg) { |
5575 | 4111 GaimConnection *gc = sess->aux_data; |
4151 | 4112 |
4113 switch(reason) { | |
4114 case 0x0003: { /* Reply from an ICQ status message request */ | |
9244 | 4115 char *title, *statusmsg, **splitmsg, *dialogmsg; |
4116 | |
4117 title = g_strdup_printf(_("Info for %s"), who); | |
4151 | 4118 |
4119 /* Split at (carriage return/newline)'s, then rejoin later with BRs between. */ | |
9244 | 4120 statusmsg = oscar_icqstatus(state); |
4151 | 4121 splitmsg = g_strsplit(msg, "\r\n", 0); |
9244 | 4122 dialogmsg = g_strdup_printf(_("<B>UIN:</B> %s<BR><B>Status:</B> %s<HR>%s"), who, statusmsg, g_strjoinv("<BR>", splitmsg)); |
4123 g_free(statusmsg); | |
4151 | 4124 g_strfreev(splitmsg); |
9244 | 4125 |
9797 | 4126 gaim_notify_userinfo(gc, who, title, _("Buddy Information"), NULL, dialogmsg, NULL, NULL); |
9244 | 4127 |
4128 g_free(title); | |
4129 g_free(dialogmsg); | |
4151 | 4130 } break; |
4131 | |
4132 default: { | |
8660 | 4133 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4134 "Received an unknown client auto-response from %s. " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4135 "Type 0x%04hx\n", who, reason); |
4151 | 4136 } break; |
4137 } /* end of switch */ | |
4138 | |
4139 return 0; | |
4140 } | |
4141 | |
3212 | 4142 static int gaim_parse_clientauto(aim_session_t *sess, aim_frame_t *fr, ...) { |
4143 va_list ap; | |
4144 fu16_t chan, reason; | |
4145 char *who; | |
4146 | |
4147 va_start(ap, fr); | |
4200 | 4148 chan = (fu16_t)va_arg(ap, unsigned int); |
3212 | 4149 who = va_arg(ap, char *); |
4200 | 4150 reason = (fu16_t)va_arg(ap, unsigned int); |
3212 | 4151 |
3952 | 4152 if (chan == 0x0002) { /* File transfer declined */ |
3630 | 4153 char *cookie = va_arg(ap, char *); |
4151 | 4154 return gaim_parse_clientauto_ch2(sess, who, reason, cookie); |
3952 | 4155 } else if (chan == 0x0004) { /* ICQ message */ |
4200 | 4156 fu32_t state = 0; |
4151 | 4157 char *msg = NULL; |
4158 if (reason == 0x0003) { | |
4200 | 4159 state = va_arg(ap, fu32_t); |
4151 | 4160 msg = va_arg(ap, char *); |
4161 } | |
4162 return gaim_parse_clientauto_ch4(sess, who, reason, state, msg); | |
4163 } | |
3952 | 4164 |
3212 | 4165 va_end(ap); |
4166 | |
4167 return 1; | |
4168 } | |
4169 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4170 static int gaim_parse_genericerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 4171 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4172 fu16_t reason; |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
4173 char *m; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4174 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4175 va_start(ap, fr); |
4199 | 4176 reason = (fu16_t) va_arg(ap, unsigned int); |
2086 | 4177 va_end(ap); |
4178 | |
8660 | 4179 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4180 "snac threw error (reason 0x%04hx: %s)\n", reason, |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4181 (reason < msgerrreasonlen) ? msgerrreason[reason] : "unknown"); |
2086 | 4182 |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
4183 m = g_strdup_printf(_("SNAC threw error: %s\n"), |
5411 | 4184 reason < msgerrreasonlen ? _(msgerrreason[reason]) : _("Unknown error")); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4185 gaim_notify_error(sess->aux_data, NULL, m, NULL); |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
4186 g_free(m); |
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
4187 |
2086 | 4188 return 1; |
4189 } | |
4190 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4191 static int gaim_parse_msgerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
9627 | 4192 GaimConnection *gc = sess->aux_data; |
4617 | 4193 #if 0 |
7283 | 4194 OscarData *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
4195 GaimXfer *xfer; |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
4196 #endif |
4617 | 4197 va_list ap; |
4198 fu16_t reason; | |
4199 char *data, *buf; | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
4200 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4201 va_start(ap, fr); |
4617 | 4202 reason = (fu16_t)va_arg(ap, unsigned int); |
3752 | 4203 data = va_arg(ap, char *); |
2086 | 4204 va_end(ap); |
4205 | |
8660 | 4206 gaim_debug_error("oscar", |
10130 | 4207 "Message error with data %s and reason %hu\n", |
4208 (data != NULL ? data : ""), reason); | |
4617 | 4209 |
4210 /* BBB */ | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
4211 #if 0 |
4617 | 4212 /* If this was a file transfer request, data is a cookie */ |
4213 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
|
4214 gaim_xfer_cancel_remote(xfer); |
3630 | 4215 return 1; |
4216 } | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
4217 #endif |
3630 | 4218 |
4617 | 4219 /* Data is assumed to be the destination sn */ |
9826 | 4220 buf = g_strdup_printf(_("Unable to send message: %s"), (reason < msgerrreasonlen) ? msgerrreason[reason] : _("Unknown reason.")); |
4221 if (!gaim_conv_present_error(data, gaim_connection_get_account(gc), buf)) { | |
4222 g_free(buf); | |
4223 buf = g_strdup_printf(_("Unable to send message to %s:"), data ? data : "(unknown)"); | |
9627 | 4224 gaim_notify_error(sess->aux_data, NULL, buf, |
9826 | 4225 (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("Unknown reason.")); |
4226 } | |
4227 g_free(buf); | |
4228 | |
2086 | 4229 return 1; |
4230 } | |
4231 | |
3595 | 4232 static int gaim_parse_mtn(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4233 GaimConnection *gc = sess->aux_data; |
3595 | 4234 va_list ap; |
4235 fu16_t type1, type2; | |
4236 char *sn; | |
4237 | |
4238 va_start(ap, fr); | |
4199 | 4239 type1 = (fu16_t) va_arg(ap, unsigned int); |
3595 | 4240 sn = va_arg(ap, char *); |
4199 | 4241 type2 = (fu16_t) va_arg(ap, unsigned int); |
3595 | 4242 va_end(ap); |
4243 | |
4244 switch (type2) { | |
4245 case 0x0000: { /* Text has been cleared */ | |
4246 serv_got_typing_stopped(gc, sn); | |
4247 } break; | |
4248 | |
4249 case 0x0001: { /* Paused typing */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
4250 serv_got_typing(gc, sn, 0, GAIM_TYPED); |
3595 | 4251 } break; |
4252 | |
4253 case 0x0002: { /* Typing */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
4254 serv_got_typing(gc, sn, 0, GAIM_TYPING); |
3595 | 4255 } break; |
4256 | |
4257 default: { | |
8660 | 4258 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 | 4259 } break; |
4260 } | |
4261 | |
4262 return 1; | |
4263 } | |
4264 | |
7141 | 4265 /* |
4266 * We get this error when there was an error in the locate family. This | |
7259 | 4267 * happens when you request info of someone who is offline. |
7141 | 4268 */ |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4269 static int gaim_parse_locerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
9826 | 4270 gchar *buf; |
2086 | 4271 va_list ap; |
5420 | 4272 fu16_t reason; |
2086 | 4273 char *destn; |
4274 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4275 va_start(ap, fr); |
4199 | 4276 reason = (fu16_t) va_arg(ap, unsigned int); |
2086 | 4277 destn = va_arg(ap, char *); |
4278 va_end(ap); | |
4279 | |
7781 | 4280 if (destn == NULL) |
7793 | 4281 return 1; |
10560 | 4282 |
9826 | 4283 buf = g_strdup_printf(_("User information not available: %s"), (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("Unknown reason.")); |
4284 if (!gaim_conv_present_error(destn, gaim_connection_get_account((GaimConnection*)sess->aux_data), buf)) { | |
4285 g_free(buf); | |
9627 | 4286 buf = g_strdup_printf(_("User information for %s unavailable:"), destn); |
9826 | 4287 gaim_notify_error(sess->aux_data, NULL, buf, (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("Unknown reason.")); |
4288 } | |
4289 g_free(buf); | |
2086 | 4290 |
4291 return 1; | |
4292 } | |
4293 | |
7011 | 4294 static int gaim_parse_userinfo(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4295 GaimConnection *gc = sess->aux_data; |
8700 | 4296 GaimAccount *account = gaim_connection_get_account(gc); |
10567 | 4297 OscarData *od = gc->proto_data; |
8700 | 4298 GString *str; |
9244 | 4299 gchar *tmp = NULL, *info_utf8 = NULL, *away_utf8 = NULL, *title = NULL; |
4791 | 4300 va_list ap; |
7011 | 4301 aim_userinfo_t *userinfo; |
2086 | 4302 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4303 va_start(ap, fr); |
7011 | 4304 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 4305 va_end(ap); |
4306 | |
8700 | 4307 str = g_string_new(""); |
4308 g_string_append_printf(str, "<b>%s:</b> %s", _("Screen Name"), userinfo->sn); | |
4309 g_string_append_printf(str, "\n<br><b>%s</b>: %d%%", _("Warning Level"), (int)((userinfo->warnlevel/10.0) + 0.5)); | |
7011 | 4310 |
10116 | 4311 if (userinfo->present & AIM_USERINFO_PRESENT_ONLINESINCE) { |
10567 | 4312 time_t t = userinfo->onlinesince - od->timeoffset; |
10116 | 4313 oscar_string_append(str, "\n<br>", _("Online Since"), ctime(&t)); |
4314 } | |
4315 | |
4316 if (userinfo->present & AIM_USERINFO_PRESENT_MEMBERSINCE) { | |
10567 | 4317 time_t t = userinfo->membersince - od->timeoffset; |
10116 | 4318 oscar_string_append(str, "\n<br>", _("Member Since"), ctime(&t)); |
4319 } | |
7011 | 4320 |
4321 if (userinfo->present & AIM_USERINFO_PRESENT_IDLE) { | |
8700 | 4322 tmp = gaim_str_seconds_to_string(userinfo->idletime*60); |
8701 | 4323 oscar_string_append(str, "\n<br>", _("Idle"), tmp); |
8700 | 4324 g_free(tmp); |
4325 } | |
4326 | |
8701 | 4327 oscar_string_append_info(gc, str, "\n<br>", NULL, userinfo); |
7011 | 4328 |
4329 if ((userinfo->flags & AIM_FLAG_AWAY) && (userinfo->away_len > 0) && (userinfo->away != NULL) && (userinfo->away_encoding != NULL)) { | |
8700 | 4330 tmp = oscar_encoding_extract(userinfo->away_encoding); |
4331 away_utf8 = oscar_encoding_to_utf8(tmp, userinfo->away, userinfo->away_len); | |
4332 g_free(tmp); | |
7011 | 4333 if (away_utf8 != NULL) { |
8700 | 4334 g_string_append_printf(str, "\n<hr>%s", away_utf8); |
7011 | 4335 g_free(away_utf8); |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4336 } |
7011 | 4337 } |
4338 | |
4339 if ((userinfo->info_len > 0) && (userinfo->info != NULL) && (userinfo->info_encoding != NULL)) { | |
8700 | 4340 tmp = oscar_encoding_extract(userinfo->info_encoding); |
4341 info_utf8 = oscar_encoding_to_utf8(tmp, userinfo->info, userinfo->info_len); | |
4342 g_free(tmp); | |
7011 | 4343 if (info_utf8 != NULL) { |
8700 | 4344 g_string_append_printf(str, "\n<hr>%s", info_utf8); |
7011 | 4345 g_free(info_utf8); |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4346 } |
7011 | 4347 } |
4348 | |
8701 | 4349 tmp = gaim_str_sub_away_formatters(str->str, gaim_account_get_username(account)); |
8700 | 4350 g_string_free(str, TRUE); |
9244 | 4351 title = g_strdup_printf(_("Info for %s"), userinfo->sn); |
9797 | 4352 gaim_notify_userinfo(gc, userinfo->sn, title, _("Buddy Information"), NULL, tmp, NULL, NULL); |
9244 | 4353 g_free(title); |
8700 | 4354 g_free(tmp); |
4151 | 4355 |
2086 | 4356 return 1; |
4357 } | |
4358 | |
8341 | 4359 static gboolean gaim_reqinfo_timeout_cb(void *data) |
4360 { | |
4361 aim_session_t *sess = data; | |
4362 GaimConnection *gc = sess->aux_data; | |
4363 OscarData *od = (OscarData *)gc->proto_data; | |
4364 | |
4365 aim_locate_dorequest(data); | |
4366 od->getinfotimer = 0; | |
4367 | |
4368 return FALSE; | |
4369 } | |
4370 | |
4371 static int gaim_reqinfo_timeout(aim_session_t *sess, aim_frame_t *fr, ...) | |
4372 { | |
4373 GaimConnection *gc = sess->aux_data; | |
4374 OscarData *od = (OscarData *)gc->proto_data; | |
4375 | |
4376 /* | |
4377 * Wait a little while then call aim_locate_dorequest(sess). This keeps | |
4378 * us from hitting the rate limit due to request away messages and info | |
4379 * too quickly. | |
4380 */ | |
4381 if (od->getinfotimer == 0) | |
10198 | 4382 od->getinfotimer = gaim_timeout_add(1500, gaim_reqinfo_timeout_cb, sess); |
8341 | 4383 |
4384 return 1; | |
4385 } | |
4386 | |
4387 static int gaim_parse_motd(aim_session_t *sess, aim_frame_t *fr, ...) | |
4388 { | |
2086 | 4389 char *msg; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4390 fu16_t id; |
2086 | 4391 va_list ap; |
4392 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4393 va_start(ap, fr); |
4199 | 4394 id = (fu16_t) va_arg(ap, unsigned int); |
2086 | 4395 msg = va_arg(ap, char *); |
4396 va_end(ap); | |
4397 | |
8660 | 4398 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4399 "MOTD: %s (%hu)\n", msg ? msg : "Unknown", id); |
2092
59b0377d18aa
[gaim-migrate @ 2102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
4400 if (id < 4) |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4401 gaim_notify_warning(sess->aux_data, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4402 _("Your AIM connection may be lost."), NULL); |
2086 | 4403 |
4404 return 1; | |
4405 } | |
4406 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4407 static int gaim_chatnav_info(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 4408 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4409 fu16_t type; |
5575 | 4410 GaimConnection *gc = sess->aux_data; |
7283 | 4411 OscarData *od = (OscarData *)gc->proto_data; |
2086 | 4412 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4413 va_start(ap, fr); |
4199 | 4414 type = (fu16_t) va_arg(ap, unsigned int); |
2086 | 4415 |
4416 switch(type) { | |
4417 case 0x0002: { | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4418 fu8_t maxrooms; |
2086 | 4419 struct aim_chat_exchangeinfo *exchanges; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4420 int exchangecount, i; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4421 |
4199 | 4422 maxrooms = (fu8_t) va_arg(ap, unsigned int); |
2086 | 4423 exchangecount = va_arg(ap, int); |
4424 exchanges = va_arg(ap, struct aim_chat_exchangeinfo *); | |
4425 | |
8660 | 4426 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4427 "chat info: Chat Rights:\n"); |
8660 | 4428 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4429 "chat info: \tMax Concurrent Rooms: %hhd\n", maxrooms); |
8660 | 4430 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4431 "chat info: \tExchange List: (%d total)\n", exchangecount); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4432 for (i = 0; i < exchangecount; i++) |
8660 | 4433 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4434 "chat info: \t\t%hu %s\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4435 exchanges[i].number, exchanges[i].name ? exchanges[i].name : ""); |
4617 | 4436 while (od->create_rooms) { |
4437 struct create_room *cr = od->create_rooms->data; | |
8660 | 4438 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4439 "creating room %s\n", cr->name); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
4440 aim_chatnav_createroom(sess, fr->conn, cr->name, cr->exchange); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
4441 g_free(cr->name); |
4617 | 4442 od->create_rooms = g_slist_remove(od->create_rooms, cr); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
4443 g_free(cr); |
2086 | 4444 } |
4445 } | |
4446 break; | |
4447 case 0x0008: { | |
4448 char *fqcn, *name, *ck; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4449 fu16_t instance, flags, maxmsglen, maxoccupancy, unknown, exchange; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4450 fu8_t createperms; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4451 fu32_t createtime; |
2086 | 4452 |
4453 fqcn = va_arg(ap, char *); | |
4200 | 4454 instance = (fu16_t)va_arg(ap, unsigned int); |
4455 exchange = (fu16_t)va_arg(ap, unsigned int); | |
4456 flags = (fu16_t)va_arg(ap, unsigned int); | |
4457 createtime = va_arg(ap, fu32_t); | |
4458 maxmsglen = (fu16_t)va_arg(ap, unsigned int); | |
4459 maxoccupancy = (fu16_t)va_arg(ap, unsigned int); | |
4460 createperms = (fu8_t)va_arg(ap, unsigned int); | |
4461 unknown = (fu16_t)va_arg(ap, unsigned int); | |
4462 name = va_arg(ap, char *); | |
4463 ck = va_arg(ap, char *); | |
4194 | 4464 |
8660 | 4465 gaim_debug_misc("oscar", |
5556 | 4466 "created room: %s %hu %hu %hu %u %hu %hu %hhu %hu %s %s\n", |
2086 | 4467 fqcn, |
4468 exchange, instance, flags, | |
4469 createtime, | |
4470 maxmsglen, maxoccupancy, createperms, unknown, | |
4471 name, ck); | |
4617 | 4472 aim_chat_join(od->sess, od->conn, exchange, ck, instance); |
2086 | 4473 } |
4474 break; | |
4475 default: | |
8660 | 4476 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4477 "chatnav info: unknown type (%04hx)\n", type); |
2086 | 4478 break; |
4479 } | |
4194 | 4480 |
4481 va_end(ap); | |
4482 | |
2086 | 4483 return 1; |
4484 } | |
4485 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
4486 static int gaim_conv_chat_join(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 4487 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4488 int count, i; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4489 aim_userinfo_t *info; |
5575 | 4490 GaimConnection *g = sess->aux_data; |
2086 | 4491 |
4492 struct chat_connection *c = NULL; | |
4493 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4494 va_start(ap, fr); |
2086 | 4495 count = va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4496 info = va_arg(ap, aim_userinfo_t *); |
2086 | 4497 va_end(ap); |
4498 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4499 c = find_oscar_chat_by_conn(g, fr->conn); |
2086 | 4500 if (!c) |
4501 return 1; | |
4502 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4503 for (i = 0; i < count; i++) |
9846 | 4504 gaim_conv_chat_add_user(GAIM_CONV_CHAT(c->conv), info[i].sn, NULL, GAIM_CBFLAGS_NONE, TRUE); |
2086 | 4505 |
4506 return 1; | |
4507 } | |
4508 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
4509 static int gaim_conv_chat_leave(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 4510 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4511 int count, i; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4512 aim_userinfo_t *info; |
5575 | 4513 GaimConnection *g = sess->aux_data; |
2086 | 4514 |
4515 struct chat_connection *c = NULL; | |
4516 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4517 va_start(ap, fr); |
2086 | 4518 count = va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4519 info = va_arg(ap, aim_userinfo_t *); |
2086 | 4520 va_end(ap); |
4521 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4522 c = find_oscar_chat_by_conn(g, fr->conn); |
2086 | 4523 if (!c) |
4524 return 1; | |
4525 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4526 for (i = 0; i < count; i++) |
8733 | 4527 gaim_conv_chat_remove_user(GAIM_CONV_CHAT(c->conv), info[i].sn, NULL); |
2086 | 4528 |
4529 return 1; | |
4530 } | |
4531 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
4532 static int gaim_conv_chat_info_update(aim_session_t *sess, aim_frame_t *fr, ...) { |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4533 va_list ap; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4534 aim_userinfo_t *userinfo; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4535 struct aim_chat_roominfo *roominfo; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4536 char *roomname; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4537 int usercount; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4538 char *roomdesc; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4539 fu16_t unknown_c9, unknown_d2, unknown_d5, maxmsglen, maxvisiblemsglen; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4540 fu32_t creationtime; |
5575 | 4541 GaimConnection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4542 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
|
4543 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4544 va_start(ap, fr); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4545 roominfo = va_arg(ap, struct aim_chat_roominfo *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4546 roomname = va_arg(ap, char *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4547 usercount= va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4548 userinfo = va_arg(ap, aim_userinfo_t *); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4549 roomdesc = va_arg(ap, char *); |
4200 | 4550 unknown_c9 = (fu16_t)va_arg(ap, unsigned int); |
4551 creationtime = va_arg(ap, fu32_t); | |
4552 maxmsglen = (fu16_t)va_arg(ap, unsigned int); | |
4553 unknown_d2 = (fu16_t)va_arg(ap, unsigned int); | |
4554 unknown_d5 = (fu16_t)va_arg(ap, unsigned int); | |
4555 maxvisiblemsglen = (fu16_t)va_arg(ap, unsigned int); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4556 va_end(ap); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4557 |
8660 | 4558 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4559 "inside chat_info_update (maxmsglen = %hu, maxvislen = %hu)\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4560 maxmsglen, maxvisiblemsglen); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4561 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4562 ccon->maxlen = maxmsglen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4563 ccon->maxvis = maxvisiblemsglen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4564 |
2086 | 4565 return 1; |
4566 } | |
4567 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
4568 static int gaim_conv_chat_incoming_msg(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4569 GaimConnection *gc = sess->aux_data; |
8225 | 4570 struct chat_connection *ccon = find_oscar_chat_by_conn(gc, fr->conn); |
4571 gchar *utf8; | |
2086 | 4572 va_list ap; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4573 aim_userinfo_t *info; |
8225 | 4574 int len; |
2086 | 4575 char *msg; |
8219 | 4576 char *charset; |
2086 | 4577 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4578 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4579 info = va_arg(ap, aim_userinfo_t *); |
8219 | 4580 len = va_arg(ap, int); |
4194 | 4581 msg = va_arg(ap, char *); |
8219 | 4582 charset = va_arg(ap, char *); |
4194 | 4583 va_end(ap); |
2086 | 4584 |
8225 | 4585 utf8 = oscar_encoding_to_utf8(charset, msg, len); |
8667 | 4586 if (utf8 == NULL) |
4587 /* The conversion failed! */ | |
8668 | 4588 utf8 = g_strdup(_("[Unable to display a message from this user because it contained invalid characters.]")); |
8225 | 4589 serv_got_chat_in(gc, ccon->id, info->sn, 0, utf8, time((time_t)NULL)); |
4590 g_free(utf8); | |
2086 | 4591 |
4592 return 1; | |
4593 } | |
4594 | |
3694 | 4595 static int gaim_email_parseupdate(aim_session_t *sess, aim_frame_t *fr, ...) { |
4596 va_list ap; | |
5575 | 4597 GaimConnection *gc = sess->aux_data; |
3694 | 4598 struct aim_emailinfo *emailinfo; |
3725 | 4599 int havenewmail; |
7297 | 4600 char *alertitle, *alerturl; |
3694 | 4601 |
4602 va_start(ap, fr); | |
4603 emailinfo = va_arg(ap, struct aim_emailinfo *); | |
3725 | 4604 havenewmail = va_arg(ap, int); |
7301 | 4605 alertitle = va_arg(ap, char *); |
4606 alerturl = va_arg(ap, char *); | |
3694 | 4607 va_end(ap); |
4608 | |
9661 | 4609 if ((emailinfo != NULL) && gaim_account_get_check_mail(gc->account)) { |
4610 gchar *to = g_strdup_printf("%s%s%s", gaim_account_get_username(gaim_connection_get_account(gc)), | |
4611 emailinfo->domain ? "@" : "", | |
4612 emailinfo->domain ? emailinfo->domain : ""); | |
5542 | 4613 if (emailinfo->unread && havenewmail) |
4614 gaim_notify_emails(gc, emailinfo->nummsgs, FALSE, NULL, NULL, (const char **)&to, (const char **)&emailinfo->url, NULL, NULL); | |
5537 | 4615 g_free(to); |
3694 | 4616 } |
10157 | 4617 |
7301 | 4618 if (alertitle) |
8660 | 4619 gaim_debug_misc("oscar", "Got an alert '%s' %s\n", alertitle, alerturl ? alerturl : ""); |
3694 | 4620 |
4621 return 1; | |
4622 } | |
4623 | |
4804 | 4624 static int gaim_icon_error(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4625 GaimConnection *gc = sess->aux_data; |
7283 | 4626 OscarData *od = gc->proto_data; |
4804 | 4627 char *sn; |
4628 | |
4629 sn = od->requesticon->data; | |
8660 | 4630 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4631 "removing %s from hash table\n", sn); |
4804 | 4632 od->requesticon = g_slist_remove(od->requesticon, sn); |
4633 free(sn); | |
4634 | |
4635 if (od->icontimer) | |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
4636 gaim_timeout_remove(od->icontimer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
4637 od->icontimer = gaim_timeout_add(500, gaim_icon_timerfunc, gc); |
4804 | 4638 |
4639 return 1; | |
4640 } | |
4641 | |
4642 static int gaim_icon_parseicon(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 4643 GaimConnection *gc = sess->aux_data; |
7283 | 4644 OscarData *od = gc->proto_data; |
4804 | 4645 GSList *cur; |
4646 va_list ap; | |
4647 char *sn; | |
4853 | 4648 fu8_t *iconcsum, *icon; |
4649 fu16_t iconcsumlen, iconlen; | |
4804 | 4650 |
4651 va_start(ap, fr); | |
4652 sn = va_arg(ap, char *); | |
4853 | 4653 iconcsum = va_arg(ap, fu8_t *); |
4654 iconcsumlen = va_arg(ap, int); | |
4804 | 4655 icon = va_arg(ap, fu8_t *); |
4656 iconlen = va_arg(ap, int); | |
4657 va_end(ap); | |
4658 | |
4853 | 4659 if (iconlen > 0) { |
4660 char *b16; | |
6695 | 4661 GaimBuddy *b = gaim_find_buddy(gc->account, sn); |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
4662 gaim_buddy_icons_set_for_user(gaim_connection_get_account(gc), |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
4663 sn, icon, iconlen); |
7106
db6bd3e794d8
[gaim-migrate @ 7671]
Christian Hammond <chipx86@chipx86.com>
parents:
7098
diff
changeset
|
4664 b16 = gaim_base16_encode(iconcsum, iconcsumlen); |
5129 | 4665 if (b16) { |
7693 | 4666 gaim_blist_node_set_string((GaimBlistNode*)b, "icon_checksum", b16); |
7162 | 4667 g_free(b16); |
5129 | 4668 } |
4853 | 4669 } |
4804 | 4670 |
4671 cur = od->requesticon; | |
4672 while (cur) { | |
4673 char *cursn = cur->data; | |
4674 if (!aim_sncmp(cursn, sn)) { | |
4675 od->requesticon = g_slist_remove(od->requesticon, cursn); | |
4676 free(cursn); | |
4677 cur = od->requesticon; | |
4678 } else | |
4679 cur = cur->next; | |
4680 } | |
4681 | |
4682 if (od->icontimer) | |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
4683 gaim_timeout_remove(od->icontimer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
4684 od->icontimer = gaim_timeout_add(250, gaim_icon_timerfunc, gc); |
4804 | 4685 |
4686 return 1; | |
4687 } | |
4688 | |
4689 static gboolean gaim_icon_timerfunc(gpointer data) { | |
5575 | 4690 GaimConnection *gc = data; |
7283 | 4691 OscarData *od = gc->proto_data; |
7011 | 4692 aim_userinfo_t *userinfo; |
4804 | 4693 aim_conn_t *conn; |
4694 | |
4695 conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_ICON); | |
5892 | 4696 if (!conn) { |
4697 if (!od->iconconnecting) { | |
4698 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_ICON); | |
4699 od->iconconnecting = TRUE; | |
4700 } | |
4804 | 4701 return FALSE; |
4702 } | |
4703 | |
5842 | 4704 if (od->set_icon) { |
6039 | 4705 struct stat st; |
4706 const char *iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc)); | |
4707 if (iconfile == NULL) { | |
8363 | 4708 aim_ssi_delicon(od->sess); |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
4709 } else if (!g_stat(iconfile, &st)) { |
6039 | 4710 char *buf = g_malloc(st.st_size); |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
4711 FILE *file = g_fopen(iconfile, "rb"); |
6039 | 4712 if (file) { |
9532 | 4713 /* XXX - Use g_file_get_contents()? */ |
6039 | 4714 fread(buf, 1, st.st_size, file); |
4715 fclose(file); | |
8660 | 4716 gaim_debug_info("oscar", |
6039 | 4717 "Uploading icon to icon server\n"); |
6879 | 4718 aim_bart_upload(od->sess, buf, st.st_size); |
5842 | 4719 } else |
8660 | 4720 gaim_debug_error("oscar", |
6039 | 4721 "Can't open buddy icon file!\n"); |
4722 g_free(buf); | |
4723 } else { | |
8660 | 4724 gaim_debug_error("oscar", |
6039 | 4725 "Can't stat buddy icon file!\n"); |
5842 | 4726 } |
4727 od->set_icon = FALSE; | |
4728 } | |
4729 | |
4730 if (!od->requesticon) { | |
8660 | 4731 gaim_debug_misc("oscar", |
5842 | 4732 "no more icons to request\n"); |
4733 return FALSE; | |
4734 } | |
4735 | |
7045 | 4736 userinfo = aim_locate_finduserinfo(od->sess, (char *)od->requesticon->data); |
7011 | 4737 if ((userinfo != NULL) && (userinfo->iconcsumlen > 0)) { |
4738 aim_bart_request(od->sess, od->requesticon->data, userinfo->iconcsum, userinfo->iconcsumlen); | |
4804 | 4739 return FALSE; |
4740 } else { | |
4741 char *sn = od->requesticon->data; | |
4742 od->requesticon = g_slist_remove(od->requesticon, sn); | |
4743 free(sn); | |
4744 } | |
4745 | |
4746 return TRUE; | |
4747 } | |
4748 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4749 /* |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4750 * 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
|
4751 */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4752 static int gaim_parse_msgack(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 4753 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4754 fu16_t type; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4755 char *sn; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4756 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4757 va_start(ap, fr); |
4199 | 4758 type = (fu16_t) va_arg(ap, unsigned int); |
2086 | 4759 sn = va_arg(ap, char *); |
4760 va_end(ap); | |
4761 | |
8660 | 4762 gaim_debug_info("oscar", "Sent message to %s.\n", sn); |
2086 | 4763 |
4764 return 1; | |
4765 } | |
4766 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4767 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
|
4768 static const char *codes[5] = { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4769 "invalid", |
4194 | 4770 "change", |
4771 "warning", | |
4772 "limit", | |
4773 "limit cleared", | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4774 }; |
2086 | 4775 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4776 fu16_t code, rateclass; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4777 fu32_t windowsize, clear, alert, limit, disconnect, currentavg, maxavg; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4778 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4779 va_start(ap, fr); |
4200 | 4780 code = (fu16_t)va_arg(ap, unsigned int); |
4781 rateclass= (fu16_t)va_arg(ap, unsigned int); | |
4782 windowsize = va_arg(ap, fu32_t); | |
4783 clear = va_arg(ap, fu32_t); | |
4784 alert = va_arg(ap, fu32_t); | |
4785 limit = va_arg(ap, fu32_t); | |
4786 disconnect = va_arg(ap, fu32_t); | |
4787 currentavg = va_arg(ap, fu32_t); | |
4788 maxavg = va_arg(ap, fu32_t); | |
2086 | 4789 va_end(ap); |
4790 | |
8660 | 4791 gaim_debug_misc("oscar", |
5556 | 4792 "rate %s (param ID 0x%04hx): curavg = %u, maxavg = %u, alert at %u, " |
4793 "clear warning at %u, limit at %u, disconnect at %u (window size = %u)\n", | |
2086 | 4794 (code < 5) ? codes[code] : codes[0], |
4795 rateclass, | |
4796 currentavg, maxavg, | |
4797 alert, clear, | |
4798 limit, disconnect, | |
4799 windowsize); | |
4800 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4801 /* XXX fix these values */ |
2086 | 4802 if (code == AIM_RATE_CODE_CHANGE) { |
4803 if (currentavg >= clear) | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4804 aim_conn_setlatency(fr->conn, 0); |
2086 | 4805 } else if (code == AIM_RATE_CODE_WARNING) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4806 aim_conn_setlatency(fr->conn, windowsize/4); |
2909
48ec70928d7f
[gaim-migrate @ 2922]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2906
diff
changeset
|
4807 } else if (code == AIM_RATE_CODE_LIMIT) { |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4808 gaim_notify_error(sess->aux_data, NULL, _("Rate limiting error."), |
6040 | 4809 _("The last action you attempted could not be " |
4810 "performed because you are over the rate limit. " | |
4811 "Please wait 10 seconds and try again.")); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4812 aim_conn_setlatency(fr->conn, windowsize/2); |
2086 | 4813 } else if (code == AIM_RATE_CODE_CLEARLIMIT) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4814 aim_conn_setlatency(fr->conn, 0); |
2086 | 4815 } |
4816 | |
4817 return 1; | |
4818 } | |
4819 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4820 static int gaim_parse_evilnotify(aim_session_t *sess, aim_frame_t *fr, ...) { |
9982 | 4821 GaimConnection *gc = sess->aux_data; |
4822 GaimAccount *account = gaim_connection_get_account(gc); | |
2086 | 4823 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4824 fu16_t newevil; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4825 aim_userinfo_t *userinfo; |
2086 | 4826 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4827 va_start(ap, fr); |
4199 | 4828 newevil = (fu16_t) va_arg(ap, unsigned int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4829 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 4830 va_end(ap); |
4831 | |
9982 | 4832 /* XXX - What's with the + 0.5? */ |
4833 gaim_prpl_got_account_warning_level(account, (userinfo && userinfo->sn) ? userinfo->sn : NULL, (newevil/10.0) + 0.5); | |
2086 | 4834 |
4835 return 1; | |
4836 } | |
4837 | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4838 static int gaim_selfinfo(aim_session_t *sess, aim_frame_t *fr, ...) { |
9982 | 4839 GaimConnection *gc = sess->aux_data; |
4840 GaimAccount *account = gaim_connection_get_account(gc); | |
10152 | 4841 GaimPresence *presence = gaim_account_get_presence(account); |
9982 | 4842 int warning_level; |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4843 va_list ap; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4844 aim_userinfo_t *info; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4845 |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4846 va_start(ap, fr); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4847 info = va_arg(ap, aim_userinfo_t *); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4848 va_end(ap); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4849 |
9982 | 4850 warning_level = info->warnlevel/10.0 + 0.5; |
4851 | |
10152 | 4852 gaim_presence_set_warning_level(presence, warning_level); |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4853 |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4854 return 1; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4855 } |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4856 |
4649 | 4857 static int gaim_connerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4858 GaimConnection *gc = sess->aux_data; |
7283 | 4859 OscarData *od = gc->proto_data; |
4649 | 4860 va_list ap; |
4861 fu16_t code; | |
4862 char *msg; | |
4863 | |
4864 va_start(ap, fr); | |
4865 code = (fu16_t)va_arg(ap, int); | |
4866 msg = va_arg(ap, char *); | |
4867 va_end(ap); | |
4868 | |
10458 | 4869 gaim_debug_info("oscar", "Disconnected. Code is 0x%04x and msg is %s\n", |
4870 code, (msg != NULL ? msg : "")); | |
4871 | |
4872 g_return_val_if_fail(fr != NULL, 1); | |
4873 g_return_val_if_fail(fr->conn != NULL, 1); | |
4874 | |
4875 if (fr->conn->type == AIM_CONN_TYPE_BOS) { | |
4651 | 4876 if (code == 0x0001) { |
6113 | 4877 gc->wants_to_die = TRUE; |
10715 | 4878 gaim_connection_error(gc, _("You have signed on from another location.")); |
4651 | 4879 } else { |
5579 | 4880 gaim_connection_error(gc, _("You have been signed off for an unknown reason.")); |
4651 | 4881 } |
4666 | 4882 od->killme = TRUE; |
10458 | 4883 } else if (fr->conn->type == AIM_CONN_TYPE_CHAT) { |
4884 struct chat_connection *cc; | |
4885 GaimConversation *conv; | |
4886 | |
4887 cc = find_oscar_chat_by_conn(gc, fr->conn); | |
4888 conv = gaim_find_chat(gc, cc->id); | |
4889 | |
4890 if (conv != NULL) | |
4891 { | |
4892 gchar *buf; | |
4893 buf = g_strdup_printf(_("You have been disconnected from chat " | |
4894 "room %s."), cc->name); | |
4895 gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_ERROR, time(NULL)); | |
4896 g_free(buf); | |
4897 } | |
4898 oscar_chat_kill(gc, cc); | |
4649 | 4899 } |
4900 | |
4901 return 1; | |
4902 } | |
4903 | |
2675 | 4904 static int conninitdone_bos(aim_session_t *sess, aim_frame_t *fr, ...) { |
7283 | 4905 GaimConnection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4906 |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4907 aim_reqpersonalinfo(sess, fr->conn); |
4230 | 4908 |
4909 #ifndef NOSSI | |
8660 | 4910 gaim_debug_info("oscar", "ssi: requesting rights and list\n"); |
4889 | 4911 aim_ssi_reqrights(sess); |
6350 | 4912 aim_ssi_reqdata(sess); |
4230 | 4913 #endif |
4914 | |
7011 | 4915 aim_locate_reqrights(sess); |
7285 | 4916 aim_buddylist_reqrights(sess, fr->conn); |
4617 | 4917 aim_im_reqparams(sess); |
7334 | 4918 aim_bos_reqrights(sess, fr->conn); /* XXX - Don't call this with ssi */ |
4230 | 4919 |
4920 #ifdef NOSSI | |
8660 | 4921 gaim_debug_info("oscar", "bos: requesting rights\n"); |
7334 | 4922 aim_bos_reqrights(sess, fr->conn); |
4230 | 4923 aim_bos_setgroupperm(sess, fr->conn, AIM_FLAG_ALLUSERS); |
4924 aim_bos_setprivacyflags(sess, fr->conn, AIM_PRIVFLAGS_ALLOWIDLE | AIM_PRIVFLAGS_ALLOWMEMBERSINCE); | |
4925 #endif | |
2086 | 4926 |
7283 | 4927 gaim_connection_update_progress(gc, _("Finalizing connection"), 5, OSCAR_CONNECT_STEPS); |
4928 | |
2086 | 4929 return 1; |
4930 } | |
4931 | |
2675 | 4932 static int conninitdone_admin(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4933 GaimConnection *gc = sess->aux_data; |
7283 | 4934 OscarData *od = gc->proto_data; |
2647 | 4935 |
6905 | 4936 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ADM, 0x0003, gaim_info_change, 0); |
4937 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ADM, 0x0005, gaim_info_change, 0); | |
4938 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ADM, 0x0007, gaim_account_confirm, 0); | |
4939 | |
2672 | 4940 aim_clientready(sess, fr->conn); |
8660 | 4941 gaim_debug_info("oscar", "connected to admin\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4942 |
2647 | 4943 if (od->chpass) { |
8660 | 4944 gaim_debug_info("oscar", "changing password\n"); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4945 aim_admin_changepasswd(sess, fr->conn, od->newp, od->oldp); |
2647 | 4946 g_free(od->oldp); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4947 od->oldp = NULL; |
2647 | 4948 g_free(od->newp); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4949 od->newp = NULL; |
2647 | 4950 od->chpass = FALSE; |
4951 } | |
2979 | 4952 if (od->setnick) { |
8660 | 4953 gaim_debug_info("oscar", "formatting screen name\n"); |
2979 | 4954 aim_admin_setnick(sess, fr->conn, od->newsn); |
4955 g_free(od->newsn); | |
4956 od->newsn = NULL; | |
4957 od->setnick = FALSE; | |
4958 } | |
2647 | 4959 if (od->conf) { |
8660 | 4960 gaim_debug_info("oscar", "confirming account\n"); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4961 aim_admin_reqconfirm(sess, fr->conn); |
2647 | 4962 od->conf = FALSE; |
4963 } | |
4964 if (od->reqemail) { | |
8660 | 4965 gaim_debug_info("oscar", "requesting email\n"); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4966 aim_admin_getinfo(sess, fr->conn, 0x0011); |
2647 | 4967 od->reqemail = FALSE; |
4968 } | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4969 if (od->setemail) { |
8660 | 4970 gaim_debug_info("oscar", "setting email\n"); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4971 aim_admin_setemail(sess, fr->conn, od->email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4972 g_free(od->email); |
5497 | 4973 od->email = NULL; |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4974 od->setemail = FALSE; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4975 } |
2647 | 4976 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4977 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4978 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4979 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4980 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
|
4981 struct aim_icbmparameters *params; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4982 va_list ap; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4983 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4984 va_start(ap, fr); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4985 params = va_arg(ap, struct aim_icbmparameters *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4986 va_end(ap); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4987 |
4194 | 4988 /* XXX - evidently this crashes on solaris. i have no clue why |
8660 | 4989 gaim_debug_misc("oscar", "ICBM Parameters: maxchannel = %hu, default flags = 0x%08lx, max msg len = %hu, " |
5556 | 4990 "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
|
4991 params->maxchan, params->flags, params->maxmsglen, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4992 ((float)params->maxsenderwarn)/10.0, ((float)params->maxrecverwarn)/10.0, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4993 params->minmsginterval); |
2427
5bc3b39fc0a5
[gaim-migrate @ 2440]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2421
diff
changeset
|
4994 */ |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4995 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4996 /* Maybe senderwarn and recverwarn should be user preferences... */ |
3595 | 4997 params->flags = 0x0000000b; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4998 params->maxmsglen = 8000; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4999 params->minmsginterval = 0; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5000 |
4617 | 5001 aim_im_setparams(sess, params); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5002 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5003 return 1; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5004 } |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5005 |
2993 | 5006 static int gaim_parse_locaterights(aim_session_t *sess, aim_frame_t *fr, ...) |
5007 { | |
5575 | 5008 GaimConnection *gc = sess->aux_data; |
7283 | 5009 OscarData *od = (OscarData *)gc->proto_data; |
5306 | 5010 va_list ap; |
5011 fu16_t maxsiglen; | |
2993 | 5012 |
5013 va_start(ap, fr); | |
4199 | 5014 maxsiglen = (fu16_t) va_arg(ap, int); |
2993 | 5015 va_end(ap); |
5016 | |
8660 | 5017 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5018 "locate rights: max sig len = %d\n", maxsiglen); |
2993 | 5019 |
4617 | 5020 od->rights.maxsiglen = od->rights.maxawaymsglen = (guint)maxsiglen; |
5021 | |
5022 if (od->icq) | |
7334 | 5023 aim_locate_setcaps(od->sess, caps_icq); |
5301 | 5024 else |
7334 | 5025 aim_locate_setcaps(od->sess, caps_aim); |
5026 oscar_set_info(gc, gc->account->user_info); | |
2993 | 5027 |
5028 return 1; | |
5029 } | |
5030 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5031 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
|
5032 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5033 fu16_t maxbuddies, maxwatchers; |
5575 | 5034 GaimConnection *gc = sess->aux_data; |
7283 | 5035 OscarData *od = (OscarData *)gc->proto_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5036 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5037 va_start(ap, fr); |
4199 | 5038 maxbuddies = (fu16_t) va_arg(ap, unsigned int); |
5039 maxwatchers = (fu16_t) va_arg(ap, unsigned int); | |
2086 | 5040 va_end(ap); |
5041 | |
8660 | 5042 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5043 "buddy list rights: Max buddies = %hu / Max watchers = %hu\n", maxbuddies, maxwatchers); |
2086 | 5044 |
4617 | 5045 od->rights.maxbuddies = (guint)maxbuddies; |
5046 od->rights.maxwatchers = (guint)maxwatchers; | |
2993 | 5047 |
2086 | 5048 return 1; |
5049 } | |
5050 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5051 static int gaim_bosrights(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 5052 GaimConnection *gc = sess->aux_data; |
7283 | 5053 OscarData *od = (OscarData *)gc->proto_data; |
10570 | 5054 GaimAccount *account = gaim_connection_get_account(gc); |
7334 | 5055 va_list ap; |
5056 fu16_t maxpermits, maxdenies; | |
2086 | 5057 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5058 va_start(ap, fr); |
4199 | 5059 maxpermits = (fu16_t) va_arg(ap, unsigned int); |
5060 maxdenies = (fu16_t) va_arg(ap, unsigned int); | |
2086 | 5061 va_end(ap); |
5062 | |
8660 | 5063 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5064 "BOS rights: Max permit = %hu / Max deny = %hu\n", maxpermits, maxdenies); |
2086 | 5065 |
4617 | 5066 od->rights.maxpermits = (guint)maxpermits; |
5067 od->rights.maxdenies = (guint)maxdenies; | |
2993 | 5068 |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
5069 gaim_connection_set_state(gc, GAIM_CONNECTED); |
2993 | 5070 serv_finish_login(gc); |
5071 | |
8660 | 5072 gaim_debug_info("oscar", "buddy list loaded\n"); |
2993 | 5073 |
2672 | 5074 aim_clientready(sess, fr->conn); |
5948 | 5075 aim_srv_setavailmsg(sess, NULL); |
7474 | 5076 aim_srv_setidle(sess, 0); |
4617 | 5077 |
4664 | 5078 if (od->icq) { |
5079 aim_icq_reqofflinemsgs(sess); | |
10570 | 5080 aim_icq_setsecurity(sess, |
5081 gaim_account_get_bool(account, "authorization", OSCAR_DEFAULT_AUTHORIZATION), | |
5082 gaim_account_get_bool(account, "web_aware", OSCAR_DEFAULT_WEB_AWARE), | |
5083 gaim_account_get_bool(account, "hide_ip", OSCAR_DEFAULT_HIDE_IP)); | |
4664 | 5084 } |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5085 |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
5086 aim_reqservice(sess, fr->conn, AIM_CONN_TYPE_CHATNAV); |
4102 | 5087 if (sess->authinfo->email) |
5088 aim_reqservice(sess, fr->conn, AIM_CONN_TYPE_EMAIL); | |
2086 | 5089 |
5090 return 1; | |
5091 } | |
5092 | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5093 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
|
5094 va_list ap; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5095 struct aim_icq_offlinemsg *msg; |
4075 | 5096 struct aim_incomingim_ch4_args args; |
5097 time_t t; | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5098 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5099 va_start(ap, fr); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5100 msg = va_arg(ap, struct aim_icq_offlinemsg *); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5101 va_end(ap); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5102 |
8660 | 5103 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5104 "Received offline message. Converting to channel 4 ICBM...\n"); |
4075 | 5105 args.uin = msg->sender; |
5106 args.type = msg->type; | |
4173 | 5107 args.flags = msg->flags; |
4076 | 5108 args.msglen = msg->msglen; |
4075 | 5109 args.msg = msg->msg; |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
5110 t = gaim_time_build(msg->year, msg->month, msg->day, msg->hour, msg->minute, 0); |
4075 | 5111 incomingim_chan4(sess, fr->conn, NULL, &args, t); |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5112 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5113 return 1; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5114 } |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5115 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5116 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
|
5117 { |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5118 aim_icq_ackofflinemsgs(sess); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5119 return 1; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5120 } |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5121 |
7388 | 5122 #if 0 |
5123 /* | |
7465 | 5124 * Update, 2003-11-09: |
5125 * Joseph S. Myers, a gcc dude, fixed this for gcc 3.4! Rock on! | |
5126 * | |
7388 | 5127 * It may not be my place to do this, but... |
5128 * I feel pretty strongly that the "last 2 digits" warning is ridiculously | |
5129 * stupid, and should not exist for % switches (%x in our case) that request | |
5130 * a year in the preferred representation for the current locale. For that | |
5131 * reason I've chosen to not use this workaround (n., see kluge). | |
5132 * | |
5133 * I have a date. I want to show it to the user in the "preferred" way. | |
5134 * Whether that displays a 2 digit year is perfectly fine--after all, it's | |
5135 * what the locale wanted. | |
5136 * | |
5137 * If I have a necessity for a full representation of the year in the current | |
5138 * locale, then I'll use a switch that returns a full representation of the | |
5139 * year. | |
5140 * | |
5141 * If you think the preferred locale should show 4 digits instead of 2 digits | |
5142 * (because you're anal, or whatever), then change the f***ing locale. | |
5143 * | |
5144 * I guess the bottom line is--I'm trying to show a date to the user how they | |
5145 * prefer to see it, why the hell does gcc want me to change that? | |
7389 | 5146 * |
5147 * See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=3190 | |
5148 * See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=8714 | |
7388 | 5149 */ |
5150 | |
5151 /* | |
5152 * This function was recommended by the STRFTIME(3) man page to remove the | |
7386 | 5153 * "last 2 digits" warning. |
5154 */ | |
10157 | 5155 static size_t my_strftime(char *s, size_t max, const char *fmt, |
7386 | 5156 const struct tm *tm) |
5157 { | |
5158 return strftime(s, max, fmt, tm); | |
5159 } | |
10636 | 5160 |
5161 /* | |
5162 * Before even realizing this was here, I went and did the same thing in util.c. | |
5163 * | |
5164 * Use gaim_strftime() | |
5165 */ | |
5166 | |
7388 | 5167 #endif |
7386 | 5168 |
4624 | 5169 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
|
5170 { |
5575 | 5171 GaimConnection *gc = sess->aux_data; |
8670 | 5172 OscarData *od = (OscarData *)gc->proto_data; |
5173 GaimBuddy *buddy; | |
8853 | 5174 struct buddyinfo *bi = NULL; |
4624 | 5175 gchar who[16]; |
8670 | 5176 GString *str; |
5177 gchar *primary, *utf8; | |
9634 | 5178 const gchar *alias; |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5179 va_list ap; |
4151 | 5180 struct aim_icq_info *info; |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5181 |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5182 va_start(ap, fr); |
4151 | 5183 info = va_arg(ap, struct aim_icq_info *); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5184 va_end(ap); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5185 |
4664 | 5186 if (!info->uin) |
5187 return 0; | |
5188 | |
8670 | 5189 str = g_string_sized_new(100); |
5556 | 5190 g_snprintf(who, sizeof(who), "%u", info->uin); |
8670 | 5191 buddy = gaim_find_buddy(gaim_connection_get_account(gc), who); |
5192 if (buddy != NULL) | |
5193 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(buddy->account, buddy->name)); | |
5194 | |
5195 g_string_append_printf(str, "<b>%s:</b> %s", _("UIN"), who); | |
8701 | 5196 oscar_string_append(str, "\n<br>", _("Nick"), info->nick); |
8670 | 5197 if ((bi != NULL) && (bi->ipaddr != 0)) { |
5198 char *tstr = g_strdup_printf("%hhu.%hhu.%hhu.%hhu", | |
5199 (bi->ipaddr & 0xff000000) >> 24, | |
5200 (bi->ipaddr & 0x00ff0000) >> 16, | |
5201 (bi->ipaddr & 0x0000ff00) >> 8, | |
5202 (bi->ipaddr & 0x000000ff)); | |
8701 | 5203 oscar_string_append(str, "\n<br>", _("IP Address"), tstr); |
8670 | 5204 g_free(tstr); |
5205 } | |
8701 | 5206 oscar_string_append(str, "\n<br>", _("First Name"), info->first); |
5207 oscar_string_append(str, "\n<br>", _("Last Name"), info->last); | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
5208 if (info->email && info->email[0] && (utf8 = gaim_utf8_try_convert(info->email))) { |
8670 | 5209 g_string_append_printf(str, "\n<br><b>%s:</b> <a href=\"mailto:%s\">%s</a>", _("Email Address"), utf8, utf8); |
5210 g_free(utf8); | |
4625 | 5211 } |
5212 if (info->numaddresses && info->email2) { | |
5213 int i; | |
5214 for (i = 0; i < info->numaddresses; i++) { | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
5215 if (info->email2[i] && info->email2[i][0] && (utf8 = gaim_utf8_try_convert(info->email2[i]))) { |
10683 | 5216 g_string_append_printf(str, "\n<br><b>%s:</b> <a href=\"mailto:%s\">%s</a>", _("Email Address"), utf8, utf8); |
8670 | 5217 g_free(utf8); |
4643 | 5218 } |
4625 | 5219 } |
4624 | 5220 } |
8701 | 5221 oscar_string_append(str, "\n<br>", _("Mobile Phone"), info->mobile); |
10022 | 5222 if (info->gender != 0) |
5223 oscar_string_append(str, "\n<br>", _("Gender"), info->gender == 1 ? _("Female") : _("Male")); | |
4624 | 5224 if (info->birthyear || info->birthmonth || info->birthday) { |
4627 | 5225 char date[30]; |
5226 struct tm tm; | |
5227 tm.tm_mday = (int)info->birthday; | |
5228 tm.tm_mon = (int)info->birthmonth-1; | |
5229 tm.tm_year = (int)info->birthyear-1900; | |
10636 | 5230 gaim_strftime(date, sizeof(date), "%x", &tm); |
8701 | 5231 oscar_string_append(str, "\n<br>", _("Birthday"), date); |
4151 | 5232 } |
4624 | 5233 if (info->age) { |
5234 char age[5]; | |
5235 snprintf(age, sizeof(age), "%hhd", info->age); | |
8701 | 5236 oscar_string_append(str, "\n<br>", _("Age"), age); |
4819 | 5237 } |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
5238 if (info->personalwebpage && info->personalwebpage[0] && (utf8 = gaim_utf8_try_convert(info->personalwebpage))) { |
8670 | 5239 g_string_append_printf(str, "\n<br><b>%s:</b> <a href=\"%s\">%s</a>", _("Personal Web Page"), utf8, utf8); |
5240 g_free(utf8); | |
4819 | 5241 } |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
5242 if (info->info && info->info[0] && (utf8 = gaim_utf8_try_convert(info->info))) { |
8670 | 5243 g_string_append_printf(str, "<hr><b>%s:</b><br>%s", _("Additional Information"), utf8); |
5244 g_free(utf8); | |
5245 } | |
10683 | 5246 g_string_append_printf(str, "<hr>"); |
4641 | 5247 if ((info->homeaddr && (info->homeaddr[0])) || (info->homecity && info->homecity[0]) || (info->homestate && info->homestate[0]) || (info->homezip && info->homezip[0])) { |
8670 | 5248 g_string_append_printf(str, "<b>%s:</b>", _("Home Address")); |
8701 | 5249 oscar_string_append(str, "\n<br>", _("Address"), info->homeaddr); |
5250 oscar_string_append(str, "\n<br>", _("City"), info->homecity); | |
5251 oscar_string_append(str, "\n<br>", _("State"), info->homestate); | |
5252 oscar_string_append(str, "\n<br>", _("Zip Code"), info->homezip); | |
10683 | 5253 g_string_append_printf(str, "\n<hr>"); |
4151 | 5254 } |
4641 | 5255 if ((info->workaddr && info->workaddr[0]) || (info->workcity && info->workcity[0]) || (info->workstate && info->workstate[0]) || (info->workzip && info->workzip[0])) { |
8670 | 5256 g_string_append_printf(str, "<b>%s:</b>", _("Work Address")); |
8701 | 5257 oscar_string_append(str, "\n<br>", _("Address"), info->workaddr); |
5258 oscar_string_append(str, "\n<br>", _("City"), info->workcity); | |
5259 oscar_string_append(str, "\n<br>", _("State"), info->workstate); | |
5260 oscar_string_append(str, "\n<br>", _("Zip Code"), info->workzip); | |
10683 | 5261 g_string_append_printf(str, "\n<hr>"); |
4624 | 5262 } |
4641 | 5263 if ((info->workcompany && info->workcompany[0]) || (info->workdivision && info->workdivision[0]) || (info->workposition && info->workposition[0]) || (info->workwebpage && info->workwebpage[0])) { |
8670 | 5264 g_string_append_printf(str, "<b>%s:</b>", _("Work Information")); |
8701 | 5265 oscar_string_append(str, "\n<br>", _("Company"), info->workcompany); |
5266 oscar_string_append(str, "\n<br>", _("Division"), info->workdivision); | |
5267 oscar_string_append(str, "\n<br>", _("Position"), info->workposition); | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
5268 if (info->workwebpage && info->workwebpage[0] && (utf8 = gaim_utf8_try_convert(info->workwebpage))) { |
8670 | 5269 g_string_append_printf(str, "\n<br><b>%s:</b> <a href=\"%s\">%s</a>", _("Web Page"), utf8, utf8); |
5270 g_free(utf8); | |
4624 | 5271 } |
10683 | 5272 g_string_append_printf(str, "\n<hr>"); |
8670 | 5273 } |
5274 | |
9634 | 5275 if (buddy != NULL) |
5276 alias = gaim_buddy_get_alias(buddy); | |
5277 else | |
5278 alias = who; | |
5279 primary = g_strdup_printf(_("ICQ Info for %s"), alias); | |
9810 | 5280 gaim_notify_userinfo(gc, who, NULL, primary, NULL, str->str, NULL, NULL); |
6873 | 5281 g_free(primary); |
8670 | 5282 g_string_free(str, TRUE); |
4151 | 5283 |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5284 return 1; |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5285 } |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5286 |
4759 | 5287 static int gaim_icqalias(aim_session_t *sess, aim_frame_t *fr, ...) |
5288 { | |
5575 | 5289 GaimConnection *gc = sess->aux_data; |
4820 | 5290 gchar who[16], *utf8; |
6695 | 5291 GaimBuddy *b; |
4759 | 5292 va_list ap; |
5293 struct aim_icq_info *info; | |
5294 | |
5295 va_start(ap, fr); | |
5296 info = va_arg(ap, struct aim_icq_info *); | |
5297 va_end(ap); | |
5298 | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
5299 if (info->uin && info->nick && info->nick[0] && (utf8 = gaim_utf8_try_convert(info->nick))) { |
5556 | 5300 g_snprintf(who, sizeof(who), "%u", info->uin); |
4820 | 5301 serv_got_alias(gc, who, utf8); |
4759 | 5302 if ((b = gaim_find_buddy(gc->account, who))) { |
7693 | 5303 gaim_blist_node_set_string((GaimBlistNode*)b, "servernick", utf8); |
4759 | 5304 } |
4820 | 5305 g_free(utf8); |
4759 | 5306 } |
5307 | |
5308 return 1; | |
5309 } | |
5310 | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5311 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
|
5312 { |
7032 | 5313 GaimConnection *gc = sess->aux_data; |
5314 gchar *text; | |
5315 va_list ap; | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5316 char *msg, *url; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5317 fu16_t wid, hei, delay; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5318 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5319 va_start(ap, fr); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5320 msg = va_arg(ap, char *); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5321 url = va_arg(ap, char *); |
4199 | 5322 wid = (fu16_t) va_arg(ap, int); |
5323 hei = (fu16_t) va_arg(ap, int); | |
5324 delay = (fu16_t) va_arg(ap, int); | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5325 va_end(ap); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5326 |
7032 | 5327 text = g_strdup_printf("%s<br><a href=\"%s\">%s</a>", msg, url, url); |
5328 gaim_notify_formatted(gc, NULL, _("Pop-Up Message"), NULL, text, NULL, NULL); | |
5329 g_free(text); | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5330 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5331 return 1; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5332 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5333 |
7032 | 5334 static int gaim_parse_searchreply(aim_session_t *sess, aim_frame_t *fr, ...) |
5335 { | |
6873 | 5336 GaimConnection *gc = sess->aux_data; |
5337 gchar *secondary; | |
10439 | 5338 gchar **screennames; |
6873 | 5339 int i, num; |
2086 | 5340 va_list ap; |
6873 | 5341 char *email, *SNs; |
2086 | 5342 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5343 va_start(ap, fr); |
6873 | 5344 email = va_arg(ap, char *); |
2086 | 5345 num = va_arg(ap, int); |
5346 SNs = va_arg(ap, char *); | |
5347 va_end(ap); | |
5348 | |
10439 | 5349 /* TODO: Need to use ngettext() here */ |
8152 | 5350 secondary = g_strdup_printf(_("The following screen names are associated with %s"), email); |
10439 | 5351 |
5352 screennames = g_malloc((num + 1) * sizeof(gchar *)); | |
2086 | 5353 for (i = 0; i < num; i++) |
10439 | 5354 screennames[i] = g_strdup(&SNs[i * (MAXSNLEN + 1)]); |
5355 screennames[num] = NULL; | |
5356 | |
5357 gaim_notify_searchresults(gc, NULL, NULL, secondary, | |
5358 (const char **)screennames, NULL, NULL); | |
6873 | 5359 |
5360 g_free(secondary); | |
10439 | 5361 g_strfreev(screennames); |
2086 | 5362 |
5363 return 1; | |
5364 } | |
5365 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5366 static int gaim_parse_searcherror(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 5367 va_list ap; |
6873 | 5368 char *email; |
5420 | 5369 char *buf; |
2086 | 5370 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5371 va_start(ap, fr); |
6873 | 5372 email = va_arg(ap, char *); |
2086 | 5373 va_end(ap); |
5374 | |
6873 | 5375 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
|
5376 gaim_notify_error(sess->aux_data, NULL, buf, NULL); |
5420 | 5377 g_free(buf); |
2086 | 5378 |
5379 return 1; | |
5380 } | |
5381 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5382 static int gaim_account_confirm(aim_session_t *sess, aim_frame_t *fr, ...) { |
6873 | 5383 GaimConnection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5384 fu16_t status; |
2086 | 5385 va_list ap; |
5386 char msg[256]; | |
5387 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5388 va_start(ap, fr); |
4199 | 5389 status = (fu16_t) va_arg(ap, unsigned int); /* status code of confirmation request */ |
2086 | 5390 va_end(ap); |
5391 | |
8660 | 5392 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5393 "account confirmation returned status 0x%04x (%s)\n", status, |
3912 | 5394 status ? "unknown" : "email sent"); |
5395 if (!status) { | |
5302 | 5396 g_snprintf(msg, sizeof(msg), _("You should receive an email asking to confirm %s."), |
5575 | 5397 gaim_account_get_username(gaim_connection_get_account(gc))); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5398 gaim_notify_info(gc, NULL, _("Account Confirmation Requested"), msg); |
2086 | 5399 } |
5400 | |
5401 return 1; | |
5402 } | |
5403 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5404 static int gaim_info_change(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 5405 GaimConnection *gc = sess->aux_data; |
2086 | 5406 va_list ap; |
3912 | 5407 fu16_t perms, err; |
5408 char *url, *sn, *email; | |
5409 int change; | |
2086 | 5410 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5411 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5412 change = va_arg(ap, int); |
4199 | 5413 perms = (fu16_t) va_arg(ap, unsigned int); |
5414 err = (fu16_t) va_arg(ap, unsigned int); | |
3912 | 5415 url = va_arg(ap, char *); |
5416 sn = va_arg(ap, char *); | |
5417 email = va_arg(ap, char *); | |
2086 | 5418 va_end(ap); |
5419 | |
8660 | 5420 gaim_debug_misc("oscar", |
9626 | 5421 "account info: because of %s, perms=0x%04x, err=0x%04x, url=%s, sn=%s, email=%s\n", |
5422 change ? "change" : "request", perms, err, | |
5423 (url != NULL) ? url : "(null)", | |
5424 (sn != NULL) ? sn : "(null)", | |
5425 (email != NULL) ? email : "(null)"); | |
5426 | |
5427 if ((err > 0) && (url != NULL)) { | |
3912 | 5428 char *dialog_msg; |
5429 char *dialog_top = g_strdup_printf(_("Error Changing Account Info")); | |
5430 switch (err) { | |
5431 case 0x0001: { | |
5432 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name differs from the original."), err); | |
5433 } break; | |
5434 case 0x0006: { | |
5435 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name ends in a space."), err); | |
5436 } break; | |
5437 case 0x000b: { | |
5438 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name is too long."), err); | |
5439 } break; | |
5440 case 0x001d: { | |
5441 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); | |
5442 } break; | |
5443 case 0x0021: { | |
5444 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); | |
5445 } break; | |
5446 case 0x0023: { | |
5447 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to change email address because the given address is invalid."), err); | |
5448 } break; | |
5449 default: { | |
5450 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unknown error."), err); | |
5451 } break; | |
5452 } | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5453 gaim_notify_error(gc, NULL, dialog_top, dialog_msg); |
3912 | 5454 g_free(dialog_top); |
5455 g_free(dialog_msg); | |
5456 return 1; | |
5457 } | |
5458 | |
9626 | 5459 if (sn != NULL) { |
4585 | 5460 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
|
5461 gaim_notify_info(gc, NULL, _("Account Info"), dialog_msg); |
3912 | 5462 g_free(dialog_msg); |
5463 } | |
5464 | |
9626 | 5465 if (email != NULL) { |
5575 | 5466 char *dialog_msg = g_strdup_printf(_("The email address for %s is %s"), |
5467 gaim_account_get_username(gaim_connection_get_account(gc)), email); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5468 gaim_notify_info(gc, NULL, _("Account Info"), dialog_msg); |
3912 | 5469 g_free(dialog_msg); |
2086 | 5470 } |
5471 | |
5472 return 1; | |
5473 } | |
5474 | |
5575 | 5475 static void oscar_keepalive(GaimConnection *gc) { |
7283 | 5476 OscarData *od = (OscarData *)gc->proto_data; |
4617 | 5477 aim_flap_nop(od->sess, od->conn); |
2086 | 5478 } |
5479 | |
6059 | 5480 static int oscar_send_typing(GaimConnection *gc, const char *name, int typing) { |
7283 | 5481 OscarData *od = (OscarData *)gc->proto_data; |
8971 | 5482 struct oscar_direct_im *dim = oscar_direct_im_find(od, name); |
5483 if (dim && dim->connected) | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
5484 if (typing == GAIM_TYPING) |
4870 | 5485 aim_odc_send_typing(od->sess, dim->conn, 0x0002); |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
5486 else if (typing == GAIM_TYPED) |
4870 | 5487 aim_odc_send_typing(od->sess, dim->conn, 0x0001); |
5488 else | |
5489 aim_odc_send_typing(od->sess, dim->conn, 0x0000); | |
3595 | 5490 else { |
5300 | 5491 /* Don't send if this turkey is in our deny list */ |
5492 GSList *list; | |
5493 for (list=gc->account->deny; (list && aim_sncmp(name, list->data)); list=list->next); | |
5494 if (!list) { | |
7261 | 5495 struct buddyinfo *bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(gc->account, name)); |
5300 | 5496 if (bi && bi->typingnot) { |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
5497 if (typing == GAIM_TYPING) |
5300 | 5498 aim_im_sendmtn(od->sess, 0x0001, name, 0x0002); |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
5499 else if (typing == GAIM_TYPED) |
5300 | 5500 aim_im_sendmtn(od->sess, 0x0001, name, 0x0001); |
5501 else | |
5502 aim_im_sendmtn(od->sess, 0x0001, name, 0x0000); | |
5503 } | |
3595 | 5504 } |
5505 } | |
2993 | 5506 return 0; |
5507 } | |
9030 | 5508 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
5509 static int gaim_odc_send_im(aim_session_t *, aim_conn_t *, const char *, GaimConvImFlags); |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
5510 |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
5511 static int oscar_send_im(GaimConnection *gc, const char *name, const char *message, GaimConvImFlags imflags) { |
7283 | 5512 OscarData *od = (OscarData *)gc->proto_data; |
10246 | 5513 GaimAccount *account = gaim_connection_get_account(gc); |
8971 | 5514 struct oscar_direct_im *dim = oscar_direct_im_find(od, name); |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
5515 int ret = 0; |
10246 | 5516 const char *iconfile = gaim_account_get_buddy_icon(account); |
8800 | 5517 char *tmpmsg = NULL, *tmpmsg2 = NULL; |
3458 | 5518 |
4838 | 5519 if (dim && dim->connected) { |
5520 /* If we're directly connected, send a direct IM */ | |
6982 | 5521 ret = gaim_odc_send_im(od->sess, dim->conn, message, imflags); |
2086 | 5522 } else { |
4738 | 5523 struct buddyinfo *bi; |
3008 | 5524 struct aim_sendimext_args args; |
5525 struct stat st; | |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
5526 gsize len; |
10246 | 5527 GaimConversation *conv; |
5528 | |
5529 conv = gaim_find_conversation_with_account(GAIM_CONV_IM, name, account); | |
8962 | 5530 |
5531 if (strstr(message, "<IMG ")) | |
5532 gaim_conversation_write(conv, "", | |
5533 _("Your IM Image was not sent. " | |
5534 "You must be Direct Connected to send IM Images."), | |
5535 GAIM_MESSAGE_ERROR, time(NULL)); | |
4269 | 5536 |
10246 | 5537 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(account, name)); |
4738 | 5538 if (!bi) { |
5539 bi = g_new0(struct buddyinfo, 1); | |
10246 | 5540 g_hash_table_insert(od->buddyinfo, g_strdup(gaim_normalize(account, name)), bi); |
4738 | 5541 } |
5542 | |
3008 | 5543 args.flags = AIM_IMFLAGS_ACK | AIM_IMFLAGS_CUSTOMFEATURES; |
4665 | 5544 if (od->icq) { |
5545 args.features = features_icq; | |
5546 args.featureslen = sizeof(features_icq); | |
3008 | 5547 args.flags |= AIM_IMFLAGS_OFFLINE; |
4665 | 5548 } else { |
5549 args.features = features_aim; | |
5550 args.featureslen = sizeof(features_aim); | |
4972 | 5551 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
5552 if (imflags & GAIM_CONV_IM_AUTO_RESP) |
4972 | 5553 args.flags |= AIM_IMFLAGS_AWAY; |
4665 | 5554 } |
4269 | 5555 |
4738 | 5556 if (bi->ico_need) { |
8660 | 5557 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5558 "Sending buddy icon request with message\n"); |
3008 | 5559 args.flags |= AIM_IMFLAGS_BUDDYREQ; |
4738 | 5560 bi->ico_need = FALSE; |
3008 | 5561 } |
4269 | 5562 |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
5563 if (iconfile && !g_stat(iconfile, &st)) { |
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
5564 FILE *file = g_fopen(iconfile, "rb"); |
3008 | 5565 if (file) { |
5566 char *buf = g_malloc(st.st_size); | |
9532 | 5567 /* XXX - Use g_file_get_contents()? */ |
3008 | 5568 fread(buf, 1, st.st_size, file); |
6039 | 5569 fclose(file); |
4269 | 5570 |
3008 | 5571 args.iconlen = st.st_size; |
4617 | 5572 args.iconsum = aimutil_iconsum(buf, st.st_size); |
3008 | 5573 args.iconstamp = st.st_mtime; |
5574 | |
7406 | 5575 if ((args.iconlen != bi->ico_me_len) || (args.iconsum != bi->ico_me_csum) || (args.iconstamp != bi->ico_me_time)) { |
4738 | 5576 bi->ico_informed = FALSE; |
7406 | 5577 bi->ico_sent = FALSE; |
5578 } | |
4738 | 5579 |
5580 if (!bi->ico_informed) { | |
8660 | 5581 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5582 "Claiming to have a buddy icon\n"); |
4738 | 5583 args.flags |= AIM_IMFLAGS_HASICON; |
5584 bi->ico_me_len = args.iconlen; | |
5585 bi->ico_me_csum = args.iconsum; | |
5586 bi->ico_me_time = args.iconstamp; | |
5587 bi->ico_informed = TRUE; | |
5588 } | |
5589 | |
3008 | 5590 g_free(buf); |
2086 | 5591 } |
5592 } | |
4269 | 5593 |
3008 | 5594 args.destsn = name; |
4269 | 5595 |
8985 | 5596 /* |
5597 * If we're IMing an ICQ user then send newlines as CR/LF and | |
5598 * strip all HTML | |
5599 */ | |
9975 | 5600 if (aim_sn_is_icq(name) ) { |
8995 | 5601 /* being sent to an ICQ user */ |
10246 | 5602 if (!aim_sn_is_icq(gaim_account_get_username(account))) { |
8995 | 5603 /* from an AIM user - ICQ receiving from AIM *expects the messsage to be HTML formatted* */ |
5604 tmpmsg = gaim_str_add_cr(message); | |
5605 } else { | |
5606 /* from an ICQ user - do nothing */ | |
5607 tmpmsg = g_strdup(message); | |
5608 } | |
5609 } else { | |
5610 /* being sent to an AIM user */ | |
10246 | 5611 if (aim_sn_is_icq(gaim_account_get_username(account))) { |
8995 | 5612 /* from an ICQ user */ |
5613 tmpmsg2 = gaim_strdup_withhtml(message); | |
10732
c4cb90065e1d
[gaim-migrate @ 12334]
Luke Schierer <lschiere@pidgin.im>
parents:
10715
diff
changeset
|
5614 tmpmsg = g_markup_escape_text(tmpmsg2, -1); |
8995 | 5615 g_free(tmpmsg2); |
5616 } else | |
5617 tmpmsg = gaim_strdup_withhtml(message); | |
5618 } | |
6310 | 5619 len = strlen(tmpmsg); |
5620 | |
9830 | 5621 gaim_plugin_oscar_convert_to_best_encoding(gc, name, tmpmsg, (char **)&args.msg, &args.msglen, &args.charset, &args.charsubset); |
5622 gaim_debug_info("oscar", "Sending IM, charset=0x%04hx, charsubset=0x%04hx, length=%d\n", | |
5623 args.charset, args.charsubset, args.msglen); | |
4617 | 5624 ret = aim_im_sendch1_ext(od->sess, &args); |
9830 | 5625 g_free((char *)args.msg); |
2086 | 5626 } |
4838 | 5627 |
6310 | 5628 g_free(tmpmsg); |
5629 | |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
5630 if (ret >= 0) |
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
5631 return 1; |
6310 | 5632 |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
5633 return ret; |
2086 | 5634 } |
5635 | |
7011 | 5636 static void oscar_get_info(GaimConnection *gc, const char *name) { |
7283 | 5637 OscarData *od = (OscarData *)gc->proto_data; |
7011 | 5638 |
9975 | 5639 if (od->icq && aim_sn_is_icq(name)) |
4624 | 5640 aim_icq_getallinfo(od->sess, name); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5641 else |
7235 | 5642 aim_locate_getinfoshort(od->sess, name, 0x00000003); |
7011 | 5643 } |
5644 | |
8950 | 5645 #if 0 |
7011 | 5646 static void oscar_set_dir(GaimConnection *gc, const char *first, const char *middle, const char *last, |
3466 | 5647 const char *maiden, const char *city, const char *state, const char *country, int web) { |
4617 | 5648 /* XXX - some of these things are wrong, but i'm lazy */ |
7283 | 5649 OscarData *od = (OscarData *)gc->proto_data; |
7011 | 5650 aim_locate_setdirinfo(od->sess, first, middle, last, |
2086 | 5651 maiden, NULL, NULL, city, state, NULL, 0, web); |
5652 } | |
8950 | 5653 #endif |
2086 | 5654 |
5575 | 5655 static void oscar_set_idle(GaimConnection *gc, int time) { |
7283 | 5656 OscarData *od = (OscarData *)gc->proto_data; |
7474 | 5657 aim_srv_setidle(od->sess, time); |
2086 | 5658 } |
5659 | |
5954 | 5660 static void oscar_set_info(GaimConnection *gc, const char *text) { |
7283 | 5661 OscarData *od = (OscarData *)gc->proto_data; |
9807 | 5662 int charset = 0; |
6019 | 5663 char *text_html = NULL; |
5129 | 5664 char *msg = NULL; |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
5665 gsize msglen = 0; |
2993 | 5666 |
4617 | 5667 if (od->rights.maxsiglen == 0) |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5668 gaim_notify_warning(gc, NULL, _("Unable to set AIM profile."), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5669 _("You have probably requested to set your " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5670 "profile before the login procedure completed. " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5671 "Your profile remains unset; try setting it " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5672 "again when you are fully connected.")); |
4617 | 5673 |
7334 | 5674 if (!text) { |
5675 aim_locate_setprofile(od->sess, NULL, "", 0, NULL, NULL, 0); | |
5676 return; | |
5677 } | |
10097 | 5678 |
7334 | 5679 text_html = gaim_strdup_withhtml(text); |
9807 | 5680 charset = oscar_charset_check(text_html); |
9826 | 5681 if (charset == AIM_CHARSET_UNICODE) { |
7334 | 5682 msg = g_convert(text_html, strlen(text_html), "UCS-2BE", "UTF-8", NULL, &msglen, NULL); |
5683 aim_locate_setprofile(od->sess, "unicode-2-0", msg, (msglen > od->rights.maxsiglen ? od->rights.maxsiglen : msglen), NULL, NULL, 0); | |
5684 g_free(msg); | |
9826 | 5685 } else if (charset == AIM_CHARSET_CUSTOM) { |
7334 | 5686 msg = g_convert(text_html, strlen(text_html), "ISO-8859-1", "UTF-8", NULL, &msglen, NULL); |
5687 aim_locate_setprofile(od->sess, "iso-8859-1", msg, (msglen > od->rights.maxsiglen ? od->rights.maxsiglen : msglen), NULL, NULL, 0); | |
5688 g_free(msg); | |
5689 } else { | |
5690 msglen = strlen(text_html); | |
5691 aim_locate_setprofile(od->sess, "us-ascii", text_html, (msglen > od->rights.maxsiglen ? od->rights.maxsiglen : msglen), NULL, NULL, 0); | |
5692 } | |
5693 | |
5694 if (msglen > od->rights.maxsiglen) { | |
5695 gchar *errstr; | |
5696 errstr = g_strdup_printf(ngettext("The maximum profile length of %d byte " | |
5697 "has been exceeded. Gaim has truncated it for you.", | |
5698 "The maximum profile length of %d bytes " | |
5699 "has been exceeded. Gaim has truncated it for you.", | |
5700 od->rights.maxsiglen), od->rights.maxsiglen); | |
5701 gaim_notify_warning(gc, NULL, _("Profile too long."), errstr); | |
5702 g_free(errstr); | |
5703 } | |
5704 | |
5705 g_free(text_html); | |
2993 | 5706 |
5707 return; | |
2086 | 5708 } |
5709 | |
9991 | 5710 static void |
5711 oscar_set_status_aim(GaimAccount *account, GaimStatus *status) | |
2993 | 5712 { |
9991 | 5713 GaimConnection *gc = gaim_account_get_connection(account); |
10400 | 5714 OscarData *od = NULL; |
9992 | 5715 GaimStatusType *status_type; |
9991 | 5716 GaimStatusPrimitive primitive; |
5717 GaimPresence *presence; | |
5718 const gchar *status_id; | |
9807 | 5719 int charset = 0; |
10196 | 5720 const gchar *text_html = NULL; |
5129 | 5721 char *msg = NULL; |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
5722 gsize msglen = 0; |
2993 | 5723 |
9992 | 5724 status_type = gaim_status_get_type(status); |
5725 primitive = gaim_status_type_get_primitive(status_type); | |
9991 | 5726 status_id = gaim_status_get_id(status); |
5727 presence = gaim_account_get_presence(account); | |
5728 | |
10196 | 5729 gaim_debug_info("oscar", "Setting status to %s\n", status_id); |
5730 | |
10400 | 5731 if (gc) |
5732 od = (OscarData *)gc->proto_data; | |
10401 | 5733 |
5734 if ((od == NULL) || (od->rights.maxawaymsglen == 0)) { | |
9991 | 5735 gaim_notify_warning(gc, NULL, _("Unable to set AIM away message."), |
10400 | 5736 _("You have probably requested to set your " |
5737 "away message before the login procedure " | |
5738 "completed. You remain in a \"present\" " | |
5739 "state; try setting it again when you are " | |
5740 "fully connected.")); | |
10401 | 5741 return; |
5742 } | |
5129 | 5743 |
9992 | 5744 if (primitive == GAIM_STATUS_AVAILABLE) { |
10197 | 5745 aim_setextstatus(od->sess, AIM_ICQ_STATE_NORMAL); |
5746 | |
7334 | 5747 aim_locate_setprofile(od->sess, NULL, NULL, 0, NULL, "", 0); |
10198 | 5748 |
5749 text_html = gaim_status_get_attr_string(status, "message"); | |
5750 if (text_html != NULL) { | |
5751 aim_srv_setavailmsg(od->sess, text_html); | |
5752 } | |
10196 | 5753 |
5754 } else if (primitive == GAIM_STATUS_AWAY) { | |
10197 | 5755 aim_setextstatus(od->sess, AIM_ICQ_STATE_NORMAL); |
5756 | |
10196 | 5757 text_html = gaim_status_get_attr_string(status, "message"); |
5758 | |
5759 if (text_html == NULL) { | |
5760 text_html = _("Away"); | |
5761 } | |
5762 | |
5763 charset = oscar_charset_check(text_html); | |
5764 if (charset == AIM_CHARSET_UNICODE) { | |
5765 msg = g_convert(text_html, strlen(text_html), "UCS-2BE", "UTF-8", NULL, &msglen, NULL); | |
5766 aim_locate_setprofile(od->sess, NULL, NULL, 0, "unicode-2-0", msg, | |
5767 (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen)); | |
5768 g_free(msg); | |
5769 } else if (charset == AIM_CHARSET_CUSTOM) { | |
5770 msg = g_convert(text_html, strlen(text_html), "ISO-8859-1", "UTF-8", NULL, &msglen, NULL); | |
5771 aim_locate_setprofile(od->sess, NULL, NULL, 0, "iso-8859-1", msg, | |
5772 (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen)); | |
5773 g_free(msg); | |
5774 } else { | |
5775 msglen = strlen(text_html); | |
5776 aim_locate_setprofile(od->sess, NULL, NULL, 0, "us-ascii", text_html, | |
5777 (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen)); | |
5778 } | |
5779 | |
5780 if (msglen > od->rights.maxawaymsglen) { | |
5781 gchar *errstr; | |
5782 | |
5783 errstr = g_strdup_printf(ngettext("The maximum away message length of %d byte " | |
5784 "has been exceeded. Gaim has truncated it for you.", | |
5785 "The maximum away message length of %d bytes " | |
5786 "has been exceeded. Gaim has truncated it for you.", | |
5787 od->rights.maxawaymsglen), od->rights.maxawaymsglen); | |
5788 gaim_notify_warning(gc, NULL, _("Away message too long."), errstr); | |
5789 g_free(errstr); | |
5790 } | |
5791 | |
10197 | 5792 } else if (primitive == GAIM_STATUS_HIDDEN) { |
5793 aim_setextstatus(od->sess, AIM_ICQ_STATE_INVISIBLE); | |
5794 | |
5129 | 5795 } else { |
10196 | 5796 gaim_debug_info("oscar", "Don't know what to do for this status\n"); |
5797 | |
5798 } | |
2993 | 5799 } |
5800 | |
9991 | 5801 static void |
5802 oscar_set_status_icq(GaimAccount *account, GaimStatus *status) | |
2993 | 5803 { |
9991 | 5804 GaimConnection *gc = gaim_account_get_connection(account); |
10646 | 5805 OscarData *od = NULL; |
9991 | 5806 const gchar *status_id = gaim_status_get_id(status); |
5807 | |
10646 | 5808 if (gc) |
5809 od = (OscarData *)gc->proto_data; | |
5810 if (!od) | |
5811 return; | |
5812 | |
9991 | 5813 if (gaim_status_type_get_primitive(gaim_status_get_type(status)) == GAIM_STATUS_HIDDEN) |
5575 | 5814 account->perm_deny = 4; |
8265 | 5815 else |
5575 | 5816 account->perm_deny = 3; |
9991 | 5817 |
8265 | 5818 if ((od->sess->ssi.received_data) && (aim_ssi_getpermdeny(od->sess->ssi.local) != account->perm_deny)) |
5819 aim_ssi_setpermdeny(od->sess, account->perm_deny, 0xffffffff); | |
4342 | 5820 |
9991 | 5821 if (!strcmp(status_id, OSCAR_STATUS_ID_ONLINE)) |
4901 | 5822 aim_setextstatus(od->sess, AIM_ICQ_STATE_NORMAL); |
9991 | 5823 |
5824 else if (!strcmp(status_id, OSCAR_STATUS_ID_AWAY)) | |
4901 | 5825 aim_setextstatus(od->sess, AIM_ICQ_STATE_AWAY); |
9991 | 5826 |
5827 else if (!strcmp(status_id, OSCAR_STATUS_ID_DND)) | |
4901 | 5828 aim_setextstatus(od->sess, AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_DND | AIM_ICQ_STATE_BUSY); |
9991 | 5829 |
5830 else if (!strcmp(status_id, OSCAR_STATUS_ID_NA)) | |
4901 | 5831 aim_setextstatus(od->sess, AIM_ICQ_STATE_OUT | AIM_ICQ_STATE_AWAY); |
9991 | 5832 |
5833 else if (!strcmp(status_id, OSCAR_STATUS_ID_OCCUPIED)) | |
4901 | 5834 aim_setextstatus(od->sess, AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_BUSY); |
9991 | 5835 |
5836 else if (!strcmp(status_id, OSCAR_STATUS_ID_FREE4CHAT)) | |
4901 | 5837 aim_setextstatus(od->sess, AIM_ICQ_STATE_CHAT); |
9991 | 5838 |
5839 else if (!strcmp(status_id, OSCAR_STATUS_ID_INVISIBLE)) | |
4901 | 5840 aim_setextstatus(od->sess, AIM_ICQ_STATE_INVISIBLE); |
9991 | 5841 |
5842 else if (!strcmp(status_id, OSCAR_STATUS_ID_CUSTOM)) | |
5843 aim_setextstatus(od->sess, AIM_ICQ_STATE_OUT | AIM_ICQ_STATE_AWAY); | |
2993 | 5844 |
5845 return; | |
5846 } | |
5847 | |
9991 | 5848 static void |
5849 oscar_set_status(GaimAccount *account, GaimStatus *status) | |
2993 | 5850 { |
9991 | 5851 GaimConnection *gc = gaim_account_get_connection(account); |
10400 | 5852 GaimStatusType *type = gaim_status_get_type(status); |
5853 int primitive = gaim_status_type_get_primitive(type); | |
5854 | |
10498 | 5855 if (!gaim_status_is_active(status)) |
10485 | 5856 return; |
5857 | |
10400 | 5858 if (primitive == !GAIM_STATUS_OFFLINE && !gc) { |
10738 | 5859 gaim_account_connect(account); |
10400 | 5860 } else if (primitive == GAIM_STATUS_OFFLINE && gc) { |
5861 gaim_account_disconnect(account); | |
5862 } else { | |
5863 | |
5864 if (aim_sn_is_icq(gaim_account_get_username(account))) | |
5865 oscar_set_status_icq(account, status); | |
5866 else | |
10560 | 5867 /* QQQ - Should probably also set this for ICQ */ |
10400 | 5868 oscar_set_status_aim(account, status); |
5869 } | |
2993 | 5870 return; |
2086 | 5871 } |
5872 | |
9991 | 5873 static void |
5874 oscar_warn(GaimConnection *gc, const char *name, gboolean anonymous) { | |
7283 | 5875 OscarData *od = (OscarData *)gc->proto_data; |
9753 | 5876 aim_im_warn(od->sess, od->conn, name, anonymous ? AIM_WARN_ANON : 0); |
2086 | 5877 } |
5878 | |
9285 | 5879 static void oscar_add_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *group) { |
7283 | 5880 OscarData *od = (OscarData *)gc->proto_data; |
9285 | 5881 |
5882 if (!aim_snvalid(buddy->name)) { | |
8092 | 5883 gchar *buf; |
9285 | 5884 buf = g_strdup_printf(_("Could not add the buddy %s because the screen name is invalid. Screen names must either start with a letter and contain only letters, numbers and spaces, or contain only numbers."), buddy->name); |
9627 | 5885 if (!gaim_conv_present_error(buddy->name, gaim_connection_get_account(gc), buf)) |
5886 gaim_notify_error(gc, NULL, _("Unable To Add"), buf); | |
8092 | 5887 g_free(buf); |
8150 | 5888 |
5889 /* Remove from local list */ | |
9285 | 5890 gaim_blist_remove_buddy(buddy); |
8150 | 5891 |
8092 | 5892 return; |
5893 } | |
5894 | |
4230 | 5895 #ifdef NOSSI |
9285 | 5896 aim_buddylist_addbuddy(od->sess, od->conn, buddy->name); |
4230 | 5897 #else |
9285 | 5898 if ((od->sess->ssi.received_data) && !(aim_ssi_itemlist_finditem(od->sess->ssi.local, group->name, buddy->name, AIM_SSI_TYPE_BUDDY))) { |
5899 if (buddy && group) { | |
8660 | 5900 gaim_debug_info("oscar", |
9285 | 5901 "ssi: adding buddy %s to group %s\n", buddy->name, group->name); |
9620 | 5902 aim_ssi_addbuddy(od->sess, buddy->name, group->name, gaim_buddy_get_alias_only(buddy), NULL, NULL, 0); |
4230 | 5903 } |
5904 } | |
5905 #endif | |
8150 | 5906 |
10157 | 5907 /* XXX - Should this be done from AIM accounts, as well? */ |
4759 | 5908 if (od->icq) |
9285 | 5909 aim_icq_getalias(od->sess, buddy->name); |
5910 } | |
5911 | |
5912 static void oscar_add_buddies(GaimConnection *gc, GList *buddies, GList *groups) { | |
7283 | 5913 OscarData *od = (OscarData *)gc->proto_data; |
4230 | 5914 #ifdef NOSSI |
5915 char buf[MSG_LEN]; | |
5916 int n=0; | |
9285 | 5917 |
4230 | 5918 while (buddies) { |
9381 | 5919 GaimBuddy *buddy = buddies->data; |
4230 | 5920 if (n > MSG_LEN - 18) { |
7285 | 5921 aim_buddylist_set(od->sess, od->conn, buf); |
4230 | 5922 n = 0; |
3092 | 5923 } |
9381 | 5924 n += g_snprintf(buf + n, sizeof(buf) - n, "%s&", buddy->name); |
4230 | 5925 buddies = buddies->next; |
5926 } | |
7285 | 5927 aim_buddylist_set(od->sess, od->conn, buf); |
4230 | 5928 #else |
9285 | 5929 |
4230 | 5930 if (od->sess->ssi.received_data) { |
9285 | 5931 GList *curb = buddies; |
5932 GList *curg = groups; | |
5933 while ((curb != NULL) && (curg != NULL)) { | |
5934 GaimBuddy *buddy = curb->data; | |
5935 GaimGroup *group = curg->data; | |
5936 oscar_add_buddy(gc, buddy, group); | |
5937 curb = curb->next; | |
5938 curg = curg->next; | |
4230 | 5939 } |
5940 } | |
5941 #endif | |
5942 } | |
5943 | |
9285 | 5944 static void oscar_remove_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *group) { |
7283 | 5945 OscarData *od = (OscarData *)gc->proto_data; |
9285 | 5946 |
4230 | 5947 #ifdef NOSSI |
9285 | 5948 aim_buddylist_removebuddy(od->sess, od->conn, buddy->name); |
4230 | 5949 #else |
5950 if (od->sess->ssi.received_data) { | |
8660 | 5951 gaim_debug_info("oscar", |
9285 | 5952 "ssi: deleting buddy %s from group %s\n", buddy->name, group->name); |
5953 aim_ssi_delbuddy(od->sess, buddy->name, group->name); | |
4230 | 5954 } |
5955 #endif | |
5956 } | |
5957 | |
9285 | 5958 static void oscar_remove_buddies(GaimConnection *gc, GList *buddies, GList *groups) { |
7283 | 5959 OscarData *od = (OscarData *)gc->proto_data; |
9285 | 5960 |
4230 | 5961 #ifdef NOSSI |
9285 | 5962 for (cur = buddies; cur != NULL; cur = cur->next) { |
5963 GaimBuddy *buddy = cur->data; | |
5964 aim_buddylist_removebuddy(od->sess, od->conn, buddy->name); | |
5965 } | |
4230 | 5966 #else |
5967 if (od->sess->ssi.received_data) { | |
9285 | 5968 GList *curb = buddies; |
5969 GList *curg = groups; | |
5970 while ((curb != NULL) && (curg != NULL)) { | |
5971 GaimBuddy *buddy = curb->data; | |
5972 GaimGroup *group = curg->data; | |
5973 oscar_remove_buddy(gc, buddy, group); | |
5974 curb = curb->next; | |
5975 curg = curg->next; | |
3092 | 5976 } |
4230 | 5977 } |
5978 #endif | |
5979 } | |
5980 | |
5981 #ifndef NOSSI | |
5575 | 5982 static void oscar_move_buddy(GaimConnection *gc, const char *name, const char *old_group, const char *new_group) { |
7283 | 5983 OscarData *od = (OscarData *)gc->proto_data; |
4303 | 5984 if (od->sess->ssi.received_data && strcmp(old_group, new_group)) { |
8660 | 5985 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5986 "ssi: moving buddy %s from group %s to group %s\n", name, old_group, new_group); |
4889 | 5987 aim_ssi_movebuddy(od->sess, old_group, new_group, name); |
4269 | 5988 } |
5989 } | |
5990 | |
5575 | 5991 static void oscar_alias_buddy(GaimConnection *gc, const char *name, const char *alias) { |
7283 | 5992 OscarData *od = (OscarData *)gc->proto_data; |
4269 | 5993 if (od->sess->ssi.received_data) { |
5994 char *gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, name); | |
5995 if (gname) { | |
8660 | 5996 gaim_debug_info("oscar", |
9586 | 5997 "ssi: changing the alias for buddy %s to %s\n", name, alias ? alias : "(none)"); |
4889 | 5998 aim_ssi_aliasbuddy(od->sess, gname, name, alias); |
4269 | 5999 } |
6000 } | |
6001 } | |
6002 | |
9285 | 6003 static void oscar_rename_group(GaimConnection *gc, const char *old_name, GaimGroup *group, GList *moved_buddies) { |
8341 | 6004 OscarData *od = (OscarData *)gc->proto_data; |
4230 | 6005 |
6006 if (od->sess->ssi.received_data) { | |
9285 | 6007 if (aim_ssi_itemlist_finditem(od->sess->ssi.local, group->name, NULL, AIM_SSI_TYPE_GROUP)) { |
6008 GList *cur, *groups = NULL; | |
6009 | |
6010 /* Make a list of what the groups each buddy is in */ | |
6011 for (cur = moved_buddies; cur != NULL; cur = cur->next) { | |
6012 GaimBlistNode *node = cur->data; | |
6013 groups = g_list_append(groups, node->parent); | |
6014 } | |
6015 | |
6016 oscar_remove_buddies(gc, moved_buddies, groups); | |
6017 oscar_add_buddies(gc, moved_buddies, groups); | |
6018 g_list_free(groups); | |
8660 | 6019 gaim_debug_info("oscar", |
9285 | 6020 "ssi: moved all buddies from group %s to %s\n", old_name, group->name); |
4230 | 6021 } else { |
9285 | 6022 aim_ssi_rename_group(od->sess, old_name, group->name); |
8660 | 6023 gaim_debug_info("oscar", |
9285 | 6024 "ssi: renamed group %s to %s\n", old_name, group->name); |
2995 | 6025 } |
6026 } | |
6027 } | |
6028 | |
5968 | 6029 static gboolean gaim_ssi_rerequestdata(gpointer data) { |
6030 aim_session_t *sess = data; | |
6350 | 6031 aim_ssi_reqdata(sess); |
5968 | 6032 return FALSE; |
6033 } | |
6034 | |
4642 | 6035 static int gaim_ssi_parseerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 6036 GaimConnection *gc = sess->aux_data; |
7283 | 6037 OscarData *od = gc->proto_data; |
4642 | 6038 va_list ap; |
6039 fu16_t reason; | |
6040 | |
6041 va_start(ap, fr); | |
6042 reason = (fu16_t)va_arg(ap, unsigned int); | |
6043 va_end(ap); | |
6044 | |
8660 | 6045 gaim_debug_error("oscar", "ssi: SNAC error %hu\n", reason); |
4642 | 6046 |
6047 if (reason == 0x0005) { | |
5892 | 6048 gaim_notify_error(gc, NULL, _("Unable To Retrieve Buddy List"), |
5828 | 6049 _("Gaim was temporarily unable to retrieve your buddy list from the AIM servers. Your buddy list is not lost, and will probably become available in a few hours.")); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
6050 od->getblisttimer = gaim_timeout_add(300000, gaim_ssi_rerequestdata, od->sess); |
4642 | 6051 } |
6052 | |
6053 /* Activate SSI */ | |
6054 /* Sending the enable causes other people to be able to see you, and you to see them */ | |
6055 /* Make sure your privacy setting/invisibility is set how you want it before this! */ | |
8660 | 6056 gaim_debug_info("oscar", "ssi: activating server-stored buddy list\n"); |
4642 | 6057 aim_ssi_enable(od->sess); |
6058 | |
6059 return 1; | |
6060 } | |
6061 | |
2991 | 6062 static int gaim_ssi_parserights(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 6063 GaimConnection *gc = sess->aux_data; |
7283 | 6064 OscarData *od = (OscarData *)gc->proto_data; |
9982 | 6065 int i; |
6066 va_list ap; | |
6067 int numtypes; | |
4230 | 6068 fu16_t *maxitems; |
2991 | 6069 |
6070 va_start(ap, fr); | |
4230 | 6071 numtypes = va_arg(ap, int); |
6072 maxitems = va_arg(ap, fu16_t *); | |
2991 | 6073 va_end(ap); |
6074 | |
8660 | 6075 gaim_debug_misc("oscar", "ssi rights:"); |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
6076 |
4230 | 6077 for (i=0; i<numtypes; i++) |
8660 | 6078 gaim_debug_misc(NULL, " max type 0x%04x=%hd,", |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
6079 i, maxitems[i]); |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
6080 |
8660 | 6081 gaim_debug_misc(NULL, "\n"); |
4230 | 6082 |
6083 if (numtypes >= 0) | |
6084 od->rights.maxbuddies = maxitems[0]; | |
6085 if (numtypes >= 1) | |
6086 od->rights.maxgroups = maxitems[1]; | |
6087 if (numtypes >= 2) | |
6088 od->rights.maxpermits = maxitems[2]; | |
6089 if (numtypes >= 3) | |
6090 od->rights.maxdenies = maxitems[3]; | |
2991 | 6091 |
6092 return 1; | |
6093 } | |
6094 | |
6095 static int gaim_ssi_parselist(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 6096 GaimConnection *gc = sess->aux_data; |
6097 GaimAccount *account = gaim_connection_get_account(gc); | |
9988 | 6098 GaimStatus *status; |
7283 | 6099 OscarData *od = (OscarData *)gc->proto_data; |
8150 | 6100 GaimGroup *g; |
6101 GaimBuddy *b; | |
2995 | 6102 struct aim_ssi_item *curitem; |
2991 | 6103 int tmp; |
4230 | 6104 va_list ap; |
8219 | 6105 fu16_t fmtver, numitems; |
6106 struct aim_ssi_item *items; | |
6107 fu32_t timestamp; | |
4230 | 6108 |
6109 va_start(ap, fr); | |
6110 fmtver = (fu16_t)va_arg(ap, int); | |
6111 numitems = (fu16_t)va_arg(ap, int); | |
8219 | 6112 items = va_arg(ap, struct aim_ssi_item *); |
4230 | 6113 timestamp = va_arg(ap, fu32_t); |
8219 | 6114 va_end(ap); |
2991 | 6115 |
8660 | 6116 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6117 "ssi: syncing local list and server list\n"); |
2991 | 6118 |
8219 | 6119 if ((timestamp == 0) || (numitems == 0)) { |
8660 | 6120 gaim_debug_info("oscar", "Got AIM SSI with a 0 timestamp or 0 numitems--not syncing. This probably means your buddy list is empty.", NULL); |
8219 | 6121 return 1; |
6122 } | |
6123 | |
2991 | 6124 /* Clean the buddy list */ |
4889 | 6125 aim_ssi_cleanlist(sess); |
2991 | 6126 |
8150 | 6127 { /* If not in server list then prune from local list */ |
6128 GaimBlistNode *gnode, *cnode, *bnode; | |
6129 GaimBuddyList *blist; | |
9539 | 6130 GSList *cur, *next; |
8150 | 6131 |
6132 /* Buddies */ | |
6133 cur = NULL; | |
6134 if ((blist = gaim_get_blist()) != NULL) { | |
6135 for (gnode = blist->root; gnode; gnode = gnode->next) { | |
6136 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
6137 continue; | |
6138 g = (GaimGroup *)gnode; | |
6139 for (cnode = gnode->child; cnode; cnode = cnode->next) { | |
6140 if(!GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
6141 continue; | |
6142 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
6143 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
6144 continue; | |
6145 b = (GaimBuddy *)bnode; | |
6146 if (b->account == gc->account) { | |
6147 if (aim_ssi_itemlist_exists(sess->ssi.local, b->name)) { | |
6148 /* If the buddy is an ICQ user then load his nickname */ | |
6149 const char *servernick = gaim_blist_node_get_string((GaimBlistNode*)b, "servernick"); | |
8214 | 6150 char *alias; |
8150 | 6151 if (servernick) |
6152 serv_got_alias(gc, b->name, servernick); | |
6153 | |
6154 /* Store local alias on server */ | |
8214 | 6155 alias = aim_ssi_getalias(sess->ssi.local, g->name, b->name); |
8150 | 6156 if (!alias && b->alias && strlen(b->alias)) |
6157 aim_ssi_aliasbuddy(sess, g->name, b->name, b->alias); | |
6158 free(alias); | |
6159 } else { | |
8660 | 6160 gaim_debug_info("oscar", |
8150 | 6161 "ssi: removing buddy %s from local list\n", b->name); |
6162 /* We can't actually remove now because it will screw up our looping */ | |
6163 cur = g_slist_prepend(cur, b); | |
6164 } | |
6165 } | |
6166 } | |
6167 } | |
6168 } | |
6169 } | |
8175 | 6170 |
8150 | 6171 while (cur != NULL) { |
6172 b = cur->data; | |
6173 cur = g_slist_remove(cur, b); | |
6174 gaim_blist_remove_buddy(b); | |
6175 } | |
6176 | |
6177 /* Permit list */ | |
6178 if (gc->account->permit) { | |
9539 | 6179 next = gc->account->permit; |
6180 while (next != NULL) { | |
6181 cur = next; | |
6182 next = next->next; | |
8150 | 6183 if (!aim_ssi_itemlist_finditem(sess->ssi.local, NULL, cur->data, AIM_SSI_TYPE_PERMIT)) { |
8660 | 6184 gaim_debug_info("oscar", |
8150 | 6185 "ssi: removing permit %s from local list\n", (const char *)cur->data); |
6186 gaim_privacy_permit_remove(account, cur->data, TRUE); | |
6187 } | |
9539 | 6188 } |
8150 | 6189 } |
6190 | |
6191 /* Deny list */ | |
6192 if (gc->account->deny) { | |
9539 | 6193 next = gc->account->deny; |
6194 while (next != NULL) { | |
6195 cur = next; | |
6196 next = next->next; | |
8150 | 6197 if (!aim_ssi_itemlist_finditem(sess->ssi.local, NULL, cur->data, AIM_SSI_TYPE_DENY)) { |
8660 | 6198 gaim_debug_info("oscar", |
8150 | 6199 "ssi: removing deny %s from local list\n", (const char *)cur->data); |
6200 gaim_privacy_deny_remove(account, cur->data, TRUE); | |
6201 } | |
9539 | 6202 } |
8150 | 6203 } |
6204 /* Presence settings (idle time visibility) */ | |
6205 if ((tmp = aim_ssi_getpresence(sess->ssi.local)) != 0xFFFFFFFF) | |
6206 if (!(tmp & 0x400)) | |
6207 aim_ssi_setpresence(sess, tmp | 0x400); | |
6208 } /* end pruning buddies from local list */ | |
6209 | |
2991 | 6210 /* Add from server list to local list */ |
4230 | 6211 for (curitem=sess->ssi.local; curitem; curitem=curitem->next) { |
7328 | 6212 if ((curitem->name == NULL) || (g_utf8_validate(curitem->name, -1, NULL))) |
2991 | 6213 switch (curitem->type) { |
4230 | 6214 case 0x0000: { /* Buddy */ |
4251 | 6215 if (curitem->name) { |
4292 | 6216 char *gname = aim_ssi_itemlist_findparentname(sess->ssi.local, curitem->name); |
7166 | 6217 char *gname_utf8 = gname ? gaim_utf8_try_convert(gname) : NULL; |
4282 | 6218 char *alias = aim_ssi_getalias(sess->ssi.local, gname, curitem->name); |
7166 | 6219 char *alias_utf8 = alias ? gaim_utf8_try_convert(alias) : NULL; |
8150 | 6220 b = gaim_find_buddy(gc->account, curitem->name); |
4458 | 6221 /* Should gname be freed here? -- elb */ |
4754 | 6222 /* Not with the current code, but that might be cleaner -- med */ |
4458 | 6223 free(alias); |
8150 | 6224 if (b) { |
4292 | 6225 /* Get server stored alias */ |
4705 | 6226 if (alias_utf8) { |
8150 | 6227 g_free(b->alias); |
6228 b->alias = g_strdup(alias_utf8); | |
4705 | 6229 } |
4282 | 6230 } else { |
8150 | 6231 b = gaim_buddy_new(gc->account, curitem->name, alias_utf8); |
5146 | 6232 |
4754 | 6233 if (!(g = gaim_find_group(gname_utf8 ? gname_utf8 : _("Orphans")))) { |
4687 | 6234 g = gaim_group_new(gname_utf8 ? gname_utf8 : _("Orphans")); |
4754 | 6235 gaim_blist_add_group(g, NULL); |
6236 } | |
5146 | 6237 |
8660 | 6238 gaim_debug_info("oscar", |
9285 | 6239 "ssi: adding buddy %s to group %s to local list\n", curitem->name, gname_utf8 ? gname_utf8 : _("Orphans")); |
8150 | 6240 gaim_blist_add_buddy(b, NULL, g, NULL); |
4251 | 6241 } |
8341 | 6242 if (!aim_sncmp(curitem->name, account->username)) { |
6243 char *comment = aim_ssi_getcomment(sess->ssi.local, gname, curitem->name); | |
6244 gaim_check_comment(od, comment); | |
6245 free(comment); | |
6246 } | |
7162 | 6247 g_free(gname_utf8); |
6248 g_free(alias_utf8); | |
2991 | 6249 } |
4230 | 6250 } break; |
6251 | |
6252 case 0x0001: { /* Group */ | |
4282 | 6253 /* Shouldn't add empty groups */ |
4230 | 6254 } break; |
6255 | |
6256 case 0x0002: { /* Permit buddy */ | |
2991 | 6257 if (curitem->name) { |
4230 | 6258 /* if (!find_permdeny_by_name(gc->permit, curitem->name)) { AAA */ |
2991 | 6259 GSList *list; |
5575 | 6260 for (list=account->permit; (list && aim_sncmp(curitem->name, list->data)); list=list->next); |
2991 | 6261 if (!list) { |
8660 | 6262 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6263 "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
|
6264 gaim_privacy_permit_add(account, curitem->name, TRUE); |
2991 | 6265 } |
6266 } | |
4230 | 6267 } break; |
6268 | |
6269 case 0x0003: { /* Deny buddy */ | |
2991 | 6270 if (curitem->name) { |
6271 GSList *list; | |
5575 | 6272 for (list=account->deny; (list && aim_sncmp(curitem->name, list->data)); list=list->next); |
2991 | 6273 if (!list) { |
8660 | 6274 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6275 "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
|
6276 gaim_privacy_deny_add(account, curitem->name, TRUE); |
2991 | 6277 } |
6278 } | |
4230 | 6279 } break; |
6280 | |
6281 case 0x0004: { /* Permit/deny setting */ | |
2991 | 6282 if (curitem->data) { |
6283 fu8_t permdeny; | |
5575 | 6284 if ((permdeny = aim_ssi_getpermdeny(sess->ssi.local)) && (permdeny != account->perm_deny)) { |
8660 | 6285 gaim_debug_info("oscar", |
5575 | 6286 "ssi: changing permdeny from %d to %hhu\n", account->perm_deny, permdeny); |
6287 account->perm_deny = permdeny; | |
6288 if (od->icq && account->perm_deny == 0x03) { | |
9991 | 6289 gaim_presence_switch_status(account->presence, OSCAR_STATUS_ID_INVISIBLE); |
4342 | 6290 } |
2991 | 6291 } |
6292 } | |
4230 | 6293 } break; |
6294 | |
6295 case 0x0005: { /* Presence setting */ | |
3109 | 6296 /* We don't want to change Gaim's setting because it applies to all accounts */ |
4230 | 6297 } break; |
2991 | 6298 } /* End of switch on curitem->type */ |
6299 } /* End of for loop */ | |
4230 | 6300 |
9991 | 6301 /* |
6302 * XXX - STATUS - Set our ICQ status. We probably don't want to do | |
6303 * this. We probably want the SSI status setting to override the local | |
6304 * setting. | |
6305 */ | |
9982 | 6306 status = gaim_presence_get_active_status(account->presence); |
6307 if (gaim_status_is_available(status)) | |
4901 | 6308 aim_setextstatus(sess, AIM_ICQ_STATE_NORMAL); |
6309 | |
4342 | 6310 /* Activate SSI */ |
6311 /* Sending the enable causes other people to be able to see you, and you to see them */ | |
6312 /* Make sure your privacy setting/invisibility is set how you want it before this! */ | |
8660 | 6313 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6314 "ssi: activating server-stored buddy list\n"); |
4642 | 6315 aim_ssi_enable(sess); |
4342 | 6316 |
2991 | 6317 return 1; |
2086 | 6318 } |
4230 | 6319 |
6320 static int gaim_ssi_parseack(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 6321 GaimConnection *gc = sess->aux_data; |
4230 | 6322 va_list ap; |
6323 struct aim_ssi_tmp *retval; | |
6324 | |
6325 va_start(ap, fr); | |
6326 retval = va_arg(ap, struct aim_ssi_tmp *); | |
6327 va_end(ap); | |
6328 | |
6329 while (retval) { | |
8660 | 6330 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6331 "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 | 6332 |
6333 if (retval->ack != 0xffff) | |
6334 switch (retval->ack) { | |
6335 case 0x0000: { /* added successfully */ | |
6336 } break; | |
6337 | |
4829 | 6338 case 0x000c: { /* you are over the limit, the cheat is to the limit, come on fhqwhgads */ |
6339 gchar *buf; | |
6340 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)"))); | |
9758 | 6341 if ((retval->name != NULL) && !gaim_conv_present_error(retval->name, gaim_connection_get_account(gc), buf)) |
9627 | 6342 gaim_notify_error(gc, NULL, _("Unable To Add"), buf); |
4829 | 6343 g_free(buf); |
6344 } | |
6345 | |
7023 | 6346 case 0x000e: { /* buddy requires authorization */ |
4828 | 6347 if ((retval->action == AIM_CB_SSI_ADD) && (retval->name)) |
4269 | 6348 gaim_auth_sendrequest(gc, retval->name); |
4230 | 6349 } break; |
6350 | |
6351 default: { /* La la la */ | |
5197 | 6352 gchar *buf; |
8660 | 6353 gaim_debug_error("oscar", "ssi: Action 0x%04hx was unsuccessful with error 0x%04hx\n", retval->action, retval->ack); |
5402 | 6354 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)"))); |
9758 | 6355 if ((retval->name != NULL) && !gaim_conv_present_error(retval->name, gaim_connection_get_account(gc), buf)) |
9627 | 6356 gaim_notify_error(gc, NULL, _("Unable To Add"), buf); |
5197 | 6357 g_free(buf); |
4230 | 6358 } break; |
6359 } | |
6360 | |
6361 retval = retval->next; | |
6362 } | |
6363 | |
6364 return 1; | |
6365 } | |
6366 | |
8227 | 6367 static int gaim_ssi_parseadd(aim_session_t *sess, aim_frame_t *fr, ...) { |
6368 GaimConnection *gc = sess->aux_data; | |
6369 char *gname, *gname_utf8, *alias, *alias_utf8; | |
6370 GaimBuddy *b; | |
6371 GaimGroup *g; | |
6372 va_list ap; | |
6373 fu16_t type; | |
6374 const char *name; | |
6375 | |
6376 va_start(ap, fr); | |
6377 type = (fu16_t)va_arg(ap, int); | |
6378 name = va_arg(ap, char *); | |
6379 va_end(ap); | |
6380 | |
6381 if ((type != 0x0000) || (name == NULL)) | |
6382 return 1; | |
6383 | |
6384 gname = aim_ssi_itemlist_findparentname(sess->ssi.local, name); | |
6385 gname_utf8 = gname ? gaim_utf8_try_convert(gname) : NULL; | |
6386 alias = aim_ssi_getalias(sess->ssi.local, gname, name); | |
6387 alias_utf8 = alias ? gaim_utf8_try_convert(alias) : NULL; | |
6388 b = gaim_find_buddy(gc->account, name); | |
6389 free(alias); | |
6390 | |
6391 if (b) { | |
6392 /* Get server stored alias */ | |
6393 if (alias_utf8) { | |
6394 g_free(b->alias); | |
6395 b->alias = g_strdup(alias_utf8); | |
6396 } | |
6397 } else { | |
6398 b = gaim_buddy_new(gc->account, name, alias_utf8); | |
6399 | |
6400 if (!(g = gaim_find_group(gname_utf8 ? gname_utf8 : _("Orphans")))) { | |
6401 g = gaim_group_new(gname_utf8 ? gname_utf8 : _("Orphans")); | |
6402 gaim_blist_add_group(g, NULL); | |
6403 } | |
6404 | |
8660 | 6405 gaim_debug_info("oscar", |
9285 | 6406 "ssi: adding buddy %s to group %s to local list\n", name, gname_utf8 ? gname_utf8 : _("Orphans")); |
8227 | 6407 gaim_blist_add_buddy(b, NULL, g, NULL); |
6408 } | |
6409 g_free(gname_utf8); | |
6410 g_free(alias_utf8); | |
6411 | |
6412 return 1; | |
6413 } | |
6414 | |
4230 | 6415 static int gaim_ssi_authgiven(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 6416 GaimConnection *gc = sess->aux_data; |
4230 | 6417 va_list ap; |
6418 char *sn, *msg; | |
4236 | 6419 gchar *dialog_msg, *nombre; |
4230 | 6420 struct name_data *data; |
6695 | 6421 GaimBuddy *buddy; |
4230 | 6422 |
6423 va_start(ap, fr); | |
6424 sn = va_arg(ap, char *); | |
6425 msg = va_arg(ap, char *); | |
6426 va_end(ap); | |
6427 | |
8660 | 6428 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6429 "ssi: %s has given you permission to add him to your buddy list\n", sn); |
4230 | 6430 |
4687 | 6431 buddy = gaim_find_buddy(gc->account, sn); |
9620 | 6432 if (buddy && (gaim_buddy_get_alias_only(buddy))) |
6433 nombre = g_strdup_printf("%s (%s)", sn, gaim_buddy_get_alias_only(buddy)); | |
4236 | 6434 else |
6435 nombre = g_strdup(sn); | |
6436 | |
6437 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 | 6438 data = g_new(struct name_data, 1); |
6439 data->gc = gc; | |
6440 data->name = g_strdup(sn); | |
6441 data->nick = NULL; | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6442 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6443 gaim_request_yes_no(gc, NULL, _("Authorization Given"), dialog_msg, |
10116 | 6444 GAIM_DEFAULT_ACTION_NONE, data, |
7023 | 6445 G_CALLBACK(gaim_icq_buddyadd), |
5836 | 6446 G_CALLBACK(oscar_free_name_data)); |
4236 | 6447 |
4230 | 6448 g_free(dialog_msg); |
4236 | 6449 g_free(nombre); |
4230 | 6450 |
6451 return 1; | |
6452 } | |
6453 | |
6454 static int gaim_ssi_authrequest(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 6455 GaimConnection *gc = sess->aux_data; |
4230 | 6456 va_list ap; |
6457 char *sn, *msg; | |
4236 | 6458 gchar *dialog_msg, *nombre; |
4230 | 6459 struct name_data *data; |
6695 | 6460 GaimBuddy *buddy; |
4230 | 6461 |
6462 va_start(ap, fr); | |
6463 sn = va_arg(ap, char *); | |
6464 msg = va_arg(ap, char *); | |
6465 va_end(ap); | |
6466 | |
8660 | 6467 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6468 "ssi: received authorization request from %s\n", sn); |
4230 | 6469 |
4687 | 6470 buddy = gaim_find_buddy(gc->account, sn); |
9620 | 6471 if (buddy && (gaim_buddy_get_alias_only(buddy))) |
6472 nombre = g_strdup_printf("%s (%s)", sn, gaim_buddy_get_alias_only(buddy)); | |
4236 | 6473 else |
6474 nombre = g_strdup(sn); | |
6475 | |
4337 | 6476 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 | 6477 data = g_new(struct name_data, 1); |
6478 data->gc = gc; | |
6479 data->name = g_strdup(sn); | |
6480 data->nick = NULL; | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6481 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6482 gaim_request_action(gc, NULL, _("Authorization Request"), dialog_msg, |
9972 | 6483 GAIM_DEFAULT_ACTION_NONE, data, 2, |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6484 _("Authorize"), G_CALLBACK(gaim_auth_grant), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6485 _("Deny"), G_CALLBACK(gaim_auth_dontgrant_msgprompt)); |
4236 | 6486 |
4230 | 6487 g_free(dialog_msg); |
4236 | 6488 g_free(nombre); |
4230 | 6489 |
6490 return 1; | |
6491 } | |
6492 | |
6493 static int gaim_ssi_authreply(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 6494 GaimConnection *gc = sess->aux_data; |
4230 | 6495 va_list ap; |
6496 char *sn, *msg; | |
4236 | 6497 gchar *dialog_msg, *nombre; |
4230 | 6498 fu8_t reply; |
6695 | 6499 GaimBuddy *buddy; |
4230 | 6500 |
6501 va_start(ap, fr); | |
6502 sn = va_arg(ap, char *); | |
6503 reply = (fu8_t)va_arg(ap, int); | |
6504 msg = va_arg(ap, char *); | |
6505 va_end(ap); | |
6506 | |
8660 | 6507 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6508 "ssi: received authorization reply from %s. Reply is 0x%04hhx\n", sn, reply); |
4236 | 6509 |
4687 | 6510 buddy = gaim_find_buddy(gc->account, sn); |
9620 | 6511 if (buddy && (gaim_buddy_get_alias_only(buddy))) |
6512 nombre = g_strdup_printf("%s (%s)", sn, gaim_buddy_get_alias_only(buddy)); | |
4236 | 6513 else |
6514 nombre = g_strdup(sn); | |
6515 | |
4230 | 6516 if (reply) { |
6517 /* Granted */ | |
7023 | 6518 dialog_msg = g_strdup_printf(_("The user %s has granted your request to add them to your buddy list."), nombre); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
6519 gaim_notify_info(gc, NULL, _("Authorization Granted"), dialog_msg); |
4230 | 6520 } else { |
6521 /* Denied */ | |
7023 | 6522 dialog_msg = g_strdup_printf(_("The user %s has denied your request to add them to your buddy list for the following reason:\n%s"), nombre, msg ? msg : _("No reason given.")); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
6523 gaim_notify_info(gc, NULL, _("Authorization Denied"), dialog_msg); |
4230 | 6524 } |
6525 g_free(dialog_msg); | |
4236 | 6526 g_free(nombre); |
4230 | 6527 |
6528 return 1; | |
6529 } | |
6530 | |
6531 static int gaim_ssi_gotadded(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 6532 GaimConnection *gc = sess->aux_data; |
4230 | 6533 va_list ap; |
6534 char *sn; | |
6695 | 6535 GaimBuddy *buddy; |
4230 | 6536 |
6537 va_start(ap, fr); | |
6538 sn = va_arg(ap, char *); | |
6539 va_end(ap); | |
6540 | |
4687 | 6541 buddy = gaim_find_buddy(gc->account, sn); |
8660 | 6542 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6543 "ssi: %s added you to their buddy list\n", sn); |
9620 | 6544 gaim_account_notify_added(gc->account, NULL, sn, (buddy ? gaim_buddy_get_alias_only(buddy) : NULL), NULL); |
4230 | 6545 |
6546 return 1; | |
6547 } | |
4269 | 6548 #endif |
2086 | 6549 |
5575 | 6550 static GList *oscar_chat_info(GaimConnection *gc) { |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6551 GList *m = NULL; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6552 struct proto_chat_entry *pce; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6553 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6554 pce = g_new0(struct proto_chat_entry, 1); |
9770 | 6555 pce->label = _("_Room:"); |
5234 | 6556 pce->identifier = "room"; |
10475 | 6557 pce->required = TRUE; |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6558 m = g_list_append(m, pce); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6559 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6560 pce = g_new0(struct proto_chat_entry, 1); |
7841 | 6561 pce->label = _("_Exchange:"); |
5234 | 6562 pce->identifier = "exchange"; |
10475 | 6563 pce->required = TRUE; |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6564 pce->is_int = TRUE; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6565 pce->min = 4; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6566 pce->max = 20; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6567 m = g_list_append(m, pce); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6568 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6569 return m; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6570 } |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6571 |
9754 | 6572 GHashTable *oscar_chat_info_defaults(GaimConnection *gc, const char *chat_name) |
6573 { | |
6574 GHashTable *defaults; | |
6575 | |
6576 defaults = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free); | |
6577 | |
6578 if (chat_name != NULL) | |
6579 g_hash_table_insert(defaults, "room", g_strdup(chat_name)); | |
6580 | |
6581 return defaults; | |
6582 } | |
6583 | |
9917 | 6584 static char *oscar_get_chat_name(GHashTable *data) { |
6585 return g_strdup(g_hash_table_lookup(data, "room")); | |
6586 } | |
6587 | |
8308 | 6588 static void oscar_join_chat(GaimConnection *gc, GHashTable *data) { |
6589 OscarData *od = (OscarData *)gc->proto_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6590 aim_conn_t *cur; |
5234 | 6591 char *name, *exchange; |
6592 | |
6593 name = g_hash_table_lookup(data, "room"); | |
6594 exchange = g_hash_table_lookup(data, "exchange"); | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6595 |
8660 | 6596 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6597 "Attempting to join chat room %s.\n", name); |
8308 | 6598 |
6599 if ((name == NULL) || (*name == '\0')) { | |
6600 gaim_notify_error(gc, NULL, _("Invalid chat name specified."), NULL); | |
6601 return; | |
6602 } | |
6603 | |
4617 | 6604 if ((cur = aim_getconn_type(od->sess, AIM_CONN_TYPE_CHATNAV))) { |
8660 | 6605 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6606 "chatnav exists, creating room\n"); |
5234 | 6607 aim_chatnav_createroom(od->sess, cur, name, atoi(exchange)); |
2086 | 6608 } else { |
6609 /* this gets tricky */ | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
6610 struct create_room *cr = g_new0(struct create_room, 1); |
8660 | 6611 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6612 "chatnav does not exist, opening chatnav\n"); |
5234 | 6613 cr->exchange = atoi(exchange); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
6614 cr->name = g_strdup(name); |
4617 | 6615 od->create_rooms = g_slist_append(od->create_rooms, cr); |
6616 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_CHATNAV); | |
2086 | 6617 } |
6618 } | |
6619 | |
8308 | 6620 static void oscar_chat_invite(GaimConnection *gc, int id, const char *message, const char *name) { |
6621 OscarData *od = (OscarData *)gc->proto_data; | |
6622 struct chat_connection *ccon = find_oscar_chat(gc, id); | |
10404 | 6623 |
6624 if (ccon == NULL) | |
2086 | 6625 return; |
10404 | 6626 |
8225 | 6627 aim_im_sendch2_chatinvite(od->sess, name, message ? message : "", |
2086 | 6628 ccon->exchange, ccon->name, 0x0); |
6629 } | |
6630 | |
10458 | 6631 static void |
6632 oscar_chat_leave(GaimConnection *gc, int id) | |
6633 { | |
6634 GaimConversation *conv; | |
6635 struct chat_connection *cc; | |
6636 | |
6637 conv = gaim_find_chat(gc, id); | |
6638 | |
6639 g_return_if_fail(conv != NULL); | |
6640 | |
6641 gaim_debug_info("oscar", "Leaving chat room %s\n", conv->name); | |
6642 | |
6643 cc = find_oscar_chat(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(conv))); | |
6644 oscar_chat_kill(gc, cc); | |
2086 | 6645 } |
6646 | |
8219 | 6647 static int oscar_send_chat(GaimConnection *gc, int id, const char *message) { |
6648 OscarData *od = (OscarData *)gc->proto_data; | |
6649 GaimConversation *conv = NULL; | |
2086 | 6650 struct chat_connection *c = NULL; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
6651 char *buf, *buf2; |
9830 | 6652 fu16_t charset, charsubset; |
9807 | 6653 char *charsetstr = NULL; |
10111 | 6654 int len; |
8219 | 6655 |
6656 if (!(conv = gaim_find_chat(gc, id))) | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
6657 return -EINVAL; |
2086 | 6658 |
8219 | 6659 if (!(c = find_oscar_chat_by_conv(gc, conv))) |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
6660 return -EINVAL; |
2086 | 6661 |
8219 | 6662 buf = gaim_strdup_withhtml(message); |
6663 len = strlen(buf); | |
6664 | |
8962 | 6665 if (strstr(buf, "<IMG ")) |
6666 gaim_conversation_write(conv, "", | |
6667 _("Your IM Image was not sent. " | |
6668 "You cannot send IM Images in AIM chats."), | |
6669 GAIM_MESSAGE_ERROR, time(NULL)); | |
6670 | |
9830 | 6671 gaim_plugin_oscar_convert_to_best_encoding(gc, NULL, buf, &buf2, &len, &charset, &charsubset); |
8359 | 6672 if ((len > c->maxlen) || (len > c->maxvis)) { |
6673 g_free(buf2); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
6674 return -E2BIG; |
8359 | 6675 } |
6676 | |
9831 | 6677 if (charset == AIM_CHARSET_ASCII) |
6678 charsetstr = "us-ascii"; | |
6679 else if (charset == AIM_CHARSET_UNICODE) | |
6680 charsetstr = "unicode-2-0"; | |
6681 else if (charset == AIM_CHARSET_CUSTOM) | |
6682 charsetstr = "iso-8859-1"; | |
9807 | 6683 aim_chat_send_im(od->sess, c->conn, 0, buf2, len, charsetstr, "en"); |
8219 | 6684 g_free(buf2); |
8359 | 6685 |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
6686 return 0; |
2086 | 6687 } |
6688 | |
10042 | 6689 static const char *oscar_list_icon(GaimAccount *a, GaimBuddy *b) |
6690 { | |
4766 | 6691 if (!b || (b && b->name && b->name[0] == '+')) { |
9975 | 6692 if (a != NULL && aim_sn_is_icq(gaim_account_get_username(a))) |
4687 | 6693 return "icq"; |
6694 else | |
6695 return "aim"; | |
6696 } | |
5646
48c63ee49961
[gaim-migrate @ 6060]
Christian Hammond <chipx86@chipx86.com>
parents:
5638
diff
changeset
|
6697 |
9975 | 6698 if (b != NULL && aim_sn_is_icq(b->name)) |
4687 | 6699 return "icq"; |
6700 return "aim"; | |
6701 } | |
6702 | |
9972 | 6703 static void oscar_list_emblems(GaimBuddy *b, const char **se, const char **sw, const char **nw, const char **ne) |
4687 | 6704 { |
7334 | 6705 GaimConnection *gc = NULL; |
6706 OscarData *od = NULL; | |
10042 | 6707 GaimAccount *account = NULL; |
6708 GaimPresence *presence; | |
6709 GaimStatus *status; | |
6710 const char *status_id; | |
4687 | 6711 char *emblems[4] = {NULL,NULL,NULL,NULL}; |
6712 int i = 0; | |
7334 | 6713 aim_userinfo_t *userinfo = NULL; |
6714 | |
6715 if (b != NULL) | |
6716 account = b->account; | |
6717 if (account != NULL) | |
6718 gc = account->gc; | |
6719 if (gc != NULL) | |
6720 od = gc->proto_data; | |
7945 | 6721 if (od != NULL) |
6722 userinfo = aim_locate_finduserinfo(od->sess, b->name); | |
4687 | 6723 |
10042 | 6724 presence = gaim_buddy_get_presence(b); |
6725 status = gaim_presence_get_active_status(presence); | |
6726 status_id = gaim_status_get_id(status); | |
6727 | |
6728 if (gaim_presence_is_online(presence) == FALSE) { | |
5131 | 6729 char *gname; |
7334 | 6730 if ((b->name) && (od) && (od->sess->ssi.received_data) && |
5131 | 6731 (gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, b->name)) && |
6732 (aim_ssi_waitingforauth(od->sess->ssi.local, gname, b->name))) { | |
6733 emblems[i++] = "notauthorized"; | |
6734 } else { | |
6735 emblems[i++] = "offline"; | |
6736 } | |
6737 } | |
4916 | 6738 |
10042 | 6739 if (b->name && aim_sn_is_icq(b->name)) { |
6740 if (!strcmp(status_id, OSCAR_STATUS_ID_INVISIBLE)) | |
6741 emblems[i++] = "invisible"; | |
6742 else if (!strcmp(status_id, OSCAR_STATUS_ID_FREE4CHAT)) | |
4960 | 6743 emblems[i++] = "freeforchat"; |
10042 | 6744 else if (!strcmp(status_id, OSCAR_STATUS_ID_DND)) |
4960 | 6745 emblems[i++] = "dnd"; |
10042 | 6746 else if (!strcmp(status_id, OSCAR_STATUS_ID_NA)) |
4960 | 6747 emblems[i++] = "na"; |
10042 | 6748 else if (!strcmp(status_id, OSCAR_STATUS_ID_OCCUPIED)) |
4960 | 6749 emblems[i++] = "occupied"; |
10042 | 6750 else if (!strcmp(status_id, OSCAR_STATUS_ID_AWAY)) |
4766 | 6751 emblems[i++] = "away"; |
10042 | 6752 } else if (!strcmp(status_id, OSCAR_STATUS_ID_AWAY)) { |
6753 emblems[i++] = "away"; | |
6754 } | |
6755 | |
6756 if (userinfo != NULL ) { | |
6757 /* if (userinfo->flags & AIM_FLAG_UNCONFIRMED) | |
6758 emblems[i++] = "unconfirmed"; */ | |
6759 if (userinfo->flags & AIM_FLAG_ADMINISTRATOR) | |
6760 emblems[i++] = "admin"; | |
6761 if (userinfo->flags & AIM_FLAG_AOL) | |
6762 emblems[i++] = "aol"; | |
6763 if (userinfo->flags & AIM_FLAG_WIRELESS) | |
6764 emblems[i++] = "wireless"; | |
6765 if (userinfo->flags & AIM_FLAG_ACTIVEBUDDY) | |
6766 emblems[i++] = "activebuddy"; | |
6767 | |
6768 if ((i < 4) && (userinfo->capabilities & AIM_CAPS_HIPTOP)) | |
7945 | 6769 emblems[i++] = "hiptop"; |
6770 | |
10042 | 6771 if ((i < 4) && (userinfo->capabilities & AIM_CAPS_SECUREIM)) |
7334 | 6772 emblems[i++] = "secure"; |
10042 | 6773 } |
7334 | 6774 |
4687 | 6775 *se = emblems[0]; |
6776 *sw = emblems[1]; | |
6777 *nw = emblems[2]; | |
6778 *ne = emblems[3]; | |
6779 } | |
6780 | |
6695 | 6781 static char *oscar_tooltip_text(GaimBuddy *b) { |
5575 | 6782 GaimConnection *gc = b->account->gc; |
7283 | 6783 OscarData *od = gc->proto_data; |
7045 | 6784 aim_userinfo_t *userinfo = aim_locate_finduserinfo(od->sess, b->name); |
8701 | 6785 GString *str = g_string_new(""); |
5131 | 6786 |
6787 if (GAIM_BUDDY_IS_ONLINE(b)) { | |
8701 | 6788 oscar_string_append_info(gc, str, "\n", b, userinfo); |
7011 | 6789 |
6790 if ((userinfo != NULL) && (userinfo->flags & AIM_FLAG_AWAY) && (userinfo->away_len > 0) && (userinfo->away != NULL) && (userinfo->away_encoding != NULL)) { | |
8225 | 6791 gchar *charset = oscar_encoding_extract(userinfo->away_encoding); |
8392 | 6792 gchar *away_utf8 = oscar_encoding_to_utf8(charset, userinfo->away, userinfo->away_len); |
8225 | 6793 g_free(charset); |
7011 | 6794 if (away_utf8 != NULL) { |
7091 | 6795 gchar *tmp1, *tmp2; |
9627 | 6796 tmp2 = gaim_markup_strip_html(away_utf8); |
8341 | 6797 g_free(away_utf8); |
10732
c4cb90065e1d
[gaim-migrate @ 12334]
Luke Schierer <lschiere@pidgin.im>
parents:
10715
diff
changeset
|
6798 tmp1 = g_markup_escape_text(tmp2, -1); |
7091 | 6799 g_free(tmp2); |
8700 | 6800 tmp2 = gaim_str_sub_away_formatters(tmp1, gaim_account_get_username(gaim_connection_get_account(gc))); |
8461 | 6801 g_free(tmp1); |
8701 | 6802 g_string_append_printf(str, "\n<b>%s:</b> %s", _("Away Message"), tmp2); |
8700 | 6803 g_free(tmp2); |
5836 | 6804 } |
5131 | 6805 } |
8701 | 6806 } |
6807 | |
6808 return g_string_free(str, FALSE); | |
5131 | 6809 } |
6810 | |
10042 | 6811 static char *oscar_status_text(GaimBuddy *b) |
6812 { | |
6813 GaimConnection *gc; | |
6814 OscarData *od; | |
6815 GaimStatus *status; | |
5167 | 6816 gchar *ret = NULL; |
6817 | |
10042 | 6818 gc = gaim_account_get_connection(gaim_buddy_get_account(b)); |
6819 od = gc->proto_data; | |
6820 status = gaim_presence_get_active_status(gaim_buddy_get_presence(b)); | |
6821 | |
6822 if (gaim_status_is_available(status) == FALSE || (((b->uc & 0xffff0000) >> 16) & AIM_ICQ_STATE_CHAT)) { | |
9975 | 6823 if (aim_sn_is_icq(b->name)) |
8701 | 6824 ret = oscar_icqstatus((b->uc & 0xffff0000) >> 16); |
7038 | 6825 else |
6826 ret = g_strdup(_("Away")); | |
5836 | 6827 } else if (GAIM_BUDDY_IS_ONLINE(b)) { |
7261 | 6828 struct buddyinfo *bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(b->account, b->name)); |
10116 | 6829 if ((bi != NULL) && (bi->availmsg != NULL)) |
6292 | 6830 ret = g_markup_escape_text(bi->availmsg, strlen(bi->availmsg)); |
5836 | 6831 } else { |
5167 | 6832 char *gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, b->name); |
6833 if (aim_ssi_waitingforauth(od->sess->ssi.local, gname, b->name)) | |
6834 ret = g_strdup(_("Not Authorized")); | |
6835 else | |
6836 ret = g_strdup(_("Offline")); | |
6837 } | |
6838 | |
6839 return ret; | |
6840 } | |
6841 | |
5842 | 6842 |
5844 | 6843 static int oscar_icon_req(aim_session_t *sess, aim_frame_t *fr, ...) { |
5842 | 6844 GaimConnection *gc = sess->aux_data; |
7283 | 6845 OscarData *od = gc->proto_data; |
5892 | 6846 va_list ap; |
5842 | 6847 fu16_t type; |
5892 | 6848 fu8_t flags = 0, length = 0; |
6849 char *md5 = NULL; | |
6850 | |
7334 | 6851 |
5842 | 6852 va_start(ap, fr); |
6853 type = va_arg(ap, int); | |
5892 | 6854 |
6855 switch(type) { | |
6856 case 0x0000: | |
6857 case 0x0001: { | |
6858 flags = va_arg(ap, int); | |
6859 length = va_arg(ap, int); | |
6860 md5 = va_arg(ap, char *); | |
6861 | |
6862 if (flags == 0x41) { | |
6863 if (!aim_getconn_type(od->sess, AIM_CONN_TYPE_ICON) && !od->iconconnecting) { | |
6864 od->iconconnecting = TRUE; | |
6865 od->set_icon = TRUE; | |
6866 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_ICON); | |
6867 } else { | |
6039 | 6868 struct stat st; |
6869 const char *iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc)); | |
6870 if (iconfile == NULL) { | |
8363 | 6871 aim_ssi_delicon(od->sess); |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
6872 } else if (!g_stat(iconfile, &st)) { |
6039 | 6873 char *buf = g_malloc(st.st_size); |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
6874 FILE *file = g_fopen(iconfile, "rb"); |
6039 | 6875 if (file) { |
9532 | 6876 /* XXX - Use g_file_get_contents()? */ |
6039 | 6877 fread(buf, 1, st.st_size, file); |
6878 fclose(file); | |
8660 | 6879 gaim_debug_info("oscar", |
10042 | 6880 "Uploading icon to icon server\n"); |
6879 | 6881 aim_bart_upload(od->sess, buf, st.st_size); |
5892 | 6882 } else |
8660 | 6883 gaim_debug_error("oscar", |
10042 | 6884 "Can't open buddy icon file!\n"); |
6039 | 6885 g_free(buf); |
6886 } else { | |
8660 | 6887 gaim_debug_error("oscar", |
10042 | 6888 "Can't stat buddy icon file!\n"); |
5892 | 6889 } |
6890 } | |
8363 | 6891 } else if (flags == 0x81) { |
6892 const char *iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc)); | |
6893 if (iconfile == NULL) | |
6894 aim_ssi_delicon(od->sess); | |
6895 else | |
6896 aim_ssi_seticon(od->sess, md5, length); | |
6897 } | |
5892 | 6898 } break; |
6899 | |
6900 case 0x0002: { /* We just set an "available" message? */ | |
6901 } break; | |
6902 } | |
6903 | |
5842 | 6904 va_end(ap); |
5844 | 6905 |
6906 return 0; | |
5842 | 6907 } |
5892 | 6908 |
5575 | 6909 static void oscar_set_permit_deny(GaimConnection *gc) { |
6910 GaimAccount *account = gaim_connection_get_account(gc); | |
7283 | 6911 OscarData *od = (OscarData *)gc->proto_data; |
4230 | 6912 #ifdef NOSSI |
8143 | 6913 GSList *list; |
4230 | 6914 char buf[MAXMSGLEN]; |
6915 int at; | |
6916 | |
5575 | 6917 switch(account->perm_deny) { |
8175 | 6918 case GAIM_PRIVACY_ALLOW_ALL: |
5575 | 6919 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_DENYADD, gaim_account_get_username(account)); |
4230 | 6920 break; |
8175 | 6921 case GAIM_PRIVACY_DENY_ALL: |
5575 | 6922 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_PERMITADD, gaim_account_get_username(account)); |
4230 | 6923 break; |
8175 | 6924 case GAIM_PRIVACY_ALLOW_USERS: |
5575 | 6925 list = account->permit; |
4230 | 6926 at = 0; |
6927 while (list) { | |
6928 at += g_snprintf(buf + at, sizeof(buf) - at, "%s&", (char *)list->data); | |
6929 list = list->next; | |
6930 } | |
6931 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_PERMITADD, buf); | |
6932 break; | |
8175 | 6933 case GAIM_PRIVACY_DENY_USERS: |
5575 | 6934 list = account->deny; |
4230 | 6935 at = 0; |
6936 while (list) { | |
6937 at += g_snprintf(buf + at, sizeof(buf) - at, "%s&", (char *)list->data); | |
6938 list = list->next; | |
6939 } | |
6940 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_DENYADD, buf); | |
6941 break; | |
6942 default: | |
6943 break; | |
2086 | 6944 } |
4230 | 6945 #else |
8175 | 6946 if (od->sess->ssi.received_data) { |
6947 switch (account->perm_deny) { | |
6948 case GAIM_PRIVACY_ALLOW_ALL: | |
6949 aim_ssi_setpermdeny(od->sess, 0x01, 0xffffffff); | |
6950 break; | |
6951 case GAIM_PRIVACY_ALLOW_BUDDYLIST: | |
6952 aim_ssi_setpermdeny(od->sess, 0x05, 0xffffffff); | |
6953 break; | |
6954 case GAIM_PRIVACY_ALLOW_USERS: | |
6955 aim_ssi_setpermdeny(od->sess, 0x03, 0xffffffff); | |
6956 break; | |
6957 case GAIM_PRIVACY_DENY_ALL: | |
6958 aim_ssi_setpermdeny(od->sess, 0x02, 0xffffffff); | |
6959 break; | |
6960 case GAIM_PRIVACY_DENY_USERS: | |
6961 aim_ssi_setpermdeny(od->sess, 0x04, 0xffffffff); | |
6962 break; | |
6963 default: | |
6964 aim_ssi_setpermdeny(od->sess, 0x01, 0xffffffff); | |
6965 break; | |
6966 } | |
6967 } | |
4230 | 6968 #endif |
2086 | 6969 } |
6970 | |
5575 | 6971 static void oscar_add_permit(GaimConnection *gc, const char *who) { |
4269 | 6972 #ifdef NOSSI |
8143 | 6973 if (gc->account->perm_deny == 3) |
4269 | 6974 oscar_set_permit_deny(gc); |
6975 #else | |
7283 | 6976 OscarData *od = (OscarData *)gc->proto_data; |
8660 | 6977 gaim_debug_info("oscar", "ssi: About to add a permit\n"); |
4230 | 6978 if (od->sess->ssi.received_data) |
4889 | 6979 aim_ssi_addpermit(od->sess, who); |
4230 | 6980 #endif |
2086 | 6981 } |
6982 | |
5575 | 6983 static void oscar_add_deny(GaimConnection *gc, const char *who) { |
4269 | 6984 #ifdef NOSSI |
8143 | 6985 if (gc->account->perm_deny == 4) |
4269 | 6986 oscar_set_permit_deny(gc); |
6987 #else | |
7283 | 6988 OscarData *od = (OscarData *)gc->proto_data; |
8660 | 6989 gaim_debug_info("oscar", "ssi: About to add a deny\n"); |
4230 | 6990 if (od->sess->ssi.received_data) |
4889 | 6991 aim_ssi_adddeny(od->sess, who); |
4230 | 6992 #endif |
2086 | 6993 } |
6994 | |
5575 | 6995 static void oscar_rem_permit(GaimConnection *gc, const char *who) { |
4269 | 6996 #ifdef NOSSI |
8143 | 6997 if (gc->account->perm_deny == 3) |
4269 | 6998 oscar_set_permit_deny(gc); |
6999 #else | |
7283 | 7000 OscarData *od = (OscarData *)gc->proto_data; |
8660 | 7001 gaim_debug_info("oscar", "ssi: About to delete a permit\n"); |
4230 | 7002 if (od->sess->ssi.received_data) |
4889 | 7003 aim_ssi_delpermit(od->sess, who); |
4230 | 7004 #endif |
2086 | 7005 } |
7006 | |
5575 | 7007 static void oscar_rem_deny(GaimConnection *gc, const char *who) { |
4269 | 7008 #ifdef NOSSI |
8143 | 7009 if (gc->account->perm_deny == 4) |
4269 | 7010 oscar_set_permit_deny(gc); |
7011 #else | |
7283 | 7012 OscarData *od = (OscarData *)gc->proto_data; |
8660 | 7013 gaim_debug_info("oscar", "ssi: About to delete a deny\n"); |
4230 | 7014 if (od->sess->ssi.received_data) |
4889 | 7015 aim_ssi_deldeny(od->sess, who); |
4230 | 7016 #endif |
2086 | 7017 } |
7018 | |
9975 | 7019 static GList * |
7020 oscar_status_types(GaimAccount *account) | |
2086 | 7021 { |
9975 | 7022 GList *status_types = NULL; |
7023 GaimStatusType *type; | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
7024 |
9973 | 7025 g_return_val_if_fail(account != NULL, NULL); |
7026 | |
10042 | 7027 /* Oscar-common status types */ |
9991 | 7028 type = gaim_status_type_new_full(GAIM_STATUS_OFFLINE, |
7029 OSCAR_STATUS_ID_OFFLINE, | |
10400 | 7030 _("Offline"), FALSE, TRUE, FALSE); |
9976 | 7031 status_types = g_list_append(status_types, type); |
7032 | |
9991 | 7033 type = gaim_status_type_new_full(GAIM_STATUS_ONLINE, |
7034 OSCAR_STATUS_ID_ONLINE, | |
10400 | 7035 _("Online"), FALSE, TRUE, FALSE); |
9976 | 7036 status_types = g_list_append(status_types, type); |
7037 | |
10198 | 7038 type = gaim_status_type_new_with_attrs(GAIM_STATUS_AVAILABLE, |
7039 OSCAR_STATUS_ID_AVAILABLE, | |
7040 _("Available"), TRUE, TRUE, FALSE, | |
7041 "message", _("Message"), | |
7042 gaim_value_new(GAIM_TYPE_STRING), NULL); | |
9976 | 7043 status_types = g_list_append(status_types, type); |
7044 | |
10195 | 7045 type = gaim_status_type_new_with_attrs(GAIM_STATUS_AWAY, |
7046 OSCAR_STATUS_ID_AWAY, | |
7047 _("Away"), TRUE, TRUE, FALSE, | |
7048 "message", _("Message"), | |
7049 gaim_value_new(GAIM_TYPE_STRING), NULL); | |
10042 | 7050 status_types = g_list_append(status_types, type); |
7051 | |
7052 type = gaim_status_type_new_full(GAIM_STATUS_HIDDEN, | |
7053 OSCAR_STATUS_ID_INVISIBLE, | |
10198 | 7054 _("Invisible"), TRUE, TRUE, FALSE); |
10042 | 7055 status_types = g_list_append(status_types, type); |
7056 | |
7057 if (aim_sn_is_icq(gaim_account_get_username(account)) == FALSE ) | |
7058 return status_types; | |
7059 | |
7060 /* ICQ-specific status types */ | |
7061 | |
9991 | 7062 type = gaim_status_type_new_full(GAIM_STATUS_AVAILABLE, |
7063 OSCAR_STATUS_ID_FREE4CHAT, | |
7064 _("Free For Chat"), TRUE, TRUE, FALSE); | |
9982 | 7065 status_types = g_list_append(status_types, type); |
7066 | |
9991 | 7067 type = gaim_status_type_new_full(GAIM_STATUS_UNAVAILABLE, |
7068 OSCAR_STATUS_ID_OCCUPIED, | |
7069 _("Occupied"), TRUE, TRUE, FALSE); | |
9976 | 7070 status_types = g_list_append(status_types, type); |
7071 | |
9991 | 7072 type = gaim_status_type_new_full(GAIM_STATUS_EXTENDED_AWAY, |
7073 OSCAR_STATUS_ID_DND, | |
7074 _("Do Not Disturb"), TRUE, TRUE, FALSE); | |
9976 | 7075 status_types = g_list_append(status_types, type); |
7076 | |
9991 | 7077 type = gaim_status_type_new_full(GAIM_STATUS_EXTENDED_AWAY, |
7078 OSCAR_STATUS_ID_NA, | |
7079 _("Not Available"), TRUE, TRUE, FALSE); | |
9976 | 7080 status_types = g_list_append(status_types, type); |
9975 | 7081 |
7082 return status_types; | |
4333 | 7083 } |
7084 | |
7172 | 7085 static void oscar_ssi_editcomment(struct name_data *data, const char *text) { |
8341 | 7086 GaimConnection *gc = data->gc; |
7087 OscarData *od = gc->proto_data; | |
7172 | 7088 GaimBuddy *b; |
7089 GaimGroup *g; | |
7090 | |
7091 if (!(b = gaim_find_buddy(gaim_connection_get_account(data->gc), data->name))) { | |
7092 oscar_free_name_data(data); | |
7093 return; | |
7094 } | |
7095 | |
7096 if (!(g = gaim_find_buddys_group(b))) { | |
7097 oscar_free_name_data(data); | |
7098 return; | |
7099 } | |
7100 | |
7101 aim_ssi_editcomment(od->sess, g->name, data->name, text); | |
8341 | 7102 |
7103 if (!aim_sncmp(data->name, gc->account->username)) | |
7104 gaim_check_comment(od, text); | |
7105 | |
7172 | 7106 oscar_free_name_data(data); |
7107 } | |
7108 | |
9030 | 7109 static void oscar_buddycb_edit_comment(GaimBlistNode *node, gpointer ignore) { |
7110 | |
7111 GaimBuddy *buddy; | |
7112 GaimConnection *gc; | |
7113 OscarData *od; | |
7114 struct name_data *data; | |
7172 | 7115 GaimGroup *g; |
7116 char *comment; | |
7117 gchar *comment_utf8; | |
9631 | 7118 gchar *title; |
7172 | 7119 |
9030 | 7120 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); |
7121 | |
7122 buddy = (GaimBuddy *) node; | |
7123 gc = gaim_account_get_connection(buddy->account); | |
7124 od = gc->proto_data; | |
7125 | |
7126 data = g_new(struct name_data, 1); | |
7127 | |
7128 if (!(g = gaim_find_buddys_group(buddy))) | |
7172 | 7129 return; |
9030 | 7130 comment = aim_ssi_getcomment(od->sess->ssi.local, g->name, buddy->name); |
7172 | 7131 comment_utf8 = comment ? gaim_utf8_try_convert(comment) : NULL; |
7132 | |
7133 data->gc = gc; | |
9030 | 7134 data->name = g_strdup(buddy->name); |
7172 | 7135 data->nick = NULL; |
7136 | |
9631 | 7137 title = g_strdup_printf(_("Buddy Comment for %s"), data->name); |
7138 gaim_request_input(gc, title, _("Buddy Comment:"), NULL, | |
8697 | 7139 comment_utf8, TRUE, FALSE, NULL, |
7172 | 7140 _("OK"), G_CALLBACK(oscar_ssi_editcomment), |
7141 _("Cancel"), G_CALLBACK(oscar_free_name_data), | |
7142 data); | |
9631 | 7143 g_free(title); |
7172 | 7144 |
7145 free(comment); | |
7146 g_free(comment_utf8); | |
7147 } | |
7148 | |
9030 | 7149 static GList *oscar_buddy_menu(GaimBuddy *buddy) { |
7150 | |
7151 GaimConnection *gc = gaim_account_get_connection(buddy->account); | |
7283 | 7152 OscarData *od = gc->proto_data; |
9030 | 7153 |
4333 | 7154 GList *m = NULL; |
9030 | 7155 GaimBlistNodeAction *act; |
7156 | |
7157 act = gaim_blist_node_action_new(_("Edit Buddy Comment"), | |
10662
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10654
diff
changeset
|
7158 oscar_buddycb_edit_comment, NULL, NULL); |
9030 | 7159 m = g_list_append(m, act); |
7172 | 7160 |
4333 | 7161 if (od->icq) { |
4624 | 7162 #if 0 |
9030 | 7163 act = gaim_blist_node_action_new(_("Get Status Msg"), |
10662
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10654
diff
changeset
|
7164 oscar_get_icqstatusmsg, NULL, NULL); |
9030 | 7165 m = g_list_append(m, act); |
4624 | 7166 #endif |
4333 | 7167 } else { |
7011 | 7168 aim_userinfo_t *userinfo; |
9030 | 7169 userinfo = aim_locate_finduserinfo(od->sess, buddy->name); |
7170 | |
7171 if (userinfo && aim_sncmp(gaim_account_get_username(buddy->account), buddy->name) && | |
7172 GAIM_BUDDY_IS_ONLINE(buddy)) { | |
7173 | |
7011 | 7174 if (userinfo->capabilities & AIM_CAPS_DIRECTIM) { |
9030 | 7175 act = gaim_blist_node_action_new(_("Direct IM"), |
10662
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10654
diff
changeset
|
7176 oscar_ask_direct_im, NULL, NULL); |
9030 | 7177 m = g_list_append(m, act); |
5917 | 7178 } |
9466 | 7179 #if 0 |
7011 | 7180 if (userinfo->capabilities & AIM_CAPS_GETFILE) { |
9030 | 7181 act = gaim_blist_node_action_new(_("Get File"), |
10662
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10654
diff
changeset
|
7182 oscar_ask_getfile, NULL, NULL); |
9030 | 7183 m = g_list_append(m, act); |
5917 | 7184 } |
4826 | 7185 #endif |
4333 | 7186 } |
5131 | 7187 } |
5197 | 7188 |
5131 | 7189 if (od->sess->ssi.received_data) { |
9030 | 7190 char *gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, buddy->name); |
7191 if (gname && aim_ssi_waitingforauth(od->sess->ssi.local, gname, buddy->name)) { | |
7192 act = gaim_blist_node_action_new(_("Re-request Authorization"), | |
10662
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10654
diff
changeset
|
7193 gaim_auth_sendrequest_menu, NULL, NULL); |
9030 | 7194 m = g_list_append(m, act); |
4333 | 7195 } |
4916 | 7196 } |
10157 | 7197 |
4333 | 7198 return m; |
7199 } | |
7200 | |
9030 | 7201 |
7202 static GList *oscar_blist_node_menu(GaimBlistNode *node) { | |
7203 if(GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
7204 return oscar_buddy_menu((GaimBuddy *) node); | |
7205 } else { | |
7206 return NULL; | |
7207 } | |
7208 } | |
7209 | |
10570 | 7210 static void |
7211 oscar_icq_privacy_opts(GaimConnection *gc, GaimRequestFields *fields) | |
7212 { | |
7213 OscarData *od = gc->proto_data; | |
7214 GaimAccount *account = gaim_connection_get_account(gc); | |
7215 GaimRequestField *f; | |
7216 gboolean auth, hide_ip, web_aware; | |
7217 | |
7218 f = gaim_request_fields_get_field(fields, "authorization"); | |
7219 auth = gaim_request_field_bool_get_value(f); | |
7220 | |
7221 f = gaim_request_fields_get_field(fields, "hide_ip"); | |
7222 hide_ip = gaim_request_field_bool_get_value(f); | |
7223 | |
7224 f = gaim_request_fields_get_field(fields, "web_aware"); | |
7225 web_aware = gaim_request_field_bool_get_value(f); | |
7226 | |
7227 gaim_account_set_bool(account, "authorization", auth); | |
7228 gaim_account_set_bool(account, "hide_ip", hide_ip); | |
7229 gaim_account_set_bool(account, "web_aware", web_aware); | |
7230 | |
7231 aim_icq_setsecurity(od->sess, auth, web_aware, hide_ip); | |
7232 } | |
7233 | |
7234 static void | |
7235 oscar_show_icq_privacy_opts(GaimPluginAction *action) | |
7236 { | |
7237 GaimConnection *gc = (GaimConnection *) action->context; | |
7238 GaimAccount *account = gaim_connection_get_account(gc); | |
7239 GaimRequestFields *fields; | |
7240 GaimRequestFieldGroup *g; | |
7241 GaimRequestField *f; | |
7242 gboolean auth, hide_ip, web_aware; | |
7243 | |
7244 auth = gaim_account_get_bool(account, "authorization", OSCAR_DEFAULT_AUTHORIZATION); | |
7245 hide_ip = gaim_account_get_bool(account, "hide_ip", OSCAR_DEFAULT_HIDE_IP); | |
7246 web_aware = gaim_account_get_bool(account, "web_aware", OSCAR_DEFAULT_WEB_AWARE); | |
7247 | |
7248 fields = gaim_request_fields_new(); | |
7249 | |
7250 g = gaim_request_field_group_new(NULL); | |
7251 | |
7252 f = gaim_request_field_bool_new("authorization", _("Require authorization"), auth); | |
7253 gaim_request_field_group_add_field(g, f); | |
7254 | |
7255 f = gaim_request_field_bool_new("hide_ip", _("Hide IP address"), hide_ip); | |
7256 gaim_request_field_group_add_field(g, f); | |
7257 | |
7258 f = gaim_request_field_bool_new("web_aware", _("Web aware"), web_aware); | |
7259 gaim_request_field_group_add_field(g, f); | |
7260 | |
7261 gaim_request_fields_add_group(fields, g); | |
7262 | |
7263 gaim_request_fields(gc, _("ICQ Privacy Options"), _("ICQ Privacy Options"), | |
7264 NULL, fields, | |
7265 _("OK"), G_CALLBACK(oscar_icq_privacy_opts), | |
7266 _("Cancel"), NULL, gc); | |
7267 } | |
9030 | 7268 |
5575 | 7269 static void oscar_format_screenname(GaimConnection *gc, const char *nick) { |
7283 | 7270 OscarData *od = gc->proto_data; |
5575 | 7271 if (!aim_sncmp(gaim_account_get_username(gaim_connection_get_account(gc)), nick)) { |
4333 | 7272 if (!aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH)) { |
7273 od->setnick = TRUE; | |
7274 od->newsn = g_strdup(nick); | |
7275 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
7276 } else { | |
7277 aim_admin_setnick(od->sess, aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH), nick); | |
7278 } | |
7279 } else { | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
7280 gaim_notify_error(gc, NULL, _("The new formatting is invalid."), |
8152 | 7281 _("Screen name formatting can change only capitalization and whitespace.")); |
4333 | 7282 } |
7283 } | |
7284 | |
9015 | 7285 static void oscar_show_format_screenname(GaimPluginAction *action) |
4333 | 7286 { |
9015 | 7287 GaimConnection *gc = (GaimConnection *) action->context; |
8152 | 7288 gaim_request_input(gc, NULL, _("New screen name formatting:"), NULL, |
8697 | 7289 gaim_connection_get_display_name(gc), FALSE, FALSE, NULL, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
7290 _("OK"), G_CALLBACK(oscar_format_screenname), |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
7291 _("Cancel"), NULL, |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
7292 gc); |
4333 | 7293 } |
7294 | |
9015 | 7295 static void oscar_confirm_account(GaimPluginAction *action) |
4333 | 7296 { |
9015 | 7297 GaimConnection *gc = (GaimConnection *) action->context; |
7283 | 7298 OscarData *od = gc->proto_data; |
4333 | 7299 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); |
7300 | |
7301 if (conn) { | |
7302 aim_admin_reqconfirm(od->sess, conn); | |
7303 } else { | |
7304 od->conf = TRUE; | |
7305 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
7306 } | |
7307 } | |
7308 | |
9015 | 7309 static void oscar_show_email(GaimPluginAction *action) |
4333 | 7310 { |
9015 | 7311 GaimConnection *gc = (GaimConnection *) action->context; |
7283 | 7312 OscarData *od = gc->proto_data; |
4333 | 7313 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); |
7314 | |
7315 if (conn) { | |
7316 aim_admin_getinfo(od->sess, conn, 0x11); | |
7317 } else { | |
7318 od->reqemail = TRUE; | |
7319 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
7320 } | |
7321 } | |
7322 | |
5575 | 7323 static void oscar_change_email(GaimConnection *gc, const char *email) |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7324 { |
7283 | 7325 OscarData *od = gc->proto_data; |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7326 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
|
7327 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7328 if (conn) { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7329 aim_admin_setemail(od->sess, conn, email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7330 } else { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7331 od->setemail = TRUE; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7332 od->email = g_strdup(email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7333 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7334 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7335 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7336 |
9015 | 7337 static void oscar_show_change_email(GaimPluginAction *action) |
4333 | 7338 { |
9015 | 7339 GaimConnection *gc = (GaimConnection *) action->context; |
6035
8c44020a958e
[gaim-migrate @ 6485]
Christian Hammond <chipx86@chipx86.com>
parents:
6029
diff
changeset
|
7340 gaim_request_input(gc, NULL, _("Change Address To:"), NULL, NULL, |
8697 | 7341 FALSE, FALSE, NULL, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
7342 _("OK"), G_CALLBACK(oscar_change_email), |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
7343 _("Cancel"), NULL, |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
7344 gc); |
4333 | 7345 } |
7346 | |
9015 | 7347 static void oscar_show_awaitingauth(GaimPluginAction *action) |
4333 | 7348 { |
9015 | 7349 GaimConnection *gc = (GaimConnection *) action->context; |
7283 | 7350 OscarData *od = gc->proto_data; |
4333 | 7351 gchar *nombre, *text, *tmp; |
6695 | 7352 GaimBlistNode *gnode, *cnode, *bnode; |
4333 | 7353 int num=0; |
7354 | |
6873 | 7355 text = g_strdup(""); |
4333 | 7356 |
4785 | 7357 for (gnode = gaim_get_blist()->root; gnode; gnode = gnode->next) { |
6695 | 7358 GaimGroup *group = (GaimGroup *)gnode; |
4785 | 7359 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) |
7360 continue; | |
6695 | 7361 for (cnode = gnode->child; cnode; cnode = cnode->next) { |
7362 if(!GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
4785 | 7363 continue; |
6695 | 7364 for (bnode = cnode->child; bnode; bnode = bnode->next) { |
7365 GaimBuddy *buddy = (GaimBuddy *)bnode; | |
7366 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
7367 continue; | |
7368 if (buddy->account == gc->account && aim_ssi_waitingforauth(od->sess->ssi.local, group->name, buddy->name)) { | |
9620 | 7369 if (gaim_buddy_get_alias_only(buddy)) |
7370 nombre = g_strdup_printf(" %s (%s)", buddy->name, gaim_buddy_get_alias_only(buddy)); | |
6695 | 7371 else |
7372 nombre = g_strdup_printf(" %s", buddy->name); | |
6873 | 7373 tmp = g_strdup_printf("%s%s<br>", text, nombre); |
6695 | 7374 g_free(text); |
7375 text = tmp; | |
7376 g_free(nombre); | |
7377 num++; | |
7378 } | |
4333 | 7379 } |
2979 | 7380 } |
4333 | 7381 } |
7382 | |
7383 if (!num) { | |
7384 g_free(text); | |
6873 | 7385 text = g_strdup(_("<i>you are not waiting for authorization</i>")); |
7386 } | |
7387 | |
7388 gaim_notify_formatted(gc, NULL, _("You are awaiting authorization from " | |
7389 "the following buddies"), _("You can re-request " | |
7390 "authorization from these buddies by " | |
7391 "right-clicking on them and selecting " | |
7392 "\"Re-request Authorization.\""), text, NULL, NULL); | |
4333 | 7393 g_free(text); |
2979 | 7394 } |
7395 | |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7396 static void search_by_email_cb(GaimConnection *gc, const char *email) |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7397 { |
8950 | 7398 OscarData *od = (OscarData *)gc->proto_data; |
7399 | |
7400 aim_search_address(od->sess, od->conn, email); | |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7401 } |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7402 |
9015 | 7403 static void oscar_show_find_email(GaimPluginAction *action) |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7404 { |
9015 | 7405 GaimConnection *gc = (GaimConnection *) action->context; |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7406 gaim_request_input(gc, _("Find Buddy by E-mail"), |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7407 _("Search for a buddy by e-mail address"), |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7408 _("Type the e-mail address of the buddy you are " |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7409 "searching for."), |
8697 | 7410 NULL, FALSE, FALSE, NULL, |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7411 _("Search"), G_CALLBACK(search_by_email_cb), |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7412 _("Cancel"), NULL, gc); |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7413 } |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7414 |
9015 | 7415 static void oscar_show_set_info(GaimPluginAction *action) |
7067
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
7416 { |
9015 | 7417 GaimConnection *gc = (GaimConnection *) action->context; |
7067
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
7418 gaim_account_request_change_user_info(gaim_connection_get_account(gc)); |
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
7419 } |
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
7420 |
9015 | 7421 static void oscar_show_set_info_icqurl(GaimPluginAction *action) |
8576 | 7422 { |
9015 | 7423 GaimConnection *gc = (GaimConnection *) action->context; |
10240
95ca0db2d01d
[gaim-migrate @ 11377]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10209
diff
changeset
|
7424 gaim_notify_uri(gc, "http://www.icq.com/whitepages/user_details.php"); |
8576 | 7425 } |
7426 | |
9015 | 7427 static void oscar_change_pass(GaimPluginAction *action) |
7063
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
7428 { |
9015 | 7429 GaimConnection *gc = (GaimConnection *) action->context; |
7063
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
7430 gaim_account_request_change_password(gaim_connection_get_account(gc)); |
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
7431 } |
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
7432 |
9015 | 7433 static void oscar_show_chpassurl(GaimPluginAction *action) |
4333 | 7434 { |
9015 | 7435 GaimConnection *gc = (GaimConnection *) action->context; |
7283 | 7436 OscarData *od = gc->proto_data; |
5575 | 7437 gchar *substituted = gaim_strreplace(od->sess->authinfo->chpassurl, "%s", gaim_account_get_username(gaim_connection_get_account(gc))); |
10240
95ca0db2d01d
[gaim-migrate @ 11377]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10209
diff
changeset
|
7438 gaim_notify_uri(gc, substituted); |
5517 | 7439 g_free(substituted); |
4333 | 7440 } |
7441 | |
9015 | 7442 static void oscar_show_imforwardingurl(GaimPluginAction *action) |
7026 | 7443 { |
9015 | 7444 GaimConnection *gc = (GaimConnection *) action->context; |
10240
95ca0db2d01d
[gaim-migrate @ 11377]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10209
diff
changeset
|
7445 gaim_notify_uri(gc, "http://mymobile.aol.com/dbreg/register?action=imf&clientID=1"); |
7026 | 7446 } |
7447 | |
5842 | 7448 static void oscar_set_icon(GaimConnection *gc, const char *iconfile) |
7449 { | |
7283 | 7450 OscarData *od = gc->proto_data; |
5844 | 7451 aim_session_t *sess = od->sess; |
5842 | 7452 FILE *file; |
7453 struct stat st; | |
5844 | 7454 |
6039 | 7455 if (iconfile == NULL) { |
8363 | 7456 aim_ssi_delicon(od->sess); |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
7457 } else if (!g_stat(iconfile, &st)) { |
5842 | 7458 char *buf = g_malloc(st.st_size); |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
7459 file = g_fopen(iconfile, "rb"); |
5842 | 7460 if (file) { |
6052 | 7461 md5_state_t *state; |
6039 | 7462 char md5[16]; |
9532 | 7463 /* XXX - Use g_file_get_contents()? */ |
5842 | 7464 int len = fread(buf, 1, st.st_size, file); |
6039 | 7465 fclose(file); |
6052 | 7466 state = g_malloc(sizeof(md5_state_t)); |
5842 | 7467 md5_init(state); |
7468 md5_append(state, buf, len); | |
7469 md5_finish(state, md5); | |
7470 g_free(state); | |
7471 aim_ssi_seticon(sess, md5, 16); | |
7472 } else | |
8660 | 7473 gaim_debug_error("oscar", |
5842 | 7474 "Can't open buddy icon file!\n"); |
7475 g_free(buf); | |
7476 } else | |
8660 | 7477 gaim_debug_error("oscar", |
5842 | 7478 "Can't stat buddy icon file!\n"); |
7479 } | |
7480 | |
7481 | |
9015 | 7482 static GList *oscar_actions(GaimPlugin *plugin, gpointer context) |
2086 | 7483 { |
9015 | 7484 GaimConnection *gc = (GaimConnection *) context; |
7283 | 7485 OscarData *od = gc->proto_data; |
4333 | 7486 GList *m = NULL; |
9015 | 7487 GaimPluginAction *act; |
7488 | |
7489 act = gaim_plugin_action_new(_("Set User Info..."), | |
7490 oscar_show_set_info); | |
7491 m = g_list_append(m, act); | |
4333 | 7492 |
10570 | 7493 if (od->icq) |
7494 { | |
9015 | 7495 act = gaim_plugin_action_new(_("Set User Info (URL)..."), |
7496 oscar_show_set_info_icqurl); | |
7497 m = g_list_append(m, act); | |
8576 | 7498 } |
7499 | |
9015 | 7500 act = gaim_plugin_action_new(_("Change Password..."), |
7501 oscar_change_pass); | |
7502 m = g_list_append(m, act); | |
4617 | 7503 |
10570 | 7504 if (od->sess->authinfo->chpassurl != NULL) |
7505 { | |
9015 | 7506 act = gaim_plugin_action_new(_("Change Password (URL)"), |
7507 oscar_show_chpassurl); | |
7508 m = g_list_append(m, act); | |
7509 | |
7510 act = gaim_plugin_action_new(_("Configure IM Forwarding (URL)"), | |
7511 oscar_show_imforwardingurl); | |
7512 m = g_list_append(m, act); | |
7026 | 7513 } |
7514 | |
10570 | 7515 m = g_list_append(m, NULL); |
7516 | |
7517 if (od->icq) | |
7518 { | |
7519 /* ICQ actions */ | |
7520 act = gaim_plugin_action_new(_("Show privacy options..."), | |
7521 oscar_show_icq_privacy_opts); | |
7522 m = g_list_append(m, act); | |
7523 } | |
7524 else | |
7525 { | |
4617 | 7526 /* AIM actions */ |
9015 | 7527 act = gaim_plugin_action_new(_("Format Screen Name..."), |
7528 oscar_show_format_screenname); | |
7529 m = g_list_append(m, act); | |
7530 | |
7531 act = gaim_plugin_action_new(_("Confirm Account"), | |
7532 oscar_confirm_account); | |
7533 m = g_list_append(m, act); | |
7534 | |
7535 act = gaim_plugin_action_new(_("Display Currently Registered Address"), | |
7536 oscar_show_email); | |
7537 m = g_list_append(m, act); | |
7538 | |
7539 act = gaim_plugin_action_new(_("Change Currently Registered Address..."), | |
7540 oscar_show_change_email); | |
7541 m = g_list_append(m, act); | |
2086 | 7542 } |
4333 | 7543 |
7544 m = g_list_append(m, NULL); | |
7545 | |
9015 | 7546 act = gaim_plugin_action_new(_("Show Buddies Awaiting Authorization"), |
7547 oscar_show_awaitingauth); | |
7548 m = g_list_append(m, act); | |
4333 | 7549 |
2086 | 7550 m = g_list_append(m, NULL); |
4333 | 7551 |
9015 | 7552 act = gaim_plugin_action_new(_("Search for Buddy by Email..."), |
7553 oscar_show_find_email); | |
7554 m = g_list_append(m, act); | |
4333 | 7555 |
8591 | 7556 #if 0 |
9015 | 7557 act = gaim_plugin_action_new(_("Search for Buddy by Information"), |
7558 show_find_info); | |
7559 m = g_list_append(m, act); | |
8591 | 7560 #endif |
2086 | 7561 |
7562 return m; | |
7563 } | |
7564 | |
5575 | 7565 static void oscar_change_passwd(GaimConnection *gc, const char *old, const char *new) |
2086 | 7566 { |
7283 | 7567 OscarData *od = gc->proto_data; |
4617 | 7568 |
7569 if (od->icq) { | |
7570 aim_icq_changepasswd(od->sess, new); | |
2086 | 7571 } else { |
4617 | 7572 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); |
7573 if (conn) { | |
7574 aim_admin_changepasswd(od->sess, conn, new, old); | |
7575 } else { | |
7576 od->chpass = TRUE; | |
7577 od->oldp = g_strdup(old); | |
7578 od->newp = g_strdup(new); | |
7579 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
7580 } | |
2086 | 7581 } |
7582 } | |
7583 | |
6059 | 7584 static void oscar_convo_closed(GaimConnection *gc, const char *who) |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
7585 { |
7283 | 7586 OscarData *od = gc->proto_data; |
8971 | 7587 struct oscar_direct_im *dim = oscar_direct_im_find(od, who); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
7588 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
7589 if (!dim) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
7590 return; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
7591 |
8971 | 7592 oscar_direct_im_destroy(od, dim); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
7593 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
7594 |
9935 | 7595 static void |
7596 recent_buddies_cb(const char *name, GaimPrefType type, gpointer value, gpointer data) | |
7597 { | |
7598 GaimConnection *gc = data; | |
7599 OscarData *od = gc->proto_data; | |
7600 aim_session_t *sess = od->sess; | |
7601 fu32_t presence; | |
7602 | |
7603 presence = aim_ssi_getpresence(sess->ssi.local); | |
7604 | |
7605 if (value) { | |
9992 | 7606 /* Based on the packet capture I thought it was the first one */ |
7607 /* Stu thinks it's the second one. */ | |
7608 /* presence |= 0x00400000; */ | |
9971 | 7609 presence &= ~0x00020000; |
9935 | 7610 aim_ssi_setpresence(sess, presence); |
7611 } else { | |
9992 | 7612 /* presence &= ~0x00400000; */ |
9971 | 7613 presence |= 0x00020000; |
9935 | 7614 aim_ssi_setpresence(sess, presence); |
7615 } | |
7616 } | |
7617 | |
10653 | 7618 #if USE_PRPL_PREFERENCES |
9935 | 7619 static GaimPluginPrefFrame * |
9936 | 7620 get_plugin_pref_frame(GaimPlugin *plugin) |
7621 { | |
9935 | 7622 GaimPluginPrefFrame *frame; |
7623 GaimPluginPref *ppref; | |
7624 | |
7625 frame = gaim_plugin_pref_frame_new(); | |
7626 | |
7627 ppref = gaim_plugin_pref_new_with_name_and_label("/plugins/prpl/oscar/recent_buddies", _("Use recent buddies group")); | |
7628 gaim_plugin_pref_frame_add(frame, ppref); | |
7629 | |
7630 ppref = gaim_plugin_pref_new_with_name_and_label("/plugins/prpl/oscar/show_idle", _("Show how long you have been idle")); | |
7631 gaim_plugin_pref_frame_add(frame, ppref); | |
7632 | |
7633 return frame; | |
7634 } | |
10653 | 7635 #endif |
9935 | 7636 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7637 static GaimPluginProtocolInfo prpl_info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7638 { |
9308 | 7639 OPT_PROTO_MAIL_CHECK | OPT_PROTO_IM_IMAGE, |
9475 | 7640 NULL, /* user_splits */ |
7641 NULL, /* protocol_options */ | |
10674 | 7642 {"jpeg,gif,bmp,ico", 48, 48, 50, 50, |
7643 GAIM_ICON_SCALE_SEND | GAIM_ICON_SCALE_DISPLAY}, /* icon_spec */ | |
9475 | 7644 oscar_list_icon, /* list_icon */ |
7645 oscar_list_emblems, /* list_emblems */ | |
7646 oscar_status_text, /* status_text */ | |
7647 oscar_tooltip_text, /* tooltip_text */ | |
9973 | 7648 oscar_status_types, /* status_types */ |
9475 | 7649 oscar_blist_node_menu, /* blist_node_menu */ |
7650 oscar_chat_info, /* chat_info */ | |
9754 | 7651 oscar_chat_info_defaults, /* chat_info_defaults */ |
9475 | 7652 oscar_login, /* login */ |
7653 oscar_close, /* close */ | |
7654 oscar_send_im, /* send_im */ | |
7655 oscar_set_info, /* set_info */ | |
7656 oscar_send_typing, /* send_typing */ | |
7657 oscar_get_info, /* get_info */ | |
9973 | 7658 oscar_set_status, /* set_status */ |
9475 | 7659 oscar_set_idle, /* set_idle */ |
7660 oscar_change_passwd, /* change_passwd */ | |
7661 oscar_add_buddy, /* add_buddy */ | |
7662 oscar_add_buddies, /* add_buddies */ | |
7663 oscar_remove_buddy, /* remove_buddy */ | |
7664 oscar_remove_buddies, /* remove_buddies */ | |
7665 oscar_add_permit, /* add_permit */ | |
7666 oscar_add_deny, /* add_deny */ | |
7667 oscar_rem_permit, /* rem_permit */ | |
7668 oscar_rem_deny, /* rem_deny */ | |
7669 oscar_set_permit_deny, /* set_permit_deny */ | |
7670 oscar_warn, /* warn */ | |
7671 oscar_join_chat, /* join_chat */ | |
7672 NULL, /* reject_chat */ | |
9973 | 7673 oscar_get_chat_name, /* get_chat_name */ |
9475 | 7674 oscar_chat_invite, /* chat_invite */ |
7675 oscar_chat_leave, /* chat_leave */ | |
7676 NULL, /* chat_whisper */ | |
7677 oscar_send_chat, /* chat_send */ | |
7678 oscar_keepalive, /* keepalive */ | |
7679 NULL, /* register_user */ | |
7680 NULL, /* get_cb_info */ | |
7681 NULL, /* get_cb_away */ | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7682 #ifndef NOSSI |
9475 | 7683 oscar_alias_buddy, /* alias_buddy */ |
7684 oscar_move_buddy, /* group_buddy */ | |
7685 oscar_rename_group, /* rename_group */ | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7686 #else |
9475 | 7687 NULL, /* alias_buddy */ |
7688 NULL, /* group_buddy */ | |
7689 NULL, /* rename_group */ | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7690 #endif |
9475 | 7691 NULL, /* buddy_free */ |
7692 oscar_convo_closed, /* convo_closed */ | |
7693 NULL, /* normalize */ | |
7694 oscar_set_icon, /* set_buddy_icon */ | |
7695 NULL, /* remove_group */ | |
7696 NULL, /* get_cb_real_name */ | |
7697 NULL, /* set_chat_topic */ | |
7698 NULL, /* find_blist_chat */ | |
7699 NULL, /* roomlist_get_list */ | |
7700 NULL, /* roomlist_cancel */ | |
7701 NULL, /* roomlist_expand_category */ | |
7702 oscar_can_receive_file, /* can_receive_file */ | |
7703 oscar_send_file /* send_file */ | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7704 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7705 |
10653 | 7706 #if USE_PRPL_PREFERENCES |
9935 | 7707 static GaimPluginUiInfo prefs_info = { |
7708 get_plugin_pref_frame | |
7709 }; | |
10653 | 7710 #endif |
9935 | 7711 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7712 static GaimPluginInfo info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7713 { |
9943 | 7714 GAIM_PLUGIN_MAGIC, |
7715 GAIM_MAJOR_VERSION, | |
7716 GAIM_MINOR_VERSION, | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7717 GAIM_PLUGIN_PROTOCOL, /**< type */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7718 NULL, /**< ui_requirement */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7719 0, /**< flags */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7720 NULL, /**< dependencies */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7721 GAIM_PRIORITY_DEFAULT, /**< priority */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7722 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7723 "prpl-oscar", /**< id */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7724 "AIM/ICQ", /**< name */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7725 VERSION, /**< version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7726 /** summary */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7727 N_("AIM/ICQ Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7728 /** description */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7729 N_("AIM/ICQ Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7730 NULL, /**< author */ |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6350
diff
changeset
|
7731 GAIM_WEBSITE, /**< homepage */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7732 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7733 NULL, /**< load */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7734 NULL, /**< unload */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7735 NULL, /**< destroy */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7736 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7737 NULL, /**< ui_info */ |
8993 | 7738 &prpl_info, /**< extra_info */ |
10653 | 7739 #if USE_PRPL_PREFERENCES |
10487 | 7740 NULL, /**< prefs_info */ |
10653 | 7741 #else |
7742 NULL, /**< prefs_info */ | |
7743 #endif | |
9015 | 7744 oscar_actions |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7745 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7746 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7747 static void |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5917
diff
changeset
|
7748 init_plugin(GaimPlugin *plugin) |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7749 { |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
7750 GaimAccountOption *option; |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
7751 |
9830 | 7752 option = gaim_account_option_string_new(_("Auth host"), "server", FAIM_LOGIN_SERVER); |
7753 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | |
7754 | |
7755 option = gaim_account_option_int_new(_("Auth port"), "port", FAIM_LOGIN_PORT); | |
7756 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | |
7757 | |
7758 option = gaim_account_option_string_new(_("Encoding"), "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); | |
7759 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7760 |
9935 | 7761 gaim_prefs_add_none("/plugins/prpl/oscar"); |
7762 gaim_prefs_add_bool("/plugins/prpl/oscar/recent_buddies", FALSE); | |
9942 | 7763 gaim_prefs_add_bool("/plugins/prpl/oscar/show_idle", FALSE); |
2086 | 7764 } |
7765 | |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5917
diff
changeset
|
7766 GAIM_INIT_PLUGIN(oscar, init_plugin, info); |