Mercurial > pidgin.yaz
annotate src/protocols/oscar/oscar.c @ 11005:bb7fd9359f9e
[gaim-migrate @ 12864]
Small changes to the oscar PRPL. Someone in #gaim was attempting to
debug a problem he's seen with permit/deny settings not sticking,
and noticed that there were multiple copies of people in his permit
or deny list. He didn't think the copies were still being added.
In any case, now Gaim will remove duplicate copies of people in your
permit and deny list, and multiple copies of a single buddy in the
same group.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Tue, 14 Jun 2005 00:24:27 +0000 |
parents | bf03a5271395 |
children | 1d58cc6c4552 |
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 static int gaim_ssi_parseerr (aim_session_t *, aim_frame_t *, ...); | |
273 static int gaim_ssi_parserights (aim_session_t *, aim_frame_t *, ...); | |
274 static int gaim_ssi_parselist (aim_session_t *, aim_frame_t *, ...); | |
275 static int gaim_ssi_parseack (aim_session_t *, aim_frame_t *, ...); | |
8227 | 276 static int gaim_ssi_parseadd (aim_session_t *, aim_frame_t *, ...); |
5129 | 277 static int gaim_ssi_authgiven (aim_session_t *, aim_frame_t *, ...); |
278 static int gaim_ssi_authrequest (aim_session_t *, aim_frame_t *, ...); | |
279 static int gaim_ssi_authreply (aim_session_t *, aim_frame_t *, ...); | |
280 static int gaim_ssi_gotadded (aim_session_t *, aim_frame_t *, ...); | |
281 | |
282 /* for DirectIM/image transfer */ | |
283 static int gaim_odc_initiate (aim_session_t *, aim_frame_t *, ...); | |
284 static int gaim_odc_incoming (aim_session_t *, aim_frame_t *, ...); | |
285 static int gaim_odc_typing (aim_session_t *, aim_frame_t *, ...); | |
6982 | 286 static int gaim_odc_update_ui (aim_session_t *, aim_frame_t *, ...); |
5129 | 287 |
288 /* for file transfer */ | |
289 static int oscar_sendfile_estblsh(aim_session_t *, aim_frame_t *, ...); | |
290 static int oscar_sendfile_prompt (aim_session_t *, aim_frame_t *, ...); | |
291 static int oscar_sendfile_ack (aim_session_t *, aim_frame_t *, ...); | |
292 static int oscar_sendfile_done (aim_session_t *, aim_frame_t *, ...); | |
293 | |
294 static gboolean gaim_icon_timerfunc(gpointer data); | |
8971 | 295 static void oscar_callback(gpointer data, gint source, GaimInputCondition condition); |
8983 | 296 static void oscar_direct_im_initiate(GaimConnection *gc, const char *who, const char *cookie); |
5954 | 297 static void oscar_set_info(GaimConnection *gc, const char *text); |
9935 | 298 static void recent_buddies_cb(const char *name, GaimPrefType type, gpointer value, gpointer data); |
299 | |
5836 | 300 static void oscar_free_name_data(struct name_data *data) { |
4230 | 301 g_free(data->name); |
302 g_free(data->nick); | |
303 g_free(data); | |
304 } | |
305 | |
5836 | 306 static void oscar_free_buddyinfo(void *data) { |
307 struct buddyinfo *bi = data; | |
6292 | 308 g_free(bi->availmsg); |
5836 | 309 g_free(bi); |
310 } | |
311 | |
9807 | 312 static fu32_t oscar_charset_check(const char *utf8) |
5129 | 313 { |
314 int i = 0; | |
9826 | 315 int charset = AIM_CHARSET_ASCII; |
5129 | 316 |
317 /* Determine how we can send this message. Per the warnings elsewhere | |
318 * in this file, these little checks determine the simplest encoding | |
319 * we can use for a given message send using it. */ | |
320 while (utf8[i]) { | |
321 if ((unsigned char)utf8[i] > 0x7f) { | |
322 /* not ASCII! */ | |
9826 | 323 charset = AIM_CHARSET_CUSTOM; |
5129 | 324 break; |
325 } | |
326 i++; | |
327 } | |
328 while (utf8[i]) { | |
329 /* ISO-8859-1 is 0x00-0xbf in the first byte | |
330 * followed by 0xc0-0xc3 in the second */ | |
331 if ((unsigned char)utf8[i] < 0x80) { | |
332 i++; | |
333 continue; | |
334 } else if (((unsigned char)utf8[i] & 0xfc) == 0xc0 && | |
335 ((unsigned char)utf8[i + 1] & 0xc0) == 0x80) { | |
336 i += 2; | |
337 continue; | |
338 } | |
9826 | 339 charset = AIM_CHARSET_UNICODE; |
5129 | 340 break; |
341 } | |
342 | |
9807 | 343 return charset; |
5129 | 344 } |
345 | |
8225 | 346 /* |
347 * Take a string of the form charset="bleh" where bleh is | |
348 * one of us-ascii, utf-8, iso-8859-1, or unicode-2-0, and | |
349 * return a newly allocated string containing bleh. | |
350 */ | |
351 static gchar *oscar_encoding_extract(const char *encoding) | |
5129 | 352 { |
8225 | 353 gchar *ret = NULL; |
354 char *begin, *end; | |
355 | |
9933 | 356 g_return_val_if_fail(encoding != NULL, NULL); |
357 | |
8735
92cbf9713795
[gaim-migrate @ 9490]
Christian Hammond <chipx86@chipx86.com>
parents:
8733
diff
changeset
|
358 /* Make sure encoding begins with charset= */ |
10540 | 359 if (strncmp(encoding, "text/aolrtf; charset=", 21) && |
360 strncmp(encoding, "text/x-aolrtf; charset=", 23)) | |
361 { | |
8225 | 362 return NULL; |
10540 | 363 } |
8225 | 364 |
365 begin = strchr(encoding, '"'); | |
366 end = strrchr(encoding, '"'); | |
367 | |
368 if ((begin == NULL) || (end == NULL) || (begin >= end)) | |
369 return NULL; | |
370 | |
371 ret = g_strndup(begin+1, (end-1) - begin); | |
372 | |
373 return ret; | |
374 } | |
375 | |
9830 | 376 static gchar * |
377 oscar_encoding_to_utf8(const char *encoding, const char *text, int textlen) | |
5129 | 378 { |
379 gchar *utf8 = NULL; | |
9595 | 380 |
381 if ((encoding == NULL) || encoding[0] == '\0') { | |
382 gaim_debug_info("oscar", "Empty encoding, assuming UTF-8\n"); | |
10396 | 383 } else if (!strcasecmp(encoding, "iso-8859-1")) { |
10376 | 384 utf8 = g_convert(text, textlen, "UTF-8", "iso-8859-1", NULL, NULL, NULL); |
10396 | 385 } else if (!strcasecmp(encoding, "ISO-8859-1-Windows-3.1-Latin-1")) { |
10375 | 386 utf8 = g_convert(text, textlen, "UTF-8", "Windows-1252", NULL, NULL, NULL); |
10396 | 387 } else if (!strcasecmp(encoding, "unicode-2-0")) { |
9595 | 388 utf8 = g_convert(text, textlen, "UTF-8", "UCS-2BE", NULL, NULL, NULL); |
10396 | 389 } else if (strcasecmp(encoding, "us-ascii") && strcmp(encoding, "utf-8")) { |
9595 | 390 gaim_debug_warning("oscar", "Unrecognized character encoding \"%s\", " |
10096 | 391 "attempting to convert to UTF-8 anyway\n", encoding); |
9595 | 392 utf8 = g_convert(text, textlen, "UTF-8", encoding, NULL, NULL, NULL); |
393 } | |
394 | |
395 /* | |
396 * If utf8 is still NULL then either the encoding is us-ascii/utf-8 or | |
397 * we have been unable to convert the text to utf-8 from the encoding | |
398 * that was specified. So we check if the text is valid utf-8 then | |
399 * just copy it. | |
400 */ | |
401 if (utf8 == NULL) { | |
9638 | 402 if (textlen != 0 && *text != '\0' |
403 && !g_utf8_validate(text, textlen, NULL)) | |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
404 utf8 = g_strdup(_("(There was an error receiving this message. The buddy you are speaking to most likely has a buggy client.)")); |
9476 | 405 else |
9481 | 406 utf8 = g_strndup(text, textlen); |
5129 | 407 } |
408 | |
409 return utf8; | |
410 } | |
411 | |
9830 | 412 static gchar * |
9908 | 413 gaim_plugin_oscar_convert_to_utf8(const fu8_t *data, fu16_t datalen, const char *charsetstr, gboolean fallback) |
9830 | 414 { |
415 gchar *ret = NULL; | |
416 GError *err = NULL; | |
417 | |
9908 | 418 if ((charsetstr == NULL) || (*charsetstr == '\0')) |
419 return NULL; | |
420 | |
421 if (strcasecmp("UTF-8", charsetstr)) { | |
422 if (fallback) | |
423 ret = g_convert_with_fallback(data, datalen, "UTF-8", charsetstr, "?", NULL, NULL, &err); | |
424 else | |
425 ret = g_convert(data, datalen, "UTF-8", charsetstr, NULL, NULL, &err); | |
426 if (err != NULL) { | |
427 gaim_debug_warning("oscar", "Conversation from %s failed: %s.\n", | |
428 charsetstr, err->message); | |
429 g_error_free(err); | |
430 } | |
431 } else { | |
432 if (g_utf8_validate(data, datalen, NULL)) | |
433 ret = g_strndup(data, datalen); | |
434 else | |
435 gaim_debug_warning("oscar", "String is not valid UTF-8.\n"); | |
436 } | |
437 | |
438 return ret; | |
439 } | |
440 | |
441 /* | |
442 * We try decoding using two different character sets. The charset | |
443 * specified in the IM determines the order in which we attempt to | |
444 * decode. We do this because there are lots of broken ICQ clients | |
445 * that don't correctly send non-ASCII messages. And if Gaim isn't | |
446 * able to deal with that crap, then people complain like banshees. | |
447 * charsetstr1 is always set to what the correct encoding should be. | |
448 */ | |
449 static gchar * | |
450 gaim_plugin_oscar_decode_im_part(GaimAccount *account, const char *sourcesn, fu16_t charset, fu16_t charsubset, fu8_t *data, fu16_t datalen) | |
451 { | |
452 gchar *ret = NULL; | |
453 const gchar *charsetstr1, *charsetstr2; | |
454 | |
455 gaim_debug_info("oscar", "Parsing IM part, charset=0x%04hx, charsubset=0x%04hx, datalen=%hd\n", charset, charsubset, datalen); | |
9830 | 456 |
457 if ((datalen == 0) || (data == NULL)) | |
458 return NULL; | |
459 | |
9908 | 460 if (charset == AIM_CHARSET_UNICODE) { |
461 charsetstr1 = "UCS-2BE"; | |
462 charsetstr2 = "UTF-8"; | |
463 } else if (charset == AIM_CHARSET_CUSTOM) { | |
9975 | 464 if ((sourcesn != NULL) && aim_sn_is_icq(sourcesn)) |
9908 | 465 charsetstr1 = gaim_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); |
9830 | 466 else |
9908 | 467 charsetstr1 = "ISO-8859-1"; |
468 charsetstr2 = "UTF-8"; | |
469 } else if (charset == AIM_CHARSET_ASCII) { | |
470 /* Should just be "ASCII" */ | |
9914 | 471 charsetstr1 = "ASCII"; |
9908 | 472 charsetstr2 = gaim_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); |
473 } else if (charset == 0x000d) { | |
9830 | 474 /* Mobile AIM client on a Nokia 3100 and an LG VX6000 */ |
9908 | 475 charsetstr1 = "ISO-8859-1"; |
476 charsetstr2 = gaim_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); | |
477 } else { | |
9830 | 478 /* Unknown, hope for valid UTF-8... */ |
9908 | 479 charsetstr1 = "UTF-8"; |
480 charsetstr2 = gaim_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); | |
481 } | |
482 | |
483 ret = gaim_plugin_oscar_convert_to_utf8(data, datalen, charsetstr1, FALSE); | |
484 if (ret == NULL) | |
485 ret = gaim_plugin_oscar_convert_to_utf8(data, datalen, charsetstr2, TRUE); | |
486 if (ret == NULL) | |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
487 ret = g_strdup(_("(There was an error receiving this message. The buddy you are speaking to most likely has a buggy client.)")); |
9830 | 488 |
489 return ret; | |
490 } | |
491 | |
492 static void | |
493 gaim_plugin_oscar_convert_to_best_encoding(GaimConnection *gc, const char *destsn, const gchar *from, | |
10039 | 494 gchar **msg, int *msglen_int, |
9830 | 495 fu16_t *charset, fu16_t *charsubset) |
496 { | |
497 OscarData *od = gc->proto_data; | |
498 GaimAccount *account = gaim_connection_get_account(gc); | |
499 GError *err = NULL; | |
500 aim_userinfo_t *userinfo = NULL; | |
501 const gchar *charsetstr; | |
10039 | 502 gsize msglen; |
9830 | 503 |
504 /* Attempt to send as ASCII */ | |
10098 | 505 if (oscar_charset_check(from) == AIM_CHARSET_ASCII) { |
10097 | 506 *msg = g_convert(from, strlen(from), "ASCII", "UTF-8", NULL, &msglen, NULL); |
10098 | 507 *charset = AIM_CHARSET_ASCII; |
9830 | 508 *charsubset = 0x0000; |
10039 | 509 *msglen_int = msglen; |
9830 | 510 return; |
511 } | |
512 | |
513 /* | |
10565 | 514 * If we're sending to an ICQ user, and they are in our |
515 * buddy list, and they are advertising the Unicode | |
516 * capability, and they are online, then attempt to send | |
517 * as UCS-2BE. | |
9830 | 518 */ |
9975 | 519 if ((destsn != NULL) && aim_sn_is_icq(destsn)) |
9830 | 520 userinfo = aim_locate_finduserinfo(od->sess, destsn); |
521 | |
10565 | 522 if ((userinfo != NULL) && (userinfo->capabilities & AIM_CAPS_ICQUTF8)) |
523 { | |
524 GaimBuddy *b; | |
525 b = gaim_find_buddy(account, destsn); | |
526 if ((b != NULL) && (GAIM_BUDDY_IS_ONLINE(b))) | |
527 { | |
528 *msg = g_convert(from, strlen(from), "UCS-2BE", "UTF-8", NULL, &msglen, NULL); | |
529 if (*msg != NULL) | |
530 { | |
531 *charset = AIM_CHARSET_UNICODE; | |
532 *charsubset = 0x0000; | |
533 *msglen_int = msglen; | |
534 return; | |
535 } | |
9830 | 536 } |
537 } | |
538 | |
539 /* | |
540 * If this is AIM then attempt to send as ISO-8859-1. If this is | |
541 * ICQ then attempt to send as the user specified character encoding. | |
542 */ | |
543 charsetstr = "ISO-8859-1"; | |
9975 | 544 if ((destsn != NULL) && aim_sn_is_icq(destsn)) |
9830 | 545 charsetstr = gaim_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); |
546 | |
10097 | 547 /* |
548 * XXX - We need a way to only attempt to convert if we KNOW "from" | |
549 * can be converted to "charsetstr" | |
550 */ | |
10039 | 551 *msg = g_convert(from, strlen(from), charsetstr, "UTF-8", NULL, &msglen, NULL); |
9830 | 552 if (*msg != NULL) { |
553 *charset = AIM_CHARSET_CUSTOM; | |
554 *charsubset = 0x0000; | |
10039 | 555 *msglen_int = msglen; |
9830 | 556 return; |
557 } | |
558 | |
559 /* | |
560 * Nothing else worked, so send as UCS-2BE. | |
561 */ | |
10039 | 562 *msg = g_convert(from, strlen(from), "UCS-2BE", "UTF-8", NULL, &msglen, &err); |
9830 | 563 if (*msg != NULL) { |
564 *charset = AIM_CHARSET_UNICODE; | |
565 *charsubset = 0x0000; | |
10039 | 566 *msglen_int = msglen; |
9830 | 567 return; |
568 } | |
569 | |
9908 | 570 gaim_debug_error("oscar", "Error converting a Unicode message: %s\n", err->message); |
9830 | 571 g_error_free(err); |
572 | |
573 gaim_debug_error("oscar", "This should NEVER happen! Sending UTF-8 text flagged as ASCII.\n"); | |
574 *msg = g_strdup(from); | |
10039 | 575 *msglen_int = strlen(*msg); |
9830 | 576 *charset = AIM_CHARSET_ASCII; |
577 *charsubset = 0x0000; | |
578 return; | |
579 } | |
580 | |
9407 | 581 gchar *oscar_caps_to_string(guint caps) |
8701 | 582 { |
9407 | 583 GString *str; |
584 gchar *tmp; | |
8701 | 585 guint bit = 1; |
586 | |
9407 | 587 str = g_string_new(""); |
588 | |
8701 | 589 if (!caps) { |
590 return NULL; | |
591 } else while (bit <= AIM_CAPS_LAST) { | |
592 if (bit & caps) { | |
593 switch (bit) { | |
594 case AIM_CAPS_BUDDYICON: | |
595 tmp = _("Buddy Icon"); | |
596 break; | |
597 case AIM_CAPS_TALK: | |
598 tmp = _("Voice"); | |
599 break; | |
600 case AIM_CAPS_DIRECTIM: | |
601 tmp = _("AIM Direct IM"); | |
602 break; | |
603 case AIM_CAPS_CHAT: | |
604 tmp = _("Chat"); | |
605 break; | |
606 case AIM_CAPS_GETFILE: | |
607 tmp = _("Get File"); | |
608 break; | |
609 case AIM_CAPS_SENDFILE: | |
610 tmp = _("Send File"); | |
611 break; | |
612 case AIM_CAPS_GAMES: | |
613 case AIM_CAPS_GAMES2: | |
614 tmp = _("Games"); | |
615 break; | |
616 case AIM_CAPS_ADDINS: | |
617 tmp = _("Add-Ins"); | |
618 break; | |
619 case AIM_CAPS_SENDBUDDYLIST: | |
620 tmp = _("Send Buddy List"); | |
621 break; | |
622 case AIM_CAPS_ICQ_DIRECT: | |
623 tmp = _("ICQ Direct Connect"); | |
624 break; | |
625 case AIM_CAPS_APINFO: | |
626 tmp = _("AP User"); | |
627 break; | |
628 case AIM_CAPS_ICQRTF: | |
629 tmp = _("ICQ RTF"); | |
630 break; | |
631 case AIM_CAPS_EMPTY: | |
632 tmp = _("Nihilist"); | |
633 break; | |
634 case AIM_CAPS_ICQSERVERRELAY: | |
635 tmp = _("ICQ Server Relay"); | |
636 break; | |
637 case AIM_CAPS_ICQUTF8OLD: | |
638 tmp = _("Old ICQ UTF8"); | |
639 break; | |
640 case AIM_CAPS_TRILLIANCRYPT: | |
641 tmp = _("Trillian Encryption"); | |
642 break; | |
643 case AIM_CAPS_ICQUTF8: | |
644 tmp = _("ICQ UTF8"); | |
645 break; | |
646 case AIM_CAPS_HIPTOP: | |
647 tmp = _("Hiptop"); | |
648 break; | |
649 case AIM_CAPS_SECUREIM: | |
650 tmp = _("Security Enabled"); | |
651 break; | |
652 case AIM_CAPS_VIDEO: | |
653 tmp = _("Video Chat"); | |
654 break; | |
655 /* Not actually sure about this one... WinAIM doesn't show anything */ | |
656 case AIM_CAPS_ICHATAV: | |
657 tmp = _("iChat AV"); | |
658 break; | |
659 case AIM_CAPS_LIVEVIDEO: | |
660 tmp = _("Live Video"); | |
661 break; | |
662 case AIM_CAPS_CAMERA: | |
663 tmp = _("Camera"); | |
664 break; | |
665 default: | |
666 tmp = NULL; | |
667 break; | |
668 } | |
669 if (tmp) | |
9532 | 670 g_string_append_printf(str, "%s%s", (*(str->str) == '\0' ? "" : ", "), tmp); |
8701 | 671 } |
672 bit <<= 1; | |
673 } | |
9407 | 674 |
675 return g_string_free(str, FALSE); | |
8701 | 676 } |
677 | |
678 static char *oscar_icqstatus(int state) { | |
679 /* Make a cute little string that shows the status of the dude or dudet */ | |
680 if (state & AIM_ICQ_STATE_CHAT) | |
681 return g_strdup_printf(_("Free For Chat")); | |
682 else if (state & AIM_ICQ_STATE_DND) | |
683 return g_strdup_printf(_("Do Not Disturb")); | |
684 else if (state & AIM_ICQ_STATE_OUT) | |
685 return g_strdup_printf(_("Not Available")); | |
686 else if (state & AIM_ICQ_STATE_BUSY) | |
687 return g_strdup_printf(_("Occupied")); | |
688 else if (state & AIM_ICQ_STATE_AWAY) | |
689 return g_strdup_printf(_("Away")); | |
690 else if (state & AIM_ICQ_STATE_WEBAWARE) | |
691 return g_strdup_printf(_("Web Aware")); | |
692 else if (state & AIM_ICQ_STATE_INVISIBLE) | |
693 return g_strdup_printf(_("Invisible")); | |
694 else | |
695 return g_strdup_printf(_("Online")); | |
696 } | |
697 | |
9973 | 698 static void |
699 oscar_string_append(GString *str, const char *newline, const char *name, const char *value) | |
8700 | 700 { |
701 gchar *utf8; | |
702 | |
703 if (value && value[0] && (utf8 = gaim_utf8_try_convert(value))) { | |
8701 | 704 g_string_append_printf(str, "%s<b>%s:</b> %s", newline, name, utf8); |
8700 | 705 g_free(utf8); |
706 } | |
707 } | |
708 | |
9973 | 709 static void oscar_string_append_info(GaimConnection *gc, GString *str, const char *newline, GaimBuddy *b, aim_userinfo_t *userinfo) |
8701 | 710 { |
10042 | 711 OscarData *od; |
712 GaimAccount *account; | |
10517
461334f300d7
[gaim-migrate @ 11821]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10504
diff
changeset
|
713 GaimPresence *presence = NULL; |
461334f300d7
[gaim-migrate @ 11821]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10504
diff
changeset
|
714 GaimStatus *status = NULL; |
8701 | 715 GaimGroup *g = NULL; |
716 struct buddyinfo *bi = NULL; | |
717 char *tmp; | |
718 | |
10042 | 719 od = gc->proto_data; |
720 account = gaim_connection_get_account(gc); | |
721 | |
722 if ((str == NULL) || (newline == NULL) || ((b == NULL) && (userinfo == NULL))) | |
8701 | 723 return; |
724 | |
725 if (userinfo == NULL) | |
726 userinfo = aim_locate_finduserinfo(od->sess, b->name); | |
727 | |
728 if (b == NULL) | |
10042 | 729 b = gaim_find_buddy(account, userinfo->sn); |
8701 | 730 |
731 if (b != NULL) | |
10498 | 732 { |
8701 | 733 g = gaim_find_buddys_group(b); |
10498 | 734 presence = gaim_buddy_get_presence(b); |
735 status = gaim_presence_get_active_status(presence); | |
736 } | |
8701 | 737 |
738 if (userinfo != NULL) | |
739 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(account, userinfo->sn)); | |
740 | |
8733 | 741 if (b != NULL) { |
10498 | 742 if (gaim_presence_is_online(presence)) { |
9975 | 743 if (aim_sn_is_icq(b->name)) { |
8733 | 744 tmp = oscar_icqstatus((b->uc & 0xffff0000) >> 16); |
745 oscar_string_append(str, newline, _("Status"), tmp); | |
746 g_free(tmp); | |
747 } | |
748 } else { | |
9625 | 749 tmp = aim_ssi_itemlist_findparentname(od->sess->ssi.local, b->name); |
8733 | 750 if (aim_ssi_waitingforauth(od->sess->ssi.local, tmp, b->name)) |
751 oscar_string_append(str, newline, _("Status"), _("Not Authorized")); | |
752 else | |
753 oscar_string_append(str, newline, _("Status"), _("Offline")); | |
8701 | 754 } |
8733 | 755 } |
8701 | 756 |
757 if ((bi != NULL) && (bi->ipaddr != 0)) { | |
9625 | 758 tmp = g_strdup_printf("%hhu.%hhu.%hhu.%hhu", |
8701 | 759 (bi->ipaddr & 0xff000000) >> 24, |
760 (bi->ipaddr & 0x00ff0000) >> 16, | |
761 (bi->ipaddr & 0x0000ff00) >> 8, | |
762 (bi->ipaddr & 0x000000ff)); | |
763 oscar_string_append(str, newline, _("IP Address"), tmp); | |
764 g_free(tmp); | |
765 } | |
766 | |
767 if ((userinfo != NULL) && (userinfo->capabilities != 0)) { | |
768 tmp = oscar_caps_to_string(userinfo->capabilities); | |
769 oscar_string_append(str, newline, _("Capabilities"), tmp); | |
9407 | 770 g_free(tmp); |
8701 | 771 } |
772 | |
773 if ((b != NULL) && (b->name != NULL) && (g != NULL) && (g->name != NULL)) { | |
774 tmp = aim_ssi_getcomment(od->sess->ssi.local, g->name, b->name); | |
775 if (tmp != NULL) { | |
9625 | 776 char *tmp2 = g_markup_escape_text(tmp, strlen(tmp)); |
8701 | 777 g_free(tmp); |
9625 | 778 oscar_string_append(str, newline, _("Buddy Comment"), tmp2); |
779 g_free(tmp2); | |
8701 | 780 } |
781 } | |
782 | |
10498 | 783 if ((bi != NULL) && (bi->availmsg != NULL) && gaim_status_is_available(status)) { |
8701 | 784 tmp = g_markup_escape_text(bi->availmsg, strlen(bi->availmsg)); |
785 oscar_string_append(str, newline, _("Available"), tmp); | |
786 g_free(tmp); | |
787 } | |
788 } | |
789 | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
790 static char *extract_name(const char *name) { |
4121 | 791 char *tmp, *x; |
2086 | 792 int i, j; |
4120 | 793 |
794 if (!name) | |
4121 | 795 return NULL; |
10042 | 796 |
4120 | 797 x = strchr(name, '-'); |
4121 | 798 |
2086 | 799 if (!x) return NULL; |
800 x = strchr(++x, '-'); | |
801 if (!x) return NULL; | |
802 tmp = g_strdup(++x); | |
803 | |
804 for (i = 0, j = 0; x[i]; i++) { | |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
805 char hex[3]; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
806 if (x[i] != '%') { |
2086 | 807 tmp[j++] = x[i]; |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
808 continue; |
2086 | 809 } |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
810 strncpy(hex, x + ++i, 2); hex[2] = 0; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
811 i++; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
812 tmp[j++] = strtol(hex, NULL, 16); |
2086 | 813 } |
814 | |
815 tmp[j] = 0; | |
816 return tmp; | |
817 } | |
818 | |
10458 | 819 static struct chat_connection * |
820 find_oscar_chat(GaimConnection *gc, int id) | |
821 { | |
822 OscarData *od = (OscarData *)gc->proto_data; | |
823 GSList *cur; | |
824 struct chat_connection *cc; | |
825 | |
826 for (cur = od->oscar_chats; cur != NULL; cur = cur->next) | |
827 { | |
828 cc = (struct chat_connection *)cur->data; | |
829 if (cc->id == id) | |
830 return cc; | |
831 } | |
832 | |
833 return NULL; | |
834 } | |
835 | |
836 static struct chat_connection * | |
837 find_oscar_chat_by_conn(GaimConnection *gc, aim_conn_t *conn) | |
838 { | |
839 OscarData *od = (OscarData *)gc->proto_data; | |
840 GSList *cur; | |
841 struct chat_connection *cc; | |
842 | |
843 for (cur = od->oscar_chats; cur != NULL; cur = cur->next) | |
844 { | |
845 cc = (struct chat_connection *)cur->data; | |
846 if (cc->conn == conn) | |
847 return cc; | |
848 } | |
849 | |
850 return NULL; | |
851 } | |
852 | |
853 static struct chat_connection * | |
854 find_oscar_chat_by_conv(GaimConnection *gc, GaimConversation *conv) | |
855 { | |
856 OscarData *od = (OscarData *)gc->proto_data; | |
857 GSList *cur; | |
858 struct chat_connection *cc; | |
859 | |
860 for (cur = od->oscar_chats; cur != NULL; cur = cur->next) | |
861 { | |
862 cc = (struct chat_connection *)cur->data; | |
863 if (cc->conv == conv) | |
864 return cc; | |
865 } | |
866 | |
867 return NULL; | |
868 } | |
869 | |
870 static void | |
871 oscar_chat_kill(GaimConnection *gc, struct chat_connection *cc) | |
872 { | |
873 OscarData *od = (OscarData *)gc->proto_data; | |
874 | |
875 /* Notify the conversation window that we've left the chat */ | |
876 serv_got_chat_left(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(cc->conv))); | |
877 | |
878 /* Destroy the chat_connection */ | |
879 od->oscar_chats = g_slist_remove(od->oscar_chats, cc); | |
880 if (cc->inpa > 0) | |
881 gaim_input_remove(cc->inpa); | |
882 aim_conn_kill(od->sess, &cc->conn); | |
883 g_free(cc->name); | |
884 g_free(cc->show); | |
885 g_free(cc); | |
8219 | 886 } |
887 | |
8971 | 888 /***************************************************************************** |
889 * Begin scary direct im stuff | |
890 *****************************************************************************/ | |
891 | |
892 static struct oscar_direct_im *oscar_direct_im_find(OscarData *od, const char *who) { | |
893 GSList *d = od->direct_ims; | |
894 struct oscar_direct_im *m = NULL; | |
895 | |
896 while (d) { | |
897 m = (struct oscar_direct_im *)d->data; | |
898 if (!aim_sncmp(who, m->name)) | |
899 return m; | |
900 d = d->next; | |
901 } | |
902 | |
903 return NULL; | |
904 } | |
905 | |
906 static void oscar_direct_im_destroy(OscarData *od, struct oscar_direct_im *dim) | |
907 { | |
908 gaim_debug_info("oscar", | |
909 "destroying Direct IM for %s.\n", dim->name); | |
910 | |
911 od->direct_ims = g_slist_remove(od->direct_ims, dim); | |
8978 | 912 if (dim->gpc_pend) { |
913 dim->killme = TRUE; | |
914 return; | |
915 } | |
8971 | 916 if (dim->watcher) |
917 gaim_input_remove(dim->watcher); | |
918 if (dim->conn) { | |
10271 | 919 aim_conn_close(dim->conn); |
8971 | 920 aim_conn_kill(od->sess, &dim->conn); |
921 } | |
922 g_free(dim); | |
923 } | |
924 | |
925 /* the only difference between this and destroy is this writes a conv message */ | |
926 static void oscar_direct_im_disconnect(OscarData *od, struct oscar_direct_im *dim) | |
927 { | |
928 GaimConversation *conv; | |
929 char buf[256]; | |
930 | |
931 gaim_debug_info("oscar", | |
932 "%s disconnected Direct IM.\n", dim->name); | |
933 | |
934 if (dim->connected) | |
935 g_snprintf(buf, sizeof buf, _("Direct IM with %s closed"), dim->name); | |
8978 | 936 else |
8971 | 937 g_snprintf(buf, sizeof buf, _("Direct IM with %s failed"), dim->name); |
938 | |
10246 | 939 conv = gaim_find_conversation_with_account(GAIM_CONV_IM, dim->name, |
940 gaim_connection_get_account(dim->gc)); | |
8971 | 941 if (conv) { |
942 gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL)); | |
9463 | 943 gaim_conversation_update_progress(conv, 0); |
8971 | 944 } else { |
945 gaim_notify_error(dim->gc, NULL, _("Direct Connect failed"), buf); | |
946 } | |
947 | |
948 oscar_direct_im_destroy(od, dim); | |
949 | |
950 return; | |
951 } | |
952 | |
953 /* oops i made two of these. this one just calls the other one. */ | |
954 static void gaim_odc_disconnect(aim_session_t *sess, aim_conn_t *conn) | |
955 { | |
956 GaimConnection *gc = sess->aux_data; | |
957 OscarData *od = (OscarData *)gc->proto_data; | |
958 struct oscar_direct_im *dim; | |
959 char *sn; | |
960 | |
961 sn = g_strdup(aim_odc_getsn(conn)); | |
962 dim = oscar_direct_im_find(od, sn); | |
963 oscar_direct_im_disconnect(od, dim); | |
964 g_free(sn); | |
965 } | |
966 | |
967 static void destroy_direct_im_request(struct ask_direct *d) { | |
968 gaim_debug_info("oscar", "Freeing DirectIM prompts.\n"); | |
969 | |
970 g_free(d->sn); | |
971 g_free(d); | |
972 } | |
973 | |
974 /* this is just a gaim_proxy_connect cb that sets up the rest of the cbs */ | |
975 static void oscar_odc_callback(gpointer data, gint source, GaimInputCondition condition) { | |
976 struct oscar_direct_im *dim = data; | |
977 GaimConnection *gc = dim->gc; | |
978 OscarData *od = gc->proto_data; | |
979 GaimConversation *conv; | |
980 char buf[256]; | |
981 struct sockaddr name; | |
982 socklen_t name_len = 1; | |
983 | |
984 g_return_if_fail(gc != NULL); | |
985 | |
8978 | 986 dim->gpc_pend = FALSE; |
987 if (dim->killme) { | |
988 oscar_direct_im_destroy(od, dim); | |
989 return; | |
990 } | |
991 | |
8971 | 992 if (!g_list_find(gaim_connections_get_all(), gc)) { |
993 oscar_direct_im_destroy(od, dim); | |
994 return; | |
995 } | |
996 | |
997 if (source < 0) { | |
8984 | 998 if (dim->donttryagain) { |
999 oscar_direct_im_disconnect(od, dim); | |
1000 return; | |
1001 } else { | |
1002 fu8_t cookie[8]; | |
1003 char *who = g_strdup(dim->name); | |
1004 const char *tmp = aim_odc_getcookie(dim->conn); | |
1005 | |
1006 memcpy(cookie, tmp, 8); | |
1007 oscar_direct_im_destroy(od, dim); | |
1008 oscar_direct_im_initiate(gc, who, cookie); | |
1009 gaim_debug_info("oscar", "asking direct im initiator to connect to us\n"); | |
1010 g_free(who); | |
1011 return; | |
1012 } | |
8971 | 1013 } |
1014 | |
1015 dim->conn->fd = source; | |
1016 aim_conn_completeconnect(od->sess, dim->conn); | |
1017 conv = gaim_conversation_new(GAIM_CONV_IM, dim->gc->account, dim->name); | |
1018 | |
1019 /* This is the best way to see if we're connected or not */ | |
8983 | 1020 /* Is this really needed? */ |
8971 | 1021 if (getpeername(source, &name, &name_len) == 0) { |
1022 g_snprintf(buf, sizeof buf, _("Direct IM with %s established"), dim->name); | |
1023 dim->connected = TRUE; | |
1024 gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL)); | |
8983 | 1025 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, oscar_callback, dim->conn); |
1026 } else { | |
8984 | 1027 if (dim->donttryagain) { |
1028 oscar_direct_im_disconnect(od, dim); | |
1029 return; | |
1030 } else { | |
1031 fu8_t cookie[8]; | |
1032 char *who = g_strdup(dim->name); | |
1033 const char *tmp = aim_odc_getcookie(dim->conn); | |
1034 | |
1035 memcpy(cookie, tmp, 8); | |
1036 oscar_direct_im_destroy(od, dim); | |
1037 oscar_direct_im_initiate(gc, who, cookie); | |
1038 gaim_debug_info("oscar", "asking direct im initiator to connect to us\n"); | |
1039 g_free(who); | |
1040 return; | |
1041 } | |
8983 | 1042 } |
1043 | |
1044 | |
8971 | 1045 } |
1046 | |
1047 static void accept_direct_im_request(struct ask_direct *d) { | |
1048 GaimConnection *gc = d->gc; | |
1049 OscarData *od; | |
1050 struct oscar_direct_im *dim; | |
1051 char *host; int port = 5190; | |
1052 int i, rc; | |
8982 | 1053 char *tmp; |
1054 GaimConversation *conv; | |
8971 | 1055 |
1056 if (!g_list_find(gaim_connections_get_all(), gc)) { | |
1057 destroy_direct_im_request(d); | |
1058 return; | |
1059 } | |
1060 | |
1061 od = (OscarData *)gc->proto_data; | |
1062 gaim_debug_info("oscar", "Accepted DirectIM.\n"); | |
1063 | |
1064 dim = oscar_direct_im_find(od, d->sn); | |
1065 if (dim && dim->connected) { | |
1066 destroy_direct_im_request(d); /* 40 */ /* what does that 40 mean? */ | |
1067 gaim_debug_info("oscar", "Wait, we're already connected, ignoring DirectIM.\n"); | |
1068 return; | |
1069 } | |
1070 dim = g_new0(struct oscar_direct_im, 1); | |
1071 dim->gc = d->gc; | |
8984 | 1072 dim->donttryagain = d->donttryagain; |
8971 | 1073 g_snprintf(dim->name, sizeof dim->name, "%s", d->sn); |
1074 | |
1075 dim->conn = aim_odc_connect(od->sess, d->sn, NULL, d->cookie); | |
1076 od->direct_ims = g_slist_append(od->direct_ims, dim); | |
1077 if (!dim->conn) { | |
1078 oscar_direct_im_disconnect(od, dim); | |
1079 destroy_direct_im_request(d); | |
1080 return; | |
1081 } | |
1082 | |
1083 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, | |
1084 gaim_odc_incoming, 0); | |
1085 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, | |
1086 gaim_odc_typing, 0); | |
1087 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER, | |
1088 gaim_odc_update_ui, 0); | |
1089 | |
1090 gaim_debug_info("oscar", "ip is %s.\n", d->ip); | |
1091 for (i = 0; i < (int)strlen(d->ip); i++) { | |
1092 if (d->ip[i] == ':') { | |
1093 port = atoi(&(d->ip[i+1])); | |
1094 break; | |
1095 } | |
1096 } | |
1097 host = g_strndup(d->ip, i); | |
1098 dim->conn->status |= AIM_CONN_STATUS_INPROGRESS; | |
8978 | 1099 dim->gpc_pend = TRUE; |
8971 | 1100 rc = gaim_proxy_connect(gc->account, host, port, oscar_odc_callback, dim); |
8982 | 1101 |
1102 conv = gaim_conversation_new(GAIM_CONV_IM, dim->gc->account, d->sn); | |
1103 tmp = g_strdup_printf(_("Attempting to connect to %s at %s:%hu for Direct IM."), d->sn, host, | |
1104 port); | |
1105 gaim_conversation_write(conv, NULL, tmp, GAIM_MESSAGE_SYSTEM, time(NULL)); | |
1106 g_free(tmp); | |
8983 | 1107 |
8971 | 1108 g_free(host); |
1109 if (rc < 0) { | |
8978 | 1110 dim->gpc_pend = FALSE; |
8971 | 1111 oscar_direct_im_disconnect(od, dim); |
1112 destroy_direct_im_request(d); | |
1113 return; | |
1114 } | |
1115 | |
1116 destroy_direct_im_request(d); | |
1117 | |
1118 return; | |
1119 } | |
1120 | |
1121 /* | |
1122 * We have just established a socket with the other dude, so set up some handlers. | |
1123 */ | |
1124 static int gaim_odc_initiate(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 1125 GaimConnection *gc = sess->aux_data; |
7283 | 1126 OscarData *od = (OscarData *)gc->proto_data; |
8733 | 1127 GaimConversation *conv; |
8971 | 1128 struct oscar_direct_im *dim; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1129 char buf[256]; |
8971 | 1130 char *sn; |
1131 va_list ap; | |
1132 aim_conn_t *newconn, *listenerconn; | |
1133 | |
1134 va_start(ap, fr); | |
1135 newconn = va_arg(ap, aim_conn_t *); | |
1136 listenerconn = va_arg(ap, aim_conn_t *); | |
1137 va_end(ap); | |
1138 | |
10271 | 1139 aim_conn_close(listenerconn); |
8971 | 1140 aim_conn_kill(sess, &listenerconn); |
1141 | |
1142 sn = g_strdup(aim_odc_getsn(newconn)); | |
1143 | |
1144 gaim_debug_info("oscar", | |
1145 "DirectIM: initiate success to %s\n", sn); | |
1146 dim = oscar_direct_im_find(od, sn); | |
1147 | |
1148 conv = gaim_conversation_new(GAIM_CONV_IM, dim->gc->account, sn); | |
1149 gaim_input_remove(dim->watcher); | |
1150 dim->conn = newconn; | |
1151 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, oscar_callback, dim->conn); | |
1152 dim->connected = TRUE; | |
1153 g_snprintf(buf, sizeof buf, _("Direct IM with %s established"), sn); | |
1154 g_free(sn); | |
1155 gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL)); | |
1156 | |
1157 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, gaim_odc_incoming, 0); | |
1158 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, gaim_odc_typing, 0); | |
1159 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER, gaim_odc_update_ui, 0); | |
1160 | |
1161 return 1; | |
1162 } | |
1163 | |
1164 /* | |
1165 * This is called when each chunk of an image is received. It can be used to | |
1166 * update a progress bar, or to eat lots of dry cat food. Wet cat food is | |
1167 * nasty, you sicko. | |
1168 */ | |
1169 static int gaim_odc_update_ui(aim_session_t *sess, aim_frame_t *fr, ...) { | |
1170 va_list ap; | |
1171 char *sn; | |
1172 double percent; | |
1173 GaimConnection *gc = sess->aux_data; | |
1174 OscarData *od = (OscarData *)gc->proto_data; | |
1175 GaimConversation *c; | |
1176 struct oscar_direct_im *dim; | |
1177 | |
1178 va_start(ap, fr); | |
1179 sn = va_arg(ap, char *); | |
1180 percent = va_arg(ap, double); | |
1181 va_end(ap); | |
1182 | |
1183 if (!sn || !(dim = oscar_direct_im_find(od, sn))) | |
1184 return 1; | |
1185 if (dim->watcher) { | |
1186 gaim_input_remove(dim->watcher); /* Otherwise, the callback will callback */ | |
1187 /* The callback will callback? I don't get how that would happen here. */ | |
1188 dim->watcher = 0; | |
1189 } | |
1190 | |
10246 | 1191 c = gaim_find_conversation_with_account(GAIM_CONV_IM, sn, |
1192 gaim_connection_get_account(gc)); | |
8971 | 1193 if (c != NULL) |
1194 gaim_conversation_update_progress(c, percent); | |
1195 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, | |
1196 oscar_callback, dim->conn); | |
1197 | |
1198 return 1; | |
1199 } | |
1200 | |
1201 /* | |
1202 * This is called after a direct IM has been received in its entirety. This | |
1203 * function is passed a long chunk of data which contains the IM with any | |
1204 * data chunks (images) appended to it. | |
1205 * | |
1206 * This function rips out all the data chunks and creates an imgstore for | |
1207 * each one. In order to do this, it first goes through the IM and takes | |
1208 * out all the IMG tags. When doing so, it rewrites the original IMG tag | |
1209 * with one compatible with the imgstore Gaim core code. For each one, we | |
1210 * then read in chunks of data from the end of the message and actually | |
1211 * create the img store using the given data. | |
1212 * | |
1213 * For somewhat easy reference, here's a sample message | |
1214 * (without the whitespace and asterisks): | |
1215 * | |
1216 * <HTML><BODY BGCOLOR="#ffffff"> | |
1217 * <FONT LANG="0"> | |
1218 * This is a really stupid picture:<BR> | |
1219 * <IMG SRC="Sample.jpg" ID="1" WIDTH="283" HEIGHT="212" DATASIZE="9894"><BR> | |
1220 * Yeah it is<BR> | |
1221 * Here is another one:<BR> | |
1222 * <IMG SRC="Soap Bubbles.bmp" ID="2" WIDTH="256" HEIGHT="256" DATASIZE="65978"> | |
1223 * </FONT> | |
1224 * </BODY></HTML> | |
1225 * <BINARY> | |
1226 * <DATA ID="1" SIZE="9894">datadatadatadata</DATA> | |
1227 * <DATA ID="2" SIZE="65978">datadatadatadata</DATA> | |
1228 * </BINARY> | |
1229 */ | |
1230 static int gaim_odc_incoming(aim_session_t *sess, aim_frame_t *fr, ...) { | |
1231 GaimConnection *gc = sess->aux_data; | |
1232 GaimConvImFlags imflags = 0; | |
1233 gchar *utf8; | |
1234 GString *newmsg = g_string_new(""); | |
1235 GSList *images = NULL; | |
1236 va_list ap; | |
1237 const char *sn, *msg, *msgend, *binary; | |
1238 size_t len; | |
1239 int encoding, isawaymsg; | |
1240 | |
1241 va_start(ap, fr); | |
1242 sn = va_arg(ap, const char *); | |
1243 msg = va_arg(ap, const char *); | |
1244 len = va_arg(ap, size_t); | |
1245 encoding = va_arg(ap, int); | |
1246 isawaymsg = va_arg(ap, int); | |
1247 va_end(ap); | |
1248 msgend = msg + len; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1249 |
8660 | 1250 gaim_debug_info("oscar", |
8971 | 1251 "Got DirectIM message from %s\n", sn); |
1252 | |
1253 if (isawaymsg) | |
1254 imflags |= GAIM_CONV_IM_AUTO_RESP; | |
1255 | |
1256 /* message has a binary trailer */ | |
1257 if ((binary = gaim_strcasestr(msg, "<binary>"))) { | |
1258 GData *attribs; | |
1259 const char *tmp, *start, *end, *last = NULL; | |
1260 | |
1261 tmp = msg; | |
1262 | |
1263 /* for each valid image tag... */ | |
1264 while (gaim_markup_find_tag("img", tmp, &start, &end, &attribs)) { | |
1265 const char *id, *src, *datasize; | |
10504 | 1266 const char *data = NULL; |
1267 char *tag = NULL; | |
8971 | 1268 size_t size; |
1269 int imgid = 0; | |
1270 | |
1271 /* update the location of the last img tag */ | |
1272 last = end; | |
1273 | |
1274 /* grab attributes */ | |
1275 id = g_datalist_get_data(&attribs, "id"); | |
1276 src = g_datalist_get_data(&attribs, "src"); | |
1277 datasize = g_datalist_get_data(&attribs, "datasize"); | |
1278 | |
1279 /* if we have id & datasize, build the data tag */ | |
1280 if (id && datasize) | |
1281 tag = g_strdup_printf("<data id=\"%s\" size=\"%s\">", id, datasize); | |
1282 | |
1283 /* if we have a tag, find the start of the data */ | |
1284 if (tag && (data = gaim_strcasestr(binary, tag))) | |
1285 data += strlen(tag); | |
1286 | |
10504 | 1287 g_free(tag); |
1288 | |
8971 | 1289 /* check the data is here and store it */ |
1290 if (data + (size = atoi(datasize)) <= msgend) | |
1291 imgid = gaim_imgstore_add(data, size, src); | |
1292 | |
1293 /* | |
1294 * XXX - The code below contains some calls to oscar_encoding_to_utf8 | |
1295 * The hardcoded "us-ascii" value REALLY needs to be removed. | |
1296 */ | |
1297 /* if we have a stored image... */ | |
1298 if (imgid) { | |
1299 /* append the message up to the tag */ | |
1300 utf8 = oscar_encoding_to_utf8("us-ascii", tmp, start - tmp); | |
1301 if (utf8 != NULL) { | |
1302 newmsg = g_string_append(newmsg, utf8); | |
1303 g_free(utf8); | |
1304 } | |
1305 | |
1306 /* write the new image tag */ | |
1307 g_string_append_printf(newmsg, "<IMG ID=\"%d\">", imgid); | |
1308 | |
1309 /* and record the image number */ | |
1310 images = g_slist_append(images, GINT_TO_POINTER(imgid)); | |
1311 } else { | |
1312 /* otherwise, copy up to the end of the tag */ | |
1313 utf8 = oscar_encoding_to_utf8("us-ascii", tmp, (end + 1) - tmp); | |
1314 if (utf8 != NULL) { | |
1315 newmsg = g_string_append(newmsg, utf8); | |
1316 g_free(utf8); | |
1317 } | |
1318 } | |
1319 | |
1320 /* clear the attribute list */ | |
1321 g_datalist_clear(&attribs); | |
1322 | |
1323 /* continue from the end of the tag */ | |
1324 tmp = end + 1; | |
1325 } | |
1326 | |
1327 /* append any remaining message data (without the > :-) */ | |
1328 if (last++ && (last < binary)) | |
1329 newmsg = g_string_append_len(newmsg, last, binary - last); | |
1330 | |
1331 /* set the flag if we caught any images */ | |
1332 if (images) | |
1333 imflags |= GAIM_CONV_IM_IMAGES; | |
1334 } else { | |
1335 g_string_append_len(newmsg, msg, len); | |
1336 } | |
1337 | |
10318 | 1338 /* Convert to UTF8 */ |
1339 /* (This hasn't been tested very much) */ | |
1340 utf8 = gaim_plugin_oscar_decode_im_part(gc->account, sn, encoding, 0x0000, newmsg->str, len); | |
1341 if (utf8 != NULL) { | |
1342 serv_got_im(gc, sn, utf8, imflags, time(NULL)); | |
1343 g_free(utf8); | |
1344 } | |
1345 | |
1346 /* free the message */ | |
8971 | 1347 g_string_free(newmsg, TRUE); |
1348 | |
1349 /* unref any images we allocated */ | |
1350 if (images) { | |
1351 GSList *tmp; | |
1352 int id; | |
1353 | |
1354 for (tmp = images; tmp != NULL; tmp = tmp->next) { | |
1355 id = GPOINTER_TO_INT(tmp->data); | |
1356 gaim_imgstore_unref(id); | |
1357 } | |
1358 | |
1359 g_slist_free(images); | |
1360 } | |
1361 | |
1362 return 1; | |
1363 } | |
1364 | |
1365 static int gaim_odc_typing(aim_session_t *sess, aim_frame_t *fr, ...) { | |
1366 va_list ap; | |
1367 char *sn; | |
1368 int typing; | |
1369 GaimConnection *gc = sess->aux_data; | |
1370 | |
1371 va_start(ap, fr); | |
1372 sn = va_arg(ap, char *); | |
1373 typing = va_arg(ap, int); | |
1374 va_end(ap); | |
1375 | |
1376 if (typing == 0x0002) { | |
1377 /* I had to leave this. It's just too funny. It reminds me of my sister. */ | |
1378 gaim_debug_info("oscar", | |
1379 "ohmigod! %s has started typing (DirectIM). He's going to send you a message! *squeal*\n", sn); | |
1380 serv_got_typing(gc, sn, 0, GAIM_TYPING); | |
1381 } else if (typing == 0x0001) | |
1382 serv_got_typing(gc, sn, 0, GAIM_TYPED); | |
1383 else | |
1384 serv_got_typing_stopped(gc, sn); | |
1385 return 1; | |
1386 } | |
1387 | |
1388 static int gaim_odc_send_im(aim_session_t *sess, aim_conn_t *conn, const char *message, GaimConvImFlags imflags) { | |
1389 char *buf; | |
1390 size_t len; | |
1391 int ret; | |
1392 GString *msg = g_string_new("<HTML><BODY>"); | |
1393 GString *data = g_string_new("</BODY></HTML><BINARY>"); | |
1394 GData *attribs; | |
1395 const char *start, *end, *last; | |
1396 int oscar_id = 0; | |
1397 | |
1398 last = message; | |
1399 | |
1400 /* for each valid IMG tag... */ | |
1401 while (last && *last && gaim_markup_find_tag("img", last, &start, &end, &attribs)) { | |
1402 GaimStoredImage *image = NULL; | |
1403 const char *id; | |
1404 | |
1405 if (start - last) { | |
1406 g_string_append_len(msg, last, start - last); | |
1407 } | |
1408 | |
1409 id = g_datalist_get_data(&attribs, "id"); | |
1410 | |
1411 /* ... if it refers to a valid gaim image ... */ | |
1412 if (id && (image = gaim_imgstore_get(atoi(id)))) { | |
1413 /* ... append the message from start to the tag ... */ | |
9126 | 1414 unsigned long size = gaim_imgstore_get_size(image); |
8971 | 1415 const char *filename = gaim_imgstore_get_filename(image); |
1416 gpointer imgdata = gaim_imgstore_get_data(image); | |
1417 | |
1418 oscar_id++; | |
1419 | |
1420 /* ... insert a new img tag with the oscar id ... */ | |
1421 if (filename) | |
1422 g_string_append_printf(msg, | |
9126 | 1423 "<IMG SRC=\"%s\" ID=\"%d\" DATASIZE=\"%lu\">", |
8971 | 1424 filename, oscar_id, size); |
1425 else | |
1426 g_string_append_printf(msg, | |
9126 | 1427 "<IMG ID=\"%d\" DATASIZE=\"%lu\">", |
8971 | 1428 oscar_id, size); |
1429 | |
1430 /* ... and append the data to the binary section ... */ | |
9126 | 1431 g_string_append_printf(data, "<DATA ID=\"%d\" SIZE=\"%lu\">", |
8971 | 1432 oscar_id, size); |
1433 data = g_string_append_len(data, imgdata, size); | |
1434 data = g_string_append(data, "</DATA>"); | |
1435 } | |
1436 /* If the tag is invalid, skip it, thus no else here */ | |
1437 | |
1438 g_datalist_clear(&attribs); | |
1439 | |
1440 /* continue from the end of the tag */ | |
1441 last = end + 1; | |
1442 } | |
1443 | |
1444 /* append any remaining message data (without the > :-) */ | |
1445 if (last && *last) | |
1446 msg = g_string_append(msg, last); | |
1447 | |
1448 /* if we inserted any images in the binary section, append it */ | |
1449 if (oscar_id) { | |
1450 msg = g_string_append_len(msg, data->str, data->len); | |
1451 msg = g_string_append(msg, "</BINARY>"); | |
1452 } | |
1453 | |
1454 len = msg->len; | |
1455 buf = msg->str; | |
1456 g_string_free(msg, FALSE); | |
1457 g_string_free(data, TRUE); | |
1458 | |
1459 | |
1460 /* XXX - The last parameter below is the encoding. Let Paco-Paco do something with it. */ | |
1461 if (imflags & GAIM_CONV_IM_AUTO_RESP) | |
1462 ret = aim_odc_send_im(sess, conn, buf, len, 0, 1); | |
1463 else | |
1464 ret = aim_odc_send_im(sess, conn, buf, len, 0, 0); | |
1465 | |
1466 g_free(buf); | |
1467 | |
1468 return ret; | |
1469 } | |
1470 | |
1471 struct ask_do_dir_im { | |
1472 char *who; | |
1473 GaimConnection *gc; | |
1474 }; | |
1475 | |
1476 static void oscar_cancel_direct_im(struct ask_do_dir_im *data) { | |
1477 g_free(data->who); | |
1478 g_free(data); | |
1479 } | |
1480 | |
8983 | 1481 /* this function is used to initiate a direct im session with someone. |
1482 * we start listening on a port and send a request. they either connect | |
1483 * or send some kind of reply. If they can't connect, they ask us to | |
1484 * connect to them, and so we do that. | |
1485 * | |
1486 * this function will also get called if the other side initiate's a direct | |
1487 * im and we try to connect and fail. in that case cookie will not be null. | |
1488 * | |
1489 * note that cookie is an 8 byte string that isn't NULL terminated | |
1490 */ | |
1491 static void oscar_direct_im_initiate(GaimConnection *gc, const char *who, const char *cookie) { | |
8971 | 1492 OscarData *od; |
1493 struct oscar_direct_im *dim; | |
1494 int listenfd; | |
8982 | 1495 const char *ip; |
8971 | 1496 |
1497 od = (OscarData *)gc->proto_data; | |
1498 | |
8983 | 1499 dim = oscar_direct_im_find(od, who); |
8971 | 1500 if (dim) { |
1501 if (!(dim->connected)) { /* We'll free the old, unconnected dim, and start over */ | |
1502 oscar_direct_im_disconnect(od, dim); | |
1503 gaim_debug_info("oscar", | |
1504 "Gave up on old direct IM, trying again\n"); | |
1505 } else { | |
1506 gaim_notify_error(gc, NULL, "DirectIM already open.", NULL); | |
8980 | 1507 return; |
8971 | 1508 } |
1509 } | |
1510 dim = g_new0(struct oscar_direct_im, 1); | |
1511 dim->gc = gc; | |
8983 | 1512 g_snprintf(dim->name, sizeof dim->name, "%s", who); |
8971 | 1513 |
1514 listenfd = gaim_network_listen_range(5190, 5199); | |
8982 | 1515 ip = gaim_network_get_my_ip(od->conn ? od->conn->fd : -1); |
9455 | 1516 if (listenfd >= 0) |
1517 dim->conn = aim_odc_initiate(od->sess, who, listenfd, gaim_network_ip_atoi(ip), gaim_network_get_port_from_fd(listenfd), cookie); | |
8971 | 1518 if (dim->conn != NULL) { |
8982 | 1519 char *tmp; |
1520 GaimConversation *conv; | |
1521 | |
8971 | 1522 od->direct_ims = g_slist_append(od->direct_ims, dim); |
1523 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, | |
1524 oscar_callback, dim->conn); | |
1525 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIM_ESTABLISHED, | |
1526 gaim_odc_initiate, 0); | |
8982 | 1527 |
8983 | 1528 conv = gaim_conversation_new(GAIM_CONV_IM, dim->gc->account, who); |
1529 tmp = g_strdup_printf(_("Asking %s to connect to us at %s:%hu for Direct IM."), who, ip, | |
8982 | 1530 gaim_network_get_port_from_fd(listenfd)); |
1531 gaim_conversation_write(conv, NULL, tmp, GAIM_MESSAGE_SYSTEM, time(NULL)); | |
1532 g_free(tmp); | |
8971 | 1533 } else { |
1534 gaim_notify_error(gc, NULL, _("Unable to open Direct IM"), NULL); | |
1535 oscar_direct_im_destroy(od, dim); | |
1536 } | |
8983 | 1537 } |
1538 | |
1539 static void oscar_direct_im(struct ask_do_dir_im *data) { | |
1540 GaimConnection *gc = data->gc; | |
1541 | |
1542 if (!g_list_find(gaim_connections_get_all(), gc)) { | |
1543 g_free(data->who); | |
1544 g_free(data); | |
1545 return; | |
1546 } | |
1547 | |
1548 oscar_direct_im_initiate(gc, data->who, NULL); | |
8971 | 1549 g_free(data->who); |
1550 g_free(data); | |
1551 } | |
1552 | |
1553 /* this is the right click menu cb thingy */ | |
9030 | 1554 static void oscar_ask_direct_im(GaimBlistNode *node, gpointer ignored) { |
1555 | |
1556 GaimBuddy *buddy; | |
1557 GaimConnection *gc; | |
8971 | 1558 gchar *buf; |
9030 | 1559 struct ask_do_dir_im *data; |
1560 | |
1561 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); | |
1562 | |
1563 buddy = (GaimBuddy *) node; | |
1564 gc = gaim_account_get_connection(buddy->account); | |
1565 | |
1566 data = g_new0(struct ask_do_dir_im, 1); | |
1567 data->who = g_strdup(buddy->name); | |
8971 | 1568 data->gc = gc; |
9030 | 1569 buf = g_strdup_printf(_("You have selected to open a Direct IM connection with %s."), |
1570 buddy->name); | |
8971 | 1571 |
1572 gaim_request_action(gc, NULL, buf, | |
9030 | 1573 _("Because this reveals your IP address, it " |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
1574 "may be considered a privacy risk. Do you " |
9030 | 1575 "wish to continue?"), |
1576 0, data, 2, | |
1577 _("Connect"), G_CALLBACK(oscar_direct_im), | |
1578 _("Cancel"), G_CALLBACK(oscar_cancel_direct_im)); | |
8971 | 1579 g_free(buf); |
1580 } | |
1581 | |
1582 /***************************************************************************** | |
1583 * End scary direct im stuff | |
1584 *****************************************************************************/ | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1585 |
4617 | 1586 static void oscar_callback(gpointer data, gint source, GaimInputCondition condition) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1587 aim_conn_t *conn = (aim_conn_t *)data; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1588 aim_session_t *sess = aim_conn_getsess(conn); |
5575 | 1589 GaimConnection *gc = sess ? sess->aux_data : NULL; |
7283 | 1590 OscarData *od; |
2086 | 1591 |
1592 if (!gc) { | |
8660 | 1593 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1594 "oscar callback for closed connection (1).\n"); |
2086 | 1595 return; |
1596 } | |
10458 | 1597 |
7283 | 1598 od = (OscarData *)gc->proto_data; |
2086 | 1599 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1600 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 1601 /* oh boy. this is probably bad. i guess the only thing we |
1602 * can really do is return? */ | |
8660 | 1603 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1604 "oscar callback for closed connection (2).\n"); |
8660 | 1605 gaim_debug_misc("oscar", "gc = %p\n", gc); |
2086 | 1606 return; |
1607 } | |
1608 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1609 if (condition & GAIM_INPUT_READ) { |
4617 | 1610 if (conn->type == AIM_CONN_TYPE_LISTENER) { |
8660 | 1611 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1612 "got information on rendezvous listener\n"); |
4617 | 1613 if (aim_handlerendconnect(od->sess, conn) < 0) { |
8660 | 1614 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1615 "connection error (rendezvous listener)\n"); |
4617 | 1616 aim_conn_kill(od->sess, &conn); |
8446 | 1617 /* AAA - Don't we need to gaim_xfer_cancel here? --marv */ |
2086 | 1618 } |
1619 } else { | |
4617 | 1620 if (aim_get_command(od->sess, conn) >= 0) { |
1621 aim_rxdispatch(od->sess); | |
6029 | 1622 if (od->killme) { |
8660 | 1623 gaim_debug_error("oscar", "Waiting to be destroyed\n"); |
6029 | 1624 return; |
1625 } | |
2086 | 1626 } else { |
1627 if ((conn->type == AIM_CONN_TYPE_BOS) || | |
10444 | 1628 !(aim_getconn_type(od->sess, AIM_CONN_TYPE_BOS))) |
1629 { | |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
1630 gaim_debug_error("oscar", "Major connection error. i.e. " |
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
1631 "invalid data was received on the oscar TCP stream\n"); |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1632 gaim_connection_error(gc, _("Disconnected.")); |
2086 | 1633 } else if (conn->type == AIM_CONN_TYPE_CHAT) { |
10458 | 1634 struct chat_connection *cc = find_oscar_chat_by_conn(gc, conn); |
1635 GaimConversation *conv = gaim_find_chat(gc, cc->id); | |
5420 | 1636 char *buf; |
10458 | 1637 |
1638 gaim_debug_info("oscar", "Lost connection " | |
1639 "to chat room %s\n", cc->name); | |
1640 | |
1641 buf = g_strdup_printf(_("You have lost your connection " | |
1642 "to chat room %s."), cc->name); | |
1643 if (conv != NULL) | |
9627 | 1644 gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_ERROR, time(NULL)); |
1645 else | |
1646 gaim_notify_error(gc, NULL, buf, NULL); | |
5420 | 1647 g_free(buf); |
10458 | 1648 |
1649 oscar_chat_kill(gc, cc); | |
1650 | |
2086 | 1651 } else if (conn->type == AIM_CONN_TYPE_CHATNAV) { |
4617 | 1652 if (od->cnpa > 0) |
1653 gaim_input_remove(od->cnpa); | |
1654 od->cnpa = 0; | |
8660 | 1655 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1656 "removing chatnav input watcher\n"); |
4617 | 1657 while (od->create_rooms) { |
1658 struct create_room *cr = od->create_rooms->data; | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
1659 g_free(cr->name); |
4617 | 1660 od->create_rooms = |
1661 g_slist_remove(od->create_rooms, cr); | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
1662 g_free(cr); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1663 gaim_notify_error(gc, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1664 _("Chat is currently unavailable"), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1665 NULL); |
2086 | 1666 } |
4617 | 1667 aim_conn_kill(od->sess, &conn); |
2086 | 1668 } else if (conn->type == AIM_CONN_TYPE_AUTH) { |
4617 | 1669 if (od->paspa > 0) |
1670 gaim_input_remove(od->paspa); | |
1671 od->paspa = 0; | |
8660 | 1672 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1673 "removing authconn input watcher\n"); |
4617 | 1674 aim_conn_kill(od->sess, &conn); |
3694 | 1675 } else if (conn->type == AIM_CONN_TYPE_EMAIL) { |
4617 | 1676 if (od->emlpa > 0) |
1677 gaim_input_remove(od->emlpa); | |
1678 od->emlpa = 0; | |
8660 | 1679 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1680 "removing email input watcher\n"); |
4617 | 1681 aim_conn_kill(od->sess, &conn); |
4804 | 1682 } else if (conn->type == AIM_CONN_TYPE_ICON) { |
1683 if (od->icopa > 0) | |
1684 gaim_input_remove(od->icopa); | |
1685 od->icopa = 0; | |
8660 | 1686 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1687 "removing icon input watcher\n"); |
4804 | 1688 aim_conn_kill(od->sess, &conn); |
2086 | 1689 } else if (conn->type == AIM_CONN_TYPE_RENDEZVOUS) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1690 if (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM) |
4617 | 1691 gaim_odc_disconnect(od->sess, conn); |
1692 aim_conn_kill(od->sess, &conn); | |
2086 | 1693 } else { |
8660 | 1694 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1695 "holy crap! generic connection error! %hu\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1696 conn->type); |
4617 | 1697 aim_conn_kill(od->sess, &conn); |
2086 | 1698 } |
1699 } | |
1700 } | |
1701 } | |
1702 } | |
1703 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1704 static void oscar_debug(aim_session_t *sess, int level, const char *format, va_list va) { |
5575 | 1705 GaimConnection *gc = sess->aux_data; |
7285 | 1706 gchar *s = g_strdup_vprintf(format, va); |
1707 gchar *buf; | |
1708 | |
1709 buf = g_strdup_printf("%s %d: %s", gaim_account_get_username(gaim_connection_get_account(gc)), level, s); | |
8660 | 1710 gaim_debug_info("oscar", buf); |
7285 | 1711 if (buf[strlen(buf)-1] != '\n') |
8660 | 1712 gaim_debug_info(NULL, "\n"); |
7285 | 1713 g_free(buf); |
2086 | 1714 g_free(s); |
1715 } | |
1716 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1717 static void oscar_login_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 1718 { |
5575 | 1719 GaimConnection *gc = data; |
7283 | 1720 OscarData *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1721 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1722 aim_conn_t *conn; |
2086 | 1723 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1724 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 1725 close(source); |
1726 return; | |
1727 } | |
1728 | |
4617 | 1729 od = gc->proto_data; |
1730 sess = od->sess; | |
2086 | 1731 conn = aim_getconn_type_all(sess, AIM_CONN_TYPE_AUTH); |
4366 | 1732 conn->fd = source; |
2086 | 1733 |
1734 if (source < 0) { | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1735 gaim_connection_error(gc, _("Couldn't connect to host")); |
2086 | 1736 return; |
1737 } | |
1738 | |
1739 aim_conn_completeconnect(sess, conn); | |
4617 | 1740 gc->inpa = gaim_input_add(conn->fd, GAIM_INPUT_READ, oscar_callback, conn); |
7282 | 1741 aim_request_login(sess, conn, gaim_account_get_username(gaim_connection_get_account(gc))); |
1742 | |
8660 | 1743 gaim_debug_info("oscar", |
7282 | 1744 "Screen name sent, waiting for response\n"); |
7283 | 1745 gaim_connection_update_progress(gc, _("Screen name sent"), 1, OSCAR_CONNECT_STEPS); |
8341 | 1746 ck[1] = 0x65; |
2086 | 1747 } |
1748 | |
10444 | 1749 static void |
1750 oscar_login(GaimAccount *account, GaimStatus *status) | |
1751 { | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1752 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1753 aim_conn_t *conn; |
5575 | 1754 GaimConnection *gc = gaim_account_get_connection(account); |
7283 | 1755 OscarData *od = gc->proto_data = g_new0(OscarData, 1); |
10400 | 1756 GaimStatusType *status_type; |
1757 GaimStatusPrimitive primitive; | |
1758 | |
1759 status_type = gaim_status_get_type(status); | |
1760 primitive = gaim_status_type_get_primitive(status_type); | |
2086 | 1761 |
8660 | 1762 gaim_debug_misc("oscar", "oscar_login: gc = %p\n", gc); |
10444 | 1763 |
10400 | 1764 if (primitive == GAIM_STATUS_OFFLINE) |
1765 return; | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
1766 |
8437 | 1767 if (!aim_snvalid(gaim_account_get_username(account))) { |
1768 gchar *buf; | |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
1769 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 | 1770 gaim_connection_error(gc, buf); |
1771 g_free(buf); | |
1772 } | |
1773 | |
9975 | 1774 if (aim_sn_is_icq((gaim_account_get_username(account)))) { |
4617 | 1775 od->icq = TRUE; |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
1776 } else { |
6622 | 1777 gc->flags |= GAIM_CONNECTION_HTML; |
1778 gc->flags |= GAIM_CONNECTION_AUTO_RESP; | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
1779 } |
5836 | 1780 od->buddyinfo = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, oscar_free_buddyinfo); |
2086 | 1781 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1782 sess = g_new0(aim_session_t, 1); |
10329 | 1783 aim_session_init(sess, TRUE, FAIM_DEBUG_LEVEL); |
2086 | 1784 aim_setdebuggingcb(sess, oscar_debug); |
7282 | 1785 /* |
1786 * We need an immediate queue because we don't use a while-loop | |
1787 * to see if things need to be sent. | |
1788 */ | |
2086 | 1789 aim_tx_setenqueue(sess, AIM_TX_IMMEDIATE, NULL); |
4617 | 1790 od->sess = sess; |
2086 | 1791 sess->aux_data = gc; |
1792 | |
9935 | 1793 /* Connect to core Gaim signals */ |
10087 | 1794 gaim_prefs_connect_callback(gc, "/plugins/prpl/oscar/recent_buddies", recent_buddies_cb, gc); |
9935 | 1795 |
2086 | 1796 conn = aim_newconn(sess, AIM_CONN_TYPE_AUTH, NULL); |
1797 if (conn == NULL) { | |
10444 | 1798 gaim_debug_error("oscar", "internal connection error\n"); |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1799 gaim_connection_error(gc, _("Unable to login to AIM")); |
2086 | 1800 return; |
1801 } | |
1802 | |
4649 | 1803 aim_conn_addhandler(sess, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
10464 | 1804 aim_conn_addhandler(sess, conn, 0x0017, 0x0003, gaim_parse_auth_resp, 0); |
2086 | 1805 aim_conn_addhandler(sess, conn, 0x0017, 0x0007, gaim_parse_login, 0); |
10464 | 1806 aim_conn_addhandler(sess, conn, AIM_CB_FAM_ATH, AIM_CB_ATH_SECURID_REQUEST, gaim_parse_auth_securid_request, 0); |
2086 | 1807 |
1808 conn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1809 if (gaim_proxy_connect(account, gaim_account_get_string(account, "server", FAIM_LOGIN_SERVER), |
5575 | 1810 gaim_account_get_int(account, "port", FAIM_LOGIN_PORT), |
1811 oscar_login_connect, gc) < 0) { | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1812 gaim_connection_error(gc, _("Couldn't connect to host")); |
2086 | 1813 return; |
1814 } | |
7282 | 1815 |
7283 | 1816 gaim_connection_update_progress(gc, _("Connecting"), 0, OSCAR_CONNECT_STEPS); |
8341 | 1817 ck[0] = 0x5a; |
5575 | 1818 } |
1819 | |
1820 static void oscar_close(GaimConnection *gc) { | |
7283 | 1821 OscarData *od = (OscarData *)gc->proto_data; |
4617 | 1822 |
1823 while (od->oscar_chats) { | |
1824 struct chat_connection *n = od->oscar_chats->data; | |
2086 | 1825 if (n->inpa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1826 gaim_input_remove(n->inpa); |
2086 | 1827 g_free(n->name); |
1828 g_free(n->show); | |
4617 | 1829 od->oscar_chats = g_slist_remove(od->oscar_chats, n); |
2086 | 1830 g_free(n); |
1831 } | |
4617 | 1832 while (od->direct_ims) { |
8971 | 1833 struct oscar_direct_im *n = od->direct_ims->data; |
1834 oscar_direct_im_destroy(od, n); | |
2086 | 1835 } |
4617 | 1836 /* BBB */ |
1837 while (od->file_transfers) { | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
1838 GaimXfer *xfer; |
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
1839 xfer = (GaimXfer *)od->file_transfers->data; |
7805 | 1840 gaim_xfer_cancel_local(xfer); |
3630 | 1841 } |
4804 | 1842 while (od->requesticon) { |
1843 char *sn = od->requesticon->data; | |
1844 od->requesticon = g_slist_remove(od->requesticon, sn); | |
1845 free(sn); | |
1846 } | |
4738 | 1847 g_hash_table_destroy(od->buddyinfo); |
4617 | 1848 while (od->create_rooms) { |
1849 struct create_room *cr = od->create_rooms->data; | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
1850 g_free(cr->name); |
4617 | 1851 od->create_rooms = g_slist_remove(od->create_rooms, cr); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
1852 g_free(cr); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
1853 } |
4617 | 1854 if (od->email) |
1855 g_free(od->email); | |
1856 if (od->newp) | |
1857 g_free(od->newp); | |
1858 if (od->oldp) | |
1859 g_free(od->oldp); | |
2086 | 1860 if (gc->inpa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1861 gaim_input_remove(gc->inpa); |
4617 | 1862 if (od->cnpa > 0) |
1863 gaim_input_remove(od->cnpa); | |
1864 if (od->paspa > 0) | |
1865 gaim_input_remove(od->paspa); | |
1866 if (od->emlpa > 0) | |
1867 gaim_input_remove(od->emlpa); | |
4804 | 1868 if (od->icopa > 0) |
1869 gaim_input_remove(od->icopa); | |
6907 | 1870 if (od->icontimer > 0) |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
1871 gaim_timeout_remove(od->icontimer); |
8341 | 1872 if (od->getblisttimer > 0) |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
1873 gaim_timeout_remove(od->getblisttimer); |
8341 | 1874 if (od->getinfotimer > 0) |
1875 gaim_timeout_remove(od->getinfotimer); | |
10087 | 1876 gaim_prefs_disconnect_by_handle(gc); |
9971 | 1877 |
4617 | 1878 aim_session_kill(od->sess); |
1879 g_free(od->sess); | |
1880 od->sess = NULL; | |
2086 | 1881 g_free(gc->proto_data); |
1882 gc->proto_data = NULL; | |
8660 | 1883 gaim_debug_info("oscar", "Signed off.\n"); |
2086 | 1884 } |
1885 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1886 static void oscar_bos_connect(gpointer data, gint source, GaimInputCondition cond) { |
5575 | 1887 GaimConnection *gc = data; |
7283 | 1888 OscarData *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1889 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1890 aim_conn_t *bosconn; |
2086 | 1891 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1892 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 1893 close(source); |
1894 return; | |
1895 } | |
1896 | |
4617 | 1897 od = gc->proto_data; |
1898 sess = od->sess; | |
1899 bosconn = od->conn; | |
4366 | 1900 bosconn->fd = source; |
2086 | 1901 |
1902 if (source < 0) { | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1903 gaim_connection_error(gc, _("Could Not Connect")); |
2086 | 1904 return; |
1905 } | |
1906 | |
1907 aim_conn_completeconnect(sess, bosconn); | |
4617 | 1908 gc->inpa = gaim_input_add(bosconn->fd, GAIM_INPUT_READ, oscar_callback, bosconn); |
7283 | 1909 |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1910 gaim_connection_update_progress(gc, |
7283 | 1911 _("Connection established, cookie sent"), 4, OSCAR_CONNECT_STEPS); |
8341 | 1912 ck[4] = 0x61; |
2086 | 1913 } |
1914 | |
4617 | 1915 /* BBB */ |
4656 | 1916 /* |
1917 * This little area in oscar.c is the nexus of file transfer code, | |
1918 * so I wrote a little explanation of what happens. I am such a | |
1919 * ninja. | |
1920 * | |
1921 * The series of events for a file send is: | |
1922 * -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
|
1923 * -User chooses a file and oscar_xfer_init is called. It establishes a |
4656 | 1924 * listening socket, then asks the remote user to connect to us (and |
1925 * gives them the file name, port, IP, etc.) | |
1926 * -They connect to us and we send them an AIM_CB_OFT_PROMPT (this happens | |
1927 * in oscar_sendfile_estblsh) | |
1928 * -They send us an AIM_CB_OFT_ACK and then we start sending data | |
1929 * -When we finish, they send us an AIM_CB_OFT_DONE and they close the | |
1930 * connection. | |
1931 * -We get drunk because file transfer kicks ass. | |
1932 * | |
1933 * The series of events for a file receive is: | |
1934 * -Create xfer and call gaim_xfer request (this happens in incomingim_chan2) | |
1935 * -Gaim user selects file to name and location to save file to and | |
1936 * oscar_xfer_init is called | |
1937 * -It connects to the remote user using the IP they gave us earlier | |
1938 * -After connecting, they send us an AIM_CB_OFT_PROMPT. In reply, we send | |
1939 * them an AIM_CB_OFT_ACK. | |
1940 * -They begin to send us lots of raw data. | |
1941 * -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
|
1942 * the connection. |
4656 | 1943 */ |
1944 static void oscar_sendfile_connected(gpointer data, gint source, GaimInputCondition condition); | |
1945 | |
8446 | 1946 /* |
1947 * Miscellaneous xfer functions | |
1948 */ | |
1949 static GaimXfer *oscar_find_xfer_by_cookie(GSList *fts, const fu8_t *ck) | |
4656 | 1950 { |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
1951 GaimXfer *xfer; |
5146 | 1952 struct aim_oft_info *oft_info; |
4656 | 1953 |
1954 while (fts) { | |
1955 xfer = fts->data; | |
5146 | 1956 oft_info = xfer->data; |
1957 | |
8446 | 1958 if (oft_info && !memcmp(ck, oft_info->cookie, 8)) |
4656 | 1959 return xfer; |
1960 | |
1961 fts = g_slist_next(fts); | |
1962 } | |
1963 | |
1964 return NULL; | |
1965 } | |
1966 | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
1967 static GaimXfer *oscar_find_xfer_by_conn(GSList *fts, aim_conn_t *conn) |
4656 | 1968 { |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
1969 GaimXfer *xfer; |
5146 | 1970 struct aim_oft_info *oft_info; |
4656 | 1971 |
1972 while (fts) { | |
1973 xfer = fts->data; | |
5146 | 1974 oft_info = xfer->data; |
1975 | |
1976 if (oft_info && (conn == oft_info->conn)) | |
4656 | 1977 return xfer; |
1978 | |
1979 fts = g_slist_next(fts); | |
1980 } | |
1981 | |
1982 return NULL; | |
1983 } | |
1984 | |
8446 | 1985 static void oscar_xfer_end(GaimXfer *xfer) |
1986 { | |
1987 struct aim_oft_info *oft_info = xfer->data; | |
1988 GaimConnection *gc = oft_info->sess->aux_data; | |
1989 OscarData *od = gc->proto_data; | |
1990 | |
8660 | 1991 gaim_debug_info("oscar", "AAA - in oscar_xfer_end\n"); |
8446 | 1992 |
1993 if (gaim_xfer_get_type(xfer) == GAIM_XFER_RECEIVE) { | |
1994 oft_info->fh.nrecvd = gaim_xfer_get_bytes_sent(xfer); | |
1995 aim_oft_sendheader(oft_info->sess, AIM_CB_OFT_DONE, oft_info); | |
1996 } | |
1997 | |
1998 aim_conn_kill(oft_info->sess, &oft_info->conn); | |
1999 aim_oft_destroyinfo(oft_info); | |
2000 xfer->data = NULL; | |
2001 od->file_transfers = g_slist_remove(od->file_transfers, xfer); | |
2002 } | |
2003 | |
2004 /* | |
2005 * xfer functions used when receiving files | |
2006 */ | |
2007 | |
2008 static void oscar_xfer_init_recv(GaimXfer *xfer) | |
2009 { | |
2010 struct aim_oft_info *oft_info = xfer->data; | |
2011 GaimConnection *gc = oft_info->sess->aux_data; | |
2012 OscarData *od = gc->proto_data; | |
2013 | |
8660 | 2014 gaim_debug_info("oscar", "AAA - in oscar_xfer_recv_init\n"); |
8446 | 2015 |
2016 oft_info->conn = aim_newconn(od->sess, AIM_CONN_TYPE_RENDEZVOUS, NULL); | |
2017 if (oft_info->conn) { | |
2018 oft_info->conn->subtype = AIM_CONN_SUBTYPE_OFT_SENDFILE; | |
2019 aim_conn_addhandler(od->sess, oft_info->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_PROMPT, oscar_sendfile_prompt, 0); | |
2020 oft_info->conn->fd = xfer->fd = gaim_proxy_connect(gaim_connection_get_account(gc), | |
2021 xfer->remote_ip, xfer->remote_port, oscar_sendfile_connected, xfer); | |
2022 if (xfer->fd == -1) { | |
10654 | 2023 gaim_xfer_error(GAIM_XFER_RECEIVE, gaim_xfer_get_account(xfer), xfer->who, |
8446 | 2024 _("Unable to establish file descriptor.")); |
2025 gaim_xfer_cancel_local(xfer); | |
2026 } | |
2027 } else { | |
10654 | 2028 gaim_xfer_error(GAIM_XFER_RECEIVE, gaim_xfer_get_account(xfer), xfer->who, |
8446 | 2029 _("Unable to create new connection.")); |
2030 gaim_xfer_cancel_local(xfer); | |
2031 /* Try a different port? Ask them to connect to us? /join #gaim and whine? */ | |
2032 } | |
2033 | |
2034 } | |
2035 | |
2036 static void oscar_xfer_cancel_recv(GaimXfer *xfer) | |
2037 { | |
10405 | 2038 struct aim_oft_info *oft_info; |
2039 GaimConnection *gc; | |
2040 OscarData *od; | |
2041 | |
2042 g_return_if_fail(xfer != NULL); | |
2043 g_return_if_fail(xfer->data != NULL); | |
2044 | |
2045 oft_info = xfer->data; | |
2046 gc = oft_info->sess->aux_data; | |
2047 od = gc->proto_data; | |
8446 | 2048 |
8660 | 2049 gaim_debug_info("oscar", "AAA - in oscar_xfer_cancel_recv\n"); |
8446 | 2050 |
9771 | 2051 if (gaim_xfer_get_status(xfer) != GAIM_XFER_STATUS_CANCEL_REMOTE) |
2052 aim_im_sendch2_sendfile_cancel(oft_info->sess, oft_info); | |
8446 | 2053 |
2054 aim_conn_kill(oft_info->sess, &oft_info->conn); | |
2055 aim_oft_destroyinfo(oft_info); | |
2056 xfer->data = NULL; | |
2057 od->file_transfers = g_slist_remove(od->file_transfers, xfer); | |
2058 } | |
2059 | |
2060 static void oscar_xfer_ack_recv(GaimXfer *xfer, const char *buffer, size_t size) | |
2061 { | |
2062 struct aim_oft_info *oft_info = xfer->data; | |
2063 | |
2064 /* Update our rolling checksum. Like Walmart, yo. */ | |
2065 oft_info->fh.recvcsum = aim_oft_checksum_chunk(buffer, size, oft_info->fh.recvcsum); | |
2066 } | |
2067 | |
2068 /* | |
2069 * xfer functions used when sending files | |
2070 */ | |
2071 | |
2072 static void oscar_xfer_init_send(GaimXfer *xfer) | |
2073 { | |
2074 struct aim_oft_info *oft_info = xfer->data; | |
2075 GaimConnection *gc = oft_info->sess->aux_data; | |
2076 OscarData *od = gc->proto_data; | |
2077 int listenfd; | |
2078 | |
8660 | 2079 gaim_debug_info("oscar", "AAA - in oscar_xfer_send_init\n"); |
8446 | 2080 |
2081 xfer->filename = g_path_get_basename(xfer->local_filename); | |
2082 strncpy(oft_info->fh.name, xfer->filename, 64); | |
2083 oft_info->fh.name[63] = '\0'; | |
2084 oft_info->fh.totsize = gaim_xfer_get_size(xfer); | |
2085 oft_info->fh.size = gaim_xfer_get_size(xfer); | |
2086 oft_info->fh.checksum = aim_oft_checksum_file(xfer->local_filename); | |
2087 | |
2088 /* Create a listening socket and an associated libfaim conn */ | |
2089 if ((listenfd = gaim_network_listen_range(5190, 5199)) < 0) { | |
2090 gaim_xfer_cancel_local(xfer); | |
2091 return; | |
2092 } | |
2093 xfer->local_port = gaim_network_get_port_from_fd(listenfd); | |
2094 oft_info->port = xfer->local_port; | |
2095 if (aim_sendfile_listen(od->sess, oft_info, listenfd) != 0) { | |
2096 gaim_xfer_cancel_local(xfer); | |
2097 return; | |
2098 } | |
8660 | 2099 gaim_debug_misc("oscar", |
8446 | 2100 "port is %hu, ip is %s\n", |
2101 xfer->local_port, oft_info->clientip); | |
2102 if (oft_info->conn) { | |
2103 xfer->watcher = gaim_input_add(oft_info->conn->fd, GAIM_INPUT_READ, oscar_callback, oft_info->conn); | |
2104 aim_im_sendch2_sendfile_ask(od->sess, oft_info); | |
2105 aim_conn_addhandler(od->sess, oft_info->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_ESTABLISHED, oscar_sendfile_estblsh, 0); | |
2106 } else { | |
10654 | 2107 gaim_xfer_error(GAIM_XFER_SEND, gaim_xfer_get_account(xfer), xfer->who, |
8446 | 2108 _("Unable to establish listener socket.")); |
2109 gaim_xfer_cancel_local(xfer); | |
2110 } | |
2111 } | |
2112 | |
2113 static void oscar_xfer_cancel_send(GaimXfer *xfer) | |
2114 { | |
2115 struct aim_oft_info *oft_info = xfer->data; | |
2116 GaimConnection *gc = oft_info->sess->aux_data; | |
2117 OscarData *od = gc->proto_data; | |
2118 | |
8660 | 2119 gaim_debug_info("oscar", "AAA - in oscar_xfer_cancel_send\n"); |
8446 | 2120 |
9771 | 2121 if (gaim_xfer_get_status(xfer) != GAIM_XFER_STATUS_CANCEL_REMOTE) |
2122 aim_im_sendch2_sendfile_cancel(oft_info->sess, oft_info); | |
8446 | 2123 |
2124 aim_conn_kill(oft_info->sess, &oft_info->conn); | |
2125 aim_oft_destroyinfo(oft_info); | |
2126 xfer->data = NULL; | |
2127 od->file_transfers = g_slist_remove(od->file_transfers, xfer); | |
2128 } | |
2129 | |
2130 static void oscar_xfer_ack_send(GaimXfer *xfer, const char *buffer, size_t size) | |
2131 { | |
2132 struct aim_oft_info *oft_info = xfer->data; | |
2133 | |
2134 /* I'm not sure I like how we do this. --marv | |
2135 * I do. AIM file transfers aren't really meant to be thought | |
2136 * of as a transferring just a single file. The rendezvous | |
2137 * establishes a connection between two computers, and then | |
2138 * those computers can use the same connection for transferring | |
2139 * multiple files. So we don't want the Gaim core up and closing | |
2140 * the socket all willy-nilly. We want to do that in the oscar | |
2141 * prpl, whenever one side or the other says they're finished | |
2142 * using the connection. There might be a better way to intercept | |
2143 * the socket from the core, however... --KingAnt | |
2144 */ | |
2145 | |
2146 /* | |
2147 * If we're done sending, intercept the socket from the core ft code | |
2148 * and wait for the other guy to send the "done" OFT packet. | |
2149 */ | |
2150 if (gaim_xfer_get_bytes_remaining(xfer) <= 0) { | |
2151 gaim_input_remove(xfer->watcher); | |
2152 xfer->watcher = gaim_input_add(xfer->fd, GAIM_INPUT_READ, oscar_callback, oft_info->conn); | |
2153 xfer->fd = 0; | |
2154 gaim_xfer_set_completed(xfer, TRUE); | |
2155 } | |
2156 } | |
2157 | |
9466 | 2158 static gboolean oscar_can_receive_file(GaimConnection *gc, const char *who) { |
2159 gboolean can_receive = FALSE; | |
2160 OscarData *od = gc->proto_data; | |
2161 | |
10517
461334f300d7
[gaim-migrate @ 11821]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10504
diff
changeset
|
2162 if (od != NULL && !od->icq) { |
9466 | 2163 aim_userinfo_t *userinfo; |
2164 userinfo = aim_locate_finduserinfo(od->sess, who); | |
2165 if (userinfo && userinfo->capabilities & AIM_CAPS_SENDFILE) | |
2166 can_receive = TRUE; | |
2167 } | |
2168 | |
2169 return can_receive; | |
2170 } | |
2171 | |
2172 static void oscar_send_file(GaimConnection *gc, const char *who, const char *file) { | |
9030 | 2173 |
2174 OscarData *od; | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2175 GaimXfer *xfer; |
5146 | 2176 struct aim_oft_info *oft_info; |
8231
f50c059b6384
[gaim-migrate @ 8954]
Christian Hammond <chipx86@chipx86.com>
parents:
8227
diff
changeset
|
2177 const char *ip; |
3752 | 2178 |
9030 | 2179 od = (OscarData *)gc->proto_data; |
2180 | |
4617 | 2181 /* You want to send a file to someone else, you're so generous */ |
2182 | |
2183 /* Build the file transfer handle */ | |
9466 | 2184 xfer = gaim_xfer_new(gc->account, GAIM_XFER_SEND, who); |
4617 | 2185 |
5146 | 2186 /* Create the oscar-specific data */ |
8838 | 2187 ip = gaim_network_get_my_ip(od->conn ? od->conn->fd : -1); |
9466 | 2188 oft_info = aim_oft_createinfo(od->sess, NULL, who, ip, 0, 0, 0, NULL); |
5146 | 2189 xfer->data = oft_info; |
2190 | |
4617 | 2191 /* Setup our I/O op functions */ |
8446 | 2192 gaim_xfer_set_init_fnc(xfer, oscar_xfer_init_send); |
4617 | 2193 gaim_xfer_set_end_fnc(xfer, oscar_xfer_end); |
4675
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
2194 gaim_xfer_set_cancel_send_fnc(xfer, oscar_xfer_cancel_send); |
8446 | 2195 gaim_xfer_set_request_denied_fnc(xfer, oscar_xfer_cancel_send); |
2196 gaim_xfer_set_ack_fnc(xfer, oscar_xfer_ack_send); | |
4617 | 2197 |
2198 /* Keep track of this transfer for later */ | |
2199 od->file_transfers = g_slist_append(od->file_transfers, xfer); | |
2200 | |
2201 /* Now perform the request */ | |
9466 | 2202 if (file) |
2203 gaim_xfer_request_accepted(xfer, file); | |
2204 else | |
2205 gaim_xfer_request(xfer); | |
3630 | 2206 } |
2207 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2208 static int gaim_parse_auth_resp(aim_session_t *sess, aim_frame_t *fr, ...) { |
6029 | 2209 GaimConnection *gc = sess->aux_data; |
7283 | 2210 OscarData *od = gc->proto_data; |
6029 | 2211 GaimAccount *account = gc->account; |
2212 aim_conn_t *bosconn; | |
2213 char *host; int port; | |
2214 int i, rc; | |
2086 | 2215 va_list ap; |
2704 | 2216 struct aim_authresp_info *info; |
6029 | 2217 |
5575 | 2218 port = gaim_account_get_int(account, "port", FAIM_LOGIN_PORT); |
2086 | 2219 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2220 va_start(ap, fr); |
2704 | 2221 info = va_arg(ap, struct aim_authresp_info *); |
2086 | 2222 va_end(ap); |
2223 | |
8660 | 2224 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2225 "inside auth_resp (Screen name: %s)\n", info->sn); |
2704 | 2226 |
4293 | 2227 if (info->errorcode || !info->bosip || !info->cookielen || !info->cookie) { |
4056 | 2228 char buf[256]; |
2704 | 2229 switch (info->errorcode) { |
2086 | 2230 case 0x05: |
2231 /* Incorrect nick/password */ | |
6498 | 2232 gc->wants_to_die = TRUE; |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
2233 gaim_connection_error(gc, _("Incorrect nickname or password.")); |
2086 | 2234 break; |
2235 case 0x11: | |
2236 /* Suspended account */ | |
6498 | 2237 gc->wants_to_die = TRUE; |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
2238 gaim_connection_error(gc, _("Your account is currently suspended.")); |
2086 | 2239 break; |
3498 | 2240 case 0x14: |
2241 /* service temporarily unavailable */ | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
2242 gaim_connection_error(gc, _("The AOL Instant Messenger service is temporarily unavailable.")); |
3498 | 2243 break; |
2086 | 2244 case 0x18: |
2245 /* connecting too frequently */ | |
6498 | 2246 gc->wants_to_die = TRUE; |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
2247 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 | 2248 break; |
2249 case 0x1c: | |
2250 /* client too old */ | |
6498 | 2251 gc->wants_to_die = TRUE; |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6350
diff
changeset
|
2252 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
|
2253 gaim_connection_error(gc, buf); |
2086 | 2254 break; |
2255 default: | |
6623 | 2256 gaim_connection_error(gc, _("Authentication failed")); |
2086 | 2257 break; |
2258 } | |
8660 | 2259 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2260 "Login Error Code 0x%04hx\n", info->errorcode); |
8660 | 2261 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2262 "Error URL: %s\n", info->errorurl); |
2086 | 2263 od->killme = TRUE; |
2264 return 1; | |
2265 } | |
2266 | |
2267 | |
9992 | 2268 gaim_debug_misc("oscar", "Reg status: %hu\n", info->regstatus); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2269 |
2704 | 2270 if (info->email) { |
8660 | 2271 gaim_debug_misc("oscar", "Email: %s\n", info->email); |
2086 | 2272 } else { |
8660 | 2273 gaim_debug_misc("oscar", "Email is NULL\n"); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2274 } |
10042 | 2275 |
8660 | 2276 gaim_debug_misc("oscar", "BOSIP: %s\n", info->bosip); |
2277 gaim_debug_info("oscar", | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2278 "Closing auth connection...\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2279 aim_conn_kill(sess, &fr->conn); |
2086 | 2280 |
2281 bosconn = aim_newconn(sess, AIM_CONN_TYPE_BOS, NULL); | |
2282 if (bosconn == NULL) { | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
2283 gaim_connection_error(gc, _("Internal Error")); |
2086 | 2284 od->killme = TRUE; |
2285 return 0; | |
2286 } | |
2287 | |
4649 | 2288 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 2289 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_bos, 0); |
2086 | 2290 aim_conn_addhandler(sess, bosconn, 0x0009, 0x0003, gaim_bosrights, 0); |
2291 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ACK, AIM_CB_ACK_ACK, NULL, 0); | |
2292 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_REDIRECT, gaim_handle_redirect, 0); | |
2993 | 2293 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_RIGHTSINFO, gaim_parse_locaterights, 0); |
2086 | 2294 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_RIGHTSINFO, gaim_parse_buddyrights, 0); |
2295 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_ONCOMING, gaim_parse_oncoming, 0); | |
2296 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_OFFGOING, gaim_parse_offgoing, 0); | |
2297 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_INCOMING, gaim_parse_incoming_im, 0); | |
2298 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_ERROR, gaim_parse_locerr, 0); | |
2299 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_MISSEDCALL, gaim_parse_misses, 0); | |
3212 | 2300 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_CLIENTAUTORESP, gaim_parse_clientauto, 0); |
2086 | 2301 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_RATECHANGE, gaim_parse_ratechange, 0); |
2302 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_EVIL, gaim_parse_evilnotify, 0); | |
2303 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOK, AIM_CB_LOK_ERROR, gaim_parse_searcherror, 0); | |
2304 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOK, 0x0003, gaim_parse_searchreply, 0); | |
2305 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ERROR, gaim_parse_msgerr, 0); | |
3595 | 2306 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_MTN, gaim_parse_mtn, 0); |
7011 | 2307 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_USERINFO, gaim_parse_userinfo, 0); |
8341 | 2308 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_REQUESTINFOTIMEOUT, gaim_reqinfo_timeout, 0); |
2086 | 2309 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ACK, gaim_parse_msgack, 0); |
2310 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
|
2311 aim_conn_addhandler(sess, bosconn, 0x0004, 0x0005, gaim_icbm_param_info, 0); |
2086 | 2312 aim_conn_addhandler(sess, bosconn, 0x0001, 0x0001, gaim_parse_genericerr, 0); |
2313 aim_conn_addhandler(sess, bosconn, 0x0003, 0x0001, gaim_parse_genericerr, 0); | |
2314 aim_conn_addhandler(sess, bosconn, 0x0009, 0x0001, gaim_parse_genericerr, 0); | |
2315 aim_conn_addhandler(sess, bosconn, 0x0001, 0x001f, gaim_memrequest, 0); | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2316 aim_conn_addhandler(sess, bosconn, 0x0001, 0x000f, gaim_selfinfo, 0); |
5844 | 2317 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
|
2318 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
|
2319 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
|
2320 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_POP, 0x0002, gaim_popup, 0); |
4759 | 2321 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_ALIAS, gaim_icqalias, 0); |
4624 | 2322 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_INFO, gaim_icqinfo, 0); |
4642 | 2323 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_ERROR, gaim_ssi_parseerr, 0); |
2991 | 2324 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RIGHTSINFO, gaim_ssi_parserights, 0); |
2325 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_LIST, gaim_ssi_parselist, 0); | |
2326 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_NOLIST, gaim_ssi_parselist, 0); | |
4230 | 2327 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_SRVACK, gaim_ssi_parseack, 0); |
8227 | 2328 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_ADD, gaim_ssi_parseadd, 0); |
4230 | 2329 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RECVAUTH, gaim_ssi_authgiven, 0); |
2330 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RECVAUTHREQ, gaim_ssi_authrequest, 0); | |
2331 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RECVAUTHREP, gaim_ssi_authreply, 0); | |
2332 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_ADDED, gaim_ssi_gotadded, 0); | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
2333 |
7283 | 2334 od->conn = bosconn; |
2704 | 2335 for (i = 0; i < (int)strlen(info->bosip); i++) { |
2336 if (info->bosip[i] == ':') { | |
2337 port = atoi(&(info->bosip[i+1])); | |
2086 | 2338 break; |
2339 } | |
2340 } | |
2704 | 2341 host = g_strndup(info->bosip, i); |
2086 | 2342 bosconn->status |= AIM_CONN_STATUS_INPROGRESS; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2343 rc = gaim_proxy_connect(gc->account, host, port, oscar_bos_connect, gc); |
2086 | 2344 g_free(host); |
4366 | 2345 if (rc < 0) { |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
2346 gaim_connection_error(gc, _("Could Not Connect")); |
2086 | 2347 od->killme = TRUE; |
2348 return 0; | |
2349 } | |
4293 | 2350 aim_sendcookie(sess, bosconn, info->cookielen, info->cookie); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
2351 gaim_input_remove(gc->inpa); |
2704 | 2352 |
7283 | 2353 gaim_connection_update_progress(gc, _("Received authorization"), 3, OSCAR_CONNECT_STEPS); |
8341 | 2354 ck[3] = 0x64; |
7282 | 2355 |
2086 | 2356 return 1; |
2357 } | |
2358 | |
10464 | 2359 static void |
2360 gaim_parse_auth_securid_request_yes_cb(gpointer user_data, const char *msg) | |
2361 { | |
2362 GaimConnection *gc = user_data; | |
2363 OscarData *od = gc->proto_data; | |
2364 aim_session_t *sess = od->sess; | |
2365 | |
2366 aim_auth_securid_send(sess, msg); | |
2367 } | |
2368 | |
2369 static void | |
2370 gaim_parse_auth_securid_request_no_cb(gpointer user_data, const char *value) | |
2371 { | |
2372 GaimConnection *gc = user_data; | |
2373 OscarData *od = gc->proto_data; | |
2374 | |
2375 /* Disconnect */ | |
2376 gc->wants_to_die = TRUE; | |
2377 gaim_connection_error(gc, _("The SecurID key entered is invalid.")); | |
2378 od->killme = TRUE; | |
2379 } | |
2380 | |
2381 static int | |
2382 gaim_parse_auth_securid_request(aim_session_t *sess, aim_frame_t *fr, ...) | |
2383 { | |
2384 GaimConnection *gc = sess->aux_data; | |
2385 GaimAccount *account = gaim_connection_get_account(gc); | |
2386 gchar *primary; | |
2387 | |
2388 gaim_debug_info("oscar", "Got SecurID request\n"); | |
2389 | |
2390 primary = g_strdup_printf("Enter the SecurID key for %s.", gaim_account_get_username(account)); | |
2391 gaim_request_input(gc, NULL, _("Enter SecurID"), primary, | |
2392 _("Enter the 6 digit number from the digital display."), | |
2393 FALSE, FALSE, NULL, | |
2394 _("OK"), G_CALLBACK(gaim_parse_auth_securid_request_yes_cb), | |
2395 _("Cancel"), G_CALLBACK(gaim_parse_auth_securid_request_no_cb), | |
2396 gc); | |
2397 g_free(primary); | |
2398 | |
2399 return 1; | |
2400 } | |
2401 | |
7285 | 2402 /* XXX - Should use gaim_url_fetch for the below stuff */ |
2086 | 2403 struct pieceofcrap { |
5575 | 2404 GaimConnection *gc; |
2086 | 2405 unsigned long offset; |
2406 unsigned long len; | |
2407 char *modname; | |
2408 int fd; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2409 aim_conn_t *conn; |
2086 | 2410 unsigned int inpa; |
2411 }; | |
2412 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
2413 static void damn_you(gpointer data, gint source, GaimInputCondition c) |
2086 | 2414 { |
2415 struct pieceofcrap *pos = data; | |
7283 | 2416 OscarData *od = pos->gc->proto_data; |
2086 | 2417 char in = '\0'; |
2418 int x = 0; | |
2419 unsigned char m[17]; | |
2420 | |
2421 while (read(pos->fd, &in, 1) == 1) { | |
2422 if (in == '\n') | |
2423 x++; | |
2424 else if (in != '\r') | |
2425 x = 0; | |
2426 if (x == 2) | |
2427 break; | |
2428 in = '\0'; | |
2429 } | |
2430 if (in != '\n') { | |
4056 | 2431 char buf[256]; |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
2432 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
|
2433 "this is fixed. Check %s for updates."), GAIM_WEBSITE); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2434 gaim_notify_warning(pos->gc, NULL, |
7422 | 2435 _("Gaim was unable to get a valid AIM login hash."), |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2436 buf); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
2437 gaim_input_remove(pos->inpa); |
2086 | 2438 close(pos->fd); |
2439 g_free(pos); | |
2440 return; | |
2441 } | |
2442 read(pos->fd, m, 16); | |
2443 m[16] = '\0'; | |
8660 | 2444 gaim_debug_misc("oscar", "Sending hash: "); |
2086 | 2445 for (x = 0; x < 16; x++) |
8660 | 2446 gaim_debug_misc(NULL, "%02hhx ", (unsigned char)m[x]); |
2447 | |
2448 gaim_debug_misc(NULL, "\n"); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
2449 gaim_input_remove(pos->inpa); |
2086 | 2450 close(pos->fd); |
2451 aim_sendmemblock(od->sess, pos->conn, 0, 16, m, AIM_SENDMEMBLOCK_FLAG_ISHASH); | |
2452 g_free(pos); | |
2453 } | |
2454 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
2455 static void straight_to_hell(gpointer data, gint source, GaimInputCondition cond) { |
2086 | 2456 struct pieceofcrap *pos = data; |
5420 | 2457 gchar *buf; |
2086 | 2458 |
4366 | 2459 pos->fd = source; |
2460 | |
2086 | 2461 if (source < 0) { |
5420 | 2462 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
|
2463 "this is fixed. Check %s for updates."), GAIM_WEBSITE); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2464 gaim_notify_warning(pos->gc, NULL, |
7422 | 2465 _("Gaim was unable to get a valid AIM login hash."), |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2466 buf); |
5420 | 2467 g_free(buf); |
2086 | 2468 if (pos->modname) |
2469 g_free(pos->modname); | |
2470 g_free(pos); | |
2471 return; | |
2472 } | |
2473 | |
5420 | 2474 buf = g_strdup_printf("GET " AIMHASHDATA "?offset=%ld&len=%ld&modname=%s HTTP/1.0\n\n", |
2086 | 2475 pos->offset, pos->len, pos->modname ? pos->modname : ""); |
2476 write(pos->fd, buf, strlen(buf)); | |
5420 | 2477 g_free(buf); |
2086 | 2478 if (pos->modname) |
2479 g_free(pos->modname); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
2480 pos->inpa = gaim_input_add(pos->fd, GAIM_INPUT_READ, damn_you, pos); |
2086 | 2481 return; |
2482 } | |
2483 | |
2484 /* size of icbmui.ocm, the largest module in AIM 3.5 */ | |
2485 #define AIM_MAX_FILE_SIZE 98304 | |
2486 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2487 int gaim_memrequest(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2488 va_list ap; |
2489 struct pieceofcrap *pos; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2490 fu32_t offset, len; |
2086 | 2491 char *modname; |
2492 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2493 va_start(ap, fr); |
4200 | 2494 offset = va_arg(ap, fu32_t); |
2495 len = va_arg(ap, fu32_t); | |
2086 | 2496 modname = va_arg(ap, char *); |
2497 va_end(ap); | |
2498 | |
8660 | 2499 gaim_debug_misc("oscar", |
5556 | 2500 "offset: %u, len: %u, file: %s\n", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2501 offset, len, (modname ? modname : "aim.exe")); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2502 |
2086 | 2503 if (len == 0) { |
8660 | 2504 gaim_debug_misc("oscar", "len is 0, hashing NULL\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2505 aim_sendmemblock(sess, fr->conn, offset, len, NULL, |
2086 | 2506 AIM_SENDMEMBLOCK_FLAG_ISREQUEST); |
2507 return 1; | |
2508 } | |
9625 | 2509 /* uncomment this when you're convinced it's right. remember, it's been wrong before. */ |
2510 #if 0 | |
2086 | 2511 if (offset > AIM_MAX_FILE_SIZE || len > AIM_MAX_FILE_SIZE) { |
2512 char *buf; | |
2513 int i = 8; | |
2514 if (modname) | |
2515 i += strlen(modname); | |
2516 buf = g_malloc(i); | |
2517 i = 0; | |
2518 if (modname) { | |
2519 memcpy(buf, modname, strlen(modname)); | |
2520 i += strlen(modname); | |
2521 } | |
2522 buf[i++] = offset & 0xff; | |
2523 buf[i++] = (offset >> 8) & 0xff; | |
2524 buf[i++] = (offset >> 16) & 0xff; | |
2525 buf[i++] = (offset >> 24) & 0xff; | |
2526 buf[i++] = len & 0xff; | |
2527 buf[i++] = (len >> 8) & 0xff; | |
2528 buf[i++] = (len >> 16) & 0xff; | |
2529 buf[i++] = (len >> 24) & 0xff; | |
8660 | 2530 gaim_debug_misc("oscar", "len + offset is invalid, " |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2531 "hashing request\n"); |
2086 | 2532 aim_sendmemblock(sess, command->conn, offset, i, buf, AIM_SENDMEMBLOCK_FLAG_ISREQUEST); |
2533 g_free(buf); | |
2534 return 1; | |
2535 } | |
9625 | 2536 #endif |
2086 | 2537 |
2538 pos = g_new0(struct pieceofcrap, 1); | |
2539 pos->gc = sess->aux_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2540 pos->conn = fr->conn; |
2086 | 2541 |
2542 pos->offset = offset; | |
2543 pos->len = len; | |
2544 pos->modname = modname ? g_strdup(modname) : NULL; | |
2545 | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2546 if (gaim_proxy_connect(pos->gc->account, "gaim.sourceforge.net", 80, straight_to_hell, pos) != 0) { |
4056 | 2547 char buf[256]; |
2086 | 2548 if (pos->modname) |
2549 g_free(pos->modname); | |
2550 g_free(pos); | |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
2551 g_snprintf(buf, sizeof(buf), _("You may be disconnected shortly. You may want to use TOC until " |
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
2552 "this is fixed. Check %s for updates."), GAIM_WEBSITE); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2553 gaim_notify_warning(pos->gc, NULL, |
7422 | 2554 _("Gaim was unable to get a valid login hash."), |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2555 buf); |
2086 | 2556 } |
2557 | |
2558 return 1; | |
2559 } | |
2560 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2561 static int gaim_parse_login(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 2562 GaimConnection *gc = sess->aux_data; |
7283 | 2563 OscarData *od = gc->proto_data; |
5591
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2564 GaimAccount *account = gaim_connection_get_account(gc); |
7282 | 2565 #if 0 |
2566 struct client_info_s info = {"gaim", 7, 3, 2003, "us", "en", 0x0004, 0x0000, 0x04b}; | |
2567 #endif | |
7011 | 2568 va_list ap; |
2569 char *key; | |
2086 | 2570 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2571 va_start(ap, fr); |
2086 | 2572 key = va_arg(ap, char *); |
2573 va_end(ap); | |
2574 | |
4617 | 2575 if (od->icq) { |
3458 | 2576 struct client_info_s info = CLIENTINFO_ICQ_KNOWNGOOD; |
10740 | 2577 aim_send_login(sess, fr->conn, gaim_account_get_username(account), |
2578 gaim_connection_get_password(gc), &info, key); | |
3458 | 2579 } else { |
2580 struct client_info_s info = CLIENTINFO_AIM_KNOWNGOOD; | |
10740 | 2581 aim_send_login(sess, fr->conn, gaim_account_get_username(account), |
2582 gaim_connection_get_password(gc), &info, key); | |
3458 | 2583 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2584 |
7283 | 2585 gaim_connection_update_progress(gc, _("Password sent"), 2, OSCAR_CONNECT_STEPS); |
8341 | 2586 ck[2] = 0x6c; |
7282 | 2587 |
2086 | 2588 return 1; |
2589 } | |
2590 | |
2675 | 2591 static int conninitdone_chat(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 2592 GaimConnection *gc = sess->aux_data; |
2647 | 2593 struct chat_connection *chatcon; |
2594 static int id = 1; | |
2595 | |
6905 | 2596 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
|
2597 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
|
2598 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
|
2599 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
|
2600 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_INCOMINGMSG, gaim_conv_chat_incoming_msg, 0); |
2675 | 2601 |
2672 | 2602 aim_clientready(sess, fr->conn); |
2675 | 2603 |
2647 | 2604 chatcon = find_oscar_chat_by_conn(gc, fr->conn); |
2605 chatcon->id = id; | |
8733 | 2606 chatcon->conv = serv_got_joined_chat(gc, id++, chatcon->show); |
2647 | 2607 |
2608 return 1; | |
2609 } | |
2610 | |
2675 | 2611 static int conninitdone_chatnav(aim_session_t *sess, aim_frame_t *fr, ...) { |
2612 | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2613 aim_conn_addhandler(sess, fr->conn, 0x000d, 0x0001, gaim_parse_genericerr, 0); |
2647 | 2614 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CTN, AIM_CB_CTN_INFO, gaim_chatnav_info, 0); |
2675 | 2615 |
2616 aim_clientready(sess, fr->conn); | |
2617 | |
2618 aim_chatnav_reqrights(sess, fr->conn); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2619 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2620 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2621 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2622 |
3694 | 2623 static int conninitdone_email(aim_session_t *sess, aim_frame_t *fr, ...) { |
2624 | |
2625 aim_conn_addhandler(sess, fr->conn, 0x0018, 0x0001, gaim_parse_genericerr, 0); | |
2626 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_EML, AIM_CB_EML_MAILSTATUS, gaim_email_parseupdate, 0); | |
2627 | |
7282 | 2628 aim_email_sendcookies(sess); |
2629 aim_email_activate(sess); | |
3694 | 2630 aim_clientready(sess, fr->conn); |
2631 | |
2632 return 1; | |
2633 } | |
2634 | |
4804 | 2635 static int conninitdone_icon(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 2636 GaimConnection *gc = sess->aux_data; |
7283 | 2637 OscarData *od = gc->proto_data; |
4804 | 2638 |
2639 aim_conn_addhandler(sess, fr->conn, 0x0018, 0x0001, gaim_parse_genericerr, 0); | |
2640 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ICO, AIM_CB_ICO_ERROR, gaim_icon_error, 0); | |
2641 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ICO, AIM_CB_ICO_RESPONSE, gaim_icon_parseicon, 0); | |
2642 | |
2643 aim_clientready(sess, fr->conn); | |
2644 | |
4823 | 2645 od->iconconnecting = FALSE; |
2646 | |
4804 | 2647 if (od->icontimer) |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
2648 gaim_timeout_remove(od->icontimer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
2649 od->icontimer = gaim_timeout_add(100, gaim_icon_timerfunc, gc); |
4804 | 2650 |
2651 return 1; | |
2652 } | |
2653 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2654 static void oscar_chatnav_connect(gpointer data, gint source, GaimInputCondition cond) { |
5575 | 2655 GaimConnection *gc = data; |
7283 | 2656 OscarData *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2657 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2658 aim_conn_t *tstconn; |
2086 | 2659 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2660 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 2661 close(source); |
2662 return; | |
2663 } | |
2664 | |
4617 | 2665 od = gc->proto_data; |
2666 sess = od->sess; | |
2086 | 2667 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_CHATNAV); |
4366 | 2668 tstconn->fd = source; |
2086 | 2669 |
2670 if (source < 0) { | |
2671 aim_conn_kill(sess, &tstconn); | |
8660 | 2672 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2673 "unable to connect to chatnav server\n"); |
2086 | 2674 return; |
2675 } | |
2676 | |
2677 aim_conn_completeconnect(sess, tstconn); | |
4617 | 2678 od->cnpa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); |
8660 | 2679 gaim_debug_info("oscar", "chatnav: connected\n"); |
2086 | 2680 } |
2681 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
2682 static void oscar_auth_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 2683 { |
5575 | 2684 GaimConnection *gc = data; |
7283 | 2685 OscarData *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2686 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2687 aim_conn_t *tstconn; |
2086 | 2688 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2689 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 2690 close(source); |
2691 return; | |
2692 } | |
2693 | |
4617 | 2694 od = gc->proto_data; |
2695 sess = od->sess; | |
2086 | 2696 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_AUTH); |
4366 | 2697 tstconn->fd = source; |
2086 | 2698 |
2699 if (source < 0) { | |
2700 aim_conn_kill(sess, &tstconn); | |
8660 | 2701 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2702 "unable to connect to authorizer\n"); |
2086 | 2703 return; |
2704 } | |
2705 | |
2706 aim_conn_completeconnect(sess, tstconn); | |
4617 | 2707 od->paspa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); |
8660 | 2708 gaim_debug_info("oscar", "admin: connected\n"); |
2086 | 2709 } |
2710 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
2711 static void oscar_chat_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 2712 { |
2713 struct chat_connection *ccon = data; | |
5575 | 2714 GaimConnection *gc = ccon->gc; |
7283 | 2715 OscarData *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2716 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2717 aim_conn_t *tstconn; |
2086 | 2718 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2719 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 2720 close(source); |
2721 g_free(ccon->show); | |
2722 g_free(ccon->name); | |
2723 g_free(ccon); | |
2724 return; | |
2725 } | |
2726 | |
4617 | 2727 od = gc->proto_data; |
2728 sess = od->sess; | |
2086 | 2729 tstconn = ccon->conn; |
4366 | 2730 tstconn->fd = source; |
2086 | 2731 |
2732 if (source < 0) { | |
2733 aim_conn_kill(sess, &tstconn); | |
2734 g_free(ccon->show); | |
2735 g_free(ccon->name); | |
2736 g_free(ccon); | |
2737 return; | |
2738 } | |
2739 | |
2740 aim_conn_completeconnect(sess, ccon->conn); | |
4617 | 2741 ccon->inpa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); |
2742 od->oscar_chats = g_slist_append(od->oscar_chats, ccon); | |
2086 | 2743 } |
2744 | |
3694 | 2745 static void oscar_email_connect(gpointer data, gint source, GaimInputCondition cond) { |
5575 | 2746 GaimConnection *gc = data; |
7283 | 2747 OscarData *od; |
3694 | 2748 aim_session_t *sess; |
2749 aim_conn_t *tstconn; | |
2750 | |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2751 if (!g_list_find(gaim_connections_get_all(), gc)) { |
3694 | 2752 close(source); |
2753 return; | |
2754 } | |
2755 | |
4617 | 2756 od = gc->proto_data; |
2757 sess = od->sess; | |
3694 | 2758 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_EMAIL); |
4366 | 2759 tstconn->fd = source; |
3694 | 2760 |
2761 if (source < 0) { | |
2762 aim_conn_kill(sess, &tstconn); | |
8660 | 2763 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2764 "unable to connect to email server\n"); |
3694 | 2765 return; |
2766 } | |
2767 | |
2768 aim_conn_completeconnect(sess, tstconn); | |
4617 | 2769 od->emlpa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); |
8660 | 2770 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2771 "email: connected\n"); |
3694 | 2772 } |
2773 | |
4804 | 2774 static void oscar_icon_connect(gpointer data, gint source, GaimInputCondition cond) { |
5575 | 2775 GaimConnection *gc = data; |
7283 | 2776 OscarData *od; |
4804 | 2777 aim_session_t *sess; |
2778 aim_conn_t *tstconn; | |
2779 | |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2780 if (!g_list_find(gaim_connections_get_all(), gc)) { |
4804 | 2781 close(source); |
2782 return; | |
2783 } | |
2784 | |
2785 od = gc->proto_data; | |
2786 sess = od->sess; | |
2787 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_ICON); | |
2788 tstconn->fd = source; | |
2789 | |
2790 if (source < 0) { | |
2791 aim_conn_kill(sess, &tstconn); | |
8660 | 2792 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2793 "unable to connect to icon server\n"); |
4804 | 2794 return; |
2795 } | |
2796 | |
2797 aim_conn_completeconnect(sess, tstconn); | |
2798 od->icopa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); | |
8660 | 2799 gaim_debug_info("oscar", "icon: connected\n"); |
4804 | 2800 } |
2801 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2802 /* 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
|
2803 static int gaim_handle_redirect(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 2804 GaimConnection *gc = sess->aux_data; |
2805 GaimAccount *account = gaim_connection_get_account(gc); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2806 aim_conn_t *tstconn; |
4452 | 2807 int i; |
2086 | 2808 char *host; |
2809 int port; | |
4821 | 2810 va_list ap; |
2811 struct aim_redirect_data *redir; | |
2086 | 2812 |
5575 | 2813 port = gaim_account_get_int(account, "port", FAIM_LOGIN_PORT); |
2086 | 2814 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2815 va_start(ap, fr); |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2816 redir = va_arg(ap, struct aim_redirect_data *); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2817 va_end(ap); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2818 |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2819 for (i = 0; i < (int)strlen(redir->ip); i++) { |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2820 if (redir->ip[i] == ':') { |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2821 port = atoi(&(redir->ip[i+1])); |
2086 | 2822 break; |
2823 } | |
2824 } | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2825 host = g_strndup(redir->ip, i); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2826 |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2827 switch(redir->group) { |
2086 | 2828 case 0x7: /* Authorizer */ |
8660 | 2829 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2830 "Reconnecting with authorizor...\n"); |
2086 | 2831 tstconn = aim_newconn(sess, AIM_CONN_TYPE_AUTH, NULL); |
2832 if (tstconn == NULL) { | |
8660 | 2833 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2834 "unable to reconnect with authorizer\n"); |
2086 | 2835 g_free(host); |
2836 return 1; | |
2837 } | |
4649 | 2838 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 2839 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_admin, 0); |
2086 | 2840 |
2841 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2842 if (gaim_proxy_connect(account, host, port, oscar_auth_connect, gc) != 0) { |
2086 | 2843 aim_conn_kill(sess, &tstconn); |
8660 | 2844 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2845 "unable to reconnect with authorizer\n"); |
2086 | 2846 g_free(host); |
2847 return 1; | |
2848 } | |
4293 | 2849 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
4194 | 2850 break; |
2851 | |
2086 | 2852 case 0xd: /* ChatNav */ |
2853 tstconn = aim_newconn(sess, AIM_CONN_TYPE_CHATNAV, NULL); | |
2854 if (tstconn == NULL) { | |
8660 | 2855 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2856 "unable to connect to chatnav server\n"); |
2086 | 2857 g_free(host); |
2858 return 1; | |
2859 } | |
4649 | 2860 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 2861 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_chatnav, 0); |
2086 | 2862 |
2863 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2864 if (gaim_proxy_connect(account, host, port, oscar_chatnav_connect, gc) != 0) { |
2086 | 2865 aim_conn_kill(sess, &tstconn); |
8660 | 2866 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2867 "unable to connect to chatnav server\n"); |
2086 | 2868 g_free(host); |
2869 return 1; | |
2870 } | |
4293 | 2871 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
4194 | 2872 break; |
2873 | |
2874 case 0xe: { /* Chat */ | |
2086 | 2875 struct chat_connection *ccon; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2876 |
2086 | 2877 tstconn = aim_newconn(sess, AIM_CONN_TYPE_CHAT, NULL); |
2878 if (tstconn == NULL) { | |
8660 | 2879 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2880 "unable to connect to chat server\n"); |
2086 | 2881 g_free(host); |
2882 return 1; | |
2883 } | |
2884 | |
4649 | 2885 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 2886 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_chat, 0); |
2887 | |
2086 | 2888 ccon = g_new0(struct chat_connection, 1); |
2889 ccon->conn = tstconn; | |
2890 ccon->gc = gc; | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2891 ccon->name = g_strdup(redir->chat.room); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2892 ccon->exchange = redir->chat.exchange; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2893 ccon->instance = redir->chat.instance; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2894 ccon->show = extract_name(redir->chat.room); |
4634 | 2895 |
2086 | 2896 ccon->conn->status |= AIM_CONN_STATUS_INPROGRESS; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2897 if (gaim_proxy_connect(account, host, port, oscar_chat_connect, ccon) != 0) { |
2086 | 2898 aim_conn_kill(sess, &tstconn); |
8660 | 2899 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2900 "unable to connect to chat server\n"); |
2086 | 2901 g_free(host); |
2902 g_free(ccon->show); | |
2903 g_free(ccon->name); | |
2904 g_free(ccon); | |
2905 return 1; | |
2906 } | |
4293 | 2907 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
8660 | 2908 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2909 "Connected to chat room %s exchange %hu\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2910 ccon->name, ccon->exchange); |
4194 | 2911 } break; |
3694 | 2912 |
4804 | 2913 case 0x0010: { /* icon */ |
2914 if (!(tstconn = aim_newconn(sess, AIM_CONN_TYPE_ICON, NULL))) { | |
8660 | 2915 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2916 "unable to connect to icon server\n"); |
4804 | 2917 g_free(host); |
2918 return 1; | |
2919 } | |
2920 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); | |
2921 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_icon, 0); | |
2922 | |
2923 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2924 if (gaim_proxy_connect(account, host, port, oscar_icon_connect, gc) != 0) { |
4804 | 2925 aim_conn_kill(sess, &tstconn); |
8660 | 2926 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2927 "unable to connect to icon server\n"); |
4804 | 2928 g_free(host); |
2929 return 1; | |
2930 } | |
2931 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); | |
2932 } break; | |
2933 | |
3694 | 2934 case 0x0018: { /* email */ |
2935 if (!(tstconn = aim_newconn(sess, AIM_CONN_TYPE_EMAIL, NULL))) { | |
8660 | 2936 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2937 "unable to connect to email server\n"); |
3694 | 2938 g_free(host); |
2939 return 1; | |
2940 } | |
4649 | 2941 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
3694 | 2942 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_email, 0); |
2943 | |
2944 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2945 if (gaim_proxy_connect(account, host, port, oscar_email_connect, gc) != 0) { |
3694 | 2946 aim_conn_kill(sess, &tstconn); |
8660 | 2947 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2948 "unable to connect to email server\n"); |
3694 | 2949 g_free(host); |
2950 return 1; | |
2951 } | |
4293 | 2952 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
3694 | 2953 } break; |
2954 | |
2086 | 2955 default: /* huh? */ |
8660 | 2956 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2957 "got redirect for unknown service 0x%04hx\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2958 redir->group); |
2086 | 2959 break; |
2960 } | |
2961 | |
2962 g_free(host); | |
2963 return 1; | |
2964 } | |
2965 | |
10042 | 2966 static int gaim_parse_oncoming(aim_session_t *sess, aim_frame_t *fr, ...) |
2967 { | |
2968 GaimConnection *gc; | |
2969 GaimAccount *account; | |
2970 OscarData *od; | |
4738 | 2971 struct buddyinfo *bi; |
2993 | 2972 time_t time_idle = 0, signon = 0; |
2973 int type = 0; | |
2974 int caps = 0; | |
2086 | 2975 va_list ap; |
4738 | 2976 aim_userinfo_t *info; |
10042 | 2977 gboolean buddy_is_away = FALSE; |
2978 | |
2979 gc = sess->aux_data; | |
2980 account = gaim_connection_get_account(gc); | |
2981 od = gc->proto_data; | |
4194 | 2982 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2983 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2984 info = va_arg(ap, aim_userinfo_t *); |
2086 | 2985 va_end(ap); |
2986 | |
10130 | 2987 g_return_val_if_fail(info != NULL, 1); |
2988 g_return_val_if_fail(info->sn != NULL, 1); | |
2989 | |
2993 | 2990 if (info->present & AIM_USERINFO_PRESENT_CAPABILITIES) |
2991 caps = info->capabilities; | |
3267 | 2992 |
4766 | 2993 if (info->present & AIM_USERINFO_PRESENT_FLAGS) { |
2994 if (info->flags & AIM_FLAG_AWAY) | |
10042 | 2995 buddy_is_away = TRUE; |
2996 } | |
2997 | |
2993 | 2998 if (info->present & AIM_USERINFO_PRESENT_ICQEXTSTATUS) { |
3595 | 2999 type = (info->icqinfo.status << 16); |
3013 | 3000 if (!(info->icqinfo.status & AIM_ICQ_STATE_CHAT) && |
3001 (info->icqinfo.status != AIM_ICQ_STATE_NORMAL)) { | |
10042 | 3002 buddy_is_away = TRUE; |
3013 | 3003 } |
2993 | 3004 } |
3005 | |
7141 | 3006 if (caps & AIM_CAPS_ICQ_DIRECT) |
3007 caps ^= AIM_CAPS_ICQ_DIRECT; | |
2993 | 3008 |
10860 | 3009 /* info->idletime is the number of minutes that this user has been idle */ |
3010 if (info->present & AIM_USERINFO_PRESENT_IDLE) | |
3011 time_idle = time(NULL) - info->idletime * 60; | |
2993 | 3012 |
5836 | 3013 if (info->present & AIM_USERINFO_PRESENT_ONLINESINCE) |
3014 signon = info->onlinesince; | |
3015 else if (info->present & AIM_USERINFO_PRESENT_SESSIONLEN) | |
2993 | 3016 signon = time(NULL) - info->sessionlen; |
2086 | 3017 |
10567 | 3018 if (!aim_sncmp(gaim_account_get_username(account), info->sn)) { |
5575 | 3019 gaim_connection_set_display_name(gc, info->sn); |
10567 | 3020 od->timeoffset = signon - gc->login_time; |
3021 } | |
2305
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
3022 |
9982 | 3023 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(account, info->sn)); |
4738 | 3024 if (!bi) { |
3025 bi = g_new0(struct buddyinfo, 1); | |
9982 | 3026 g_hash_table_insert(od->buddyinfo, g_strdup(gaim_normalize(account, info->sn)), bi); |
4738 | 3027 } |
4739 | 3028 bi->typingnot = FALSE; |
3029 bi->ico_informed = FALSE; | |
6857 | 3030 bi->ipaddr = info->icqinfo.ipaddr; |
3031 | |
10563 | 3032 /* |
3033 * Handle the available message. If info->avail is NULL then the user | |
3034 * may or may not have an available message, so don't do anything. If | |
3035 * info->avail is set to the empty string, then the user's client DOES | |
3036 * support available messages and the user DOES NOT have one set. | |
3037 * Otherwise info->avail contains the available message. | |
3038 */ | |
7011 | 3039 if (info->avail != NULL) |
10563 | 3040 { |
3041 free(bi->availmsg); | |
3042 if (info->avail[0] != '\0') | |
3043 bi->availmsg = oscar_encoding_to_utf8(info->avail_encoding, info->avail, info->avail_len); | |
3044 else | |
3045 bi->availmsg = NULL; | |
3046 } | |
4732 | 3047 |
4804 | 3048 /* Server stored icon stuff */ |
4853 | 3049 if (info->iconcsumlen) { |
7125 | 3050 const char *filename = NULL, *saved_b16 = NULL; |
9801 | 3051 char *b16 = NULL, *filepath = NULL; |
7093 | 3052 GaimBuddy *b = NULL; |
4853 | 3053 |
7106
db6bd3e794d8
[gaim-migrate @ 7671]
Christian Hammond <chipx86@chipx86.com>
parents:
7098
diff
changeset
|
3054 b16 = gaim_base16_encode(info->iconcsum, info->iconcsumlen); |
9982 | 3055 b = gaim_find_buddy(account, info->sn); |
7093 | 3056 /* |
3057 * If for some reason the checksum is valid, but cached file is not.. | |
3058 * we want to know. | |
3059 */ | |
7693 | 3060 filename = gaim_blist_node_get_string((GaimBlistNode*)b, "buddy_icon"); |
7093 | 3061 if (filename != NULL) { |
3062 if (g_file_test(filename, G_FILE_TEST_EXISTS)) | |
7693 | 3063 saved_b16 = gaim_blist_node_get_string((GaimBlistNode*)b, |
3064 "icon_checksum"); | |
9801 | 3065 else { |
3066 filepath = g_build_filename(gaim_buddy_icons_get_cache_dir(), | |
3067 filename, NULL); | |
3068 if (g_file_test(filepath, G_FILE_TEST_EXISTS)) | |
3069 saved_b16 = gaim_blist_node_get_string((GaimBlistNode*)b, | |
3070 "icon_checksum"); | |
3071 g_free(filepath); | |
3072 } | |
7093 | 3073 } else |
3074 saved_b16 = NULL; | |
7054
7c04a0775918
[gaim-migrate @ 7617]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
7045
diff
changeset
|
3075 |
4853 | 3076 if (!b16 || !saved_b16 || strcmp(b16, saved_b16)) { |
3077 GSList *cur = od->requesticon; | |
3078 while (cur && aim_sncmp((char *)cur->data, info->sn)) | |
3079 cur = cur->next; | |
3080 if (!cur) { | |
9982 | 3081 od->requesticon = g_slist_append(od->requesticon, g_strdup(gaim_normalize(account, info->sn))); |
4853 | 3082 if (od->icontimer) |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
3083 gaim_timeout_remove(od->icontimer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
3084 od->icontimer = gaim_timeout_add(500, gaim_icon_timerfunc, gc); |
4853 | 3085 } |
3086 } | |
6053 | 3087 g_free(b16); |
4853 | 3088 } |
3089 | |
10042 | 3090 /* XXX - Represent other ICQ statuses */ |
3091 if (buddy_is_away == TRUE) | |
3092 gaim_prpl_got_user_status(account, info->sn, OSCAR_STATUS_ID_AWAY, NULL); | |
3093 else | |
3094 gaim_prpl_got_user_status(account, info->sn, OSCAR_STATUS_ID_AVAILABLE, NULL); | |
10567 | 3095 gaim_prpl_got_user_login_time(account, info->sn, signon - od->timeoffset); |
9982 | 3096 gaim_prpl_got_user_warning_level(account, info->sn, info->warnlevel/10.0 + 0.5); |
3097 | |
3098 if (time_idle > 0) | |
3099 gaim_prpl_got_user_idle(account, info->sn, TRUE, time_idle); | |
10009 | 3100 else |
3101 gaim_prpl_got_user_idle(account, info->sn, FALSE, 0); | |
2086 | 3102 |
3103 return 1; | |
3104 } | |
3105 | |
8341 | 3106 static void gaim_check_comment(OscarData *od, const char *str) { |
3107 if ((str == NULL) || strcmp(str, ck)) | |
3108 aim_locate_setcaps(od->sess, caps_aim); | |
3109 else | |
3110 aim_locate_setcaps(od->sess, caps_aim | AIM_CAPS_SECUREIM); | |
3111 } | |
3112 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3113 static int gaim_parse_offgoing(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3114 GaimConnection *gc = sess->aux_data; |
7283 | 3115 OscarData *od = gc->proto_data; |
9982 | 3116 GaimAccount *account = gaim_connection_get_account(gc); |
2086 | 3117 va_list ap; |
4739 | 3118 aim_userinfo_t *info; |
2086 | 3119 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3120 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3121 info = va_arg(ap, aim_userinfo_t *); |
2086 | 3122 va_end(ap); |
3123 | |
9982 | 3124 gaim_prpl_got_user_status(account, info->sn, OSCAR_STATUS_ID_OFFLINE, NULL); |
2086 | 3125 |
7261 | 3126 g_hash_table_remove(od->buddyinfo, gaim_normalize(gc->account, info->sn)); |
5837 | 3127 |
2086 | 3128 return 1; |
3129 } | |
3130 | |
4617 | 3131 /* BBB */ |
3952 | 3132 /* |
4617 | 3133 * This is called after a remote AIM user has connected to us. We |
3134 * want to do some voodoo with the socket file descriptors, add a | |
3135 * callback or two, and then send the AIM_CB_OFT_PROMPT. | |
3952 | 3136 */ |
4656 | 3137 static int oscar_sendfile_estblsh(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3138 GaimConnection *gc = sess->aux_data; |
7283 | 3139 OscarData *od = (OscarData *)gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
3140 GaimXfer *xfer; |
5146 | 3141 struct aim_oft_info *oft_info; |
3630 | 3142 va_list ap; |
3143 aim_conn_t *conn, *listenerconn; | |
4656 | 3144 |
8660 | 3145 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3146 "AAA - in oscar_sendfile_estblsh\n"); |
3630 | 3147 va_start(ap, fr); |
3148 conn = va_arg(ap, aim_conn_t *); | |
3149 listenerconn = va_arg(ap, aim_conn_t *); | |
3150 va_end(ap); | |
3151 | |
4617 | 3152 if (!(xfer = oscar_find_xfer_by_conn(od->file_transfers, listenerconn))) |
3153 return 1; | |
3154 | |
5146 | 3155 if (!(oft_info = xfer->data)) |
4617 | 3156 return 1; |
3157 | |
3630 | 3158 /* Stop watching listener conn; watch transfer conn instead */ |
4617 | 3159 gaim_input_remove(xfer->watcher); |
3630 | 3160 aim_conn_kill(sess, &listenerconn); |
3161 | |
5146 | 3162 oft_info->conn = conn; |
3163 xfer->fd = oft_info->conn->fd; | |
3164 | |
3165 aim_conn_addhandler(sess, oft_info->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_ACK, oscar_sendfile_ack, 0); | |
3166 aim_conn_addhandler(sess, oft_info->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DONE, oscar_sendfile_done, 0); | |
3167 xfer->watcher = gaim_input_add(oft_info->conn->fd, GAIM_INPUT_READ, oscar_callback, oft_info->conn); | |
4617 | 3168 |
3169 /* Inform the other user that we are connected and ready to transfer */ | |
5146 | 3170 aim_oft_sendheader(sess, AIM_CB_OFT_PROMPT, oft_info); |
3630 | 3171 |
3172 return 0; | |
3173 } | |
3174 | |
3952 | 3175 /* |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
3176 * This is the gaim callback passed to gaim_proxy_connect when connecting to another AIM |
4617 | 3177 * user in order to transfer a file. |
3952 | 3178 */ |
4617 | 3179 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
|
3180 GaimXfer *xfer; |
5146 | 3181 struct aim_oft_info *oft_info; |
4656 | 3182 |
8660 | 3183 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3184 "AAA - in oscar_sendfile_connected\n"); |
4617 | 3185 if (!(xfer = data)) |
3186 return; | |
5146 | 3187 if (!(oft_info = xfer->data)) |
3630 | 3188 return; |
8446 | 3189 if (source < 0) { |
3190 gaim_xfer_cancel_remote(xfer); | |
4617 | 3191 return; |
8446 | 3192 } |
4617 | 3193 |
3194 xfer->fd = source; | |
5146 | 3195 oft_info->conn->fd = source; |
3196 | |
3197 aim_conn_completeconnect(oft_info->sess, oft_info->conn); | |
3198 xfer->watcher = gaim_input_add(xfer->fd, GAIM_INPUT_READ, oscar_callback, oft_info->conn); | |
4617 | 3199 |
3200 /* Inform the other user that we are connected and ready to transfer */ | |
5146 | 3201 aim_im_sendch2_sendfile_accept(oft_info->sess, oft_info); |
4617 | 3202 |
3203 return; | |
3630 | 3204 } |
3205 | |
3952 | 3206 /* |
4617 | 3207 * This is called when a buddy sends us some file info. This happens when they |
3208 * are sending a file to you, and you have just established a connection to them. | |
4650 | 3209 * You should send them the exact same info except use the real cookie. We also |
4617 | 3210 * get like totally ready to like, receive the file, kay? |
3952 | 3211 */ |
4617 | 3212 static int oscar_sendfile_prompt(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3213 GaimConnection *gc = sess->aux_data; |
7283 | 3214 OscarData *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
3215 GaimXfer *xfer; |
5146 | 3216 struct aim_oft_info *oft_info; |
4617 | 3217 va_list ap; |
3218 aim_conn_t *conn; | |
3219 fu8_t *cookie; | |
3220 struct aim_fileheader_t *fh; | |
4656 | 3221 |
8660 | 3222 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3223 "AAA - in oscar_sendfile_prompt\n"); |
4617 | 3224 va_start(ap, fr); |
3225 conn = va_arg(ap, aim_conn_t *); | |
3226 cookie = va_arg(ap, fu8_t *); | |
3227 fh = va_arg(ap, struct aim_fileheader_t *); | |
3228 va_end(ap); | |
3229 | |
3230 if (!(xfer = oscar_find_xfer_by_conn(od->file_transfers, conn))) | |
3231 return 1; | |
3232 | |
5146 | 3233 if (!(oft_info = xfer->data)) |
4617 | 3234 return 1; |
3235 | |
3236 /* We want to stop listening with a normal thingy */ | |
3237 gaim_input_remove(xfer->watcher); | |
3238 xfer->watcher = 0; | |
3239 | |
5146 | 3240 /* They sent us some information about the file they're sending */ |
3241 memcpy(&oft_info->fh, fh, sizeof(*fh)); | |
3242 | |
3243 /* Fill in the cookie */ | |
3244 memcpy(&oft_info->fh.bcookie, oft_info->cookie, 8); | |
3245 | |
4617 | 3246 /* XXX - convert the name from UTF-8 to UCS-2 if necessary, and pass the encoding to the call below */ |
5146 | 3247 aim_oft_sendheader(oft_info->sess, AIM_CB_OFT_ACK, oft_info); |
4617 | 3248 gaim_xfer_start(xfer, xfer->fd, NULL, 0); |
3249 | |
3250 return 0; | |
3630 | 3251 } |
3252 | |
3952 | 3253 /* |
4657 | 3254 * We are sending a file to someone else. They have just acknowledged our |
4617 | 3255 * prompt, so we want to start sending data like there's no tomorrow. |
3952 | 3256 */ |
4617 | 3257 static int oscar_sendfile_ack(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3258 GaimConnection *gc = sess->aux_data; |
7283 | 3259 OscarData *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
3260 GaimXfer *xfer; |
4617 | 3261 va_list ap; |
3262 aim_conn_t *conn; | |
3263 fu8_t *cookie; | |
3264 struct aim_fileheader_t *fh; | |
4656 | 3265 |
8660 | 3266 gaim_debug_info("oscar", "AAA - in oscar_sendfile_ack\n"); |
4617 | 3267 va_start(ap, fr); |
3268 conn = va_arg(ap, aim_conn_t *); | |
3269 cookie = va_arg(ap, fu8_t *); | |
3270 fh = va_arg(ap, struct aim_fileheader_t *); | |
3271 va_end(ap); | |
3272 | |
3273 if (!(xfer = oscar_find_xfer_by_cookie(od->file_transfers, cookie))) | |
3274 return 1; | |
3275 | |
4656 | 3276 /* We want to stop listening with a normal thingy */ |
3277 gaim_input_remove(xfer->watcher); | |
3278 xfer->watcher = 0; | |
3279 | |
4617 | 3280 gaim_xfer_start(xfer, xfer->fd, NULL, 0); |
3281 | |
3282 return 0; | |
3630 | 3283 } |
4617 | 3284 |
3285 /* | |
3286 * We just sent a file to someone. They said they got it and everything, | |
3287 * so we can close our direct connection and what not. | |
3288 */ | |
3289 static int oscar_sendfile_done(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 3290 GaimConnection *gc = sess->aux_data; |
7283 | 3291 OscarData *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
3292 GaimXfer *xfer; |
4617 | 3293 va_list ap; |
3294 aim_conn_t *conn; | |
3295 fu8_t *cookie; | |
3296 struct aim_fileheader_t *fh; | |
4656 | 3297 |
8660 | 3298 gaim_debug_info("oscar", "AAA - in oscar_sendfile_done\n"); |
4617 | 3299 va_start(ap, fr); |
3300 conn = va_arg(ap, aim_conn_t *); | |
3301 cookie = va_arg(ap, fu8_t *); | |
3302 fh = va_arg(ap, struct aim_fileheader_t *); | |
3303 va_end(ap); | |
3304 | |
3305 if (!(xfer = oscar_find_xfer_by_conn(od->file_transfers, conn))) | |
3306 return 1; | |
3307 | |
4656 | 3308 xfer->fd = conn->fd; |
4617 | 3309 gaim_xfer_end(xfer); |
3310 | |
3311 return 0; | |
3312 } | |
3630 | 3313 |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3314 static int incomingim_chan1(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch1_args *args) { |
5575 | 3315 GaimConnection *gc = sess->aux_data; |
7283 | 3316 OscarData *od = gc->proto_data; |
8708 | 3317 GaimAccount *account = gaim_connection_get_account(gc); |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
3318 GaimConvImFlags flags = 0; |
4738 | 3319 struct buddyinfo *bi; |
5575 | 3320 const char *iconfile; |
9806 | 3321 GString *message; |
3322 gchar *tmp; | |
3323 aim_mpmsg_section_t *curpart; | |
3324 | |
10472 | 3325 gaim_debug_misc("oscar", "Received IM from %s with %d parts\n", |
9806 | 3326 userinfo->sn, args->mpmsg.numparts); |
4738 | 3327 |
10595 | 3328 if (args->mpmsg.numparts == 0) |
3329 return 1; | |
3330 | |
8708 | 3331 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(account, userinfo->sn)); |
4738 | 3332 if (!bi) { |
3333 bi = g_new0(struct buddyinfo, 1); | |
8708 | 3334 g_hash_table_insert(od->buddyinfo, g_strdup(gaim_normalize(account, userinfo->sn)), bi); |
4738 | 3335 } |
2273
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
3336 |
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
3337 if (args->icbmflags & AIM_IMFLAGS_AWAY) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
3338 flags |= GAIM_CONV_IM_AUTO_RESP; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3339 |
4738 | 3340 if (args->icbmflags & AIM_IMFLAGS_TYPINGNOT) |
3341 bi->typingnot = TRUE; | |
3342 else | |
3343 bi->typingnot = FALSE; | |
3344 | |
4380 | 3345 if ((args->icbmflags & AIM_IMFLAGS_HASICON) && (args->iconlen) && (args->iconsum) && (args->iconstamp)) { |
8660 | 3346 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3347 "%s has an icon\n", userinfo->sn); |
4738 | 3348 if ((args->iconlen != bi->ico_len) || (args->iconsum != bi->ico_csum) || (args->iconstamp != bi->ico_time)) { |
3349 bi->ico_need = TRUE; | |
3350 bi->ico_len = args->iconlen; | |
3351 bi->ico_csum = args->iconsum; | |
3352 bi->ico_time = args->iconstamp; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3353 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3354 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3355 |
10458 | 3356 if ((iconfile = gaim_account_get_buddy_icon(account)) && |
7406 | 3357 (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
|
3358 FILE *file; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3359 struct stat st; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3360 |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
3361 if (!g_stat(iconfile, &st)) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3362 char *buf = g_malloc(st.st_size); |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
3363 file = g_fopen(iconfile, "rb"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3364 if (file) { |
9532 | 3365 /* XXX - Use g_file_get_contents() */ |
2603
24664768a739
[gaim-migrate @ 2616]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2597
diff
changeset
|
3366 int len = fread(buf, 1, st.st_size, file); |
8660 | 3367 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3368 "Sending buddy icon to %s (%d bytes, " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3369 "%lu reported)\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3370 userinfo->sn, len, st.st_size); |
4617 | 3371 aim_im_sendch2_icon(sess, userinfo->sn, buf, st.st_size, |
3372 st.st_mtime, aimutil_iconsum(buf, st.st_size)); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3373 fclose(file); |
2336
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
3374 } else |
8660 | 3375 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3376 "Can't open buddy icon file!\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3377 g_free(buf); |
2336
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
3378 } else |
8660 | 3379 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3380 "Can't stat buddy icon file!\n"); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3381 } |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3382 |
9806 | 3383 message = g_string_new(""); |
3384 curpart = args->mpmsg.parts; | |
3385 while (curpart != NULL) { | |
9908 | 3386 tmp = gaim_plugin_oscar_decode_im_part(account, userinfo->sn, curpart->charset, curpart->charsubset, |
9806 | 3387 curpart->data, curpart->datalen); |
3388 if (tmp != NULL) { | |
3389 g_string_append(message, tmp); | |
3390 g_free(tmp); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3391 } |
9806 | 3392 |
3393 curpart = curpart->next; | |
3394 } | |
3395 tmp = g_string_free(message, FALSE); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3396 |
8666 | 3397 /* |
10781 | 3398 * If the message is from an ICQ user and to an ICQ user then escape any HTML, |
9016 | 3399 * because HTML is not sent over ICQ as a means to format a message. |
10781 | 3400 * So any HTML we receive is intended to be displayed. Also, \r\n must be |
3401 * replaced with <br> | |
8995 | 3402 * |
3403 * Note: There *may* be some clients which send messages as HTML formatted - | |
3404 * they need to be special-cased somehow. | |
8666 | 3405 */ |
9982 | 3406 if (aim_sn_is_icq(gaim_account_get_username(account)) && aim_sn_is_icq(userinfo->sn)) { |
8995 | 3407 /* 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
|
3408 gchar *tmp2 = g_markup_escape_text(tmp, -1); |
8493 | 3409 g_free(tmp); |
3410 tmp = tmp2; | |
10783 | 3411 tmp2 = gaim_strreplace(tmp, "\r\n", "<br>"); |
10781 | 3412 g_free(tmp); |
3413 tmp = tmp2; | |
8493 | 3414 } |
3415 | |
6982 | 3416 serv_got_im(gc, userinfo->sn, tmp, flags, time(NULL)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3417 g_free(tmp); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3418 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3419 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3420 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3421 |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3422 static int incomingim_chan2(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args) { |
9070 | 3423 GaimConnection *gc; |
9933 | 3424 GaimAccount *account; |
9070 | 3425 OscarData *od; |
9933 | 3426 const char *username = NULL; |
3427 char *message = NULL; | |
9070 | 3428 |
3429 g_return_val_if_fail(sess != NULL, 0); | |
3430 g_return_val_if_fail(sess->aux_data != NULL, 0); | |
3431 | |
3432 gc = sess->aux_data; | |
9933 | 3433 account = gaim_connection_get_account(gc); |
9070 | 3434 od = gc->proto_data; |
9933 | 3435 username = gaim_account_get_username(account); |
3436 | |
3437 if (args == NULL) | |
4121 | 3438 return 0; |
4194 | 3439 |
9933 | 3440 gaim_debug_misc("oscar", "rendezvous with %s, status is %hu\n", |
3441 userinfo->sn, args->status); | |
3442 | |
3443 if (args->msg != NULL) | |
3444 { | |
3445 if (args->encoding != NULL) | |
3446 { | |
3447 char *encoding = NULL; | |
3448 encoding = oscar_encoding_extract(args->encoding); | |
3449 message = oscar_encoding_to_utf8(encoding, args->msg, args->msglen); | |
3450 g_free(encoding); | |
3451 } else { | |
3452 if (g_utf8_validate(args->msg, args->msglen, NULL)) | |
3453 message = g_strdup(args->msg); | |
3454 } | |
3455 } | |
2869 | 3456 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3457 if (args->reqclass & AIM_CAPS_CHAT) { |
4121 | 3458 char *name; |
5234 | 3459 GHashTable *components; |
3460 | |
9933 | 3461 if (!args->info.chat.roominfo.name || !args->info.chat.roominfo.exchange) { |
3462 g_free(message); | |
4121 | 3463 return 1; |
9933 | 3464 } |
5234 | 3465 components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, |
3466 g_free); | |
4121 | 3467 name = extract_name(args->info.chat.roominfo.name); |
5234 | 3468 g_hash_table_replace(components, g_strdup("room"), g_strdup(name ? name : args->info.chat.roominfo.name)); |
3469 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
|
3470 serv_got_chat_invite(gc, |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3471 name ? name : args->info.chat.roominfo.name, |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3472 userinfo->sn, |
9933 | 3473 message, |
5234 | 3474 components); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3475 if (name) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3476 g_free(name); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3477 } else if (args->reqclass & AIM_CAPS_SENDFILE) { |
4617 | 3478 /* BBB */ |
3479 if (args->status == AIM_RENDEZVOUS_PROPOSE) { | |
3480 /* Someone wants to send a file (or files) to us */ | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
3481 GaimXfer *xfer; |
5146 | 3482 struct aim_oft_info *oft_info; |
3483 | |
3484 if (!args->cookie || !args->port || !args->verifiedip || | |
3485 !args->info.sendfile.filename || !args->info.sendfile.totsize || | |
4656 | 3486 !args->info.sendfile.totfiles || !args->reqclass) { |
8660 | 3487 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3488 "%s tried to send you a file with incomplete " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3489 "information.\n", userinfo->sn); |
5146 | 3490 if (args->proxyip) |
8660 | 3491 gaim_debug_warning("oscar", |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
3492 "IP for a proxy server was given. Gaim " |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3493 "does not support this yet.\n"); |
9933 | 3494 g_free(message); |
4617 | 3495 return 1; |
4656 | 3496 } |
4617 | 3497 |
3498 if (args->info.sendfile.subtype == AIM_OFT_SUBTYPE_SEND_DIR) { | |
3499 /* 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
|
3500 * directory -- remove the star and trailing slash so we don't save |
4617 | 3501 * directories that look like 'dirname\*' -- arl */ |
3502 char *tmp = strrchr(args->info.sendfile.filename, '\\'); | |
3503 if (tmp && (tmp[1] == '*')) { | |
3504 tmp[0] = '\0'; | |
3505 } | |
8660 | 3506 gaim_debug_warning("oscar", |
8446 | 3507 "We're receiving a whole directory! What fun! " |
3508 "Especially since we don't support that!\n"); | |
4617 | 3509 } |
3510 | |
3511 /* Build the file transfer handle */ | |
3512 xfer = gaim_xfer_new(gc->account, GAIM_XFER_RECEIVE, userinfo->sn); | |
5163 | 3513 xfer->remote_ip = g_strdup(args->verifiedip); |
5146 | 3514 xfer->remote_port = args->port; |
4617 | 3515 gaim_xfer_set_filename(xfer, args->info.sendfile.filename); |
3516 gaim_xfer_set_size(xfer, args->info.sendfile.totsize); | |
9933 | 3517 gaim_xfer_set_message(xfer, message); |
5146 | 3518 |
3519 /* Create the oscar-specific data */ | |
5163 | 3520 oft_info = aim_oft_createinfo(od->sess, args->cookie, userinfo->sn, args->clientip, xfer->remote_port, 0, 0, NULL); |
4898 | 3521 if (args->proxyip) |
5146 | 3522 oft_info->proxyip = g_strdup(args->proxyip); |
4898 | 3523 if (args->verifiedip) |
5146 | 3524 oft_info->verifiedip = g_strdup(args->verifiedip); |
3525 xfer->data = oft_info; | |
4617 | 3526 |
3527 /* Setup our I/O op functions */ | |
8446 | 3528 gaim_xfer_set_init_fnc(xfer, oscar_xfer_init_recv); |
4617 | 3529 gaim_xfer_set_end_fnc(xfer, oscar_xfer_end); |
8446 | 3530 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
|
3531 gaim_xfer_set_cancel_recv_fnc(xfer, oscar_xfer_cancel_recv); |
8446 | 3532 gaim_xfer_set_ack_fnc(xfer, oscar_xfer_ack_recv); |
4617 | 3533 |
3534 /* Keep track of this transfer for later */ | |
3535 od->file_transfers = g_slist_append(od->file_transfers, xfer); | |
3536 | |
3537 /* Now perform the request */ | |
3538 gaim_xfer_request(xfer); | |
3539 } else if (args->status == AIM_RENDEZVOUS_CANCEL) { | |
3540 /* The other user wants to cancel a file transfer */ | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
3541 GaimXfer *xfer; |
8660 | 3542 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3543 "AAA - File transfer canceled by remote user\n"); |
4617 | 3544 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
|
3545 gaim_xfer_cancel_remote(xfer); |
4617 | 3546 } else if (args->status == AIM_RENDEZVOUS_ACCEPT) { |
3547 /* | |
3548 * This gets sent by the receiver of a file | |
3549 * as they connect directly to us. If we don't | |
3550 * get this, then maybe a third party connected | |
3551 * to us, and we shouldn't send them anything. | |
3552 */ | |
3553 } else { | |
8660 | 3554 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3555 "unknown rendezvous status!\n"); |
3630 | 3556 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3557 } else if (args->reqclass & AIM_CAPS_GETFILE) { |
8092 | 3558 } else if (args->reqclass & AIM_CAPS_TALK) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3559 } else if (args->reqclass & AIM_CAPS_BUDDYICON) { |
9933 | 3560 gaim_buddy_icons_set_for_user(account, userinfo->sn, |
3561 args->info.icon.icon, | |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
3562 args->info.icon.length); |
6871 | 3563 } else if (args->reqclass & AIM_CAPS_DIRECTIM) { |
8971 | 3564 /* 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
|
3565 struct ask_direct *d = g_new0(struct ask_direct, 1); |
8971 | 3566 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
|
3567 char buf[256]; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3568 |
4212 | 3569 if (!args->verifiedip) { |
8983 | 3570 /* TODO: do something about this, after figuring out what it means */ |
8660 | 3571 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3572 "directim kill blocked (%s)\n", userinfo->sn); |
9933 | 3573 g_free(message); |
4650 | 3574 return 1; |
4212 | 3575 } |
3576 | |
8660 | 3577 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3578 "%s received direct im request from %s (%s)\n", |
10594 | 3579 username, userinfo->sn, args->verifiedip); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3580 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3581 d->gc = gc; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3582 d->sn = g_strdup(userinfo->sn); |
8983 | 3583 /* Let's use the clientip here, because I think that's what AIM does. |
3584 * Besides, if the clientip is wrong, we'll probably timeout faster, | |
3585 * and then ask them to connect to us. */ | |
10594 | 3586 /* |
3587 * I disagree, let's use the verifiedip. I think AIM tries the | |
3588 * verified IP first, then tries the client IP if that fails. In | |
3589 * any case, there's a better chance the verified IP will be correct. | |
3590 * The client IP is what the other person _thinks_ their IP address | |
3591 * is. The verified IP is the address that the AIM server sees the | |
3592 * other person using. | |
3593 */ | |
3594 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
|
3595 memcpy(d->cookie, args->cookie, 8); |
9070 | 3596 if (dim && !dim->connected && aim_odc_getcookie(dim->conn) && args->cookie && |
3597 (!memcmp(aim_odc_getcookie(dim->conn), args->cookie, 8))) { | |
3598 | |
8971 | 3599 oscar_direct_im_destroy(od, dim); |
8984 | 3600 d->donttryagain = TRUE; |
8971 | 3601 accept_direct_im_request(d); |
3602 } else { | |
8983 | 3603 if (dim && !dim->connected) |
8971 | 3604 gaim_debug_warning("oscar", "DirectIM: received direct im request while " |
3605 "already connected to that buddy!"); | |
5575 | 3606 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
|
3607 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3608 gaim_request_action(gc, NULL, buf, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3609 _("This requires a direct connection between " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3610 "the two computers and is necessary for IM " |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
3611 "Images. Because your IP address will be " |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3612 "revealed, this may be considered a privacy " |
9972 | 3613 "risk."), |
3614 GAIM_DEFAULT_ACTION_NONE, d, 2, | |
8971 | 3615 _("Connect"), G_CALLBACK(accept_direct_im_request), |
3616 _("Cancel"), G_CALLBACK(destroy_direct_im_request)); | |
3617 /* FIXME: we should actually send a packet on cancel */ | |
3618 } | |
8708 | 3619 } else if (args->reqclass & AIM_CAPS_ICQSERVERRELAY) { |
3620 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
|
3621 } else { |
8660 | 3622 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3623 "Unknown reqclass %hu\n", args->reqclass); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3624 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3625 |
9933 | 3626 g_free(message); |
3627 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3628 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3629 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3630 |
3453 | 3631 /* |
4230 | 3632 * Authorization Functions |
3633 * Most of these are callbacks from dialogs. They're used by both | |
3634 * methods of authorization (SSI and old-school channel 4 ICBM) | |
3453 | 3635 */ |
4269 | 3636 /* When you ask other people for authorization */ |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3637 static void gaim_auth_request(struct name_data *data, char *msg) { |
5575 | 3638 GaimConnection *gc = data->gc; |
4244 | 3639 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
3640 if (g_list_find(gaim_connections_get_all(), gc)) { |
7283 | 3641 OscarData *od = gc->proto_data; |
6695 | 3642 GaimBuddy *buddy = gaim_find_buddy(gc->account, data->name); |
3643 GaimGroup *group = gaim_find_buddys_group(buddy); | |
4244 | 3644 if (buddy && group) { |
8660 | 3645 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3646 "ssi: adding buddy %s to group %s\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3647 buddy->name, group->name); |
4889 | 3648 aim_ssi_sendauthrequest(od->sess, data->name, msg ? msg : _("Please authorize me so I can add you to my buddy list.")); |
4269 | 3649 if (!aim_ssi_itemlist_finditem(od->sess->ssi.local, group->name, buddy->name, AIM_SSI_TYPE_BUDDY)) |
9620 | 3650 aim_ssi_addbuddy(od->sess, buddy->name, group->name, gaim_buddy_get_alias_only(buddy), NULL, NULL, 1); |
4244 | 3651 } |
4230 | 3652 } |
4337 | 3653 } |
3654 | |
3655 static void gaim_auth_request_msgprompt(struct name_data *data) { | |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
3656 gaim_request_input(data->gc, NULL, _("Authorization Request Message:"), |
8697 | 3657 NULL, _("Please authorize me!"), TRUE, FALSE, NULL, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
3658 _("OK"), G_CALLBACK(gaim_auth_request), |
5836 | 3659 _("Cancel"), G_CALLBACK(oscar_free_name_data), |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
3660 data); |
4230 | 3661 } |
3662 | |
3663 static void gaim_auth_dontrequest(struct name_data *data) { | |
5575 | 3664 GaimConnection *gc = data->gc; |
4244 | 3665 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
3666 if (g_list_find(gaim_connections_get_all(), gc)) { |
8151 | 3667 /* Remove from local list */ |
3668 GaimBuddy *b = gaim_find_buddy(gaim_connection_get_account(gc), data->name); | |
3669 gaim_blist_remove_buddy(b); | |
4244 | 3670 } |
3671 | |
5836 | 3672 oscar_free_name_data(data); |
4230 | 3673 } |
3674 | |
9030 | 3675 |
3676 static void gaim_auth_sendrequest(GaimConnection *gc, char *name) { | |
4269 | 3677 struct name_data *data = g_new(struct name_data, 1); |
6695 | 3678 GaimBuddy *buddy; |
4269 | 3679 gchar *dialog_msg, *nombre; |
3680 | |
4687 | 3681 buddy = gaim_find_buddy(gc->account, name); |
9620 | 3682 if (buddy && (gaim_buddy_get_alias_only(buddy))) |
3683 nombre = g_strdup_printf("%s (%s)", name, gaim_buddy_get_alias_only(buddy)); | |
4269 | 3684 else |
4830 | 3685 nombre = NULL; |
3686 | |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
3687 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 | 3688 data->gc = gc; |
3689 data->name = g_strdup(name); | |
3690 data->nick = NULL; | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3691 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3692 gaim_request_action(gc, NULL, _("Request Authorization"), dialog_msg, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3693 0, data, 2, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3694 _("Request Authorization"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3695 G_CALLBACK(gaim_auth_request_msgprompt), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3696 _("Cancel"), G_CALLBACK(gaim_auth_dontrequest)); |
4269 | 3697 |
3698 g_free(dialog_msg); | |
3699 g_free(nombre); | |
3700 } | |
3701 | |
9030 | 3702 |
3703 static void gaim_auth_sendrequest_menu(GaimBlistNode *node, gpointer ignored) { | |
3704 GaimBuddy *buddy; | |
3705 GaimConnection *gc; | |
3706 | |
3707 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); | |
3708 | |
3709 buddy = (GaimBuddy *) node; | |
3710 gc = gaim_account_get_connection(buddy->account); | |
3711 gaim_auth_sendrequest(gc, buddy->name); | |
3712 } | |
3713 | |
4230 | 3714 /* When other people ask you for authorization */ |
3715 static void gaim_auth_grant(struct name_data *data) { | |
5575 | 3716 GaimConnection *gc = data->gc; |
4244 | 3717 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
3718 if (g_list_find(gaim_connections_get_all(), gc)) { |
7283 | 3719 OscarData *od = gc->proto_data; |
4889 | 3720 aim_ssi_sendauthreply(od->sess, data->name, 0x01, NULL); |
4244 | 3721 } |
3722 | |
5836 | 3723 oscar_free_name_data(data); |
3141 | 3724 } |
3725 | |
4230 | 3726 /* When other people ask you for authorization */ |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3727 static void gaim_auth_dontgrant(struct name_data *data, char *msg) { |
5575 | 3728 GaimConnection *gc = data->gc; |
4244 | 3729 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
3730 if (g_list_find(gaim_connections_get_all(), gc)) { |
7283 | 3731 OscarData *od = gc->proto_data; |
4889 | 3732 aim_ssi_sendauthreply(od->sess, data->name, 0x00, msg ? msg : _("No reason given.")); |
4244 | 3733 } |
4337 | 3734 } |
3735 | |
3736 static void gaim_auth_dontgrant_msgprompt(struct name_data *data) { | |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
3737 gaim_request_input(data->gc, NULL, _("Authorization Denied Message:"), |
8697 | 3738 NULL, _("No reason given."), TRUE, FALSE, NULL, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
3739 _("OK"), G_CALLBACK(gaim_auth_dontgrant), |
5836 | 3740 _("Cancel"), G_CALLBACK(oscar_free_name_data), |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
3741 data); |
3141 | 3742 } |
3743 | |
7023 | 3744 /* When someone sends you buddies */ |
3745 static void gaim_icq_buddyadd(struct name_data *data) { | |
5575 | 3746 GaimConnection *gc = data->gc; |
4244 | 3747 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
3748 if (g_list_find(gaim_connections_get_all(), gc)) { |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7054
diff
changeset
|
3749 gaim_blist_request_add_buddy(gaim_connection_get_account(gc), data->name, NULL, data->nick); |
4244 | 3750 } |
3751 | |
5836 | 3752 oscar_free_name_data(data); |
3453 | 3753 } |
3754 | |
4075 | 3755 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 | 3756 GaimConnection *gc = sess->aux_data; |
9908 | 3757 GaimAccount *account = gaim_connection_get_account(gc); |
4076 | 3758 gchar **msg1, **msg2; |
6051 | 3759 int i, numtoks; |
4076 | 3760 |
4121 | 3761 if (!args->type || !args->msg || !args->uin) |
3762 return 1; | |
4194 | 3763 |
8660 | 3764 gaim_debug_info("oscar", |
9908 | 3765 "Received a channel 4 message of type 0x%02hhx.\n", |
3766 args->type); | |
4076 | 3767 |
9919 | 3768 /* |
3769 * Split up the message at the delimeter character, then convert each | |
3770 * string to UTF-8. Unless, of course, this is a type 1 message. If | |
3771 * this is a type 1 message, then the delimiter 0xfe could be a valid | |
3772 * character in whatever encoding the message was sent in. Type 1 | |
3773 * messages are always made up of only one part, so we can easily account | |
3774 * for this suck-ass part of the protocol by splitting the string into at | |
3775 * most 1 baby string. | |
3776 */ | |
3777 msg1 = g_strsplit(args->msg, "\376", (args->type == 0x01 ? 1 : 0)); | |
6051 | 3778 for (numtoks=0; msg1[numtoks]; numtoks++); |
3779 msg2 = (gchar **)g_malloc((numtoks+1)*sizeof(gchar *)); | |
4076 | 3780 for (i=0; msg1[i]; i++) { |
7478
3c21f3084ff0
[gaim-migrate @ 8091]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
7475
diff
changeset
|
3781 gaim_str_strip_cr(msg1[i]); |
9908 | 3782 msg2[i] = gaim_plugin_oscar_decode_im_part(account, "1", AIM_CHARSET_ASCII, 0x0000, msg1[i], strlen(msg1[i])); |
4076 | 3783 } |
3784 msg2[i] = NULL; | |
3785 | |
3952 | 3786 switch (args->type) { |
4173 | 3787 case 0x01: { /* MacICQ message or basic offline message */ |
4076 | 3788 if (i >= 1) { |
5556 | 3789 gchar *uin = g_strdup_printf("%u", args->uin); |
8493 | 3790 gchar *tmp; |
3791 | |
3792 /* 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
|
3793 tmp = g_markup_escape_text(msg2[0], -1); |
8493 | 3794 |
4076 | 3795 if (t) { /* This is an offline message */ |
9680 | 3796 /* The timestamp is UTC-ish, so we need to get the offset */ |
9698 | 3797 #ifdef HAVE_TM_GMTOFF |
9724 | 3798 time_t now; |
3799 struct tm *tm; | |
3800 now = time(NULL); | |
3801 tm = localtime(&now); | |
3802 t += tm->tm_gmtoff; | |
9698 | 3803 #else |
3804 # ifdef HAVE_TIMEZONE | |
9680 | 3805 tzset(); |
3806 t -= timezone; | |
9698 | 3807 # endif |
3808 #endif | |
8514 | 3809 serv_got_im(gc, uin, tmp, 0, t); |
4076 | 3810 } else { /* This is a message from MacICQ/Miranda */ |
8514 | 3811 serv_got_im(gc, uin, tmp, 0, time(NULL)); |
4076 | 3812 } |
3813 g_free(uin); | |
8493 | 3814 g_free(tmp); |
4075 | 3815 } |
3316 | 3816 } break; |
3817 | |
4173 | 3818 case 0x04: { /* Someone sent you a URL */ |
4076 | 3819 if (i >= 2) { |
7385 | 3820 if (msg2[1] != NULL) { |
3821 gchar *uin = g_strdup_printf("%u", args->uin); | |
3822 gchar *message = g_strdup_printf("<A HREF=\"%s\">%s</A>", | |
3823 msg2[1], | |
3824 (msg2[0] && msg2[0][0]) ? msg2[0] : msg2[1]); | |
3825 serv_got_im(gc, uin, message, 0, time(NULL)); | |
3826 g_free(uin); | |
3827 g_free(message); | |
3828 } | |
3453 | 3829 } |
3830 } break; | |
3831 | |
4173 | 3832 case 0x06: { /* Someone requested authorization */ |
4076 | 3833 if (i >= 6) { |
4230 | 3834 struct name_data *data = g_new(struct name_data, 1); |
10949 | 3835 gchar *dialog_msg = g_strdup_printf( |
3836 _("The user %u wants to add %s to their buddy list for the following reason:\n%s"), | |
3837 args->uin, gaim_account_get_username(gc->account), | |
3838 (msg2[5] ? msg2[5] : _("No reason given."))); | |
8660 | 3839 gaim_debug_info("oscar", |
5556 | 3840 "Received an authorization request from UIN %u\n", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3841 args->uin); |
4076 | 3842 data->gc = gc; |
5556 | 3843 data->name = g_strdup_printf("%u", args->uin); |
4230 | 3844 data->nick = NULL; |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3845 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3846 gaim_request_action(gc, NULL, _("Authorization Request"), |
9948 | 3847 dialog_msg, GAIM_DEFAULT_ACTION_NONE, data, |
3848 2, _("Authorize"), | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3849 G_CALLBACK(gaim_auth_grant), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3850 _("Deny"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3851 G_CALLBACK(gaim_auth_dontgrant_msgprompt)); |
4076 | 3852 g_free(dialog_msg); |
3853 } | |
3141 | 3854 } break; |
3855 | |
4173 | 3856 case 0x07: { /* Someone has denied you authorization */ |
4076 | 3857 if (i >= 1) { |
7023 | 3858 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
|
3859 gaim_notify_info(gc, NULL, _("ICQ authorization denied."), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3860 dialog_msg); |
4076 | 3861 g_free(dialog_msg); |
3862 } | |
3141 | 3863 } break; |
3864 | |
4173 | 3865 case 0x08: { /* Someone has granted you authorization */ |
7023 | 3866 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
|
3867 gaim_notify_info(gc, NULL, "ICQ authorization accepted.", |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3868 dialog_msg); |
3141 | 3869 g_free(dialog_msg); |
3870 } break; | |
3871 | |
4333 | 3872 case 0x09: { /* Message from the Godly ICQ server itself, I think */ |
3873 if (i >= 5) { | |
3874 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
|
3875 gaim_notify_info(gc, NULL, "ICQ Server Message", dialog_msg); |
4333 | 3876 g_free(dialog_msg); |
3877 } | |
3878 } break; | |
3879 | |
4173 | 3880 case 0x0d: { /* Someone has sent you a pager message from http://www.icq.com/your_uin */ |
4076 | 3881 if (i >= 6) { |
4194 | 3882 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
|
3883 gaim_notify_info(gc, NULL, "ICQ Page", dialog_msg); |
4076 | 3884 g_free(dialog_msg); |
3885 } | |
4075 | 3886 } break; |
3887 | |
4173 | 3888 case 0x0e: { /* Someone has emailed you at your_uin@pager.icq.com */ |
4076 | 3889 if (i >= 6) { |
4308 | 3890 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
|
3891 gaim_notify_info(gc, NULL, "ICQ Email", dialog_msg); |
4076 | 3892 g_free(dialog_msg); |
3893 } | |
4075 | 3894 } break; |
3895 | |
4173 | 3896 case 0x12: { |
3141 | 3897 /* Ack for authorizing/denying someone. Or possibly an ack for sending any system notice */ |
7023 | 3898 /* Someone added you to their buddy list? */ |
3141 | 3899 } break; |
3900 | |
7023 | 3901 case 0x13: { /* Someone has sent you some ICQ buddies */ |
7631 | 3902 guint i, num; |
3453 | 3903 gchar **text; |
4173 | 3904 text = g_strsplit(args->msg, "\376", 0); |
3453 | 3905 if (text) { |
3906 num = 0; | |
3907 for (i=0; i<strlen(text[0]); i++) | |
3908 num = num*10 + text[0][i]-48; | |
3909 for (i=0; i<num; i++) { | |
4230 | 3910 struct name_data *data = g_new(struct name_data, 1); |
7023 | 3911 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 | 3912 data->gc = gc; |
4790 | 3913 data->name = g_strdup(text[i*2+1]); |
3914 data->nick = g_strdup(text[i*2+2]); | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3915 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3916 gaim_request_action(gc, NULL, message, |
7023 | 3917 _("Do you want to add this buddy " |
3918 "to your buddy list?"), | |
9972 | 3919 GAIM_DEFAULT_ACTION_NONE, data, 2, |
7023 | 3920 _("Add"), G_CALLBACK(gaim_icq_buddyadd), |
5836 | 3921 _("Decline"), G_CALLBACK(oscar_free_name_data)); |
3453 | 3922 g_free(message); |
3923 } | |
3924 g_strfreev(text); | |
3925 } | |
3926 } break; | |
3927 | |
7023 | 3928 case 0x1a: { /* Someone has sent you a greeting card or requested buddies? */ |
3453 | 3929 /* This is boring and silly. */ |
3930 } break; | |
3931 | |
3141 | 3932 default: { |
8660 | 3933 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3934 "Received a channel 4 message of unknown type " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3935 "(type 0x%02hhx).\n", args->type); |
3141 | 3936 } break; |
3937 } | |
3938 | |
4076 | 3939 g_strfreev(msg1); |
3940 g_strfreev(msg2); | |
3941 | |
3141 | 3942 return 1; |
3943 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3944 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3945 static int gaim_parse_incoming_im(aim_session_t *sess, aim_frame_t *fr, ...) { |
4200 | 3946 fu16_t channel; |
3947 int ret = 0; | |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3948 aim_userinfo_t *userinfo; |
2086 | 3949 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3950 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3951 va_start(ap, fr); |
4200 | 3952 channel = (fu16_t)va_arg(ap, unsigned int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3953 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 3954 |
3141 | 3955 switch (channel) { |
3956 case 1: { /* standard message */ | |
3957 struct aim_incomingim_ch1_args *args; | |
3958 args = va_arg(ap, struct aim_incomingim_ch1_args *); | |
3959 ret = incomingim_chan1(sess, fr->conn, userinfo, args); | |
3960 } break; | |
3961 | |
8735
92cbf9713795
[gaim-migrate @ 9490]
Christian Hammond <chipx86@chipx86.com>
parents:
8733
diff
changeset
|
3962 case 2: { /* rendezvous */ |
3141 | 3963 struct aim_incomingim_ch2_args *args; |
3964 args = va_arg(ap, struct aim_incomingim_ch2_args *); | |
3965 ret = incomingim_chan2(sess, fr->conn, userinfo, args); | |
3966 } break; | |
3967 | |
3968 case 4: { /* ICQ */ | |
3969 struct aim_incomingim_ch4_args *args; | |
3970 args = va_arg(ap, struct aim_incomingim_ch4_args *); | |
4075 | 3971 ret = incomingim_chan4(sess, fr->conn, userinfo, args, 0); |
3141 | 3972 } break; |
3973 | |
3974 default: { | |
8660 | 3975 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3976 "ICBM received on unsupported channel (channel " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3977 "0x%04hx).", channel); |
3141 | 3978 } break; |
2086 | 3979 } |
3980 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3981 va_end(ap); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3982 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3983 return ret; |
2086 | 3984 } |
3985 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3986 static int gaim_parse_misses(aim_session_t *sess, aim_frame_t *fr, ...) { |
8733 | 3987 GaimConnection *gc = sess->aux_data; |
3988 GaimAccount *account = gaim_connection_get_account(gc); | |
5420 | 3989 char *buf; |
2086 | 3990 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3991 fu16_t chan, nummissed, reason; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3992 aim_userinfo_t *userinfo; |
2086 | 3993 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3994 va_start(ap, fr); |
4200 | 3995 chan = (fu16_t)va_arg(ap, unsigned int); |
3996 userinfo = va_arg(ap, aim_userinfo_t *); | |
3997 nummissed = (fu16_t)va_arg(ap, unsigned int); | |
3998 reason = (fu16_t)va_arg(ap, unsigned int); | |
2086 | 3999 va_end(ap); |
4000 | |
4001 switch(reason) { | |
5420 | 4002 case 0: /* Invalid (0) */ |
4003 buf = g_strdup_printf( | |
4004 ngettext( | |
4276 | 4005 "You missed %hu message from %s because it was invalid.", |
4006 "You missed %hu messages from %s because they were invalid.", | |
4007 nummissed), | |
4282 | 4008 nummissed, |
4009 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4010 break; |
5420 | 4011 case 1: /* Message too large */ |
4012 buf = g_strdup_printf( | |
4013 ngettext( | |
4276 | 4014 "You missed %hu message from %s because it was too large.", |
4015 "You missed %hu messages from %s because they were too large.", | |
4016 nummissed), | |
4282 | 4017 nummissed, |
4018 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4019 break; |
5420 | 4020 case 2: /* Rate exceeded */ |
4021 buf = g_strdup_printf( | |
4022 ngettext( | |
4276 | 4023 "You missed %hu message from %s because the rate limit has been exceeded.", |
4024 "You missed %hu messages from %s because the rate limit has been exceeded.", | |
4025 nummissed), | |
4282 | 4026 nummissed, |
4027 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4028 break; |
5420 | 4029 case 3: /* Evil Sender */ |
4030 buf = g_strdup_printf( | |
4031 ngettext( | |
4276 | 4032 "You missed %hu message from %s because he/she was too evil.", |
4033 "You missed %hu messages from %s because he/she was too evil.", | |
4034 nummissed), | |
4282 | 4035 nummissed, |
4036 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4037 break; |
5420 | 4038 case 4: /* Evil Receiver */ |
4039 buf = g_strdup_printf( | |
4040 ngettext( | |
4276 | 4041 "You missed %hu message from %s because you are too evil.", |
4042 "You missed %hu messages from %s because you are too evil.", | |
4043 nummissed), | |
4282 | 4044 nummissed, |
4045 userinfo->sn); | |
2086 | 4046 break; |
4047 default: | |
5420 | 4048 buf = g_strdup_printf( |
4049 ngettext( | |
4276 | 4050 "You missed %hu message from %s for an unknown reason.", |
4051 "You missed %hu messages from %s for an unknown reason.", | |
4052 nummissed), | |
4282 | 4053 nummissed, |
4054 userinfo->sn); | |
2086 | 4055 break; |
4056 } | |
8733 | 4057 |
9627 | 4058 if (!gaim_conv_present_error(userinfo->sn, account, buf)) |
8733 | 4059 gaim_notify_error(sess->aux_data, NULL, buf, NULL); |
5420 | 4060 g_free(buf); |
2086 | 4061 |
4062 return 1; | |
4063 } | |
4064 | |
4194 | 4065 static int gaim_parse_clientauto_ch2(aim_session_t *sess, const char *who, fu16_t reason, const char *cookie) { |
5575 | 4066 GaimConnection *gc = sess->aux_data; |
7283 | 4067 OscarData *od = gc->proto_data; |
4617 | 4068 |
4069 /* BBB */ | |
3630 | 4070 switch (reason) { |
4151 | 4071 case 3: { /* Decline sendfile. */ |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
4072 GaimXfer *xfer; |
8971 | 4073 struct oscar_direct_im *dim; |
4074 | |
8660 | 4075 gaim_debug_info("oscar", |
9070 | 4076 "AAA - Other user declined some sort of direct " |
8971 | 4077 "connect attempt (automaticly?)\n"); |
4617 | 4078 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
|
4079 gaim_xfer_cancel_remote(xfer); |
8971 | 4080 else if ((dim = oscar_direct_im_find(od, who))) { |
4081 /* AAA should use find by cookie or something here */ | |
4082 oscar_direct_im_disconnect(od, dim); | |
4083 } | |
4151 | 4084 } break; |
4085 | |
4086 default: { | |
8660 | 4087 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4088 "Received an unknown rendezvous client auto-response " |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
4089 "from %s. Type 0x%04hx\n", who, reason); |
4151 | 4090 } |
3630 | 4091 |
4092 } | |
4093 | |
4094 return 0; | |
4095 } | |
4096 | |
4194 | 4097 static int gaim_parse_clientauto_ch4(aim_session_t *sess, char *who, fu16_t reason, fu32_t state, char *msg) { |
5575 | 4098 GaimConnection *gc = sess->aux_data; |
4151 | 4099 |
4100 switch(reason) { | |
4101 case 0x0003: { /* Reply from an ICQ status message request */ | |
9244 | 4102 char *title, *statusmsg, **splitmsg, *dialogmsg; |
4103 | |
4104 title = g_strdup_printf(_("Info for %s"), who); | |
4151 | 4105 |
4106 /* Split at (carriage return/newline)'s, then rejoin later with BRs between. */ | |
9244 | 4107 statusmsg = oscar_icqstatus(state); |
4151 | 4108 splitmsg = g_strsplit(msg, "\r\n", 0); |
9244 | 4109 dialogmsg = g_strdup_printf(_("<B>UIN:</B> %s<BR><B>Status:</B> %s<HR>%s"), who, statusmsg, g_strjoinv("<BR>", splitmsg)); |
4110 g_free(statusmsg); | |
4151 | 4111 g_strfreev(splitmsg); |
9244 | 4112 |
9797 | 4113 gaim_notify_userinfo(gc, who, title, _("Buddy Information"), NULL, dialogmsg, NULL, NULL); |
9244 | 4114 |
4115 g_free(title); | |
4116 g_free(dialogmsg); | |
4151 | 4117 } break; |
4118 | |
4119 default: { | |
8660 | 4120 gaim_debug_warning("oscar", |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
4121 "Received an unknown client auto-response from %s. " |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4122 "Type 0x%04hx\n", who, reason); |
4151 | 4123 } break; |
4124 } /* end of switch */ | |
4125 | |
4126 return 0; | |
4127 } | |
4128 | |
3212 | 4129 static int gaim_parse_clientauto(aim_session_t *sess, aim_frame_t *fr, ...) { |
4130 va_list ap; | |
4131 fu16_t chan, reason; | |
4132 char *who; | |
4133 | |
4134 va_start(ap, fr); | |
4200 | 4135 chan = (fu16_t)va_arg(ap, unsigned int); |
3212 | 4136 who = va_arg(ap, char *); |
4200 | 4137 reason = (fu16_t)va_arg(ap, unsigned int); |
3212 | 4138 |
3952 | 4139 if (chan == 0x0002) { /* File transfer declined */ |
3630 | 4140 char *cookie = va_arg(ap, char *); |
4151 | 4141 return gaim_parse_clientauto_ch2(sess, who, reason, cookie); |
3952 | 4142 } else if (chan == 0x0004) { /* ICQ message */ |
4200 | 4143 fu32_t state = 0; |
4151 | 4144 char *msg = NULL; |
4145 if (reason == 0x0003) { | |
4200 | 4146 state = va_arg(ap, fu32_t); |
4151 | 4147 msg = va_arg(ap, char *); |
4148 } | |
4149 return gaim_parse_clientauto_ch4(sess, who, reason, state, msg); | |
4150 } | |
3952 | 4151 |
3212 | 4152 va_end(ap); |
4153 | |
4154 return 1; | |
4155 } | |
4156 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4157 static int gaim_parse_genericerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 4158 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4159 fu16_t reason; |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
4160 char *m; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4161 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4162 va_start(ap, fr); |
4199 | 4163 reason = (fu16_t) va_arg(ap, unsigned int); |
2086 | 4164 va_end(ap); |
4165 | |
8660 | 4166 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4167 "snac threw error (reason 0x%04hx: %s)\n", reason, |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4168 (reason < msgerrreasonlen) ? msgerrreason[reason] : "unknown"); |
2086 | 4169 |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
4170 m = g_strdup_printf(_("SNAC threw error: %s\n"), |
5411 | 4171 reason < msgerrreasonlen ? _(msgerrreason[reason]) : _("Unknown error")); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4172 gaim_notify_error(sess->aux_data, NULL, m, NULL); |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
4173 g_free(m); |
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
4174 |
2086 | 4175 return 1; |
4176 } | |
4177 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4178 static int gaim_parse_msgerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
9627 | 4179 GaimConnection *gc = sess->aux_data; |
4617 | 4180 #if 0 |
7283 | 4181 OscarData *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
4182 GaimXfer *xfer; |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
4183 #endif |
4617 | 4184 va_list ap; |
4185 fu16_t reason; | |
4186 char *data, *buf; | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
4187 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4188 va_start(ap, fr); |
4617 | 4189 reason = (fu16_t)va_arg(ap, unsigned int); |
3752 | 4190 data = va_arg(ap, char *); |
2086 | 4191 va_end(ap); |
4192 | |
8660 | 4193 gaim_debug_error("oscar", |
10130 | 4194 "Message error with data %s and reason %hu\n", |
4195 (data != NULL ? data : ""), reason); | |
4617 | 4196 |
4197 /* BBB */ | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
4198 #if 0 |
4617 | 4199 /* If this was a file transfer request, data is a cookie */ |
4200 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
|
4201 gaim_xfer_cancel_remote(xfer); |
3630 | 4202 return 1; |
4203 } | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
4204 #endif |
3630 | 4205 |
4617 | 4206 /* Data is assumed to be the destination sn */ |
9826 | 4207 buf = g_strdup_printf(_("Unable to send message: %s"), (reason < msgerrreasonlen) ? msgerrreason[reason] : _("Unknown reason.")); |
4208 if (!gaim_conv_present_error(data, gaim_connection_get_account(gc), buf)) { | |
4209 g_free(buf); | |
4210 buf = g_strdup_printf(_("Unable to send message to %s:"), data ? data : "(unknown)"); | |
9627 | 4211 gaim_notify_error(sess->aux_data, NULL, buf, |
9826 | 4212 (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("Unknown reason.")); |
4213 } | |
4214 g_free(buf); | |
4215 | |
2086 | 4216 return 1; |
4217 } | |
4218 | |
3595 | 4219 static int gaim_parse_mtn(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4220 GaimConnection *gc = sess->aux_data; |
3595 | 4221 va_list ap; |
4222 fu16_t type1, type2; | |
4223 char *sn; | |
4224 | |
4225 va_start(ap, fr); | |
4199 | 4226 type1 = (fu16_t) va_arg(ap, unsigned int); |
3595 | 4227 sn = va_arg(ap, char *); |
4199 | 4228 type2 = (fu16_t) va_arg(ap, unsigned int); |
3595 | 4229 va_end(ap); |
4230 | |
4231 switch (type2) { | |
4232 case 0x0000: { /* Text has been cleared */ | |
4233 serv_got_typing_stopped(gc, sn); | |
4234 } break; | |
4235 | |
4236 case 0x0001: { /* Paused typing */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
4237 serv_got_typing(gc, sn, 0, GAIM_TYPED); |
3595 | 4238 } break; |
4239 | |
4240 case 0x0002: { /* Typing */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
4241 serv_got_typing(gc, sn, 0, GAIM_TYPING); |
3595 | 4242 } break; |
4243 | |
4244 default: { | |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
4245 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 | 4246 } break; |
4247 } | |
4248 | |
4249 return 1; | |
4250 } | |
4251 | |
7141 | 4252 /* |
4253 * We get this error when there was an error in the locate family. This | |
7259 | 4254 * happens when you request info of someone who is offline. |
7141 | 4255 */ |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4256 static int gaim_parse_locerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
9826 | 4257 gchar *buf; |
2086 | 4258 va_list ap; |
5420 | 4259 fu16_t reason; |
2086 | 4260 char *destn; |
4261 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4262 va_start(ap, fr); |
4199 | 4263 reason = (fu16_t) va_arg(ap, unsigned int); |
2086 | 4264 destn = va_arg(ap, char *); |
4265 va_end(ap); | |
4266 | |
7781 | 4267 if (destn == NULL) |
7793 | 4268 return 1; |
10560 | 4269 |
9826 | 4270 buf = g_strdup_printf(_("User information not available: %s"), (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("Unknown reason.")); |
4271 if (!gaim_conv_present_error(destn, gaim_connection_get_account((GaimConnection*)sess->aux_data), buf)) { | |
4272 g_free(buf); | |
9627 | 4273 buf = g_strdup_printf(_("User information for %s unavailable:"), destn); |
9826 | 4274 gaim_notify_error(sess->aux_data, NULL, buf, (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("Unknown reason.")); |
4275 } | |
4276 g_free(buf); | |
2086 | 4277 |
4278 return 1; | |
4279 } | |
4280 | |
7011 | 4281 static int gaim_parse_userinfo(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4282 GaimConnection *gc = sess->aux_data; |
8700 | 4283 GaimAccount *account = gaim_connection_get_account(gc); |
10567 | 4284 OscarData *od = gc->proto_data; |
8700 | 4285 GString *str; |
9244 | 4286 gchar *tmp = NULL, *info_utf8 = NULL, *away_utf8 = NULL, *title = NULL; |
4791 | 4287 va_list ap; |
7011 | 4288 aim_userinfo_t *userinfo; |
2086 | 4289 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4290 va_start(ap, fr); |
7011 | 4291 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 4292 va_end(ap); |
4293 | |
8700 | 4294 str = g_string_new(""); |
4295 g_string_append_printf(str, "<b>%s:</b> %s", _("Screen Name"), userinfo->sn); | |
4296 g_string_append_printf(str, "\n<br><b>%s</b>: %d%%", _("Warning Level"), (int)((userinfo->warnlevel/10.0) + 0.5)); | |
7011 | 4297 |
10116 | 4298 if (userinfo->present & AIM_USERINFO_PRESENT_ONLINESINCE) { |
10567 | 4299 time_t t = userinfo->onlinesince - od->timeoffset; |
10116 | 4300 oscar_string_append(str, "\n<br>", _("Online Since"), ctime(&t)); |
4301 } | |
4302 | |
4303 if (userinfo->present & AIM_USERINFO_PRESENT_MEMBERSINCE) { | |
10567 | 4304 time_t t = userinfo->membersince - od->timeoffset; |
10116 | 4305 oscar_string_append(str, "\n<br>", _("Member Since"), ctime(&t)); |
4306 } | |
7011 | 4307 |
4308 if (userinfo->present & AIM_USERINFO_PRESENT_IDLE) { | |
8700 | 4309 tmp = gaim_str_seconds_to_string(userinfo->idletime*60); |
8701 | 4310 oscar_string_append(str, "\n<br>", _("Idle"), tmp); |
8700 | 4311 g_free(tmp); |
4312 } | |
4313 | |
8701 | 4314 oscar_string_append_info(gc, str, "\n<br>", NULL, userinfo); |
7011 | 4315 |
4316 if ((userinfo->flags & AIM_FLAG_AWAY) && (userinfo->away_len > 0) && (userinfo->away != NULL) && (userinfo->away_encoding != NULL)) { | |
8700 | 4317 tmp = oscar_encoding_extract(userinfo->away_encoding); |
4318 away_utf8 = oscar_encoding_to_utf8(tmp, userinfo->away, userinfo->away_len); | |
4319 g_free(tmp); | |
7011 | 4320 if (away_utf8 != NULL) { |
8700 | 4321 g_string_append_printf(str, "\n<hr>%s", away_utf8); |
7011 | 4322 g_free(away_utf8); |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4323 } |
7011 | 4324 } |
4325 | |
4326 if ((userinfo->info_len > 0) && (userinfo->info != NULL) && (userinfo->info_encoding != NULL)) { | |
8700 | 4327 tmp = oscar_encoding_extract(userinfo->info_encoding); |
4328 info_utf8 = oscar_encoding_to_utf8(tmp, userinfo->info, userinfo->info_len); | |
4329 g_free(tmp); | |
7011 | 4330 if (info_utf8 != NULL) { |
8700 | 4331 g_string_append_printf(str, "\n<hr>%s", info_utf8); |
7011 | 4332 g_free(info_utf8); |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4333 } |
7011 | 4334 } |
4335 | |
8701 | 4336 tmp = gaim_str_sub_away_formatters(str->str, gaim_account_get_username(account)); |
8700 | 4337 g_string_free(str, TRUE); |
9244 | 4338 title = g_strdup_printf(_("Info for %s"), userinfo->sn); |
9797 | 4339 gaim_notify_userinfo(gc, userinfo->sn, title, _("Buddy Information"), NULL, tmp, NULL, NULL); |
9244 | 4340 g_free(title); |
8700 | 4341 g_free(tmp); |
4151 | 4342 |
2086 | 4343 return 1; |
4344 } | |
4345 | |
8341 | 4346 static gboolean gaim_reqinfo_timeout_cb(void *data) |
4347 { | |
4348 aim_session_t *sess = data; | |
4349 GaimConnection *gc = sess->aux_data; | |
4350 OscarData *od = (OscarData *)gc->proto_data; | |
4351 | |
4352 aim_locate_dorequest(data); | |
4353 od->getinfotimer = 0; | |
4354 | |
4355 return FALSE; | |
4356 } | |
4357 | |
4358 static int gaim_reqinfo_timeout(aim_session_t *sess, aim_frame_t *fr, ...) | |
4359 { | |
4360 GaimConnection *gc = sess->aux_data; | |
4361 OscarData *od = (OscarData *)gc->proto_data; | |
4362 | |
4363 /* | |
4364 * Wait a little while then call aim_locate_dorequest(sess). This keeps | |
4365 * us from hitting the rate limit due to request away messages and info | |
4366 * too quickly. | |
4367 */ | |
4368 if (od->getinfotimer == 0) | |
10198 | 4369 od->getinfotimer = gaim_timeout_add(1500, gaim_reqinfo_timeout_cb, sess); |
8341 | 4370 |
4371 return 1; | |
4372 } | |
4373 | |
4374 static int gaim_parse_motd(aim_session_t *sess, aim_frame_t *fr, ...) | |
4375 { | |
2086 | 4376 char *msg; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4377 fu16_t id; |
2086 | 4378 va_list ap; |
4379 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4380 va_start(ap, fr); |
4199 | 4381 id = (fu16_t) va_arg(ap, unsigned int); |
2086 | 4382 msg = va_arg(ap, char *); |
4383 va_end(ap); | |
4384 | |
8660 | 4385 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4386 "MOTD: %s (%hu)\n", msg ? msg : "Unknown", id); |
2092
59b0377d18aa
[gaim-migrate @ 2102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
4387 if (id < 4) |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4388 gaim_notify_warning(sess->aux_data, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4389 _("Your AIM connection may be lost."), NULL); |
2086 | 4390 |
4391 return 1; | |
4392 } | |
4393 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4394 static int gaim_chatnav_info(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 4395 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4396 fu16_t type; |
5575 | 4397 GaimConnection *gc = sess->aux_data; |
7283 | 4398 OscarData *od = (OscarData *)gc->proto_data; |
2086 | 4399 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4400 va_start(ap, fr); |
4199 | 4401 type = (fu16_t) va_arg(ap, unsigned int); |
2086 | 4402 |
4403 switch(type) { | |
4404 case 0x0002: { | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4405 fu8_t maxrooms; |
2086 | 4406 struct aim_chat_exchangeinfo *exchanges; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4407 int exchangecount, i; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4408 |
4199 | 4409 maxrooms = (fu8_t) va_arg(ap, unsigned int); |
2086 | 4410 exchangecount = va_arg(ap, int); |
4411 exchanges = va_arg(ap, struct aim_chat_exchangeinfo *); | |
4412 | |
8660 | 4413 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4414 "chat info: Chat Rights:\n"); |
8660 | 4415 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4416 "chat info: \tMax Concurrent Rooms: %hhd\n", maxrooms); |
8660 | 4417 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4418 "chat info: \tExchange List: (%d total)\n", exchangecount); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4419 for (i = 0; i < exchangecount; i++) |
8660 | 4420 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4421 "chat info: \t\t%hu %s\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4422 exchanges[i].number, exchanges[i].name ? exchanges[i].name : ""); |
4617 | 4423 while (od->create_rooms) { |
4424 struct create_room *cr = od->create_rooms->data; | |
8660 | 4425 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4426 "creating room %s\n", cr->name); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
4427 aim_chatnav_createroom(sess, fr->conn, cr->name, cr->exchange); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
4428 g_free(cr->name); |
4617 | 4429 od->create_rooms = g_slist_remove(od->create_rooms, cr); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
4430 g_free(cr); |
2086 | 4431 } |
4432 } | |
4433 break; | |
4434 case 0x0008: { | |
4435 char *fqcn, *name, *ck; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4436 fu16_t instance, flags, maxmsglen, maxoccupancy, unknown, exchange; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4437 fu8_t createperms; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4438 fu32_t createtime; |
2086 | 4439 |
4440 fqcn = va_arg(ap, char *); | |
4200 | 4441 instance = (fu16_t)va_arg(ap, unsigned int); |
4442 exchange = (fu16_t)va_arg(ap, unsigned int); | |
4443 flags = (fu16_t)va_arg(ap, unsigned int); | |
4444 createtime = va_arg(ap, fu32_t); | |
4445 maxmsglen = (fu16_t)va_arg(ap, unsigned int); | |
4446 maxoccupancy = (fu16_t)va_arg(ap, unsigned int); | |
4447 createperms = (fu8_t)va_arg(ap, unsigned int); | |
4448 unknown = (fu16_t)va_arg(ap, unsigned int); | |
4449 name = va_arg(ap, char *); | |
4450 ck = va_arg(ap, char *); | |
4194 | 4451 |
8660 | 4452 gaim_debug_misc("oscar", |
5556 | 4453 "created room: %s %hu %hu %hu %u %hu %hu %hhu %hu %s %s\n", |
2086 | 4454 fqcn, |
4455 exchange, instance, flags, | |
4456 createtime, | |
4457 maxmsglen, maxoccupancy, createperms, unknown, | |
4458 name, ck); | |
4617 | 4459 aim_chat_join(od->sess, od->conn, exchange, ck, instance); |
2086 | 4460 } |
4461 break; | |
4462 default: | |
8660 | 4463 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4464 "chatnav info: unknown type (%04hx)\n", type); |
2086 | 4465 break; |
4466 } | |
4194 | 4467 |
4468 va_end(ap); | |
4469 | |
2086 | 4470 return 1; |
4471 } | |
4472 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
4473 static int gaim_conv_chat_join(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 4474 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4475 int count, i; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4476 aim_userinfo_t *info; |
5575 | 4477 GaimConnection *g = sess->aux_data; |
2086 | 4478 |
4479 struct chat_connection *c = NULL; | |
4480 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4481 va_start(ap, fr); |
2086 | 4482 count = va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4483 info = va_arg(ap, aim_userinfo_t *); |
2086 | 4484 va_end(ap); |
4485 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4486 c = find_oscar_chat_by_conn(g, fr->conn); |
2086 | 4487 if (!c) |
4488 return 1; | |
4489 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4490 for (i = 0; i < count; i++) |
9846 | 4491 gaim_conv_chat_add_user(GAIM_CONV_CHAT(c->conv), info[i].sn, NULL, GAIM_CBFLAGS_NONE, TRUE); |
2086 | 4492 |
4493 return 1; | |
4494 } | |
4495 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
4496 static int gaim_conv_chat_leave(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 4497 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4498 int count, i; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4499 aim_userinfo_t *info; |
5575 | 4500 GaimConnection *g = sess->aux_data; |
2086 | 4501 |
4502 struct chat_connection *c = NULL; | |
4503 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4504 va_start(ap, fr); |
2086 | 4505 count = va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4506 info = va_arg(ap, aim_userinfo_t *); |
2086 | 4507 va_end(ap); |
4508 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4509 c = find_oscar_chat_by_conn(g, fr->conn); |
2086 | 4510 if (!c) |
4511 return 1; | |
4512 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4513 for (i = 0; i < count; i++) |
8733 | 4514 gaim_conv_chat_remove_user(GAIM_CONV_CHAT(c->conv), info[i].sn, NULL); |
2086 | 4515 |
4516 return 1; | |
4517 } | |
4518 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
4519 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
|
4520 va_list ap; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4521 aim_userinfo_t *userinfo; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4522 struct aim_chat_roominfo *roominfo; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4523 char *roomname; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4524 int usercount; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4525 char *roomdesc; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4526 fu16_t unknown_c9, unknown_d2, unknown_d5, maxmsglen, maxvisiblemsglen; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4527 fu32_t creationtime; |
5575 | 4528 GaimConnection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4529 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
|
4530 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4531 va_start(ap, fr); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4532 roominfo = va_arg(ap, struct aim_chat_roominfo *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4533 roomname = va_arg(ap, char *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4534 usercount= va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4535 userinfo = va_arg(ap, aim_userinfo_t *); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4536 roomdesc = va_arg(ap, char *); |
4200 | 4537 unknown_c9 = (fu16_t)va_arg(ap, unsigned int); |
4538 creationtime = va_arg(ap, fu32_t); | |
4539 maxmsglen = (fu16_t)va_arg(ap, unsigned int); | |
4540 unknown_d2 = (fu16_t)va_arg(ap, unsigned int); | |
4541 unknown_d5 = (fu16_t)va_arg(ap, unsigned int); | |
4542 maxvisiblemsglen = (fu16_t)va_arg(ap, unsigned int); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4543 va_end(ap); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4544 |
8660 | 4545 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4546 "inside chat_info_update (maxmsglen = %hu, maxvislen = %hu)\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4547 maxmsglen, maxvisiblemsglen); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4548 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4549 ccon->maxlen = maxmsglen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4550 ccon->maxvis = maxvisiblemsglen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4551 |
2086 | 4552 return 1; |
4553 } | |
4554 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
4555 static int gaim_conv_chat_incoming_msg(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4556 GaimConnection *gc = sess->aux_data; |
8225 | 4557 struct chat_connection *ccon = find_oscar_chat_by_conn(gc, fr->conn); |
4558 gchar *utf8; | |
2086 | 4559 va_list ap; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4560 aim_userinfo_t *info; |
8225 | 4561 int len; |
2086 | 4562 char *msg; |
8219 | 4563 char *charset; |
2086 | 4564 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4565 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4566 info = va_arg(ap, aim_userinfo_t *); |
8219 | 4567 len = va_arg(ap, int); |
4194 | 4568 msg = va_arg(ap, char *); |
8219 | 4569 charset = va_arg(ap, char *); |
4194 | 4570 va_end(ap); |
2086 | 4571 |
8225 | 4572 utf8 = oscar_encoding_to_utf8(charset, msg, len); |
8667 | 4573 if (utf8 == NULL) |
4574 /* The conversion failed! */ | |
8668 | 4575 utf8 = g_strdup(_("[Unable to display a message from this user because it contained invalid characters.]")); |
8225 | 4576 serv_got_chat_in(gc, ccon->id, info->sn, 0, utf8, time((time_t)NULL)); |
4577 g_free(utf8); | |
2086 | 4578 |
4579 return 1; | |
4580 } | |
4581 | |
3694 | 4582 static int gaim_email_parseupdate(aim_session_t *sess, aim_frame_t *fr, ...) { |
4583 va_list ap; | |
5575 | 4584 GaimConnection *gc = sess->aux_data; |
3694 | 4585 struct aim_emailinfo *emailinfo; |
3725 | 4586 int havenewmail; |
7297 | 4587 char *alertitle, *alerturl; |
3694 | 4588 |
4589 va_start(ap, fr); | |
4590 emailinfo = va_arg(ap, struct aim_emailinfo *); | |
3725 | 4591 havenewmail = va_arg(ap, int); |
7301 | 4592 alertitle = va_arg(ap, char *); |
4593 alerturl = va_arg(ap, char *); | |
3694 | 4594 va_end(ap); |
4595 | |
9661 | 4596 if ((emailinfo != NULL) && gaim_account_get_check_mail(gc->account)) { |
4597 gchar *to = g_strdup_printf("%s%s%s", gaim_account_get_username(gaim_connection_get_account(gc)), | |
4598 emailinfo->domain ? "@" : "", | |
4599 emailinfo->domain ? emailinfo->domain : ""); | |
5542 | 4600 if (emailinfo->unread && havenewmail) |
4601 gaim_notify_emails(gc, emailinfo->nummsgs, FALSE, NULL, NULL, (const char **)&to, (const char **)&emailinfo->url, NULL, NULL); | |
5537 | 4602 g_free(to); |
3694 | 4603 } |
10157 | 4604 |
7301 | 4605 if (alertitle) |
8660 | 4606 gaim_debug_misc("oscar", "Got an alert '%s' %s\n", alertitle, alerturl ? alerturl : ""); |
3694 | 4607 |
4608 return 1; | |
4609 } | |
4610 | |
4804 | 4611 static int gaim_icon_error(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4612 GaimConnection *gc = sess->aux_data; |
7283 | 4613 OscarData *od = gc->proto_data; |
4804 | 4614 char *sn; |
4615 | |
4616 sn = od->requesticon->data; | |
8660 | 4617 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4618 "removing %s from hash table\n", sn); |
4804 | 4619 od->requesticon = g_slist_remove(od->requesticon, sn); |
4620 free(sn); | |
4621 | |
4622 if (od->icontimer) | |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
4623 gaim_timeout_remove(od->icontimer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
4624 od->icontimer = gaim_timeout_add(500, gaim_icon_timerfunc, gc); |
4804 | 4625 |
4626 return 1; | |
4627 } | |
4628 | |
4629 static int gaim_icon_parseicon(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 4630 GaimConnection *gc = sess->aux_data; |
7283 | 4631 OscarData *od = gc->proto_data; |
4804 | 4632 GSList *cur; |
4633 va_list ap; | |
4634 char *sn; | |
4853 | 4635 fu8_t *iconcsum, *icon; |
4636 fu16_t iconcsumlen, iconlen; | |
4804 | 4637 |
4638 va_start(ap, fr); | |
4639 sn = va_arg(ap, char *); | |
4853 | 4640 iconcsum = va_arg(ap, fu8_t *); |
4641 iconcsumlen = va_arg(ap, int); | |
4804 | 4642 icon = va_arg(ap, fu8_t *); |
4643 iconlen = va_arg(ap, int); | |
4644 va_end(ap); | |
4645 | |
4853 | 4646 if (iconlen > 0) { |
4647 char *b16; | |
6695 | 4648 GaimBuddy *b = gaim_find_buddy(gc->account, sn); |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
4649 gaim_buddy_icons_set_for_user(gaim_connection_get_account(gc), |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
4650 sn, icon, iconlen); |
7106
db6bd3e794d8
[gaim-migrate @ 7671]
Christian Hammond <chipx86@chipx86.com>
parents:
7098
diff
changeset
|
4651 b16 = gaim_base16_encode(iconcsum, iconcsumlen); |
5129 | 4652 if (b16) { |
7693 | 4653 gaim_blist_node_set_string((GaimBlistNode*)b, "icon_checksum", b16); |
7162 | 4654 g_free(b16); |
5129 | 4655 } |
4853 | 4656 } |
4804 | 4657 |
4658 cur = od->requesticon; | |
4659 while (cur) { | |
4660 char *cursn = cur->data; | |
4661 if (!aim_sncmp(cursn, sn)) { | |
4662 od->requesticon = g_slist_remove(od->requesticon, cursn); | |
4663 free(cursn); | |
4664 cur = od->requesticon; | |
4665 } else | |
4666 cur = cur->next; | |
4667 } | |
4668 | |
4669 if (od->icontimer) | |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
4670 gaim_timeout_remove(od->icontimer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
4671 od->icontimer = gaim_timeout_add(250, gaim_icon_timerfunc, gc); |
4804 | 4672 |
4673 return 1; | |
4674 } | |
4675 | |
4676 static gboolean gaim_icon_timerfunc(gpointer data) { | |
5575 | 4677 GaimConnection *gc = data; |
7283 | 4678 OscarData *od = gc->proto_data; |
7011 | 4679 aim_userinfo_t *userinfo; |
4804 | 4680 aim_conn_t *conn; |
4681 | |
4682 conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_ICON); | |
5892 | 4683 if (!conn) { |
4684 if (!od->iconconnecting) { | |
4685 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_ICON); | |
4686 od->iconconnecting = TRUE; | |
4687 } | |
4804 | 4688 return FALSE; |
4689 } | |
4690 | |
5842 | 4691 if (od->set_icon) { |
6039 | 4692 struct stat st; |
4693 const char *iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc)); | |
4694 if (iconfile == NULL) { | |
8363 | 4695 aim_ssi_delicon(od->sess); |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
4696 } else if (!g_stat(iconfile, &st)) { |
6039 | 4697 char *buf = g_malloc(st.st_size); |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
4698 FILE *file = g_fopen(iconfile, "rb"); |
6039 | 4699 if (file) { |
9532 | 4700 /* XXX - Use g_file_get_contents()? */ |
6039 | 4701 fread(buf, 1, st.st_size, file); |
4702 fclose(file); | |
8660 | 4703 gaim_debug_info("oscar", |
6039 | 4704 "Uploading icon to icon server\n"); |
6879 | 4705 aim_bart_upload(od->sess, buf, st.st_size); |
5842 | 4706 } else |
8660 | 4707 gaim_debug_error("oscar", |
6039 | 4708 "Can't open buddy icon file!\n"); |
4709 g_free(buf); | |
4710 } else { | |
8660 | 4711 gaim_debug_error("oscar", |
6039 | 4712 "Can't stat buddy icon file!\n"); |
5842 | 4713 } |
4714 od->set_icon = FALSE; | |
4715 } | |
4716 | |
4717 if (!od->requesticon) { | |
8660 | 4718 gaim_debug_misc("oscar", |
5842 | 4719 "no more icons to request\n"); |
4720 return FALSE; | |
4721 } | |
4722 | |
7045 | 4723 userinfo = aim_locate_finduserinfo(od->sess, (char *)od->requesticon->data); |
7011 | 4724 if ((userinfo != NULL) && (userinfo->iconcsumlen > 0)) { |
4725 aim_bart_request(od->sess, od->requesticon->data, userinfo->iconcsum, userinfo->iconcsumlen); | |
4804 | 4726 return FALSE; |
4727 } else { | |
4728 char *sn = od->requesticon->data; | |
4729 od->requesticon = g_slist_remove(od->requesticon, sn); | |
4730 free(sn); | |
4731 } | |
4732 | |
4733 return TRUE; | |
4734 } | |
4735 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4736 /* |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4737 * 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
|
4738 */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4739 static int gaim_parse_msgack(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 4740 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4741 fu16_t type; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4742 char *sn; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4743 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4744 va_start(ap, fr); |
4199 | 4745 type = (fu16_t) va_arg(ap, unsigned int); |
2086 | 4746 sn = va_arg(ap, char *); |
4747 va_end(ap); | |
4748 | |
8660 | 4749 gaim_debug_info("oscar", "Sent message to %s.\n", sn); |
2086 | 4750 |
4751 return 1; | |
4752 } | |
4753 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4754 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
|
4755 static const char *codes[5] = { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4756 "invalid", |
4194 | 4757 "change", |
4758 "warning", | |
4759 "limit", | |
4760 "limit cleared", | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4761 }; |
2086 | 4762 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4763 fu16_t code, rateclass; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4764 fu32_t windowsize, clear, alert, limit, disconnect, currentavg, maxavg; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4765 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4766 va_start(ap, fr); |
4200 | 4767 code = (fu16_t)va_arg(ap, unsigned int); |
4768 rateclass= (fu16_t)va_arg(ap, unsigned int); | |
4769 windowsize = va_arg(ap, fu32_t); | |
4770 clear = va_arg(ap, fu32_t); | |
4771 alert = va_arg(ap, fu32_t); | |
4772 limit = va_arg(ap, fu32_t); | |
4773 disconnect = va_arg(ap, fu32_t); | |
4774 currentavg = va_arg(ap, fu32_t); | |
4775 maxavg = va_arg(ap, fu32_t); | |
2086 | 4776 va_end(ap); |
4777 | |
8660 | 4778 gaim_debug_misc("oscar", |
5556 | 4779 "rate %s (param ID 0x%04hx): curavg = %u, maxavg = %u, alert at %u, " |
4780 "clear warning at %u, limit at %u, disconnect at %u (window size = %u)\n", | |
2086 | 4781 (code < 5) ? codes[code] : codes[0], |
4782 rateclass, | |
4783 currentavg, maxavg, | |
4784 alert, clear, | |
4785 limit, disconnect, | |
4786 windowsize); | |
4787 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4788 /* XXX fix these values */ |
2086 | 4789 if (code == AIM_RATE_CODE_CHANGE) { |
4790 if (currentavg >= clear) | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4791 aim_conn_setlatency(fr->conn, 0); |
2086 | 4792 } else if (code == AIM_RATE_CODE_WARNING) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4793 aim_conn_setlatency(fr->conn, windowsize/4); |
2909
48ec70928d7f
[gaim-migrate @ 2922]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2906
diff
changeset
|
4794 } else if (code == AIM_RATE_CODE_LIMIT) { |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4795 gaim_notify_error(sess->aux_data, NULL, _("Rate limiting error."), |
6040 | 4796 _("The last action you attempted could not be " |
4797 "performed because you are over the rate limit. " | |
4798 "Please wait 10 seconds and try again.")); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4799 aim_conn_setlatency(fr->conn, windowsize/2); |
2086 | 4800 } else if (code == AIM_RATE_CODE_CLEARLIMIT) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4801 aim_conn_setlatency(fr->conn, 0); |
2086 | 4802 } |
4803 | |
4804 return 1; | |
4805 } | |
4806 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4807 static int gaim_parse_evilnotify(aim_session_t *sess, aim_frame_t *fr, ...) { |
9982 | 4808 GaimConnection *gc = sess->aux_data; |
4809 GaimAccount *account = gaim_connection_get_account(gc); | |
2086 | 4810 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4811 fu16_t newevil; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4812 aim_userinfo_t *userinfo; |
2086 | 4813 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4814 va_start(ap, fr); |
4199 | 4815 newevil = (fu16_t) va_arg(ap, unsigned int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4816 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 4817 va_end(ap); |
4818 | |
9982 | 4819 /* XXX - What's with the + 0.5? */ |
4820 gaim_prpl_got_account_warning_level(account, (userinfo && userinfo->sn) ? userinfo->sn : NULL, (newevil/10.0) + 0.5); | |
2086 | 4821 |
4822 return 1; | |
4823 } | |
4824 | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4825 static int gaim_selfinfo(aim_session_t *sess, aim_frame_t *fr, ...) { |
9982 | 4826 GaimConnection *gc = sess->aux_data; |
4827 GaimAccount *account = gaim_connection_get_account(gc); | |
10152 | 4828 GaimPresence *presence = gaim_account_get_presence(account); |
9982 | 4829 int warning_level; |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4830 va_list ap; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4831 aim_userinfo_t *info; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4832 |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4833 va_start(ap, fr); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4834 info = va_arg(ap, aim_userinfo_t *); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4835 va_end(ap); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4836 |
9982 | 4837 warning_level = info->warnlevel/10.0 + 0.5; |
4838 | |
10152 | 4839 gaim_presence_set_warning_level(presence, warning_level); |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4840 |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4841 return 1; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4842 } |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4843 |
4649 | 4844 static int gaim_connerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4845 GaimConnection *gc = sess->aux_data; |
7283 | 4846 OscarData *od = gc->proto_data; |
4649 | 4847 va_list ap; |
4848 fu16_t code; | |
4849 char *msg; | |
4850 | |
4851 va_start(ap, fr); | |
4852 code = (fu16_t)va_arg(ap, int); | |
4853 msg = va_arg(ap, char *); | |
4854 va_end(ap); | |
4855 | |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
4856 gaim_debug_info("oscar", "Disconnected. Code is 0x%04x and msg is %s\n", |
10458 | 4857 code, (msg != NULL ? msg : "")); |
4858 | |
4859 g_return_val_if_fail(fr != NULL, 1); | |
4860 g_return_val_if_fail(fr->conn != NULL, 1); | |
4861 | |
4862 if (fr->conn->type == AIM_CONN_TYPE_BOS) { | |
4651 | 4863 if (code == 0x0001) { |
6113 | 4864 gc->wants_to_die = TRUE; |
10715 | 4865 gaim_connection_error(gc, _("You have signed on from another location.")); |
4651 | 4866 } else { |
5579 | 4867 gaim_connection_error(gc, _("You have been signed off for an unknown reason.")); |
4651 | 4868 } |
4666 | 4869 od->killme = TRUE; |
10458 | 4870 } else if (fr->conn->type == AIM_CONN_TYPE_CHAT) { |
4871 struct chat_connection *cc; | |
4872 GaimConversation *conv; | |
4873 | |
4874 cc = find_oscar_chat_by_conn(gc, fr->conn); | |
4875 conv = gaim_find_chat(gc, cc->id); | |
4876 | |
4877 if (conv != NULL) | |
4878 { | |
4879 gchar *buf; | |
4880 buf = g_strdup_printf(_("You have been disconnected from chat " | |
4881 "room %s."), cc->name); | |
4882 gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_ERROR, time(NULL)); | |
4883 g_free(buf); | |
4884 } | |
4885 oscar_chat_kill(gc, cc); | |
4649 | 4886 } |
4887 | |
4888 return 1; | |
4889 } | |
4890 | |
2675 | 4891 static int conninitdone_bos(aim_session_t *sess, aim_frame_t *fr, ...) { |
7283 | 4892 GaimConnection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4893 |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4894 aim_reqpersonalinfo(sess, fr->conn); |
4230 | 4895 |
8660 | 4896 gaim_debug_info("oscar", "ssi: requesting rights and list\n"); |
4889 | 4897 aim_ssi_reqrights(sess); |
6350 | 4898 aim_ssi_reqdata(sess); |
4230 | 4899 |
7011 | 4900 aim_locate_reqrights(sess); |
7285 | 4901 aim_buddylist_reqrights(sess, fr->conn); |
4617 | 4902 aim_im_reqparams(sess); |
7334 | 4903 aim_bos_reqrights(sess, fr->conn); /* XXX - Don't call this with ssi */ |
4230 | 4904 |
7283 | 4905 gaim_connection_update_progress(gc, _("Finalizing connection"), 5, OSCAR_CONNECT_STEPS); |
4906 | |
2086 | 4907 return 1; |
4908 } | |
4909 | |
2675 | 4910 static int conninitdone_admin(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4911 GaimConnection *gc = sess->aux_data; |
7283 | 4912 OscarData *od = gc->proto_data; |
2647 | 4913 |
6905 | 4914 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ADM, 0x0003, gaim_info_change, 0); |
4915 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ADM, 0x0005, gaim_info_change, 0); | |
4916 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ADM, 0x0007, gaim_account_confirm, 0); | |
4917 | |
2672 | 4918 aim_clientready(sess, fr->conn); |
8660 | 4919 gaim_debug_info("oscar", "connected to admin\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4920 |
2647 | 4921 if (od->chpass) { |
8660 | 4922 gaim_debug_info("oscar", "changing password\n"); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4923 aim_admin_changepasswd(sess, fr->conn, od->newp, od->oldp); |
2647 | 4924 g_free(od->oldp); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4925 od->oldp = NULL; |
2647 | 4926 g_free(od->newp); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4927 od->newp = NULL; |
2647 | 4928 od->chpass = FALSE; |
4929 } | |
2979 | 4930 if (od->setnick) { |
8660 | 4931 gaim_debug_info("oscar", "formatting screen name\n"); |
2979 | 4932 aim_admin_setnick(sess, fr->conn, od->newsn); |
4933 g_free(od->newsn); | |
4934 od->newsn = NULL; | |
4935 od->setnick = FALSE; | |
4936 } | |
2647 | 4937 if (od->conf) { |
8660 | 4938 gaim_debug_info("oscar", "confirming account\n"); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4939 aim_admin_reqconfirm(sess, fr->conn); |
2647 | 4940 od->conf = FALSE; |
4941 } | |
4942 if (od->reqemail) { | |
8660 | 4943 gaim_debug_info("oscar", "requesting email\n"); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4944 aim_admin_getinfo(sess, fr->conn, 0x0011); |
2647 | 4945 od->reqemail = FALSE; |
4946 } | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4947 if (od->setemail) { |
8660 | 4948 gaim_debug_info("oscar", "setting email\n"); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4949 aim_admin_setemail(sess, fr->conn, od->email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4950 g_free(od->email); |
5497 | 4951 od->email = NULL; |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4952 od->setemail = FALSE; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4953 } |
2647 | 4954 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4955 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4956 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4957 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4958 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
|
4959 struct aim_icbmparameters *params; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4960 va_list ap; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4961 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4962 va_start(ap, fr); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4963 params = va_arg(ap, struct aim_icbmparameters *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4964 va_end(ap); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4965 |
4194 | 4966 /* XXX - evidently this crashes on solaris. i have no clue why |
8660 | 4967 gaim_debug_misc("oscar", "ICBM Parameters: maxchannel = %hu, default flags = 0x%08lx, max msg len = %hu, " |
5556 | 4968 "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
|
4969 params->maxchan, params->flags, params->maxmsglen, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4970 ((float)params->maxsenderwarn)/10.0, ((float)params->maxrecverwarn)/10.0, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4971 params->minmsginterval); |
2427
5bc3b39fc0a5
[gaim-migrate @ 2440]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2421
diff
changeset
|
4972 */ |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4973 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4974 /* Maybe senderwarn and recverwarn should be user preferences... */ |
3595 | 4975 params->flags = 0x0000000b; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4976 params->maxmsglen = 8000; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4977 params->minmsginterval = 0; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4978 |
4617 | 4979 aim_im_setparams(sess, params); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4980 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4981 return 1; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4982 } |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4983 |
2993 | 4984 static int gaim_parse_locaterights(aim_session_t *sess, aim_frame_t *fr, ...) |
4985 { | |
5575 | 4986 GaimConnection *gc = sess->aux_data; |
7283 | 4987 OscarData *od = (OscarData *)gc->proto_data; |
5306 | 4988 va_list ap; |
4989 fu16_t maxsiglen; | |
2993 | 4990 |
4991 va_start(ap, fr); | |
4199 | 4992 maxsiglen = (fu16_t) va_arg(ap, int); |
2993 | 4993 va_end(ap); |
4994 | |
8660 | 4995 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4996 "locate rights: max sig len = %d\n", maxsiglen); |
2993 | 4997 |
4617 | 4998 od->rights.maxsiglen = od->rights.maxawaymsglen = (guint)maxsiglen; |
4999 | |
5000 if (od->icq) | |
7334 | 5001 aim_locate_setcaps(od->sess, caps_icq); |
5301 | 5002 else |
7334 | 5003 aim_locate_setcaps(od->sess, caps_aim); |
5004 oscar_set_info(gc, gc->account->user_info); | |
2993 | 5005 |
5006 return 1; | |
5007 } | |
5008 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5009 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
|
5010 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5011 fu16_t maxbuddies, maxwatchers; |
5575 | 5012 GaimConnection *gc = sess->aux_data; |
7283 | 5013 OscarData *od = (OscarData *)gc->proto_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5014 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5015 va_start(ap, fr); |
4199 | 5016 maxbuddies = (fu16_t) va_arg(ap, unsigned int); |
5017 maxwatchers = (fu16_t) va_arg(ap, unsigned int); | |
2086 | 5018 va_end(ap); |
5019 | |
8660 | 5020 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5021 "buddy list rights: Max buddies = %hu / Max watchers = %hu\n", maxbuddies, maxwatchers); |
2086 | 5022 |
4617 | 5023 od->rights.maxbuddies = (guint)maxbuddies; |
5024 od->rights.maxwatchers = (guint)maxwatchers; | |
2993 | 5025 |
2086 | 5026 return 1; |
5027 } | |
5028 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5029 static int gaim_bosrights(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 5030 GaimConnection *gc = sess->aux_data; |
7283 | 5031 OscarData *od = (OscarData *)gc->proto_data; |
10570 | 5032 GaimAccount *account = gaim_connection_get_account(gc); |
7334 | 5033 va_list ap; |
5034 fu16_t maxpermits, maxdenies; | |
2086 | 5035 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5036 va_start(ap, fr); |
4199 | 5037 maxpermits = (fu16_t) va_arg(ap, unsigned int); |
5038 maxdenies = (fu16_t) va_arg(ap, unsigned int); | |
2086 | 5039 va_end(ap); |
5040 | |
8660 | 5041 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5042 "BOS rights: Max permit = %hu / Max deny = %hu\n", maxpermits, maxdenies); |
2086 | 5043 |
4617 | 5044 od->rights.maxpermits = (guint)maxpermits; |
5045 od->rights.maxdenies = (guint)maxdenies; | |
2993 | 5046 |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
5047 gaim_connection_set_state(gc, GAIM_CONNECTED); |
2993 | 5048 |
8660 | 5049 gaim_debug_info("oscar", "buddy list loaded\n"); |
2993 | 5050 |
2672 | 5051 aim_clientready(sess, fr->conn); |
5948 | 5052 aim_srv_setavailmsg(sess, NULL); |
7474 | 5053 aim_srv_setidle(sess, 0); |
4617 | 5054 |
4664 | 5055 if (od->icq) { |
5056 aim_icq_reqofflinemsgs(sess); | |
10570 | 5057 aim_icq_setsecurity(sess, |
5058 gaim_account_get_bool(account, "authorization", OSCAR_DEFAULT_AUTHORIZATION), | |
5059 gaim_account_get_bool(account, "web_aware", OSCAR_DEFAULT_WEB_AWARE), | |
5060 gaim_account_get_bool(account, "hide_ip", OSCAR_DEFAULT_HIDE_IP)); | |
4664 | 5061 } |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5062 |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
5063 aim_reqservice(sess, fr->conn, AIM_CONN_TYPE_CHATNAV); |
4102 | 5064 if (sess->authinfo->email) |
5065 aim_reqservice(sess, fr->conn, AIM_CONN_TYPE_EMAIL); | |
2086 | 5066 |
5067 return 1; | |
5068 } | |
5069 | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5070 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
|
5071 va_list ap; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5072 struct aim_icq_offlinemsg *msg; |
4075 | 5073 struct aim_incomingim_ch4_args args; |
5074 time_t t; | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5075 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5076 va_start(ap, fr); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5077 msg = va_arg(ap, struct aim_icq_offlinemsg *); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5078 va_end(ap); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5079 |
8660 | 5080 gaim_debug_info("oscar", |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
5081 "Received offline message. Converting to channel 4 ICBM...\n"); |
4075 | 5082 args.uin = msg->sender; |
5083 args.type = msg->type; | |
4173 | 5084 args.flags = msg->flags; |
4076 | 5085 args.msglen = msg->msglen; |
4075 | 5086 args.msg = msg->msg; |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
5087 t = gaim_time_build(msg->year, msg->month, msg->day, msg->hour, msg->minute, 0); |
4075 | 5088 incomingim_chan4(sess, fr->conn, NULL, &args, t); |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5089 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5090 return 1; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5091 } |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5092 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5093 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
|
5094 { |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5095 aim_icq_ackofflinemsgs(sess); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5096 return 1; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5097 } |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
5098 |
7388 | 5099 #if 0 |
5100 /* | |
7465 | 5101 * Update, 2003-11-09: |
5102 * Joseph S. Myers, a gcc dude, fixed this for gcc 3.4! Rock on! | |
5103 * | |
7388 | 5104 * It may not be my place to do this, but... |
5105 * I feel pretty strongly that the "last 2 digits" warning is ridiculously | |
5106 * stupid, and should not exist for % switches (%x in our case) that request | |
5107 * a year in the preferred representation for the current locale. For that | |
5108 * reason I've chosen to not use this workaround (n., see kluge). | |
5109 * | |
5110 * I have a date. I want to show it to the user in the "preferred" way. | |
5111 * Whether that displays a 2 digit year is perfectly fine--after all, it's | |
5112 * what the locale wanted. | |
5113 * | |
5114 * If I have a necessity for a full representation of the year in the current | |
5115 * locale, then I'll use a switch that returns a full representation of the | |
5116 * year. | |
5117 * | |
5118 * If you think the preferred locale should show 4 digits instead of 2 digits | |
5119 * (because you're anal, or whatever), then change the f***ing locale. | |
5120 * | |
5121 * I guess the bottom line is--I'm trying to show a date to the user how they | |
5122 * prefer to see it, why the hell does gcc want me to change that? | |
7389 | 5123 * |
5124 * See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=3190 | |
5125 * See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=8714 | |
7388 | 5126 */ |
5127 | |
5128 /* | |
5129 * This function was recommended by the STRFTIME(3) man page to remove the | |
7386 | 5130 * "last 2 digits" warning. |
5131 */ | |
10157 | 5132 static size_t my_strftime(char *s, size_t max, const char *fmt, |
7386 | 5133 const struct tm *tm) |
5134 { | |
5135 return strftime(s, max, fmt, tm); | |
5136 } | |
10636 | 5137 |
5138 /* | |
5139 * Before even realizing this was here, I went and did the same thing in util.c. | |
5140 * | |
5141 * Use gaim_strftime() | |
5142 */ | |
5143 | |
7388 | 5144 #endif |
7386 | 5145 |
4624 | 5146 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
|
5147 { |
5575 | 5148 GaimConnection *gc = sess->aux_data; |
8670 | 5149 OscarData *od = (OscarData *)gc->proto_data; |
5150 GaimBuddy *buddy; | |
8853 | 5151 struct buddyinfo *bi = NULL; |
4624 | 5152 gchar who[16]; |
8670 | 5153 GString *str; |
5154 gchar *primary, *utf8; | |
9634 | 5155 const gchar *alias; |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5156 va_list ap; |
4151 | 5157 struct aim_icq_info *info; |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5158 |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5159 va_start(ap, fr); |
4151 | 5160 info = va_arg(ap, struct aim_icq_info *); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5161 va_end(ap); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5162 |
4664 | 5163 if (!info->uin) |
5164 return 0; | |
5165 | |
8670 | 5166 str = g_string_sized_new(100); |
5556 | 5167 g_snprintf(who, sizeof(who), "%u", info->uin); |
8670 | 5168 buddy = gaim_find_buddy(gaim_connection_get_account(gc), who); |
5169 if (buddy != NULL) | |
5170 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(buddy->account, buddy->name)); | |
5171 | |
5172 g_string_append_printf(str, "<b>%s:</b> %s", _("UIN"), who); | |
8701 | 5173 oscar_string_append(str, "\n<br>", _("Nick"), info->nick); |
8670 | 5174 if ((bi != NULL) && (bi->ipaddr != 0)) { |
5175 char *tstr = g_strdup_printf("%hhu.%hhu.%hhu.%hhu", | |
5176 (bi->ipaddr & 0xff000000) >> 24, | |
5177 (bi->ipaddr & 0x00ff0000) >> 16, | |
5178 (bi->ipaddr & 0x0000ff00) >> 8, | |
5179 (bi->ipaddr & 0x000000ff)); | |
8701 | 5180 oscar_string_append(str, "\n<br>", _("IP Address"), tstr); |
8670 | 5181 g_free(tstr); |
5182 } | |
8701 | 5183 oscar_string_append(str, "\n<br>", _("First Name"), info->first); |
5184 oscar_string_append(str, "\n<br>", _("Last Name"), info->last); | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
5185 if (info->email && info->email[0] && (utf8 = gaim_utf8_try_convert(info->email))) { |
8670 | 5186 g_string_append_printf(str, "\n<br><b>%s:</b> <a href=\"mailto:%s\">%s</a>", _("Email Address"), utf8, utf8); |
5187 g_free(utf8); | |
4625 | 5188 } |
5189 if (info->numaddresses && info->email2) { | |
5190 int i; | |
5191 for (i = 0; i < info->numaddresses; i++) { | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
5192 if (info->email2[i] && info->email2[i][0] && (utf8 = gaim_utf8_try_convert(info->email2[i]))) { |
10683 | 5193 g_string_append_printf(str, "\n<br><b>%s:</b> <a href=\"mailto:%s\">%s</a>", _("Email Address"), utf8, utf8); |
8670 | 5194 g_free(utf8); |
4643 | 5195 } |
4625 | 5196 } |
4624 | 5197 } |
8701 | 5198 oscar_string_append(str, "\n<br>", _("Mobile Phone"), info->mobile); |
10022 | 5199 if (info->gender != 0) |
5200 oscar_string_append(str, "\n<br>", _("Gender"), info->gender == 1 ? _("Female") : _("Male")); | |
4624 | 5201 if (info->birthyear || info->birthmonth || info->birthday) { |
4627 | 5202 char date[30]; |
5203 struct tm tm; | |
5204 tm.tm_mday = (int)info->birthday; | |
5205 tm.tm_mon = (int)info->birthmonth-1; | |
5206 tm.tm_year = (int)info->birthyear-1900; | |
10636 | 5207 gaim_strftime(date, sizeof(date), "%x", &tm); |
8701 | 5208 oscar_string_append(str, "\n<br>", _("Birthday"), date); |
4151 | 5209 } |
4624 | 5210 if (info->age) { |
5211 char age[5]; | |
5212 snprintf(age, sizeof(age), "%hhd", info->age); | |
8701 | 5213 oscar_string_append(str, "\n<br>", _("Age"), age); |
4819 | 5214 } |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
5215 if (info->personalwebpage && info->personalwebpage[0] && (utf8 = gaim_utf8_try_convert(info->personalwebpage))) { |
8670 | 5216 g_string_append_printf(str, "\n<br><b>%s:</b> <a href=\"%s\">%s</a>", _("Personal Web Page"), utf8, utf8); |
5217 g_free(utf8); | |
4819 | 5218 } |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
5219 if (info->info && info->info[0] && (utf8 = gaim_utf8_try_convert(info->info))) { |
8670 | 5220 g_string_append_printf(str, "<hr><b>%s:</b><br>%s", _("Additional Information"), utf8); |
5221 g_free(utf8); | |
5222 } | |
10683 | 5223 g_string_append_printf(str, "<hr>"); |
4641 | 5224 if ((info->homeaddr && (info->homeaddr[0])) || (info->homecity && info->homecity[0]) || (info->homestate && info->homestate[0]) || (info->homezip && info->homezip[0])) { |
8670 | 5225 g_string_append_printf(str, "<b>%s:</b>", _("Home Address")); |
8701 | 5226 oscar_string_append(str, "\n<br>", _("Address"), info->homeaddr); |
5227 oscar_string_append(str, "\n<br>", _("City"), info->homecity); | |
5228 oscar_string_append(str, "\n<br>", _("State"), info->homestate); | |
5229 oscar_string_append(str, "\n<br>", _("Zip Code"), info->homezip); | |
10683 | 5230 g_string_append_printf(str, "\n<hr>"); |
4151 | 5231 } |
4641 | 5232 if ((info->workaddr && info->workaddr[0]) || (info->workcity && info->workcity[0]) || (info->workstate && info->workstate[0]) || (info->workzip && info->workzip[0])) { |
8670 | 5233 g_string_append_printf(str, "<b>%s:</b>", _("Work Address")); |
8701 | 5234 oscar_string_append(str, "\n<br>", _("Address"), info->workaddr); |
5235 oscar_string_append(str, "\n<br>", _("City"), info->workcity); | |
5236 oscar_string_append(str, "\n<br>", _("State"), info->workstate); | |
5237 oscar_string_append(str, "\n<br>", _("Zip Code"), info->workzip); | |
10683 | 5238 g_string_append_printf(str, "\n<hr>"); |
4624 | 5239 } |
4641 | 5240 if ((info->workcompany && info->workcompany[0]) || (info->workdivision && info->workdivision[0]) || (info->workposition && info->workposition[0]) || (info->workwebpage && info->workwebpage[0])) { |
8670 | 5241 g_string_append_printf(str, "<b>%s:</b>", _("Work Information")); |
8701 | 5242 oscar_string_append(str, "\n<br>", _("Company"), info->workcompany); |
5243 oscar_string_append(str, "\n<br>", _("Division"), info->workdivision); | |
5244 oscar_string_append(str, "\n<br>", _("Position"), info->workposition); | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
5245 if (info->workwebpage && info->workwebpage[0] && (utf8 = gaim_utf8_try_convert(info->workwebpage))) { |
8670 | 5246 g_string_append_printf(str, "\n<br><b>%s:</b> <a href=\"%s\">%s</a>", _("Web Page"), utf8, utf8); |
5247 g_free(utf8); | |
4624 | 5248 } |
10683 | 5249 g_string_append_printf(str, "\n<hr>"); |
8670 | 5250 } |
5251 | |
9634 | 5252 if (buddy != NULL) |
5253 alias = gaim_buddy_get_alias(buddy); | |
5254 else | |
5255 alias = who; | |
5256 primary = g_strdup_printf(_("ICQ Info for %s"), alias); | |
9810 | 5257 gaim_notify_userinfo(gc, who, NULL, primary, NULL, str->str, NULL, NULL); |
6873 | 5258 g_free(primary); |
8670 | 5259 g_string_free(str, TRUE); |
4151 | 5260 |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5261 return 1; |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5262 } |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5263 |
4759 | 5264 static int gaim_icqalias(aim_session_t *sess, aim_frame_t *fr, ...) |
5265 { | |
5575 | 5266 GaimConnection *gc = sess->aux_data; |
4820 | 5267 gchar who[16], *utf8; |
6695 | 5268 GaimBuddy *b; |
4759 | 5269 va_list ap; |
5270 struct aim_icq_info *info; | |
5271 | |
5272 va_start(ap, fr); | |
5273 info = va_arg(ap, struct aim_icq_info *); | |
5274 va_end(ap); | |
5275 | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
5276 if (info->uin && info->nick && info->nick[0] && (utf8 = gaim_utf8_try_convert(info->nick))) { |
5556 | 5277 g_snprintf(who, sizeof(who), "%u", info->uin); |
4820 | 5278 serv_got_alias(gc, who, utf8); |
4759 | 5279 if ((b = gaim_find_buddy(gc->account, who))) { |
7693 | 5280 gaim_blist_node_set_string((GaimBlistNode*)b, "servernick", utf8); |
4759 | 5281 } |
4820 | 5282 g_free(utf8); |
4759 | 5283 } |
5284 | |
5285 return 1; | |
5286 } | |
5287 | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5288 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
|
5289 { |
7032 | 5290 GaimConnection *gc = sess->aux_data; |
5291 gchar *text; | |
5292 va_list ap; | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5293 char *msg, *url; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5294 fu16_t wid, hei, delay; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5295 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5296 va_start(ap, fr); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5297 msg = va_arg(ap, char *); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5298 url = va_arg(ap, char *); |
4199 | 5299 wid = (fu16_t) va_arg(ap, int); |
5300 hei = (fu16_t) va_arg(ap, int); | |
5301 delay = (fu16_t) va_arg(ap, int); | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5302 va_end(ap); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5303 |
7032 | 5304 text = g_strdup_printf("%s<br><a href=\"%s\">%s</a>", msg, url, url); |
5305 gaim_notify_formatted(gc, NULL, _("Pop-Up Message"), NULL, text, NULL, NULL); | |
5306 g_free(text); | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5307 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5308 return 1; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5309 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5310 |
7032 | 5311 static int gaim_parse_searchreply(aim_session_t *sess, aim_frame_t *fr, ...) |
5312 { | |
6873 | 5313 GaimConnection *gc = sess->aux_data; |
5314 gchar *secondary; | |
10439 | 5315 gchar **screennames; |
6873 | 5316 int i, num; |
2086 | 5317 va_list ap; |
6873 | 5318 char *email, *SNs; |
2086 | 5319 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5320 va_start(ap, fr); |
6873 | 5321 email = va_arg(ap, char *); |
2086 | 5322 num = va_arg(ap, int); |
5323 SNs = va_arg(ap, char *); | |
5324 va_end(ap); | |
5325 | |
10439 | 5326 /* TODO: Need to use ngettext() here */ |
8152 | 5327 secondary = g_strdup_printf(_("The following screen names are associated with %s"), email); |
10439 | 5328 |
5329 screennames = g_malloc((num + 1) * sizeof(gchar *)); | |
2086 | 5330 for (i = 0; i < num; i++) |
10439 | 5331 screennames[i] = g_strdup(&SNs[i * (MAXSNLEN + 1)]); |
5332 screennames[num] = NULL; | |
5333 | |
5334 gaim_notify_searchresults(gc, NULL, NULL, secondary, | |
5335 (const char **)screennames, NULL, NULL); | |
6873 | 5336 |
5337 g_free(secondary); | |
10439 | 5338 g_strfreev(screennames); |
2086 | 5339 |
5340 return 1; | |
5341 } | |
5342 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5343 static int gaim_parse_searcherror(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 5344 va_list ap; |
6873 | 5345 char *email; |
5420 | 5346 char *buf; |
2086 | 5347 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5348 va_start(ap, fr); |
6873 | 5349 email = va_arg(ap, char *); |
2086 | 5350 va_end(ap); |
5351 | |
6873 | 5352 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
|
5353 gaim_notify_error(sess->aux_data, NULL, buf, NULL); |
5420 | 5354 g_free(buf); |
2086 | 5355 |
5356 return 1; | |
5357 } | |
5358 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5359 static int gaim_account_confirm(aim_session_t *sess, aim_frame_t *fr, ...) { |
6873 | 5360 GaimConnection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5361 fu16_t status; |
2086 | 5362 va_list ap; |
5363 char msg[256]; | |
5364 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5365 va_start(ap, fr); |
4199 | 5366 status = (fu16_t) va_arg(ap, unsigned int); /* status code of confirmation request */ |
2086 | 5367 va_end(ap); |
5368 | |
8660 | 5369 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5370 "account confirmation returned status 0x%04x (%s)\n", status, |
3912 | 5371 status ? "unknown" : "email sent"); |
5372 if (!status) { | |
5302 | 5373 g_snprintf(msg, sizeof(msg), _("You should receive an email asking to confirm %s."), |
5575 | 5374 gaim_account_get_username(gaim_connection_get_account(gc))); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5375 gaim_notify_info(gc, NULL, _("Account Confirmation Requested"), msg); |
2086 | 5376 } |
5377 | |
5378 return 1; | |
5379 } | |
5380 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5381 static int gaim_info_change(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 5382 GaimConnection *gc = sess->aux_data; |
2086 | 5383 va_list ap; |
3912 | 5384 fu16_t perms, err; |
5385 char *url, *sn, *email; | |
5386 int change; | |
2086 | 5387 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5388 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5389 change = va_arg(ap, int); |
4199 | 5390 perms = (fu16_t) va_arg(ap, unsigned int); |
5391 err = (fu16_t) va_arg(ap, unsigned int); | |
3912 | 5392 url = va_arg(ap, char *); |
5393 sn = va_arg(ap, char *); | |
5394 email = va_arg(ap, char *); | |
2086 | 5395 va_end(ap); |
5396 | |
8660 | 5397 gaim_debug_misc("oscar", |
9626 | 5398 "account info: because of %s, perms=0x%04x, err=0x%04x, url=%s, sn=%s, email=%s\n", |
5399 change ? "change" : "request", perms, err, | |
5400 (url != NULL) ? url : "(null)", | |
5401 (sn != NULL) ? sn : "(null)", | |
5402 (email != NULL) ? email : "(null)"); | |
5403 | |
5404 if ((err > 0) && (url != NULL)) { | |
3912 | 5405 char *dialog_msg; |
5406 char *dialog_top = g_strdup_printf(_("Error Changing Account Info")); | |
5407 switch (err) { | |
5408 case 0x0001: { | |
5409 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name differs from the original."), err); | |
5410 } break; | |
5411 case 0x0006: { | |
5412 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name ends in a space."), err); | |
5413 } break; | |
5414 case 0x000b: { | |
5415 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name is too long."), err); | |
5416 } break; | |
5417 case 0x001d: { | |
5418 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); | |
5419 } break; | |
5420 case 0x0021: { | |
5421 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); | |
5422 } break; | |
5423 case 0x0023: { | |
5424 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to change email address because the given address is invalid."), err); | |
5425 } break; | |
5426 default: { | |
5427 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unknown error."), err); | |
5428 } break; | |
5429 } | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5430 gaim_notify_error(gc, NULL, dialog_top, dialog_msg); |
3912 | 5431 g_free(dialog_top); |
5432 g_free(dialog_msg); | |
5433 return 1; | |
5434 } | |
5435 | |
9626 | 5436 if (sn != NULL) { |
4585 | 5437 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
|
5438 gaim_notify_info(gc, NULL, _("Account Info"), dialog_msg); |
3912 | 5439 g_free(dialog_msg); |
5440 } | |
5441 | |
9626 | 5442 if (email != NULL) { |
5575 | 5443 char *dialog_msg = g_strdup_printf(_("The email address for %s is %s"), |
5444 gaim_account_get_username(gaim_connection_get_account(gc)), email); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5445 gaim_notify_info(gc, NULL, _("Account Info"), dialog_msg); |
3912 | 5446 g_free(dialog_msg); |
2086 | 5447 } |
5448 | |
5449 return 1; | |
5450 } | |
5451 | |
5575 | 5452 static void oscar_keepalive(GaimConnection *gc) { |
7283 | 5453 OscarData *od = (OscarData *)gc->proto_data; |
4617 | 5454 aim_flap_nop(od->sess, od->conn); |
2086 | 5455 } |
5456 | |
6059 | 5457 static int oscar_send_typing(GaimConnection *gc, const char *name, int typing) { |
7283 | 5458 OscarData *od = (OscarData *)gc->proto_data; |
8971 | 5459 struct oscar_direct_im *dim = oscar_direct_im_find(od, name); |
5460 if (dim && dim->connected) | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
5461 if (typing == GAIM_TYPING) |
4870 | 5462 aim_odc_send_typing(od->sess, dim->conn, 0x0002); |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
5463 else if (typing == GAIM_TYPED) |
4870 | 5464 aim_odc_send_typing(od->sess, dim->conn, 0x0001); |
5465 else | |
5466 aim_odc_send_typing(od->sess, dim->conn, 0x0000); | |
3595 | 5467 else { |
5300 | 5468 /* Don't send if this turkey is in our deny list */ |
5469 GSList *list; | |
5470 for (list=gc->account->deny; (list && aim_sncmp(name, list->data)); list=list->next); | |
5471 if (!list) { | |
7261 | 5472 struct buddyinfo *bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(gc->account, name)); |
5300 | 5473 if (bi && bi->typingnot) { |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
5474 if (typing == GAIM_TYPING) |
5300 | 5475 aim_im_sendmtn(od->sess, 0x0001, name, 0x0002); |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
5476 else if (typing == GAIM_TYPED) |
5300 | 5477 aim_im_sendmtn(od->sess, 0x0001, name, 0x0001); |
5478 else | |
5479 aim_im_sendmtn(od->sess, 0x0001, name, 0x0000); | |
5480 } | |
3595 | 5481 } |
5482 } | |
2993 | 5483 return 0; |
5484 } | |
9030 | 5485 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
5486 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
|
5487 |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
5488 static int oscar_send_im(GaimConnection *gc, const char *name, const char *message, GaimConvImFlags imflags) { |
7283 | 5489 OscarData *od = (OscarData *)gc->proto_data; |
10246 | 5490 GaimAccount *account = gaim_connection_get_account(gc); |
8971 | 5491 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
|
5492 int ret = 0; |
10246 | 5493 const char *iconfile = gaim_account_get_buddy_icon(account); |
10781 | 5494 char *tmpmsg = NULL; |
3458 | 5495 |
4838 | 5496 if (dim && dim->connected) { |
5497 /* If we're directly connected, send a direct IM */ | |
6982 | 5498 ret = gaim_odc_send_im(od->sess, dim->conn, message, imflags); |
2086 | 5499 } else { |
4738 | 5500 struct buddyinfo *bi; |
3008 | 5501 struct aim_sendimext_args args; |
5502 struct stat st; | |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
5503 gsize len; |
10246 | 5504 GaimConversation *conv; |
5505 | |
5506 conv = gaim_find_conversation_with_account(GAIM_CONV_IM, name, account); | |
8962 | 5507 |
5508 if (strstr(message, "<IMG ")) | |
5509 gaim_conversation_write(conv, "", | |
5510 _("Your IM Image was not sent. " | |
5511 "You must be Direct Connected to send IM Images."), | |
5512 GAIM_MESSAGE_ERROR, time(NULL)); | |
4269 | 5513 |
10246 | 5514 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(account, name)); |
4738 | 5515 if (!bi) { |
5516 bi = g_new0(struct buddyinfo, 1); | |
10246 | 5517 g_hash_table_insert(od->buddyinfo, g_strdup(gaim_normalize(account, name)), bi); |
4738 | 5518 } |
5519 | |
3008 | 5520 args.flags = AIM_IMFLAGS_ACK | AIM_IMFLAGS_CUSTOMFEATURES; |
4665 | 5521 if (od->icq) { |
5522 args.features = features_icq; | |
5523 args.featureslen = sizeof(features_icq); | |
3008 | 5524 args.flags |= AIM_IMFLAGS_OFFLINE; |
4665 | 5525 } else { |
5526 args.features = features_aim; | |
5527 args.featureslen = sizeof(features_aim); | |
4972 | 5528 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
5529 if (imflags & GAIM_CONV_IM_AUTO_RESP) |
4972 | 5530 args.flags |= AIM_IMFLAGS_AWAY; |
4665 | 5531 } |
4269 | 5532 |
4738 | 5533 if (bi->ico_need) { |
8660 | 5534 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5535 "Sending buddy icon request with message\n"); |
3008 | 5536 args.flags |= AIM_IMFLAGS_BUDDYREQ; |
4738 | 5537 bi->ico_need = FALSE; |
3008 | 5538 } |
4269 | 5539 |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
5540 if (iconfile && !g_stat(iconfile, &st)) { |
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
5541 FILE *file = g_fopen(iconfile, "rb"); |
3008 | 5542 if (file) { |
5543 char *buf = g_malloc(st.st_size); | |
9532 | 5544 /* XXX - Use g_file_get_contents()? */ |
3008 | 5545 fread(buf, 1, st.st_size, file); |
6039 | 5546 fclose(file); |
4269 | 5547 |
3008 | 5548 args.iconlen = st.st_size; |
4617 | 5549 args.iconsum = aimutil_iconsum(buf, st.st_size); |
3008 | 5550 args.iconstamp = st.st_mtime; |
5551 | |
7406 | 5552 if ((args.iconlen != bi->ico_me_len) || (args.iconsum != bi->ico_me_csum) || (args.iconstamp != bi->ico_me_time)) { |
4738 | 5553 bi->ico_informed = FALSE; |
7406 | 5554 bi->ico_sent = FALSE; |
5555 } | |
4738 | 5556 |
5557 if (!bi->ico_informed) { | |
8660 | 5558 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5559 "Claiming to have a buddy icon\n"); |
4738 | 5560 args.flags |= AIM_IMFLAGS_HASICON; |
5561 bi->ico_me_len = args.iconlen; | |
5562 bi->ico_me_csum = args.iconsum; | |
5563 bi->ico_me_time = args.iconstamp; | |
5564 bi->ico_informed = TRUE; | |
5565 } | |
5566 | |
3008 | 5567 g_free(buf); |
2086 | 5568 } |
5569 } | |
4269 | 5570 |
3008 | 5571 args.destsn = name; |
4269 | 5572 |
8985 | 5573 /* |
10781 | 5574 * If we're IMing an ICQ user from an ICQ account, then strip HTML |
5575 * and use \r\n as the newline character. | |
8985 | 5576 */ |
10781 | 5577 if (aim_sn_is_icq(gaim_account_get_username(account))) { |
5578 if (aim_sn_is_icq(name)) | |
5579 /* From ICQ to ICQ */ | |
8995 | 5580 tmpmsg = g_strdup(message); |
10781 | 5581 else |
5582 /* From ICQ to AIM */ | |
5583 tmpmsg = g_markup_escape_text(message, -1); | |
8995 | 5584 } else { |
10785 | 5585 /* From AIM to AIM and AIM to ICQ */ |
5586 tmpmsg = g_strdup(message); | |
8995 | 5587 } |
6310 | 5588 len = strlen(tmpmsg); |
5589 | |
9830 | 5590 gaim_plugin_oscar_convert_to_best_encoding(gc, name, tmpmsg, (char **)&args.msg, &args.msglen, &args.charset, &args.charsubset); |
5591 gaim_debug_info("oscar", "Sending IM, charset=0x%04hx, charsubset=0x%04hx, length=%d\n", | |
5592 args.charset, args.charsubset, args.msglen); | |
4617 | 5593 ret = aim_im_sendch1_ext(od->sess, &args); |
9830 | 5594 g_free((char *)args.msg); |
2086 | 5595 } |
4838 | 5596 |
6310 | 5597 g_free(tmpmsg); |
5598 | |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
5599 if (ret >= 0) |
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
5600 return 1; |
6310 | 5601 |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
5602 return ret; |
2086 | 5603 } |
5604 | |
7011 | 5605 static void oscar_get_info(GaimConnection *gc, const char *name) { |
7283 | 5606 OscarData *od = (OscarData *)gc->proto_data; |
7011 | 5607 |
9975 | 5608 if (od->icq && aim_sn_is_icq(name)) |
4624 | 5609 aim_icq_getallinfo(od->sess, name); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5610 else |
7235 | 5611 aim_locate_getinfoshort(od->sess, name, 0x00000003); |
7011 | 5612 } |
5613 | |
8950 | 5614 #if 0 |
7011 | 5615 static void oscar_set_dir(GaimConnection *gc, const char *first, const char *middle, const char *last, |
3466 | 5616 const char *maiden, const char *city, const char *state, const char *country, int web) { |
4617 | 5617 /* XXX - some of these things are wrong, but i'm lazy */ |
7283 | 5618 OscarData *od = (OscarData *)gc->proto_data; |
7011 | 5619 aim_locate_setdirinfo(od->sess, first, middle, last, |
2086 | 5620 maiden, NULL, NULL, city, state, NULL, 0, web); |
5621 } | |
8950 | 5622 #endif |
2086 | 5623 |
5575 | 5624 static void oscar_set_idle(GaimConnection *gc, int time) { |
7283 | 5625 OscarData *od = (OscarData *)gc->proto_data; |
7474 | 5626 aim_srv_setidle(od->sess, time); |
2086 | 5627 } |
5628 | |
5954 | 5629 static void oscar_set_info(GaimConnection *gc, const char *text) { |
7283 | 5630 OscarData *od = (OscarData *)gc->proto_data; |
9807 | 5631 int charset = 0; |
6019 | 5632 char *text_html = NULL; |
5129 | 5633 char *msg = NULL; |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
5634 gsize msglen = 0; |
2993 | 5635 |
4617 | 5636 if (od->rights.maxsiglen == 0) |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5637 gaim_notify_warning(gc, NULL, _("Unable to set AIM profile."), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5638 _("You have probably requested to set your " |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
5639 "profile before the login procedure completed. " |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5640 "Your profile remains unset; try setting it " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5641 "again when you are fully connected.")); |
4617 | 5642 |
7334 | 5643 if (!text) { |
5644 aim_locate_setprofile(od->sess, NULL, "", 0, NULL, NULL, 0); | |
5645 return; | |
5646 } | |
10097 | 5647 |
7334 | 5648 text_html = gaim_strdup_withhtml(text); |
9807 | 5649 charset = oscar_charset_check(text_html); |
9826 | 5650 if (charset == AIM_CHARSET_UNICODE) { |
7334 | 5651 msg = g_convert(text_html, strlen(text_html), "UCS-2BE", "UTF-8", NULL, &msglen, NULL); |
5652 aim_locate_setprofile(od->sess, "unicode-2-0", msg, (msglen > od->rights.maxsiglen ? od->rights.maxsiglen : msglen), NULL, NULL, 0); | |
5653 g_free(msg); | |
9826 | 5654 } else if (charset == AIM_CHARSET_CUSTOM) { |
7334 | 5655 msg = g_convert(text_html, strlen(text_html), "ISO-8859-1", "UTF-8", NULL, &msglen, NULL); |
5656 aim_locate_setprofile(od->sess, "iso-8859-1", msg, (msglen > od->rights.maxsiglen ? od->rights.maxsiglen : msglen), NULL, NULL, 0); | |
5657 g_free(msg); | |
5658 } else { | |
5659 msglen = strlen(text_html); | |
5660 aim_locate_setprofile(od->sess, "us-ascii", text_html, (msglen > od->rights.maxsiglen ? od->rights.maxsiglen : msglen), NULL, NULL, 0); | |
5661 } | |
5662 | |
5663 if (msglen > od->rights.maxsiglen) { | |
5664 gchar *errstr; | |
5665 errstr = g_strdup_printf(ngettext("The maximum profile length of %d byte " | |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
5666 "has been exceeded. Gaim has truncated it for you.", |
7334 | 5667 "The maximum profile length of %d bytes " |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
5668 "has been exceeded. Gaim has truncated it for you.", |
7334 | 5669 od->rights.maxsiglen), od->rights.maxsiglen); |
5670 gaim_notify_warning(gc, NULL, _("Profile too long."), errstr); | |
5671 g_free(errstr); | |
5672 } | |
5673 | |
5674 g_free(text_html); | |
2086 | 5675 } |
5676 | |
9991 | 5677 static void |
5678 oscar_set_status_aim(GaimAccount *account, GaimStatus *status) | |
2993 | 5679 { |
9991 | 5680 GaimConnection *gc = gaim_account_get_connection(account); |
10400 | 5681 OscarData *od = NULL; |
9992 | 5682 GaimStatusType *status_type; |
9991 | 5683 GaimStatusPrimitive primitive; |
5684 GaimPresence *presence; | |
5685 const gchar *status_id; | |
9807 | 5686 int charset = 0; |
10196 | 5687 const gchar *text_html = NULL; |
5129 | 5688 char *msg = NULL; |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
5689 gsize msglen = 0; |
2993 | 5690 |
9992 | 5691 status_type = gaim_status_get_type(status); |
5692 primitive = gaim_status_type_get_primitive(status_type); | |
9991 | 5693 status_id = gaim_status_get_id(status); |
5694 presence = gaim_account_get_presence(account); | |
5695 | |
10400 | 5696 if (gc) |
5697 od = (OscarData *)gc->proto_data; | |
10401 | 5698 |
5699 if ((od == NULL) || (od->rights.maxawaymsglen == 0)) { | |
9991 | 5700 gaim_notify_warning(gc, NULL, _("Unable to set AIM away message."), |
10400 | 5701 _("You have probably requested to set your " |
5702 "away message before the login procedure " | |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
5703 "completed. You remain in a \"present\" " |
10400 | 5704 "state; try setting it again when you are " |
5705 "fully connected.")); | |
10401 | 5706 return; |
5707 } | |
5129 | 5708 |
9992 | 5709 if (primitive == GAIM_STATUS_AVAILABLE) { |
10197 | 5710 aim_setextstatus(od->sess, AIM_ICQ_STATE_NORMAL); |
5711 | |
7334 | 5712 aim_locate_setprofile(od->sess, NULL, NULL, 0, NULL, "", 0); |
10198 | 5713 |
5714 text_html = gaim_status_get_attr_string(status, "message"); | |
5715 if (text_html != NULL) { | |
5716 aim_srv_setavailmsg(od->sess, text_html); | |
5717 } | |
10196 | 5718 |
5719 } else if (primitive == GAIM_STATUS_AWAY) { | |
10197 | 5720 aim_setextstatus(od->sess, AIM_ICQ_STATE_NORMAL); |
5721 | |
10196 | 5722 text_html = gaim_status_get_attr_string(status, "message"); |
5723 | |
5724 if (text_html == NULL) { | |
5725 text_html = _("Away"); | |
5726 } | |
5727 | |
5728 charset = oscar_charset_check(text_html); | |
5729 if (charset == AIM_CHARSET_UNICODE) { | |
5730 msg = g_convert(text_html, strlen(text_html), "UCS-2BE", "UTF-8", NULL, &msglen, NULL); | |
5731 aim_locate_setprofile(od->sess, NULL, NULL, 0, "unicode-2-0", msg, | |
5732 (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen)); | |
5733 g_free(msg); | |
5734 } else if (charset == AIM_CHARSET_CUSTOM) { | |
5735 msg = g_convert(text_html, strlen(text_html), "ISO-8859-1", "UTF-8", NULL, &msglen, NULL); | |
5736 aim_locate_setprofile(od->sess, NULL, NULL, 0, "iso-8859-1", msg, | |
5737 (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen)); | |
5738 g_free(msg); | |
5739 } else { | |
5740 msglen = strlen(text_html); | |
5741 aim_locate_setprofile(od->sess, NULL, NULL, 0, "us-ascii", text_html, | |
5742 (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen)); | |
5743 } | |
5744 | |
5745 if (msglen > od->rights.maxawaymsglen) { | |
5746 gchar *errstr; | |
5747 | |
5748 errstr = g_strdup_printf(ngettext("The maximum away message length of %d byte " | |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
5749 "has been exceeded. Gaim has truncated it for you.", |
10196 | 5750 "The maximum away message length of %d bytes " |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
5751 "has been exceeded. Gaim has truncated it for you.", |
10196 | 5752 od->rights.maxawaymsglen), od->rights.maxawaymsglen); |
5753 gaim_notify_warning(gc, NULL, _("Away message too long."), errstr); | |
5754 g_free(errstr); | |
5755 } | |
5756 | |
10197 | 5757 } else if (primitive == GAIM_STATUS_HIDDEN) { |
5758 aim_setextstatus(od->sess, AIM_ICQ_STATE_INVISIBLE); | |
5759 | |
5129 | 5760 } else { |
10196 | 5761 gaim_debug_info("oscar", "Don't know what to do for this status\n"); |
5762 | |
5763 } | |
2993 | 5764 } |
5765 | |
9991 | 5766 static void |
5767 oscar_set_status_icq(GaimAccount *account, GaimStatus *status) | |
2993 | 5768 { |
9991 | 5769 GaimConnection *gc = gaim_account_get_connection(account); |
10646 | 5770 OscarData *od = NULL; |
9991 | 5771 const gchar *status_id = gaim_status_get_id(status); |
5772 | |
10646 | 5773 if (gc) |
5774 od = (OscarData *)gc->proto_data; | |
5775 if (!od) | |
5776 return; | |
5777 | |
9991 | 5778 if (gaim_status_type_get_primitive(gaim_status_get_type(status)) == GAIM_STATUS_HIDDEN) |
5575 | 5779 account->perm_deny = 4; |
8265 | 5780 else |
5575 | 5781 account->perm_deny = 3; |
9991 | 5782 |
8265 | 5783 if ((od->sess->ssi.received_data) && (aim_ssi_getpermdeny(od->sess->ssi.local) != account->perm_deny)) |
5784 aim_ssi_setpermdeny(od->sess, account->perm_deny, 0xffffffff); | |
4342 | 5785 |
9991 | 5786 if (!strcmp(status_id, OSCAR_STATUS_ID_ONLINE)) |
4901 | 5787 aim_setextstatus(od->sess, AIM_ICQ_STATE_NORMAL); |
9991 | 5788 |
5789 else if (!strcmp(status_id, OSCAR_STATUS_ID_AWAY)) | |
4901 | 5790 aim_setextstatus(od->sess, AIM_ICQ_STATE_AWAY); |
9991 | 5791 |
5792 else if (!strcmp(status_id, OSCAR_STATUS_ID_DND)) | |
4901 | 5793 aim_setextstatus(od->sess, AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_DND | AIM_ICQ_STATE_BUSY); |
9991 | 5794 |
5795 else if (!strcmp(status_id, OSCAR_STATUS_ID_NA)) | |
4901 | 5796 aim_setextstatus(od->sess, AIM_ICQ_STATE_OUT | AIM_ICQ_STATE_AWAY); |
9991 | 5797 |
5798 else if (!strcmp(status_id, OSCAR_STATUS_ID_OCCUPIED)) | |
4901 | 5799 aim_setextstatus(od->sess, AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_BUSY); |
9991 | 5800 |
5801 else if (!strcmp(status_id, OSCAR_STATUS_ID_FREE4CHAT)) | |
4901 | 5802 aim_setextstatus(od->sess, AIM_ICQ_STATE_CHAT); |
9991 | 5803 |
5804 else if (!strcmp(status_id, OSCAR_STATUS_ID_INVISIBLE)) | |
4901 | 5805 aim_setextstatus(od->sess, AIM_ICQ_STATE_INVISIBLE); |
9991 | 5806 |
5807 else if (!strcmp(status_id, OSCAR_STATUS_ID_CUSTOM)) | |
5808 aim_setextstatus(od->sess, AIM_ICQ_STATE_OUT | AIM_ICQ_STATE_AWAY); | |
2993 | 5809 } |
5810 | |
9991 | 5811 static void |
5812 oscar_set_status(GaimAccount *account, GaimStatus *status) | |
2993 | 5813 { |
10747 | 5814 gboolean connected = gaim_account_is_connected(account); |
10400 | 5815 GaimStatusType *type = gaim_status_get_type(status); |
5816 int primitive = gaim_status_type_get_primitive(type); | |
5817 | |
10747 | 5818 gaim_debug_info("oscar", "Set status to %s\n", gaim_status_get_name(status)); |
5819 | |
10498 | 5820 if (!gaim_status_is_active(status)) |
10485 | 5821 return; |
5822 | |
10753 | 5823 if (primitive != GAIM_STATUS_OFFLINE && !connected) { |
10738 | 5824 gaim_account_connect(account); |
10747 | 5825 } else if (primitive == GAIM_STATUS_OFFLINE && connected) { |
10400 | 5826 gaim_account_disconnect(account); |
5827 } else { | |
10747 | 5828 if (!connected) |
5829 return; | |
10400 | 5830 |
5831 if (aim_sn_is_icq(gaim_account_get_username(account))) | |
5832 oscar_set_status_icq(account, status); | |
5833 else | |
10560 | 5834 /* QQQ - Should probably also set this for ICQ */ |
10400 | 5835 oscar_set_status_aim(account, status); |
5836 } | |
2086 | 5837 } |
5838 | |
9991 | 5839 static void |
5840 oscar_warn(GaimConnection *gc, const char *name, gboolean anonymous) { | |
7283 | 5841 OscarData *od = (OscarData *)gc->proto_data; |
9753 | 5842 aim_im_warn(od->sess, od->conn, name, anonymous ? AIM_WARN_ANON : 0); |
2086 | 5843 } |
5844 | |
10747 | 5845 static void |
5846 oscar_add_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *group) { | |
7283 | 5847 OscarData *od = (OscarData *)gc->proto_data; |
9285 | 5848 |
5849 if (!aim_snvalid(buddy->name)) { | |
8092 | 5850 gchar *buf; |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
5851 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 | 5852 if (!gaim_conv_present_error(buddy->name, gaim_connection_get_account(gc), buf)) |
5853 gaim_notify_error(gc, NULL, _("Unable To Add"), buf); | |
8092 | 5854 g_free(buf); |
8150 | 5855 |
5856 /* Remove from local list */ | |
9285 | 5857 gaim_blist_remove_buddy(buddy); |
8150 | 5858 |
8092 | 5859 return; |
5860 } | |
5861 | |
9285 | 5862 if ((od->sess->ssi.received_data) && !(aim_ssi_itemlist_finditem(od->sess->ssi.local, group->name, buddy->name, AIM_SSI_TYPE_BUDDY))) { |
5863 if (buddy && group) { | |
8660 | 5864 gaim_debug_info("oscar", |
9285 | 5865 "ssi: adding buddy %s to group %s\n", buddy->name, group->name); |
9620 | 5866 aim_ssi_addbuddy(od->sess, buddy->name, group->name, gaim_buddy_get_alias_only(buddy), NULL, NULL, 0); |
4230 | 5867 } |
5868 } | |
8150 | 5869 |
10157 | 5870 /* XXX - Should this be done from AIM accounts, as well? */ |
4759 | 5871 if (od->icq) |
9285 | 5872 aim_icq_getalias(od->sess, buddy->name); |
5873 } | |
5874 | |
5875 static void oscar_remove_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *group) { | |
7283 | 5876 OscarData *od = (OscarData *)gc->proto_data; |
9285 | 5877 |
4230 | 5878 if (od->sess->ssi.received_data) { |
8660 | 5879 gaim_debug_info("oscar", |
9285 | 5880 "ssi: deleting buddy %s from group %s\n", buddy->name, group->name); |
5881 aim_ssi_delbuddy(od->sess, buddy->name, group->name); | |
4230 | 5882 } |
10866 | 5883 } |
5884 | |
5575 | 5885 static void oscar_move_buddy(GaimConnection *gc, const char *name, const char *old_group, const char *new_group) { |
7283 | 5886 OscarData *od = (OscarData *)gc->proto_data; |
4303 | 5887 if (od->sess->ssi.received_data && strcmp(old_group, new_group)) { |
8660 | 5888 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5889 "ssi: moving buddy %s from group %s to group %s\n", name, old_group, new_group); |
4889 | 5890 aim_ssi_movebuddy(od->sess, old_group, new_group, name); |
4269 | 5891 } |
5892 } | |
5893 | |
5575 | 5894 static void oscar_alias_buddy(GaimConnection *gc, const char *name, const char *alias) { |
7283 | 5895 OscarData *od = (OscarData *)gc->proto_data; |
4269 | 5896 if (od->sess->ssi.received_data) { |
5897 char *gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, name); | |
5898 if (gname) { | |
8660 | 5899 gaim_debug_info("oscar", |
9586 | 5900 "ssi: changing the alias for buddy %s to %s\n", name, alias ? alias : "(none)"); |
4889 | 5901 aim_ssi_aliasbuddy(od->sess, gname, name, alias); |
4269 | 5902 } |
5903 } | |
5904 } | |
5905 | |
11005 | 5906 /* |
5907 * FYI, the OSCAR SSI code removes empty groups automatically. | |
5908 */ | |
9285 | 5909 static void oscar_rename_group(GaimConnection *gc, const char *old_name, GaimGroup *group, GList *moved_buddies) { |
8341 | 5910 OscarData *od = (OscarData *)gc->proto_data; |
4230 | 5911 |
5912 if (od->sess->ssi.received_data) { | |
9285 | 5913 if (aim_ssi_itemlist_finditem(od->sess->ssi.local, group->name, NULL, AIM_SSI_TYPE_GROUP)) { |
5914 GList *cur, *groups = NULL; | |
5915 | |
5916 /* Make a list of what the groups each buddy is in */ | |
5917 for (cur = moved_buddies; cur != NULL; cur = cur->next) { | |
5918 GaimBlistNode *node = cur->data; | |
11002
bf03a5271395
[gaim-migrate @ 12857]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10949
diff
changeset
|
5919 /* node is GaimBuddy, parent is a GaimContact. |
bf03a5271395
[gaim-migrate @ 12857]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10949
diff
changeset
|
5920 * We must go two levels up to get the Group */ |
bf03a5271395
[gaim-migrate @ 12857]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10949
diff
changeset
|
5921 groups = g_list_append(groups, |
bf03a5271395
[gaim-migrate @ 12857]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10949
diff
changeset
|
5922 node->parent->parent); |
9285 | 5923 } |
5924 | |
10866 | 5925 serv_remove_buddies(gc, moved_buddies, groups); |
5926 serv_add_buddies(gc, moved_buddies); | |
9285 | 5927 g_list_free(groups); |
8660 | 5928 gaim_debug_info("oscar", |
9285 | 5929 "ssi: moved all buddies from group %s to %s\n", old_name, group->name); |
4230 | 5930 } else { |
9285 | 5931 aim_ssi_rename_group(od->sess, old_name, group->name); |
8660 | 5932 gaim_debug_info("oscar", |
9285 | 5933 "ssi: renamed group %s to %s\n", old_name, group->name); |
2995 | 5934 } |
5935 } | |
5936 } | |
5937 | |
5968 | 5938 static gboolean gaim_ssi_rerequestdata(gpointer data) { |
5939 aim_session_t *sess = data; | |
6350 | 5940 aim_ssi_reqdata(sess); |
5968 | 5941 return FALSE; |
5942 } | |
5943 | |
4642 | 5944 static int gaim_ssi_parseerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 5945 GaimConnection *gc = sess->aux_data; |
7283 | 5946 OscarData *od = gc->proto_data; |
4642 | 5947 va_list ap; |
5948 fu16_t reason; | |
5949 | |
5950 va_start(ap, fr); | |
5951 reason = (fu16_t)va_arg(ap, unsigned int); | |
5952 va_end(ap); | |
5953 | |
8660 | 5954 gaim_debug_error("oscar", "ssi: SNAC error %hu\n", reason); |
4642 | 5955 |
5956 if (reason == 0x0005) { | |
5892 | 5957 gaim_notify_error(gc, NULL, _("Unable To Retrieve Buddy List"), |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
5958 _("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
|
5959 od->getblisttimer = gaim_timeout_add(300000, gaim_ssi_rerequestdata, od->sess); |
4642 | 5960 } |
5961 | |
5962 /* Activate SSI */ | |
5963 /* Sending the enable causes other people to be able to see you, and you to see them */ | |
5964 /* Make sure your privacy setting/invisibility is set how you want it before this! */ | |
8660 | 5965 gaim_debug_info("oscar", "ssi: activating server-stored buddy list\n"); |
4642 | 5966 aim_ssi_enable(od->sess); |
5967 | |
5968 return 1; | |
5969 } | |
5970 | |
2991 | 5971 static int gaim_ssi_parserights(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 5972 GaimConnection *gc = sess->aux_data; |
7283 | 5973 OscarData *od = (OscarData *)gc->proto_data; |
9982 | 5974 int i; |
5975 va_list ap; | |
5976 int numtypes; | |
4230 | 5977 fu16_t *maxitems; |
2991 | 5978 |
5979 va_start(ap, fr); | |
4230 | 5980 numtypes = va_arg(ap, int); |
5981 maxitems = va_arg(ap, fu16_t *); | |
2991 | 5982 va_end(ap); |
5983 | |
8660 | 5984 gaim_debug_misc("oscar", "ssi rights:"); |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
5985 |
4230 | 5986 for (i=0; i<numtypes; i++) |
8660 | 5987 gaim_debug_misc(NULL, " max type 0x%04x=%hd,", |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
5988 i, maxitems[i]); |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
5989 |
8660 | 5990 gaim_debug_misc(NULL, "\n"); |
4230 | 5991 |
5992 if (numtypes >= 0) | |
5993 od->rights.maxbuddies = maxitems[0]; | |
5994 if (numtypes >= 1) | |
5995 od->rights.maxgroups = maxitems[1]; | |
5996 if (numtypes >= 2) | |
5997 od->rights.maxpermits = maxitems[2]; | |
5998 if (numtypes >= 3) | |
5999 od->rights.maxdenies = maxitems[3]; | |
2991 | 6000 |
6001 return 1; | |
6002 } | |
6003 | |
6004 static int gaim_ssi_parselist(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 6005 GaimConnection *gc = sess->aux_data; |
6006 GaimAccount *account = gaim_connection_get_account(gc); | |
9988 | 6007 GaimStatus *status; |
7283 | 6008 OscarData *od = (OscarData *)gc->proto_data; |
8150 | 6009 GaimGroup *g; |
6010 GaimBuddy *b; | |
2995 | 6011 struct aim_ssi_item *curitem; |
2991 | 6012 int tmp; |
4230 | 6013 va_list ap; |
8219 | 6014 fu16_t fmtver, numitems; |
6015 struct aim_ssi_item *items; | |
6016 fu32_t timestamp; | |
4230 | 6017 |
6018 va_start(ap, fr); | |
6019 fmtver = (fu16_t)va_arg(ap, int); | |
6020 numitems = (fu16_t)va_arg(ap, int); | |
8219 | 6021 items = va_arg(ap, struct aim_ssi_item *); |
4230 | 6022 timestamp = va_arg(ap, fu32_t); |
8219 | 6023 va_end(ap); |
2991 | 6024 |
8660 | 6025 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6026 "ssi: syncing local list and server list\n"); |
2991 | 6027 |
8219 | 6028 if ((timestamp == 0) || (numitems == 0)) { |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
6029 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 | 6030 return 1; |
6031 } | |
6032 | |
2991 | 6033 /* Clean the buddy list */ |
4889 | 6034 aim_ssi_cleanlist(sess); |
2991 | 6035 |
8150 | 6036 { /* If not in server list then prune from local list */ |
6037 GaimBlistNode *gnode, *cnode, *bnode; | |
6038 GaimBuddyList *blist; | |
9539 | 6039 GSList *cur, *next; |
8150 | 6040 |
6041 /* Buddies */ | |
6042 cur = NULL; | |
6043 if ((blist = gaim_get_blist()) != NULL) { | |
6044 for (gnode = blist->root; gnode; gnode = gnode->next) { | |
6045 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
6046 continue; | |
6047 g = (GaimGroup *)gnode; | |
6048 for (cnode = gnode->child; cnode; cnode = cnode->next) { | |
6049 if(!GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
6050 continue; | |
6051 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
6052 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
6053 continue; | |
6054 b = (GaimBuddy *)bnode; | |
6055 if (b->account == gc->account) { | |
6056 if (aim_ssi_itemlist_exists(sess->ssi.local, b->name)) { | |
6057 /* If the buddy is an ICQ user then load his nickname */ | |
6058 const char *servernick = gaim_blist_node_get_string((GaimBlistNode*)b, "servernick"); | |
8214 | 6059 char *alias; |
8150 | 6060 if (servernick) |
6061 serv_got_alias(gc, b->name, servernick); | |
6062 | |
6063 /* Store local alias on server */ | |
8214 | 6064 alias = aim_ssi_getalias(sess->ssi.local, g->name, b->name); |
8150 | 6065 if (!alias && b->alias && strlen(b->alias)) |
6066 aim_ssi_aliasbuddy(sess, g->name, b->name, b->alias); | |
6067 free(alias); | |
6068 } else { | |
8660 | 6069 gaim_debug_info("oscar", |
8150 | 6070 "ssi: removing buddy %s from local list\n", b->name); |
6071 /* We can't actually remove now because it will screw up our looping */ | |
6072 cur = g_slist_prepend(cur, b); | |
6073 } | |
6074 } | |
6075 } | |
6076 } | |
6077 } | |
6078 } | |
8175 | 6079 |
8150 | 6080 while (cur != NULL) { |
6081 b = cur->data; | |
6082 cur = g_slist_remove(cur, b); | |
6083 gaim_blist_remove_buddy(b); | |
6084 } | |
6085 | |
6086 /* Permit list */ | |
6087 if (gc->account->permit) { | |
9539 | 6088 next = gc->account->permit; |
6089 while (next != NULL) { | |
6090 cur = next; | |
6091 next = next->next; | |
8150 | 6092 if (!aim_ssi_itemlist_finditem(sess->ssi.local, NULL, cur->data, AIM_SSI_TYPE_PERMIT)) { |
8660 | 6093 gaim_debug_info("oscar", |
8150 | 6094 "ssi: removing permit %s from local list\n", (const char *)cur->data); |
6095 gaim_privacy_permit_remove(account, cur->data, TRUE); | |
6096 } | |
9539 | 6097 } |
8150 | 6098 } |
6099 | |
6100 /* Deny list */ | |
6101 if (gc->account->deny) { | |
9539 | 6102 next = gc->account->deny; |
6103 while (next != NULL) { | |
6104 cur = next; | |
6105 next = next->next; | |
8150 | 6106 if (!aim_ssi_itemlist_finditem(sess->ssi.local, NULL, cur->data, AIM_SSI_TYPE_DENY)) { |
8660 | 6107 gaim_debug_info("oscar", |
8150 | 6108 "ssi: removing deny %s from local list\n", (const char *)cur->data); |
6109 gaim_privacy_deny_remove(account, cur->data, TRUE); | |
6110 } | |
9539 | 6111 } |
8150 | 6112 } |
6113 /* Presence settings (idle time visibility) */ | |
6114 if ((tmp = aim_ssi_getpresence(sess->ssi.local)) != 0xFFFFFFFF) | |
6115 if (!(tmp & 0x400)) | |
6116 aim_ssi_setpresence(sess, tmp | 0x400); | |
6117 } /* end pruning buddies from local list */ | |
6118 | |
2991 | 6119 /* Add from server list to local list */ |
4230 | 6120 for (curitem=sess->ssi.local; curitem; curitem=curitem->next) { |
7328 | 6121 if ((curitem->name == NULL) || (g_utf8_validate(curitem->name, -1, NULL))) |
2991 | 6122 switch (curitem->type) { |
4230 | 6123 case 0x0000: { /* Buddy */ |
4251 | 6124 if (curitem->name) { |
4292 | 6125 char *gname = aim_ssi_itemlist_findparentname(sess->ssi.local, curitem->name); |
7166 | 6126 char *gname_utf8 = gname ? gaim_utf8_try_convert(gname) : NULL; |
4282 | 6127 char *alias = aim_ssi_getalias(sess->ssi.local, gname, curitem->name); |
7166 | 6128 char *alias_utf8 = alias ? gaim_utf8_try_convert(alias) : NULL; |
8150 | 6129 b = gaim_find_buddy(gc->account, curitem->name); |
4458 | 6130 /* Should gname be freed here? -- elb */ |
4754 | 6131 /* Not with the current code, but that might be cleaner -- med */ |
4458 | 6132 free(alias); |
8150 | 6133 if (b) { |
4292 | 6134 /* Get server stored alias */ |
4705 | 6135 if (alias_utf8) { |
8150 | 6136 g_free(b->alias); |
6137 b->alias = g_strdup(alias_utf8); | |
4705 | 6138 } |
4282 | 6139 } else { |
8150 | 6140 b = gaim_buddy_new(gc->account, curitem->name, alias_utf8); |
5146 | 6141 |
4754 | 6142 if (!(g = gaim_find_group(gname_utf8 ? gname_utf8 : _("Orphans")))) { |
4687 | 6143 g = gaim_group_new(gname_utf8 ? gname_utf8 : _("Orphans")); |
4754 | 6144 gaim_blist_add_group(g, NULL); |
6145 } | |
5146 | 6146 |
8660 | 6147 gaim_debug_info("oscar", |
9285 | 6148 "ssi: adding buddy %s to group %s to local list\n", curitem->name, gname_utf8 ? gname_utf8 : _("Orphans")); |
8150 | 6149 gaim_blist_add_buddy(b, NULL, g, NULL); |
4251 | 6150 } |
8341 | 6151 if (!aim_sncmp(curitem->name, account->username)) { |
6152 char *comment = aim_ssi_getcomment(sess->ssi.local, gname, curitem->name); | |
6153 gaim_check_comment(od, comment); | |
6154 free(comment); | |
6155 } | |
7162 | 6156 g_free(gname_utf8); |
6157 g_free(alias_utf8); | |
2991 | 6158 } |
4230 | 6159 } break; |
6160 | |
6161 case 0x0001: { /* Group */ | |
4282 | 6162 /* Shouldn't add empty groups */ |
4230 | 6163 } break; |
6164 | |
6165 case 0x0002: { /* Permit buddy */ | |
2991 | 6166 if (curitem->name) { |
4230 | 6167 /* if (!find_permdeny_by_name(gc->permit, curitem->name)) { AAA */ |
2991 | 6168 GSList *list; |
5575 | 6169 for (list=account->permit; (list && aim_sncmp(curitem->name, list->data)); list=list->next); |
2991 | 6170 if (!list) { |
8660 | 6171 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6172 "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
|
6173 gaim_privacy_permit_add(account, curitem->name, TRUE); |
2991 | 6174 } |
6175 } | |
4230 | 6176 } break; |
6177 | |
6178 case 0x0003: { /* Deny buddy */ | |
2991 | 6179 if (curitem->name) { |
6180 GSList *list; | |
5575 | 6181 for (list=account->deny; (list && aim_sncmp(curitem->name, list->data)); list=list->next); |
2991 | 6182 if (!list) { |
8660 | 6183 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6184 "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
|
6185 gaim_privacy_deny_add(account, curitem->name, TRUE); |
2991 | 6186 } |
6187 } | |
4230 | 6188 } break; |
6189 | |
6190 case 0x0004: { /* Permit/deny setting */ | |
2991 | 6191 if (curitem->data) { |
6192 fu8_t permdeny; | |
5575 | 6193 if ((permdeny = aim_ssi_getpermdeny(sess->ssi.local)) && (permdeny != account->perm_deny)) { |
8660 | 6194 gaim_debug_info("oscar", |
5575 | 6195 "ssi: changing permdeny from %d to %hhu\n", account->perm_deny, permdeny); |
6196 account->perm_deny = permdeny; | |
6197 if (od->icq && account->perm_deny == 0x03) { | |
9991 | 6198 gaim_presence_switch_status(account->presence, OSCAR_STATUS_ID_INVISIBLE); |
4342 | 6199 } |
2991 | 6200 } |
6201 } | |
4230 | 6202 } break; |
6203 | |
6204 case 0x0005: { /* Presence setting */ | |
3109 | 6205 /* We don't want to change Gaim's setting because it applies to all accounts */ |
4230 | 6206 } break; |
2991 | 6207 } /* End of switch on curitem->type */ |
6208 } /* End of for loop */ | |
4230 | 6209 |
9991 | 6210 /* |
6211 * XXX - STATUS - Set our ICQ status. We probably don't want to do | |
6212 * this. We probably want the SSI status setting to override the local | |
6213 * setting. | |
6214 */ | |
9982 | 6215 status = gaim_presence_get_active_status(account->presence); |
6216 if (gaim_status_is_available(status)) | |
4901 | 6217 aim_setextstatus(sess, AIM_ICQ_STATE_NORMAL); |
6218 | |
4342 | 6219 /* Activate SSI */ |
6220 /* Sending the enable causes other people to be able to see you, and you to see them */ | |
6221 /* Make sure your privacy setting/invisibility is set how you want it before this! */ | |
8660 | 6222 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6223 "ssi: activating server-stored buddy list\n"); |
4642 | 6224 aim_ssi_enable(sess); |
4342 | 6225 |
2991 | 6226 return 1; |
2086 | 6227 } |
4230 | 6228 |
6229 static int gaim_ssi_parseack(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 6230 GaimConnection *gc = sess->aux_data; |
4230 | 6231 va_list ap; |
6232 struct aim_ssi_tmp *retval; | |
6233 | |
6234 va_start(ap, fr); | |
6235 retval = va_arg(ap, struct aim_ssi_tmp *); | |
6236 va_end(ap); | |
6237 | |
6238 while (retval) { | |
8660 | 6239 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6240 "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 | 6241 |
6242 if (retval->ack != 0xffff) | |
6243 switch (retval->ack) { | |
6244 case 0x0000: { /* added successfully */ | |
6245 } break; | |
6246 | |
4829 | 6247 case 0x000c: { /* you are over the limit, the cheat is to the limit, come on fhqwhgads */ |
6248 gchar *buf; | |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
6249 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 | 6250 if ((retval->name != NULL) && !gaim_conv_present_error(retval->name, gaim_connection_get_account(gc), buf)) |
9627 | 6251 gaim_notify_error(gc, NULL, _("Unable To Add"), buf); |
4829 | 6252 g_free(buf); |
6253 } | |
6254 | |
7023 | 6255 case 0x000e: { /* buddy requires authorization */ |
4828 | 6256 if ((retval->action == AIM_CB_SSI_ADD) && (retval->name)) |
4269 | 6257 gaim_auth_sendrequest(gc, retval->name); |
4230 | 6258 } break; |
6259 | |
6260 default: { /* La la la */ | |
5197 | 6261 gchar *buf; |
8660 | 6262 gaim_debug_error("oscar", "ssi: Action 0x%04hx was unsuccessful with error 0x%04hx\n", retval->action, retval->ack); |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
6263 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 | 6264 if ((retval->name != NULL) && !gaim_conv_present_error(retval->name, gaim_connection_get_account(gc), buf)) |
9627 | 6265 gaim_notify_error(gc, NULL, _("Unable To Add"), buf); |
5197 | 6266 g_free(buf); |
4230 | 6267 } break; |
6268 } | |
6269 | |
6270 retval = retval->next; | |
6271 } | |
6272 | |
6273 return 1; | |
6274 } | |
6275 | |
8227 | 6276 static int gaim_ssi_parseadd(aim_session_t *sess, aim_frame_t *fr, ...) { |
6277 GaimConnection *gc = sess->aux_data; | |
6278 char *gname, *gname_utf8, *alias, *alias_utf8; | |
6279 GaimBuddy *b; | |
6280 GaimGroup *g; | |
6281 va_list ap; | |
6282 fu16_t type; | |
6283 const char *name; | |
6284 | |
6285 va_start(ap, fr); | |
6286 type = (fu16_t)va_arg(ap, int); | |
6287 name = va_arg(ap, char *); | |
6288 va_end(ap); | |
6289 | |
6290 if ((type != 0x0000) || (name == NULL)) | |
6291 return 1; | |
6292 | |
6293 gname = aim_ssi_itemlist_findparentname(sess->ssi.local, name); | |
6294 gname_utf8 = gname ? gaim_utf8_try_convert(gname) : NULL; | |
6295 alias = aim_ssi_getalias(sess->ssi.local, gname, name); | |
6296 alias_utf8 = alias ? gaim_utf8_try_convert(alias) : NULL; | |
6297 b = gaim_find_buddy(gc->account, name); | |
6298 free(alias); | |
6299 | |
6300 if (b) { | |
6301 /* Get server stored alias */ | |
6302 if (alias_utf8) { | |
6303 g_free(b->alias); | |
6304 b->alias = g_strdup(alias_utf8); | |
6305 } | |
6306 } else { | |
6307 b = gaim_buddy_new(gc->account, name, alias_utf8); | |
6308 | |
6309 if (!(g = gaim_find_group(gname_utf8 ? gname_utf8 : _("Orphans")))) { | |
6310 g = gaim_group_new(gname_utf8 ? gname_utf8 : _("Orphans")); | |
6311 gaim_blist_add_group(g, NULL); | |
6312 } | |
6313 | |
8660 | 6314 gaim_debug_info("oscar", |
9285 | 6315 "ssi: adding buddy %s to group %s to local list\n", name, gname_utf8 ? gname_utf8 : _("Orphans")); |
8227 | 6316 gaim_blist_add_buddy(b, NULL, g, NULL); |
6317 } | |
6318 g_free(gname_utf8); | |
6319 g_free(alias_utf8); | |
6320 | |
6321 return 1; | |
6322 } | |
6323 | |
4230 | 6324 static int gaim_ssi_authgiven(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 6325 GaimConnection *gc = sess->aux_data; |
4230 | 6326 va_list ap; |
6327 char *sn, *msg; | |
4236 | 6328 gchar *dialog_msg, *nombre; |
4230 | 6329 struct name_data *data; |
6695 | 6330 GaimBuddy *buddy; |
4230 | 6331 |
6332 va_start(ap, fr); | |
6333 sn = va_arg(ap, char *); | |
6334 msg = va_arg(ap, char *); | |
6335 va_end(ap); | |
6336 | |
8660 | 6337 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6338 "ssi: %s has given you permission to add him to your buddy list\n", sn); |
4230 | 6339 |
4687 | 6340 buddy = gaim_find_buddy(gc->account, sn); |
9620 | 6341 if (buddy && (gaim_buddy_get_alias_only(buddy))) |
6342 nombre = g_strdup_printf("%s (%s)", sn, gaim_buddy_get_alias_only(buddy)); | |
4236 | 6343 else |
6344 nombre = g_strdup(sn); | |
6345 | |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
6346 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 | 6347 data = g_new(struct name_data, 1); |
6348 data->gc = gc; | |
6349 data->name = g_strdup(sn); | |
6350 data->nick = NULL; | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6351 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6352 gaim_request_yes_no(gc, NULL, _("Authorization Given"), dialog_msg, |
10116 | 6353 GAIM_DEFAULT_ACTION_NONE, data, |
7023 | 6354 G_CALLBACK(gaim_icq_buddyadd), |
5836 | 6355 G_CALLBACK(oscar_free_name_data)); |
4236 | 6356 |
4230 | 6357 g_free(dialog_msg); |
4236 | 6358 g_free(nombre); |
4230 | 6359 |
6360 return 1; | |
6361 } | |
6362 | |
6363 static int gaim_ssi_authrequest(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 6364 GaimConnection *gc = sess->aux_data; |
4230 | 6365 va_list ap; |
6366 char *sn, *msg; | |
4236 | 6367 gchar *dialog_msg, *nombre; |
4230 | 6368 struct name_data *data; |
6695 | 6369 GaimBuddy *buddy; |
4230 | 6370 |
6371 va_start(ap, fr); | |
6372 sn = va_arg(ap, char *); | |
6373 msg = va_arg(ap, char *); | |
6374 va_end(ap); | |
6375 | |
8660 | 6376 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6377 "ssi: received authorization request from %s\n", sn); |
4230 | 6378 |
4687 | 6379 buddy = gaim_find_buddy(gc->account, sn); |
9620 | 6380 if (buddy && (gaim_buddy_get_alias_only(buddy))) |
6381 nombre = g_strdup_printf("%s (%s)", sn, gaim_buddy_get_alias_only(buddy)); | |
4236 | 6382 else |
6383 nombre = g_strdup(sn); | |
6384 | |
10949 | 6385 dialog_msg = g_strdup_printf( |
6386 _("The user %s wants to add %s to their buddy list for the following reason:\n%s"), | |
6387 nombre, gaim_account_get_username(gc->account), | |
6388 (msg ? msg : _("No reason given."))); | |
6389 | |
4230 | 6390 data = g_new(struct name_data, 1); |
6391 data->gc = gc; | |
6392 data->name = g_strdup(sn); | |
6393 data->nick = NULL; | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6394 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6395 gaim_request_action(gc, NULL, _("Authorization Request"), dialog_msg, |
9972 | 6396 GAIM_DEFAULT_ACTION_NONE, data, 2, |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6397 _("Authorize"), G_CALLBACK(gaim_auth_grant), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6398 _("Deny"), G_CALLBACK(gaim_auth_dontgrant_msgprompt)); |
4236 | 6399 |
4230 | 6400 g_free(dialog_msg); |
4236 | 6401 g_free(nombre); |
4230 | 6402 |
6403 return 1; | |
6404 } | |
6405 | |
6406 static int gaim_ssi_authreply(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 6407 GaimConnection *gc = sess->aux_data; |
4230 | 6408 va_list ap; |
6409 char *sn, *msg; | |
4236 | 6410 gchar *dialog_msg, *nombre; |
4230 | 6411 fu8_t reply; |
6695 | 6412 GaimBuddy *buddy; |
4230 | 6413 |
6414 va_start(ap, fr); | |
6415 sn = va_arg(ap, char *); | |
6416 reply = (fu8_t)va_arg(ap, int); | |
6417 msg = va_arg(ap, char *); | |
6418 va_end(ap); | |
6419 | |
8660 | 6420 gaim_debug_info("oscar", |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
6421 "ssi: received authorization reply from %s. Reply is 0x%04hhx\n", sn, reply); |
4236 | 6422 |
4687 | 6423 buddy = gaim_find_buddy(gc->account, sn); |
9620 | 6424 if (buddy && (gaim_buddy_get_alias_only(buddy))) |
6425 nombre = g_strdup_printf("%s (%s)", sn, gaim_buddy_get_alias_only(buddy)); | |
4236 | 6426 else |
6427 nombre = g_strdup(sn); | |
6428 | |
4230 | 6429 if (reply) { |
6430 /* Granted */ | |
7023 | 6431 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
|
6432 gaim_notify_info(gc, NULL, _("Authorization Granted"), dialog_msg); |
4230 | 6433 } else { |
6434 /* Denied */ | |
7023 | 6435 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
|
6436 gaim_notify_info(gc, NULL, _("Authorization Denied"), dialog_msg); |
4230 | 6437 } |
6438 g_free(dialog_msg); | |
4236 | 6439 g_free(nombre); |
4230 | 6440 |
6441 return 1; | |
6442 } | |
6443 | |
6444 static int gaim_ssi_gotadded(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 6445 GaimConnection *gc = sess->aux_data; |
4230 | 6446 va_list ap; |
6447 char *sn; | |
6695 | 6448 GaimBuddy *buddy; |
4230 | 6449 |
6450 va_start(ap, fr); | |
6451 sn = va_arg(ap, char *); | |
6452 va_end(ap); | |
6453 | |
4687 | 6454 buddy = gaim_find_buddy(gc->account, sn); |
8660 | 6455 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6456 "ssi: %s added you to their buddy list\n", sn); |
9620 | 6457 gaim_account_notify_added(gc->account, NULL, sn, (buddy ? gaim_buddy_get_alias_only(buddy) : NULL), NULL); |
4230 | 6458 |
6459 return 1; | |
6460 } | |
2086 | 6461 |
5575 | 6462 static GList *oscar_chat_info(GaimConnection *gc) { |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6463 GList *m = NULL; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6464 struct proto_chat_entry *pce; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6465 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6466 pce = g_new0(struct proto_chat_entry, 1); |
9770 | 6467 pce->label = _("_Room:"); |
5234 | 6468 pce->identifier = "room"; |
10475 | 6469 pce->required = TRUE; |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6470 m = g_list_append(m, pce); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6471 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6472 pce = g_new0(struct proto_chat_entry, 1); |
7841 | 6473 pce->label = _("_Exchange:"); |
5234 | 6474 pce->identifier = "exchange"; |
10475 | 6475 pce->required = TRUE; |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6476 pce->is_int = TRUE; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6477 pce->min = 4; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6478 pce->max = 20; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6479 m = g_list_append(m, pce); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6480 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6481 return m; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6482 } |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6483 |
9754 | 6484 GHashTable *oscar_chat_info_defaults(GaimConnection *gc, const char *chat_name) |
6485 { | |
6486 GHashTable *defaults; | |
6487 | |
6488 defaults = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free); | |
6489 | |
6490 if (chat_name != NULL) | |
6491 g_hash_table_insert(defaults, "room", g_strdup(chat_name)); | |
6492 | |
6493 return defaults; | |
6494 } | |
6495 | |
9917 | 6496 static char *oscar_get_chat_name(GHashTable *data) { |
6497 return g_strdup(g_hash_table_lookup(data, "room")); | |
6498 } | |
6499 | |
8308 | 6500 static void oscar_join_chat(GaimConnection *gc, GHashTable *data) { |
6501 OscarData *od = (OscarData *)gc->proto_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6502 aim_conn_t *cur; |
5234 | 6503 char *name, *exchange; |
6504 | |
6505 name = g_hash_table_lookup(data, "room"); | |
6506 exchange = g_hash_table_lookup(data, "exchange"); | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6507 |
8660 | 6508 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6509 "Attempting to join chat room %s.\n", name); |
8308 | 6510 |
6511 if ((name == NULL) || (*name == '\0')) { | |
6512 gaim_notify_error(gc, NULL, _("Invalid chat name specified."), NULL); | |
6513 return; | |
6514 } | |
6515 | |
4617 | 6516 if ((cur = aim_getconn_type(od->sess, AIM_CONN_TYPE_CHATNAV))) { |
8660 | 6517 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6518 "chatnav exists, creating room\n"); |
5234 | 6519 aim_chatnav_createroom(od->sess, cur, name, atoi(exchange)); |
2086 | 6520 } else { |
6521 /* this gets tricky */ | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
6522 struct create_room *cr = g_new0(struct create_room, 1); |
8660 | 6523 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6524 "chatnav does not exist, opening chatnav\n"); |
5234 | 6525 cr->exchange = atoi(exchange); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
6526 cr->name = g_strdup(name); |
4617 | 6527 od->create_rooms = g_slist_append(od->create_rooms, cr); |
6528 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_CHATNAV); | |
2086 | 6529 } |
6530 } | |
6531 | |
8308 | 6532 static void oscar_chat_invite(GaimConnection *gc, int id, const char *message, const char *name) { |
6533 OscarData *od = (OscarData *)gc->proto_data; | |
6534 struct chat_connection *ccon = find_oscar_chat(gc, id); | |
10404 | 6535 |
6536 if (ccon == NULL) | |
2086 | 6537 return; |
10404 | 6538 |
8225 | 6539 aim_im_sendch2_chatinvite(od->sess, name, message ? message : "", |
2086 | 6540 ccon->exchange, ccon->name, 0x0); |
6541 } | |
6542 | |
10458 | 6543 static void |
6544 oscar_chat_leave(GaimConnection *gc, int id) | |
6545 { | |
6546 GaimConversation *conv; | |
6547 struct chat_connection *cc; | |
6548 | |
6549 conv = gaim_find_chat(gc, id); | |
6550 | |
6551 g_return_if_fail(conv != NULL); | |
6552 | |
6553 gaim_debug_info("oscar", "Leaving chat room %s\n", conv->name); | |
6554 | |
6555 cc = find_oscar_chat(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(conv))); | |
6556 oscar_chat_kill(gc, cc); | |
2086 | 6557 } |
6558 | |
8219 | 6559 static int oscar_send_chat(GaimConnection *gc, int id, const char *message) { |
6560 OscarData *od = (OscarData *)gc->proto_data; | |
6561 GaimConversation *conv = NULL; | |
2086 | 6562 struct chat_connection *c = NULL; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
6563 char *buf, *buf2; |
9830 | 6564 fu16_t charset, charsubset; |
9807 | 6565 char *charsetstr = NULL; |
10111 | 6566 int len; |
8219 | 6567 |
6568 if (!(conv = gaim_find_chat(gc, id))) | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
6569 return -EINVAL; |
2086 | 6570 |
8219 | 6571 if (!(c = find_oscar_chat_by_conv(gc, conv))) |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
6572 return -EINVAL; |
2086 | 6573 |
8219 | 6574 buf = gaim_strdup_withhtml(message); |
6575 len = strlen(buf); | |
6576 | |
8962 | 6577 if (strstr(buf, "<IMG ")) |
6578 gaim_conversation_write(conv, "", | |
6579 _("Your IM Image was not sent. " | |
6580 "You cannot send IM Images in AIM chats."), | |
6581 GAIM_MESSAGE_ERROR, time(NULL)); | |
6582 | |
9830 | 6583 gaim_plugin_oscar_convert_to_best_encoding(gc, NULL, buf, &buf2, &len, &charset, &charsubset); |
8359 | 6584 if ((len > c->maxlen) || (len > c->maxvis)) { |
6585 g_free(buf2); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
6586 return -E2BIG; |
8359 | 6587 } |
6588 | |
9831 | 6589 if (charset == AIM_CHARSET_ASCII) |
6590 charsetstr = "us-ascii"; | |
6591 else if (charset == AIM_CHARSET_UNICODE) | |
6592 charsetstr = "unicode-2-0"; | |
6593 else if (charset == AIM_CHARSET_CUSTOM) | |
6594 charsetstr = "iso-8859-1"; | |
9807 | 6595 aim_chat_send_im(od->sess, c->conn, 0, buf2, len, charsetstr, "en"); |
8219 | 6596 g_free(buf2); |
8359 | 6597 |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
6598 return 0; |
2086 | 6599 } |
6600 | |
10042 | 6601 static const char *oscar_list_icon(GaimAccount *a, GaimBuddy *b) |
6602 { | |
4766 | 6603 if (!b || (b && b->name && b->name[0] == '+')) { |
9975 | 6604 if (a != NULL && aim_sn_is_icq(gaim_account_get_username(a))) |
4687 | 6605 return "icq"; |
6606 else | |
6607 return "aim"; | |
6608 } | |
5646
48c63ee49961
[gaim-migrate @ 6060]
Christian Hammond <chipx86@chipx86.com>
parents:
5638
diff
changeset
|
6609 |
9975 | 6610 if (b != NULL && aim_sn_is_icq(b->name)) |
4687 | 6611 return "icq"; |
6612 return "aim"; | |
6613 } | |
6614 | |
9972 | 6615 static void oscar_list_emblems(GaimBuddy *b, const char **se, const char **sw, const char **nw, const char **ne) |
4687 | 6616 { |
7334 | 6617 GaimConnection *gc = NULL; |
6618 OscarData *od = NULL; | |
10042 | 6619 GaimAccount *account = NULL; |
6620 GaimPresence *presence; | |
6621 GaimStatus *status; | |
6622 const char *status_id; | |
4687 | 6623 char *emblems[4] = {NULL,NULL,NULL,NULL}; |
6624 int i = 0; | |
7334 | 6625 aim_userinfo_t *userinfo = NULL; |
6626 | |
6627 if (b != NULL) | |
6628 account = b->account; | |
6629 if (account != NULL) | |
6630 gc = account->gc; | |
6631 if (gc != NULL) | |
6632 od = gc->proto_data; | |
7945 | 6633 if (od != NULL) |
6634 userinfo = aim_locate_finduserinfo(od->sess, b->name); | |
4687 | 6635 |
10042 | 6636 presence = gaim_buddy_get_presence(b); |
6637 status = gaim_presence_get_active_status(presence); | |
6638 status_id = gaim_status_get_id(status); | |
6639 | |
6640 if (gaim_presence_is_online(presence) == FALSE) { | |
5131 | 6641 char *gname; |
7334 | 6642 if ((b->name) && (od) && (od->sess->ssi.received_data) && |
5131 | 6643 (gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, b->name)) && |
6644 (aim_ssi_waitingforauth(od->sess->ssi.local, gname, b->name))) { | |
6645 emblems[i++] = "notauthorized"; | |
6646 } else { | |
6647 emblems[i++] = "offline"; | |
6648 } | |
6649 } | |
4916 | 6650 |
10042 | 6651 if (b->name && aim_sn_is_icq(b->name)) { |
6652 if (!strcmp(status_id, OSCAR_STATUS_ID_INVISIBLE)) | |
6653 emblems[i++] = "invisible"; | |
6654 else if (!strcmp(status_id, OSCAR_STATUS_ID_FREE4CHAT)) | |
4960 | 6655 emblems[i++] = "freeforchat"; |
10042 | 6656 else if (!strcmp(status_id, OSCAR_STATUS_ID_DND)) |
4960 | 6657 emblems[i++] = "dnd"; |
10042 | 6658 else if (!strcmp(status_id, OSCAR_STATUS_ID_NA)) |
4960 | 6659 emblems[i++] = "na"; |
10042 | 6660 else if (!strcmp(status_id, OSCAR_STATUS_ID_OCCUPIED)) |
4960 | 6661 emblems[i++] = "occupied"; |
10042 | 6662 else if (!strcmp(status_id, OSCAR_STATUS_ID_AWAY)) |
4766 | 6663 emblems[i++] = "away"; |
10042 | 6664 } else if (!strcmp(status_id, OSCAR_STATUS_ID_AWAY)) { |
6665 emblems[i++] = "away"; | |
6666 } | |
6667 | |
6668 if (userinfo != NULL ) { | |
6669 /* if (userinfo->flags & AIM_FLAG_UNCONFIRMED) | |
6670 emblems[i++] = "unconfirmed"; */ | |
6671 if (userinfo->flags & AIM_FLAG_ADMINISTRATOR) | |
6672 emblems[i++] = "admin"; | |
6673 if (userinfo->flags & AIM_FLAG_AOL) | |
6674 emblems[i++] = "aol"; | |
6675 if (userinfo->flags & AIM_FLAG_WIRELESS) | |
6676 emblems[i++] = "wireless"; | |
6677 if (userinfo->flags & AIM_FLAG_ACTIVEBUDDY) | |
6678 emblems[i++] = "activebuddy"; | |
6679 | |
6680 if ((i < 4) && (userinfo->capabilities & AIM_CAPS_HIPTOP)) | |
7945 | 6681 emblems[i++] = "hiptop"; |
6682 | |
10042 | 6683 if ((i < 4) && (userinfo->capabilities & AIM_CAPS_SECUREIM)) |
7334 | 6684 emblems[i++] = "secure"; |
10042 | 6685 } |
7334 | 6686 |
4687 | 6687 *se = emblems[0]; |
6688 *sw = emblems[1]; | |
6689 *nw = emblems[2]; | |
6690 *ne = emblems[3]; | |
6691 } | |
6692 | |
6695 | 6693 static char *oscar_tooltip_text(GaimBuddy *b) { |
5575 | 6694 GaimConnection *gc = b->account->gc; |
7283 | 6695 OscarData *od = gc->proto_data; |
7045 | 6696 aim_userinfo_t *userinfo = aim_locate_finduserinfo(od->sess, b->name); |
8701 | 6697 GString *str = g_string_new(""); |
5131 | 6698 |
6699 if (GAIM_BUDDY_IS_ONLINE(b)) { | |
8701 | 6700 oscar_string_append_info(gc, str, "\n", b, userinfo); |
7011 | 6701 |
6702 if ((userinfo != NULL) && (userinfo->flags & AIM_FLAG_AWAY) && (userinfo->away_len > 0) && (userinfo->away != NULL) && (userinfo->away_encoding != NULL)) { | |
8225 | 6703 gchar *charset = oscar_encoding_extract(userinfo->away_encoding); |
8392 | 6704 gchar *away_utf8 = oscar_encoding_to_utf8(charset, userinfo->away, userinfo->away_len); |
8225 | 6705 g_free(charset); |
7011 | 6706 if (away_utf8 != NULL) { |
7091 | 6707 gchar *tmp1, *tmp2; |
9627 | 6708 tmp2 = gaim_markup_strip_html(away_utf8); |
8341 | 6709 g_free(away_utf8); |
10732
c4cb90065e1d
[gaim-migrate @ 12334]
Luke Schierer <lschiere@pidgin.im>
parents:
10715
diff
changeset
|
6710 tmp1 = g_markup_escape_text(tmp2, -1); |
7091 | 6711 g_free(tmp2); |
8700 | 6712 tmp2 = gaim_str_sub_away_formatters(tmp1, gaim_account_get_username(gaim_connection_get_account(gc))); |
8461 | 6713 g_free(tmp1); |
8701 | 6714 g_string_append_printf(str, "\n<b>%s:</b> %s", _("Away Message"), tmp2); |
8700 | 6715 g_free(tmp2); |
5836 | 6716 } |
5131 | 6717 } |
8701 | 6718 } |
6719 | |
6720 return g_string_free(str, FALSE); | |
5131 | 6721 } |
6722 | |
10042 | 6723 static char *oscar_status_text(GaimBuddy *b) |
6724 { | |
6725 GaimConnection *gc; | |
6726 OscarData *od; | |
6727 GaimStatus *status; | |
5167 | 6728 gchar *ret = NULL; |
6729 | |
10042 | 6730 gc = gaim_account_get_connection(gaim_buddy_get_account(b)); |
6731 od = gc->proto_data; | |
6732 status = gaim_presence_get_active_status(gaim_buddy_get_presence(b)); | |
6733 | |
6734 if (gaim_status_is_available(status) == FALSE || (((b->uc & 0xffff0000) >> 16) & AIM_ICQ_STATE_CHAT)) { | |
9975 | 6735 if (aim_sn_is_icq(b->name)) |
8701 | 6736 ret = oscar_icqstatus((b->uc & 0xffff0000) >> 16); |
7038 | 6737 else |
6738 ret = g_strdup(_("Away")); | |
5836 | 6739 } else if (GAIM_BUDDY_IS_ONLINE(b)) { |
7261 | 6740 struct buddyinfo *bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(b->account, b->name)); |
10116 | 6741 if ((bi != NULL) && (bi->availmsg != NULL)) |
6292 | 6742 ret = g_markup_escape_text(bi->availmsg, strlen(bi->availmsg)); |
5836 | 6743 } else { |
5167 | 6744 char *gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, b->name); |
6745 if (aim_ssi_waitingforauth(od->sess->ssi.local, gname, b->name)) | |
6746 ret = g_strdup(_("Not Authorized")); | |
6747 else | |
6748 ret = g_strdup(_("Offline")); | |
6749 } | |
6750 | |
6751 return ret; | |
6752 } | |
6753 | |
5842 | 6754 |
5844 | 6755 static int oscar_icon_req(aim_session_t *sess, aim_frame_t *fr, ...) { |
5842 | 6756 GaimConnection *gc = sess->aux_data; |
7283 | 6757 OscarData *od = gc->proto_data; |
5892 | 6758 va_list ap; |
5842 | 6759 fu16_t type; |
5892 | 6760 fu8_t flags = 0, length = 0; |
6761 char *md5 = NULL; | |
6762 | |
7334 | 6763 |
5842 | 6764 va_start(ap, fr); |
6765 type = va_arg(ap, int); | |
5892 | 6766 |
6767 switch(type) { | |
6768 case 0x0000: | |
6769 case 0x0001: { | |
6770 flags = va_arg(ap, int); | |
6771 length = va_arg(ap, int); | |
6772 md5 = va_arg(ap, char *); | |
6773 | |
6774 if (flags == 0x41) { | |
6775 if (!aim_getconn_type(od->sess, AIM_CONN_TYPE_ICON) && !od->iconconnecting) { | |
6776 od->iconconnecting = TRUE; | |
6777 od->set_icon = TRUE; | |
6778 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_ICON); | |
6779 } else { | |
6039 | 6780 struct stat st; |
6781 const char *iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc)); | |
6782 if (iconfile == NULL) { | |
8363 | 6783 aim_ssi_delicon(od->sess); |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
6784 } else if (!g_stat(iconfile, &st)) { |
6039 | 6785 char *buf = g_malloc(st.st_size); |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
6786 FILE *file = g_fopen(iconfile, "rb"); |
6039 | 6787 if (file) { |
9532 | 6788 /* XXX - Use g_file_get_contents()? */ |
6039 | 6789 fread(buf, 1, st.st_size, file); |
6790 fclose(file); | |
8660 | 6791 gaim_debug_info("oscar", |
10042 | 6792 "Uploading icon to icon server\n"); |
6879 | 6793 aim_bart_upload(od->sess, buf, st.st_size); |
5892 | 6794 } else |
8660 | 6795 gaim_debug_error("oscar", |
10042 | 6796 "Can't open buddy icon file!\n"); |
6039 | 6797 g_free(buf); |
6798 } else { | |
8660 | 6799 gaim_debug_error("oscar", |
10042 | 6800 "Can't stat buddy icon file!\n"); |
5892 | 6801 } |
6802 } | |
8363 | 6803 } else if (flags == 0x81) { |
6804 const char *iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc)); | |
6805 if (iconfile == NULL) | |
6806 aim_ssi_delicon(od->sess); | |
6807 else | |
6808 aim_ssi_seticon(od->sess, md5, length); | |
6809 } | |
5892 | 6810 } break; |
6811 | |
6812 case 0x0002: { /* We just set an "available" message? */ | |
6813 } break; | |
6814 } | |
6815 | |
5842 | 6816 va_end(ap); |
5844 | 6817 |
6818 return 0; | |
5842 | 6819 } |
5892 | 6820 |
5575 | 6821 static void oscar_set_permit_deny(GaimConnection *gc) { |
6822 GaimAccount *account = gaim_connection_get_account(gc); | |
7283 | 6823 OscarData *od = (OscarData *)gc->proto_data; |
10866 | 6824 |
8175 | 6825 if (od->sess->ssi.received_data) { |
6826 switch (account->perm_deny) { | |
6827 case GAIM_PRIVACY_ALLOW_ALL: | |
6828 aim_ssi_setpermdeny(od->sess, 0x01, 0xffffffff); | |
6829 break; | |
6830 case GAIM_PRIVACY_ALLOW_BUDDYLIST: | |
6831 aim_ssi_setpermdeny(od->sess, 0x05, 0xffffffff); | |
6832 break; | |
6833 case GAIM_PRIVACY_ALLOW_USERS: | |
6834 aim_ssi_setpermdeny(od->sess, 0x03, 0xffffffff); | |
6835 break; | |
6836 case GAIM_PRIVACY_DENY_ALL: | |
6837 aim_ssi_setpermdeny(od->sess, 0x02, 0xffffffff); | |
6838 break; | |
6839 case GAIM_PRIVACY_DENY_USERS: | |
6840 aim_ssi_setpermdeny(od->sess, 0x04, 0xffffffff); | |
6841 break; | |
6842 default: | |
6843 aim_ssi_setpermdeny(od->sess, 0x01, 0xffffffff); | |
6844 break; | |
6845 } | |
6846 } | |
2086 | 6847 } |
6848 | |
5575 | 6849 static void oscar_add_permit(GaimConnection *gc, const char *who) { |
7283 | 6850 OscarData *od = (OscarData *)gc->proto_data; |
8660 | 6851 gaim_debug_info("oscar", "ssi: About to add a permit\n"); |
4230 | 6852 if (od->sess->ssi.received_data) |
4889 | 6853 aim_ssi_addpermit(od->sess, who); |
2086 | 6854 } |
6855 | |
5575 | 6856 static void oscar_add_deny(GaimConnection *gc, const char *who) { |
7283 | 6857 OscarData *od = (OscarData *)gc->proto_data; |
8660 | 6858 gaim_debug_info("oscar", "ssi: About to add a deny\n"); |
4230 | 6859 if (od->sess->ssi.received_data) |
4889 | 6860 aim_ssi_adddeny(od->sess, who); |
2086 | 6861 } |
6862 | |
5575 | 6863 static void oscar_rem_permit(GaimConnection *gc, const char *who) { |
7283 | 6864 OscarData *od = (OscarData *)gc->proto_data; |
8660 | 6865 gaim_debug_info("oscar", "ssi: About to delete a permit\n"); |
4230 | 6866 if (od->sess->ssi.received_data) |
4889 | 6867 aim_ssi_delpermit(od->sess, who); |
2086 | 6868 } |
6869 | |
5575 | 6870 static void oscar_rem_deny(GaimConnection *gc, const char *who) { |
7283 | 6871 OscarData *od = (OscarData *)gc->proto_data; |
8660 | 6872 gaim_debug_info("oscar", "ssi: About to delete a deny\n"); |
4230 | 6873 if (od->sess->ssi.received_data) |
4889 | 6874 aim_ssi_deldeny(od->sess, who); |
2086 | 6875 } |
6876 | |
9975 | 6877 static GList * |
6878 oscar_status_types(GaimAccount *account) | |
2086 | 6879 { |
9975 | 6880 GList *status_types = NULL; |
6881 GaimStatusType *type; | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
6882 |
9973 | 6883 g_return_val_if_fail(account != NULL, NULL); |
6884 | |
10042 | 6885 /* Oscar-common status types */ |
9991 | 6886 type = gaim_status_type_new_full(GAIM_STATUS_OFFLINE, |
6887 OSCAR_STATUS_ID_OFFLINE, | |
10400 | 6888 _("Offline"), FALSE, TRUE, FALSE); |
9976 | 6889 status_types = g_list_append(status_types, type); |
6890 | |
9991 | 6891 type = gaim_status_type_new_full(GAIM_STATUS_ONLINE, |
6892 OSCAR_STATUS_ID_ONLINE, | |
10400 | 6893 _("Online"), FALSE, TRUE, FALSE); |
9976 | 6894 status_types = g_list_append(status_types, type); |
6895 | |
10198 | 6896 type = gaim_status_type_new_with_attrs(GAIM_STATUS_AVAILABLE, |
6897 OSCAR_STATUS_ID_AVAILABLE, | |
6898 _("Available"), TRUE, TRUE, FALSE, | |
6899 "message", _("Message"), | |
6900 gaim_value_new(GAIM_TYPE_STRING), NULL); | |
9976 | 6901 status_types = g_list_append(status_types, type); |
6902 | |
10195 | 6903 type = gaim_status_type_new_with_attrs(GAIM_STATUS_AWAY, |
6904 OSCAR_STATUS_ID_AWAY, | |
6905 _("Away"), TRUE, TRUE, FALSE, | |
6906 "message", _("Message"), | |
6907 gaim_value_new(GAIM_TYPE_STRING), NULL); | |
10042 | 6908 status_types = g_list_append(status_types, type); |
6909 | |
6910 type = gaim_status_type_new_full(GAIM_STATUS_HIDDEN, | |
6911 OSCAR_STATUS_ID_INVISIBLE, | |
10198 | 6912 _("Invisible"), TRUE, TRUE, FALSE); |
10042 | 6913 status_types = g_list_append(status_types, type); |
6914 | |
6915 if (aim_sn_is_icq(gaim_account_get_username(account)) == FALSE ) | |
6916 return status_types; | |
6917 | |
6918 /* ICQ-specific status types */ | |
6919 | |
9991 | 6920 type = gaim_status_type_new_full(GAIM_STATUS_AVAILABLE, |
6921 OSCAR_STATUS_ID_FREE4CHAT, | |
6922 _("Free For Chat"), TRUE, TRUE, FALSE); | |
9982 | 6923 status_types = g_list_append(status_types, type); |
6924 | |
9991 | 6925 type = gaim_status_type_new_full(GAIM_STATUS_UNAVAILABLE, |
6926 OSCAR_STATUS_ID_OCCUPIED, | |
6927 _("Occupied"), TRUE, TRUE, FALSE); | |
9976 | 6928 status_types = g_list_append(status_types, type); |
6929 | |
9991 | 6930 type = gaim_status_type_new_full(GAIM_STATUS_EXTENDED_AWAY, |
6931 OSCAR_STATUS_ID_DND, | |
6932 _("Do Not Disturb"), TRUE, TRUE, FALSE); | |
9976 | 6933 status_types = g_list_append(status_types, type); |
6934 | |
9991 | 6935 type = gaim_status_type_new_full(GAIM_STATUS_EXTENDED_AWAY, |
6936 OSCAR_STATUS_ID_NA, | |
6937 _("Not Available"), TRUE, TRUE, FALSE); | |
9976 | 6938 status_types = g_list_append(status_types, type); |
9975 | 6939 |
6940 return status_types; | |
4333 | 6941 } |
6942 | |
7172 | 6943 static void oscar_ssi_editcomment(struct name_data *data, const char *text) { |
8341 | 6944 GaimConnection *gc = data->gc; |
6945 OscarData *od = gc->proto_data; | |
7172 | 6946 GaimBuddy *b; |
6947 GaimGroup *g; | |
6948 | |
6949 if (!(b = gaim_find_buddy(gaim_connection_get_account(data->gc), data->name))) { | |
6950 oscar_free_name_data(data); | |
6951 return; | |
6952 } | |
6953 | |
6954 if (!(g = gaim_find_buddys_group(b))) { | |
6955 oscar_free_name_data(data); | |
6956 return; | |
6957 } | |
6958 | |
6959 aim_ssi_editcomment(od->sess, g->name, data->name, text); | |
8341 | 6960 |
6961 if (!aim_sncmp(data->name, gc->account->username)) | |
6962 gaim_check_comment(od, text); | |
6963 | |
7172 | 6964 oscar_free_name_data(data); |
6965 } | |
6966 | |
9030 | 6967 static void oscar_buddycb_edit_comment(GaimBlistNode *node, gpointer ignore) { |
6968 | |
6969 GaimBuddy *buddy; | |
6970 GaimConnection *gc; | |
6971 OscarData *od; | |
6972 struct name_data *data; | |
7172 | 6973 GaimGroup *g; |
6974 char *comment; | |
6975 gchar *comment_utf8; | |
9631 | 6976 gchar *title; |
7172 | 6977 |
9030 | 6978 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); |
6979 | |
6980 buddy = (GaimBuddy *) node; | |
6981 gc = gaim_account_get_connection(buddy->account); | |
6982 od = gc->proto_data; | |
6983 | |
6984 data = g_new(struct name_data, 1); | |
6985 | |
6986 if (!(g = gaim_find_buddys_group(buddy))) | |
7172 | 6987 return; |
9030 | 6988 comment = aim_ssi_getcomment(od->sess->ssi.local, g->name, buddy->name); |
7172 | 6989 comment_utf8 = comment ? gaim_utf8_try_convert(comment) : NULL; |
6990 | |
6991 data->gc = gc; | |
9030 | 6992 data->name = g_strdup(buddy->name); |
7172 | 6993 data->nick = NULL; |
6994 | |
9631 | 6995 title = g_strdup_printf(_("Buddy Comment for %s"), data->name); |
6996 gaim_request_input(gc, title, _("Buddy Comment:"), NULL, | |
8697 | 6997 comment_utf8, TRUE, FALSE, NULL, |
7172 | 6998 _("OK"), G_CALLBACK(oscar_ssi_editcomment), |
6999 _("Cancel"), G_CALLBACK(oscar_free_name_data), | |
7000 data); | |
9631 | 7001 g_free(title); |
7172 | 7002 |
7003 free(comment); | |
7004 g_free(comment_utf8); | |
7005 } | |
7006 | |
9030 | 7007 static GList *oscar_buddy_menu(GaimBuddy *buddy) { |
7008 | |
7009 GaimConnection *gc = gaim_account_get_connection(buddy->account); | |
7283 | 7010 OscarData *od = gc->proto_data; |
9030 | 7011 |
4333 | 7012 GList *m = NULL; |
9030 | 7013 GaimBlistNodeAction *act; |
7014 | |
7015 act = gaim_blist_node_action_new(_("Edit Buddy Comment"), | |
10662
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10654
diff
changeset
|
7016 oscar_buddycb_edit_comment, NULL, NULL); |
9030 | 7017 m = g_list_append(m, act); |
7172 | 7018 |
4333 | 7019 if (od->icq) { |
4624 | 7020 #if 0 |
9030 | 7021 act = gaim_blist_node_action_new(_("Get Status Msg"), |
10662
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10654
diff
changeset
|
7022 oscar_get_icqstatusmsg, NULL, NULL); |
9030 | 7023 m = g_list_append(m, act); |
4624 | 7024 #endif |
4333 | 7025 } else { |
7011 | 7026 aim_userinfo_t *userinfo; |
9030 | 7027 userinfo = aim_locate_finduserinfo(od->sess, buddy->name); |
7028 | |
7029 if (userinfo && aim_sncmp(gaim_account_get_username(buddy->account), buddy->name) && | |
7030 GAIM_BUDDY_IS_ONLINE(buddy)) { | |
7031 | |
7011 | 7032 if (userinfo->capabilities & AIM_CAPS_DIRECTIM) { |
9030 | 7033 act = gaim_blist_node_action_new(_("Direct IM"), |
10662
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10654
diff
changeset
|
7034 oscar_ask_direct_im, NULL, NULL); |
9030 | 7035 m = g_list_append(m, act); |
5917 | 7036 } |
9466 | 7037 #if 0 |
7011 | 7038 if (userinfo->capabilities & AIM_CAPS_GETFILE) { |
9030 | 7039 act = gaim_blist_node_action_new(_("Get File"), |
10662
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10654
diff
changeset
|
7040 oscar_ask_getfile, NULL, NULL); |
9030 | 7041 m = g_list_append(m, act); |
5917 | 7042 } |
4826 | 7043 #endif |
4333 | 7044 } |
5131 | 7045 } |
5197 | 7046 |
5131 | 7047 if (od->sess->ssi.received_data) { |
9030 | 7048 char *gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, buddy->name); |
7049 if (gname && aim_ssi_waitingforauth(od->sess->ssi.local, gname, buddy->name)) { | |
7050 act = gaim_blist_node_action_new(_("Re-request Authorization"), | |
10662
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10654
diff
changeset
|
7051 gaim_auth_sendrequest_menu, NULL, NULL); |
9030 | 7052 m = g_list_append(m, act); |
4333 | 7053 } |
4916 | 7054 } |
10157 | 7055 |
4333 | 7056 return m; |
7057 } | |
7058 | |
9030 | 7059 |
7060 static GList *oscar_blist_node_menu(GaimBlistNode *node) { | |
7061 if(GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
7062 return oscar_buddy_menu((GaimBuddy *) node); | |
7063 } else { | |
7064 return NULL; | |
7065 } | |
7066 } | |
7067 | |
10570 | 7068 static void |
7069 oscar_icq_privacy_opts(GaimConnection *gc, GaimRequestFields *fields) | |
7070 { | |
7071 OscarData *od = gc->proto_data; | |
7072 GaimAccount *account = gaim_connection_get_account(gc); | |
7073 GaimRequestField *f; | |
7074 gboolean auth, hide_ip, web_aware; | |
7075 | |
7076 f = gaim_request_fields_get_field(fields, "authorization"); | |
7077 auth = gaim_request_field_bool_get_value(f); | |
7078 | |
7079 f = gaim_request_fields_get_field(fields, "hide_ip"); | |
7080 hide_ip = gaim_request_field_bool_get_value(f); | |
7081 | |
7082 f = gaim_request_fields_get_field(fields, "web_aware"); | |
7083 web_aware = gaim_request_field_bool_get_value(f); | |
7084 | |
7085 gaim_account_set_bool(account, "authorization", auth); | |
7086 gaim_account_set_bool(account, "hide_ip", hide_ip); | |
7087 gaim_account_set_bool(account, "web_aware", web_aware); | |
7088 | |
7089 aim_icq_setsecurity(od->sess, auth, web_aware, hide_ip); | |
7090 } | |
7091 | |
7092 static void | |
7093 oscar_show_icq_privacy_opts(GaimPluginAction *action) | |
7094 { | |
7095 GaimConnection *gc = (GaimConnection *) action->context; | |
7096 GaimAccount *account = gaim_connection_get_account(gc); | |
7097 GaimRequestFields *fields; | |
7098 GaimRequestFieldGroup *g; | |
7099 GaimRequestField *f; | |
7100 gboolean auth, hide_ip, web_aware; | |
7101 | |
7102 auth = gaim_account_get_bool(account, "authorization", OSCAR_DEFAULT_AUTHORIZATION); | |
7103 hide_ip = gaim_account_get_bool(account, "hide_ip", OSCAR_DEFAULT_HIDE_IP); | |
7104 web_aware = gaim_account_get_bool(account, "web_aware", OSCAR_DEFAULT_WEB_AWARE); | |
7105 | |
7106 fields = gaim_request_fields_new(); | |
7107 | |
7108 g = gaim_request_field_group_new(NULL); | |
7109 | |
7110 f = gaim_request_field_bool_new("authorization", _("Require authorization"), auth); | |
7111 gaim_request_field_group_add_field(g, f); | |
7112 | |
7113 f = gaim_request_field_bool_new("hide_ip", _("Hide IP address"), hide_ip); | |
7114 gaim_request_field_group_add_field(g, f); | |
7115 | |
7116 f = gaim_request_field_bool_new("web_aware", _("Web aware"), web_aware); | |
7117 gaim_request_field_group_add_field(g, f); | |
7118 | |
7119 gaim_request_fields_add_group(fields, g); | |
7120 | |
7121 gaim_request_fields(gc, _("ICQ Privacy Options"), _("ICQ Privacy Options"), | |
7122 NULL, fields, | |
7123 _("OK"), G_CALLBACK(oscar_icq_privacy_opts), | |
7124 _("Cancel"), NULL, gc); | |
7125 } | |
9030 | 7126 |
5575 | 7127 static void oscar_format_screenname(GaimConnection *gc, const char *nick) { |
7283 | 7128 OscarData *od = gc->proto_data; |
5575 | 7129 if (!aim_sncmp(gaim_account_get_username(gaim_connection_get_account(gc)), nick)) { |
4333 | 7130 if (!aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH)) { |
7131 od->setnick = TRUE; | |
7132 od->newsn = g_strdup(nick); | |
7133 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
7134 } else { | |
7135 aim_admin_setnick(od->sess, aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH), nick); | |
7136 } | |
7137 } else { | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
7138 gaim_notify_error(gc, NULL, _("The new formatting is invalid."), |
8152 | 7139 _("Screen name formatting can change only capitalization and whitespace.")); |
4333 | 7140 } |
7141 } | |
7142 | |
9015 | 7143 static void oscar_show_format_screenname(GaimPluginAction *action) |
4333 | 7144 { |
9015 | 7145 GaimConnection *gc = (GaimConnection *) action->context; |
8152 | 7146 gaim_request_input(gc, NULL, _("New screen name formatting:"), NULL, |
8697 | 7147 gaim_connection_get_display_name(gc), FALSE, FALSE, NULL, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
7148 _("OK"), G_CALLBACK(oscar_format_screenname), |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
7149 _("Cancel"), NULL, |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
7150 gc); |
4333 | 7151 } |
7152 | |
9015 | 7153 static void oscar_confirm_account(GaimPluginAction *action) |
4333 | 7154 { |
9015 | 7155 GaimConnection *gc = (GaimConnection *) action->context; |
7283 | 7156 OscarData *od = gc->proto_data; |
4333 | 7157 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); |
7158 | |
7159 if (conn) { | |
7160 aim_admin_reqconfirm(od->sess, conn); | |
7161 } else { | |
7162 od->conf = TRUE; | |
7163 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
7164 } | |
7165 } | |
7166 | |
9015 | 7167 static void oscar_show_email(GaimPluginAction *action) |
4333 | 7168 { |
9015 | 7169 GaimConnection *gc = (GaimConnection *) action->context; |
7283 | 7170 OscarData *od = gc->proto_data; |
4333 | 7171 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); |
7172 | |
7173 if (conn) { | |
7174 aim_admin_getinfo(od->sess, conn, 0x11); | |
7175 } else { | |
7176 od->reqemail = TRUE; | |
7177 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
7178 } | |
7179 } | |
7180 | |
5575 | 7181 static void oscar_change_email(GaimConnection *gc, const char *email) |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7182 { |
7283 | 7183 OscarData *od = gc->proto_data; |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7184 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
|
7185 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7186 if (conn) { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7187 aim_admin_setemail(od->sess, conn, email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7188 } else { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7189 od->setemail = TRUE; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7190 od->email = g_strdup(email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7191 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7192 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7193 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7194 |
9015 | 7195 static void oscar_show_change_email(GaimPluginAction *action) |
4333 | 7196 { |
9015 | 7197 GaimConnection *gc = (GaimConnection *) action->context; |
6035
8c44020a958e
[gaim-migrate @ 6485]
Christian Hammond <chipx86@chipx86.com>
parents:
6029
diff
changeset
|
7198 gaim_request_input(gc, NULL, _("Change Address To:"), NULL, NULL, |
8697 | 7199 FALSE, FALSE, NULL, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
7200 _("OK"), G_CALLBACK(oscar_change_email), |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
7201 _("Cancel"), NULL, |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
7202 gc); |
4333 | 7203 } |
7204 | |
9015 | 7205 static void oscar_show_awaitingauth(GaimPluginAction *action) |
4333 | 7206 { |
9015 | 7207 GaimConnection *gc = (GaimConnection *) action->context; |
7283 | 7208 OscarData *od = gc->proto_data; |
4333 | 7209 gchar *nombre, *text, *tmp; |
6695 | 7210 GaimBlistNode *gnode, *cnode, *bnode; |
4333 | 7211 int num=0; |
7212 | |
6873 | 7213 text = g_strdup(""); |
4333 | 7214 |
4785 | 7215 for (gnode = gaim_get_blist()->root; gnode; gnode = gnode->next) { |
6695 | 7216 GaimGroup *group = (GaimGroup *)gnode; |
4785 | 7217 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) |
7218 continue; | |
6695 | 7219 for (cnode = gnode->child; cnode; cnode = cnode->next) { |
7220 if(!GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
4785 | 7221 continue; |
6695 | 7222 for (bnode = cnode->child; bnode; bnode = bnode->next) { |
7223 GaimBuddy *buddy = (GaimBuddy *)bnode; | |
7224 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
7225 continue; | |
7226 if (buddy->account == gc->account && aim_ssi_waitingforauth(od->sess->ssi.local, group->name, buddy->name)) { | |
9620 | 7227 if (gaim_buddy_get_alias_only(buddy)) |
7228 nombre = g_strdup_printf(" %s (%s)", buddy->name, gaim_buddy_get_alias_only(buddy)); | |
6695 | 7229 else |
7230 nombre = g_strdup_printf(" %s", buddy->name); | |
6873 | 7231 tmp = g_strdup_printf("%s%s<br>", text, nombre); |
6695 | 7232 g_free(text); |
7233 text = tmp; | |
7234 g_free(nombre); | |
7235 num++; | |
7236 } | |
4333 | 7237 } |
2979 | 7238 } |
4333 | 7239 } |
7240 | |
7241 if (!num) { | |
7242 g_free(text); | |
6873 | 7243 text = g_strdup(_("<i>you are not waiting for authorization</i>")); |
7244 } | |
7245 | |
7246 gaim_notify_formatted(gc, NULL, _("You are awaiting authorization from " | |
7247 "the following buddies"), _("You can re-request " | |
7248 "authorization from these buddies by " | |
7249 "right-clicking on them and selecting " | |
7250 "\"Re-request Authorization.\""), text, NULL, NULL); | |
4333 | 7251 g_free(text); |
2979 | 7252 } |
7253 | |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7254 static void search_by_email_cb(GaimConnection *gc, const char *email) |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7255 { |
8950 | 7256 OscarData *od = (OscarData *)gc->proto_data; |
7257 | |
7258 aim_search_address(od->sess, od->conn, email); | |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7259 } |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7260 |
9015 | 7261 static void oscar_show_find_email(GaimPluginAction *action) |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7262 { |
9015 | 7263 GaimConnection *gc = (GaimConnection *) action->context; |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7264 gaim_request_input(gc, _("Find Buddy by E-mail"), |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7265 _("Search for a buddy by e-mail address"), |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7266 _("Type the e-mail address of the buddy you are " |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7267 "searching for."), |
8697 | 7268 NULL, FALSE, FALSE, NULL, |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7269 _("Search"), G_CALLBACK(search_by_email_cb), |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7270 _("Cancel"), NULL, gc); |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7271 } |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7272 |
9015 | 7273 static void oscar_show_set_info(GaimPluginAction *action) |
7067
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
7274 { |
9015 | 7275 GaimConnection *gc = (GaimConnection *) action->context; |
7067
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
7276 gaim_account_request_change_user_info(gaim_connection_get_account(gc)); |
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
7277 } |
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
7278 |
9015 | 7279 static void oscar_show_set_info_icqurl(GaimPluginAction *action) |
8576 | 7280 { |
9015 | 7281 GaimConnection *gc = (GaimConnection *) action->context; |
10240
95ca0db2d01d
[gaim-migrate @ 11377]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10209
diff
changeset
|
7282 gaim_notify_uri(gc, "http://www.icq.com/whitepages/user_details.php"); |
8576 | 7283 } |
7284 | |
9015 | 7285 static void oscar_change_pass(GaimPluginAction *action) |
7063
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
7286 { |
9015 | 7287 GaimConnection *gc = (GaimConnection *) action->context; |
7063
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
7288 gaim_account_request_change_password(gaim_connection_get_account(gc)); |
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
7289 } |
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
7290 |
9015 | 7291 static void oscar_show_chpassurl(GaimPluginAction *action) |
4333 | 7292 { |
9015 | 7293 GaimConnection *gc = (GaimConnection *) action->context; |
7283 | 7294 OscarData *od = gc->proto_data; |
5575 | 7295 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
|
7296 gaim_notify_uri(gc, substituted); |
5517 | 7297 g_free(substituted); |
4333 | 7298 } |
7299 | |
9015 | 7300 static void oscar_show_imforwardingurl(GaimPluginAction *action) |
7026 | 7301 { |
9015 | 7302 GaimConnection *gc = (GaimConnection *) action->context; |
10240
95ca0db2d01d
[gaim-migrate @ 11377]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10209
diff
changeset
|
7303 gaim_notify_uri(gc, "http://mymobile.aol.com/dbreg/register?action=imf&clientID=1"); |
7026 | 7304 } |
7305 | |
5842 | 7306 static void oscar_set_icon(GaimConnection *gc, const char *iconfile) |
7307 { | |
7283 | 7308 OscarData *od = gc->proto_data; |
5844 | 7309 aim_session_t *sess = od->sess; |
5842 | 7310 FILE *file; |
7311 struct stat st; | |
5844 | 7312 |
6039 | 7313 if (iconfile == NULL) { |
8363 | 7314 aim_ssi_delicon(od->sess); |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
7315 } else if (!g_stat(iconfile, &st)) { |
5842 | 7316 char *buf = g_malloc(st.st_size); |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
7317 file = g_fopen(iconfile, "rb"); |
5842 | 7318 if (file) { |
6052 | 7319 md5_state_t *state; |
6039 | 7320 char md5[16]; |
9532 | 7321 /* XXX - Use g_file_get_contents()? */ |
5842 | 7322 int len = fread(buf, 1, st.st_size, file); |
6039 | 7323 fclose(file); |
6052 | 7324 state = g_malloc(sizeof(md5_state_t)); |
5842 | 7325 md5_init(state); |
7326 md5_append(state, buf, len); | |
7327 md5_finish(state, md5); | |
7328 g_free(state); | |
7329 aim_ssi_seticon(sess, md5, 16); | |
7330 } else | |
8660 | 7331 gaim_debug_error("oscar", |
5842 | 7332 "Can't open buddy icon file!\n"); |
7333 g_free(buf); | |
7334 } else | |
8660 | 7335 gaim_debug_error("oscar", |
5842 | 7336 "Can't stat buddy icon file!\n"); |
7337 } | |
7338 | |
7339 | |
9015 | 7340 static GList *oscar_actions(GaimPlugin *plugin, gpointer context) |
2086 | 7341 { |
9015 | 7342 GaimConnection *gc = (GaimConnection *) context; |
7283 | 7343 OscarData *od = gc->proto_data; |
4333 | 7344 GList *m = NULL; |
9015 | 7345 GaimPluginAction *act; |
7346 | |
7347 act = gaim_plugin_action_new(_("Set User Info..."), | |
7348 oscar_show_set_info); | |
7349 m = g_list_append(m, act); | |
4333 | 7350 |
10570 | 7351 if (od->icq) |
7352 { | |
9015 | 7353 act = gaim_plugin_action_new(_("Set User Info (URL)..."), |
7354 oscar_show_set_info_icqurl); | |
7355 m = g_list_append(m, act); | |
8576 | 7356 } |
7357 | |
9015 | 7358 act = gaim_plugin_action_new(_("Change Password..."), |
7359 oscar_change_pass); | |
7360 m = g_list_append(m, act); | |
4617 | 7361 |
10570 | 7362 if (od->sess->authinfo->chpassurl != NULL) |
7363 { | |
9015 | 7364 act = gaim_plugin_action_new(_("Change Password (URL)"), |
7365 oscar_show_chpassurl); | |
7366 m = g_list_append(m, act); | |
7367 | |
7368 act = gaim_plugin_action_new(_("Configure IM Forwarding (URL)"), | |
7369 oscar_show_imforwardingurl); | |
7370 m = g_list_append(m, act); | |
7026 | 7371 } |
7372 | |
10570 | 7373 m = g_list_append(m, NULL); |
7374 | |
7375 if (od->icq) | |
7376 { | |
7377 /* ICQ actions */ | |
7378 act = gaim_plugin_action_new(_("Show privacy options..."), | |
7379 oscar_show_icq_privacy_opts); | |
7380 m = g_list_append(m, act); | |
7381 } | |
7382 else | |
7383 { | |
4617 | 7384 /* AIM actions */ |
9015 | 7385 act = gaim_plugin_action_new(_("Format Screen Name..."), |
7386 oscar_show_format_screenname); | |
7387 m = g_list_append(m, act); | |
7388 | |
7389 act = gaim_plugin_action_new(_("Confirm Account"), | |
7390 oscar_confirm_account); | |
7391 m = g_list_append(m, act); | |
7392 | |
7393 act = gaim_plugin_action_new(_("Display Currently Registered Address"), | |
7394 oscar_show_email); | |
7395 m = g_list_append(m, act); | |
7396 | |
7397 act = gaim_plugin_action_new(_("Change Currently Registered Address..."), | |
7398 oscar_show_change_email); | |
7399 m = g_list_append(m, act); | |
2086 | 7400 } |
4333 | 7401 |
7402 m = g_list_append(m, NULL); | |
7403 | |
9015 | 7404 act = gaim_plugin_action_new(_("Show Buddies Awaiting Authorization"), |
7405 oscar_show_awaitingauth); | |
7406 m = g_list_append(m, act); | |
4333 | 7407 |
2086 | 7408 m = g_list_append(m, NULL); |
4333 | 7409 |
9015 | 7410 act = gaim_plugin_action_new(_("Search for Buddy by Email..."), |
7411 oscar_show_find_email); | |
7412 m = g_list_append(m, act); | |
4333 | 7413 |
8591 | 7414 #if 0 |
9015 | 7415 act = gaim_plugin_action_new(_("Search for Buddy by Information"), |
7416 show_find_info); | |
7417 m = g_list_append(m, act); | |
8591 | 7418 #endif |
2086 | 7419 |
7420 return m; | |
7421 } | |
7422 | |
5575 | 7423 static void oscar_change_passwd(GaimConnection *gc, const char *old, const char *new) |
2086 | 7424 { |
7283 | 7425 OscarData *od = gc->proto_data; |
4617 | 7426 |
7427 if (od->icq) { | |
7428 aim_icq_changepasswd(od->sess, new); | |
2086 | 7429 } else { |
4617 | 7430 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); |
7431 if (conn) { | |
7432 aim_admin_changepasswd(od->sess, conn, new, old); | |
7433 } else { | |
7434 od->chpass = TRUE; | |
7435 od->oldp = g_strdup(old); | |
7436 od->newp = g_strdup(new); | |
7437 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
7438 } | |
2086 | 7439 } |
7440 } | |
7441 | |
6059 | 7442 static void oscar_convo_closed(GaimConnection *gc, const char *who) |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
7443 { |
7283 | 7444 OscarData *od = gc->proto_data; |
8971 | 7445 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
|
7446 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
7447 if (!dim) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
7448 return; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
7449 |
8971 | 7450 oscar_direct_im_destroy(od, dim); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
7451 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
7452 |
9935 | 7453 static void |
7454 recent_buddies_cb(const char *name, GaimPrefType type, gpointer value, gpointer data) | |
7455 { | |
7456 GaimConnection *gc = data; | |
7457 OscarData *od = gc->proto_data; | |
7458 aim_session_t *sess = od->sess; | |
7459 fu32_t presence; | |
7460 | |
7461 presence = aim_ssi_getpresence(sess->ssi.local); | |
7462 | |
7463 if (value) { | |
9992 | 7464 /* Based on the packet capture I thought it was the first one */ |
7465 /* Stu thinks it's the second one. */ | |
7466 /* presence |= 0x00400000; */ | |
9971 | 7467 presence &= ~0x00020000; |
9935 | 7468 aim_ssi_setpresence(sess, presence); |
7469 } else { | |
9992 | 7470 /* presence &= ~0x00400000; */ |
9971 | 7471 presence |= 0x00020000; |
9935 | 7472 aim_ssi_setpresence(sess, presence); |
7473 } | |
7474 } | |
7475 | |
10653 | 7476 #if USE_PRPL_PREFERENCES |
9935 | 7477 static GaimPluginPrefFrame * |
9936 | 7478 get_plugin_pref_frame(GaimPlugin *plugin) |
7479 { | |
9935 | 7480 GaimPluginPrefFrame *frame; |
7481 GaimPluginPref *ppref; | |
7482 | |
7483 frame = gaim_plugin_pref_frame_new(); | |
7484 | |
7485 ppref = gaim_plugin_pref_new_with_name_and_label("/plugins/prpl/oscar/recent_buddies", _("Use recent buddies group")); | |
7486 gaim_plugin_pref_frame_add(frame, ppref); | |
7487 | |
7488 ppref = gaim_plugin_pref_new_with_name_and_label("/plugins/prpl/oscar/show_idle", _("Show how long you have been idle")); | |
7489 gaim_plugin_pref_frame_add(frame, ppref); | |
7490 | |
7491 return frame; | |
7492 } | |
10653 | 7493 #endif |
9935 | 7494 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7495 static GaimPluginProtocolInfo prpl_info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7496 { |
9308 | 7497 OPT_PROTO_MAIL_CHECK | OPT_PROTO_IM_IMAGE, |
9475 | 7498 NULL, /* user_splits */ |
7499 NULL, /* protocol_options */ | |
10674 | 7500 {"jpeg,gif,bmp,ico", 48, 48, 50, 50, |
7501 GAIM_ICON_SCALE_SEND | GAIM_ICON_SCALE_DISPLAY}, /* icon_spec */ | |
9475 | 7502 oscar_list_icon, /* list_icon */ |
7503 oscar_list_emblems, /* list_emblems */ | |
7504 oscar_status_text, /* status_text */ | |
7505 oscar_tooltip_text, /* tooltip_text */ | |
9973 | 7506 oscar_status_types, /* status_types */ |
9475 | 7507 oscar_blist_node_menu, /* blist_node_menu */ |
7508 oscar_chat_info, /* chat_info */ | |
9754 | 7509 oscar_chat_info_defaults, /* chat_info_defaults */ |
9475 | 7510 oscar_login, /* login */ |
7511 oscar_close, /* close */ | |
7512 oscar_send_im, /* send_im */ | |
7513 oscar_set_info, /* set_info */ | |
7514 oscar_send_typing, /* send_typing */ | |
7515 oscar_get_info, /* get_info */ | |
9973 | 7516 oscar_set_status, /* set_status */ |
9475 | 7517 oscar_set_idle, /* set_idle */ |
7518 oscar_change_passwd, /* change_passwd */ | |
7519 oscar_add_buddy, /* add_buddy */ | |
10866 | 7520 NULL, /* add_buddies */ |
9475 | 7521 oscar_remove_buddy, /* remove_buddy */ |
10866 | 7522 NULL, /* remove_buddies */ |
9475 | 7523 oscar_add_permit, /* add_permit */ |
7524 oscar_add_deny, /* add_deny */ | |
7525 oscar_rem_permit, /* rem_permit */ | |
7526 oscar_rem_deny, /* rem_deny */ | |
7527 oscar_set_permit_deny, /* set_permit_deny */ | |
7528 oscar_warn, /* warn */ | |
7529 oscar_join_chat, /* join_chat */ | |
7530 NULL, /* reject_chat */ | |
9973 | 7531 oscar_get_chat_name, /* get_chat_name */ |
9475 | 7532 oscar_chat_invite, /* chat_invite */ |
7533 oscar_chat_leave, /* chat_leave */ | |
7534 NULL, /* chat_whisper */ | |
7535 oscar_send_chat, /* chat_send */ | |
7536 oscar_keepalive, /* keepalive */ | |
7537 NULL, /* register_user */ | |
7538 NULL, /* get_cb_info */ | |
7539 NULL, /* get_cb_away */ | |
7540 oscar_alias_buddy, /* alias_buddy */ | |
7541 oscar_move_buddy, /* group_buddy */ | |
7542 oscar_rename_group, /* rename_group */ | |
7543 NULL, /* buddy_free */ | |
7544 oscar_convo_closed, /* convo_closed */ | |
7545 NULL, /* normalize */ | |
7546 oscar_set_icon, /* set_buddy_icon */ | |
7547 NULL, /* remove_group */ | |
7548 NULL, /* get_cb_real_name */ | |
7549 NULL, /* set_chat_topic */ | |
7550 NULL, /* find_blist_chat */ | |
7551 NULL, /* roomlist_get_list */ | |
7552 NULL, /* roomlist_cancel */ | |
7553 NULL, /* roomlist_expand_category */ | |
7554 oscar_can_receive_file, /* can_receive_file */ | |
7555 oscar_send_file /* send_file */ | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7556 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7557 |
10653 | 7558 #if USE_PRPL_PREFERENCES |
9935 | 7559 static GaimPluginUiInfo prefs_info = { |
7560 get_plugin_pref_frame | |
7561 }; | |
10653 | 7562 #endif |
9935 | 7563 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7564 static GaimPluginInfo info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7565 { |
9943 | 7566 GAIM_PLUGIN_MAGIC, |
7567 GAIM_MAJOR_VERSION, | |
7568 GAIM_MINOR_VERSION, | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7569 GAIM_PLUGIN_PROTOCOL, /**< type */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7570 NULL, /**< ui_requirement */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7571 0, /**< flags */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7572 NULL, /**< dependencies */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7573 GAIM_PRIORITY_DEFAULT, /**< priority */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7574 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7575 "prpl-oscar", /**< id */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7576 "AIM/ICQ", /**< name */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7577 VERSION, /**< version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7578 /** summary */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7579 N_("AIM/ICQ Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7580 /** description */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7581 N_("AIM/ICQ Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7582 NULL, /**< author */ |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6350
diff
changeset
|
7583 GAIM_WEBSITE, /**< homepage */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7584 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7585 NULL, /**< load */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7586 NULL, /**< unload */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7587 NULL, /**< destroy */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7588 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7589 NULL, /**< ui_info */ |
8993 | 7590 &prpl_info, /**< extra_info */ |
10653 | 7591 #if USE_PRPL_PREFERENCES |
10487 | 7592 NULL, /**< prefs_info */ |
10653 | 7593 #else |
7594 NULL, /**< prefs_info */ | |
7595 #endif | |
9015 | 7596 oscar_actions |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7597 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7598 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7599 static void |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5917
diff
changeset
|
7600 init_plugin(GaimPlugin *plugin) |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7601 { |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
7602 GaimAccountOption *option; |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
7603 |
9830 | 7604 option = gaim_account_option_string_new(_("Auth host"), "server", FAIM_LOGIN_SERVER); |
7605 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | |
7606 | |
7607 option = gaim_account_option_int_new(_("Auth port"), "port", FAIM_LOGIN_PORT); | |
7608 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | |
7609 | |
7610 option = gaim_account_option_string_new(_("Encoding"), "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); | |
7611 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
|
7612 |
9935 | 7613 gaim_prefs_add_none("/plugins/prpl/oscar"); |
7614 gaim_prefs_add_bool("/plugins/prpl/oscar/recent_buddies", FALSE); | |
9942 | 7615 gaim_prefs_add_bool("/plugins/prpl/oscar/show_idle", FALSE); |
2086 | 7616 } |
7617 | |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5917
diff
changeset
|
7618 GAIM_INIT_PLUGIN(oscar, init_plugin, info); |