Mercurial > pidgin
annotate src/protocols/oscar/oscar.c @ 10097:158950e7996d
[gaim-migrate @ 11119]
I wrote this code with the assumption that iconv would fail if Gaim
attempted to convert utf8 to an encoding that could not represent
all the characters.
This assumption is not true for all version of iconv
(NetBSD 2.0, in this case).
Pope not Calle of Flaxborough (notcalle) pointed this out and
provided a fix.
Thanks!
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Thu, 14 Oct 2004 03:44:42 +0000 |
parents | 2923a6c59192 |
children | fb4216714dac |
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 | |
10042 | 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" |
7283 | 64 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
65 static GaimPlugin *my_protocol = NULL; |
4249 | 66 |
7376 | 67 static int caps_aim = AIM_CAPS_CHAT | AIM_CAPS_BUDDYICON | AIM_CAPS_DIRECTIM | AIM_CAPS_SENDFILE | AIM_CAPS_INTEROPERATE | AIM_CAPS_ICHAT; |
68 static int caps_icq = AIM_CAPS_BUDDYICON | AIM_CAPS_DIRECTIM | AIM_CAPS_SENDFILE | AIM_CAPS_ICQUTF8 | AIM_CAPS_INTEROPERATE | AIM_CAPS_ICHAT; | |
3458 | 69 |
4665 | 70 static fu8_t features_aim[] = {0x01, 0x01, 0x01, 0x02}; |
71 static fu8_t features_icq[] = {0x01, 0x06}; | |
8341 | 72 static fu8_t ck[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; |
2086 | 73 |
7283 | 74 typedef struct _OscarData OscarData; |
75 struct _OscarData { | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
76 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
77 aim_conn_t *conn; |
2086 | 78 |
79 guint cnpa; | |
80 guint paspa; | |
3694 | 81 guint emlpa; |
4804 | 82 guint icopa; |
2086 | 83 |
4823 | 84 gboolean iconconnecting; |
5842 | 85 gboolean set_icon; |
4823 | 86 |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
87 GSList *create_rooms; |
2086 | 88 |
89 gboolean conf; | |
90 gboolean reqemail; | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
91 gboolean setemail; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
92 char *email; |
2979 | 93 gboolean setnick; |
94 char *newsn; | |
2086 | 95 gboolean chpass; |
96 char *oldp; | |
97 char *newp; | |
9971 | 98 |
2086 | 99 GSList *oscar_chats; |
100 GSList *direct_ims; | |
3630 | 101 GSList *file_transfers; |
4738 | 102 GHashTable *buddyinfo; |
4804 | 103 GSList *requesticon; |
2086 | 104 |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
105 gboolean killme; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
106 gboolean icq; |
4804 | 107 guint icontimer; |
5968 | 108 guint getblisttimer; |
8341 | 109 guint getinfotimer; |
2993 | 110 |
111 struct { | |
4230 | 112 guint maxwatchers; /* max users who can watch you */ |
2993 | 113 guint maxbuddies; /* max users you can watch */ |
4230 | 114 guint maxgroups; /* max groups in server list */ |
2993 | 115 guint maxpermits; /* max users on permit list */ |
116 guint maxdenies; /* max users on deny list */ | |
117 guint maxsiglen; /* max size (bytes) of profile */ | |
118 guint maxawaymsglen; /* max size (bytes) of posted away message */ | |
119 } rights; | |
2086 | 120 }; |
121 | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
122 struct create_room { |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
123 char *name; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
124 int exchange; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
125 }; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
126 |
2086 | 127 struct chat_connection { |
128 char *name; | |
129 char *show; /* AOL did something funny to us */ | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
130 fu16_t exchange; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
131 fu16_t instance; |
2086 | 132 int fd; /* this is redundant since we have the conn below */ |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
133 aim_conn_t *conn; |
2086 | 134 int inpa; |
135 int id; | |
5575 | 136 GaimConnection *gc; /* i hate this. */ |
8733 | 137 GaimConversation *conv; /* bah. */ |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
138 int maxlen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
139 int maxvis; |
2086 | 140 }; |
141 | |
8971 | 142 struct oscar_direct_im { |
5575 | 143 GaimConnection *gc; |
2086 | 144 char name[80]; |
145 int watcher; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
146 aim_conn_t *conn; |
3008 | 147 gboolean connected; |
8978 | 148 gboolean gpc_pend; |
149 gboolean killme; | |
8984 | 150 gboolean donttryagain; |
2086 | 151 }; |
152 | |
153 struct ask_direct { | |
5575 | 154 GaimConnection *gc; |
2086 | 155 char *sn; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
156 char ip[64]; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
157 fu8_t cookie[8]; |
8984 | 158 gboolean donttryagain; |
2086 | 159 }; |
160 | |
7011 | 161 /* |
162 * Various PRPL-specific buddy info that we want to keep track of | |
163 * Some other info is maintained by locate.c, and I'd like to move | |
164 * the rest of this to libfaim, mostly im.c | |
165 */ | |
4738 | 166 struct buddyinfo { |
167 gboolean typingnot; | |
6292 | 168 gchar *availmsg; |
6857 | 169 fu32_t ipaddr; |
5836 | 170 |
171 unsigned long ico_me_len; | |
172 unsigned long ico_me_csum; | |
173 time_t ico_me_time; | |
174 gboolean ico_informed; | |
4738 | 175 |
176 unsigned long ico_len; | |
177 unsigned long ico_csum; | |
178 time_t ico_time; | |
179 gboolean ico_need; | |
7406 | 180 gboolean ico_sent; |
2086 | 181 }; |
182 | |
4230 | 183 struct name_data { |
5575 | 184 GaimConnection *gc; |
4230 | 185 gchar *name; |
3453 | 186 gchar *nick; |
3141 | 187 }; |
188 | |
5129 | 189 static char *msgerrreason[] = { |
190 N_("Invalid error"), | |
191 N_("Invalid SNAC"), | |
192 N_("Rate to host"), | |
193 N_("Rate to client"), | |
194 N_("Not logged in"), | |
195 N_("Service unavailable"), | |
196 N_("Service not defined"), | |
197 N_("Obsolete SNAC"), | |
198 N_("Not supported by host"), | |
199 N_("Not supported by client"), | |
200 N_("Refused by client"), | |
201 N_("Reply too big"), | |
202 N_("Responses lost"), | |
203 N_("Request denied"), | |
204 N_("Busted SNAC payload"), | |
205 N_("Insufficient rights"), | |
206 N_("In local permit/deny"), | |
207 N_("Too evil (sender)"), | |
208 N_("Too evil (receiver)"), | |
209 N_("User temporarily unavailable"), | |
210 N_("No match"), | |
211 N_("List overflow"), | |
212 N_("Request ambiguous"), | |
213 N_("Queue full"), | |
214 N_("Not while on AOL") | |
215 }; | |
216 static int msgerrreasonlen = 25; | |
217 | |
218 /* All the libfaim->gaim callback functions */ | |
219 static int gaim_parse_auth_resp (aim_session_t *, aim_frame_t *, ...); | |
220 static int gaim_parse_login (aim_session_t *, aim_frame_t *, ...); | |
221 static int gaim_handle_redirect (aim_session_t *, aim_frame_t *, ...); | |
222 static int gaim_info_change (aim_session_t *, aim_frame_t *, ...); | |
223 static int gaim_account_confirm (aim_session_t *, aim_frame_t *, ...); | |
224 static int gaim_parse_oncoming (aim_session_t *, aim_frame_t *, ...); | |
225 static int gaim_parse_offgoing (aim_session_t *, aim_frame_t *, ...); | |
226 static int gaim_parse_incoming_im(aim_session_t *, aim_frame_t *, ...); | |
227 static int gaim_parse_misses (aim_session_t *, aim_frame_t *, ...); | |
228 static int gaim_parse_clientauto (aim_session_t *, aim_frame_t *, ...); | |
7011 | 229 static int gaim_parse_userinfo (aim_session_t *, aim_frame_t *, ...); |
8341 | 230 static int gaim_reqinfo_timeout (aim_session_t *, aim_frame_t *, ...); |
5129 | 231 static int gaim_parse_motd (aim_session_t *, aim_frame_t *, ...); |
232 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
|
233 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
|
234 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
|
235 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
|
236 static int gaim_conv_chat_incoming_msg(aim_session_t *, aim_frame_t *, ...); |
5129 | 237 static int gaim_email_parseupdate(aim_session_t *, aim_frame_t *, ...); |
238 static int gaim_icon_error (aim_session_t *, aim_frame_t *, ...); | |
239 static int gaim_icon_parseicon (aim_session_t *, aim_frame_t *, ...); | |
5844 | 240 static int oscar_icon_req (aim_session_t *, aim_frame_t *, ...); |
5129 | 241 static int gaim_parse_msgack (aim_session_t *, aim_frame_t *, ...); |
242 static int gaim_parse_ratechange (aim_session_t *, aim_frame_t *, ...); | |
243 static int gaim_parse_evilnotify (aim_session_t *, aim_frame_t *, ...); | |
244 static int gaim_parse_searcherror(aim_session_t *, aim_frame_t *, ...); | |
245 static int gaim_parse_searchreply(aim_session_t *, aim_frame_t *, ...); | |
246 static int gaim_bosrights (aim_session_t *, aim_frame_t *, ...); | |
247 static int gaim_connerr (aim_session_t *, aim_frame_t *, ...); | |
248 static int conninitdone_admin (aim_session_t *, aim_frame_t *, ...); | |
249 static int conninitdone_bos (aim_session_t *, aim_frame_t *, ...); | |
250 static int conninitdone_chatnav (aim_session_t *, aim_frame_t *, ...); | |
251 static int conninitdone_chat (aim_session_t *, aim_frame_t *, ...); | |
252 static int conninitdone_email (aim_session_t *, aim_frame_t *, ...); | |
253 static int conninitdone_icon (aim_session_t *, aim_frame_t *, ...); | |
254 static int gaim_parse_msgerr (aim_session_t *, aim_frame_t *, ...); | |
255 static int gaim_parse_mtn (aim_session_t *, aim_frame_t *, ...); | |
256 static int gaim_parse_locaterights(aim_session_t *, aim_frame_t *, ...); | |
257 static int gaim_parse_buddyrights(aim_session_t *, aim_frame_t *, ...); | |
258 static int gaim_parse_locerr (aim_session_t *, aim_frame_t *, ...); | |
259 static int gaim_icbm_param_info (aim_session_t *, aim_frame_t *, ...); | |
260 static int gaim_parse_genericerr (aim_session_t *, aim_frame_t *, ...); | |
261 static int gaim_memrequest (aim_session_t *, aim_frame_t *, ...); | |
262 static int gaim_selfinfo (aim_session_t *, aim_frame_t *, ...); | |
263 static int gaim_offlinemsg (aim_session_t *, aim_frame_t *, ...); | |
264 static int gaim_offlinemsgdone (aim_session_t *, aim_frame_t *, ...); | |
265 static int gaim_icqalias (aim_session_t *, aim_frame_t *, ...); | |
266 static int gaim_icqinfo (aim_session_t *, aim_frame_t *, ...); | |
267 static int gaim_popup (aim_session_t *, aim_frame_t *, ...); | |
268 #ifndef NOSSI | |
269 static int gaim_ssi_parseerr (aim_session_t *, aim_frame_t *, ...); | |
270 static int gaim_ssi_parserights (aim_session_t *, aim_frame_t *, ...); | |
271 static int gaim_ssi_parselist (aim_session_t *, aim_frame_t *, ...); | |
272 static int gaim_ssi_parseack (aim_session_t *, aim_frame_t *, ...); | |
8227 | 273 static int gaim_ssi_parseadd (aim_session_t *, aim_frame_t *, ...); |
5129 | 274 static int gaim_ssi_authgiven (aim_session_t *, aim_frame_t *, ...); |
275 static int gaim_ssi_authrequest (aim_session_t *, aim_frame_t *, ...); | |
276 static int gaim_ssi_authreply (aim_session_t *, aim_frame_t *, ...); | |
277 static int gaim_ssi_gotadded (aim_session_t *, aim_frame_t *, ...); | |
278 #endif | |
279 | |
280 /* for DirectIM/image transfer */ | |
281 static int gaim_odc_initiate (aim_session_t *, aim_frame_t *, ...); | |
282 static int gaim_odc_incoming (aim_session_t *, aim_frame_t *, ...); | |
283 static int gaim_odc_typing (aim_session_t *, aim_frame_t *, ...); | |
6982 | 284 static int gaim_odc_update_ui (aim_session_t *, aim_frame_t *, ...); |
5129 | 285 |
286 /* for file transfer */ | |
287 static int oscar_sendfile_estblsh(aim_session_t *, aim_frame_t *, ...); | |
288 static int oscar_sendfile_prompt (aim_session_t *, aim_frame_t *, ...); | |
289 static int oscar_sendfile_ack (aim_session_t *, aim_frame_t *, ...); | |
290 static int oscar_sendfile_done (aim_session_t *, aim_frame_t *, ...); | |
291 | |
292 static gboolean gaim_icon_timerfunc(gpointer data); | |
8971 | 293 static void oscar_callback(gpointer data, gint source, GaimInputCondition condition); |
8983 | 294 static void oscar_direct_im_initiate(GaimConnection *gc, const char *who, const char *cookie); |
5954 | 295 static void oscar_set_info(GaimConnection *gc, const char *text); |
9935 | 296 static void recent_buddies_cb(const char *name, GaimPrefType type, gpointer value, gpointer data); |
297 | |
5836 | 298 static void oscar_free_name_data(struct name_data *data) { |
4230 | 299 g_free(data->name); |
300 g_free(data->nick); | |
301 g_free(data); | |
302 } | |
303 | |
5836 | 304 static void oscar_free_buddyinfo(void *data) { |
305 struct buddyinfo *bi = data; | |
6292 | 306 g_free(bi->availmsg); |
5836 | 307 g_free(bi); |
308 } | |
309 | |
9807 | 310 static fu32_t oscar_charset_check(const char *utf8) |
5129 | 311 { |
312 int i = 0; | |
9826 | 313 int charset = AIM_CHARSET_ASCII; |
5129 | 314 |
315 /* Determine how we can send this message. Per the warnings elsewhere | |
316 * in this file, these little checks determine the simplest encoding | |
317 * we can use for a given message send using it. */ | |
318 while (utf8[i]) { | |
319 if ((unsigned char)utf8[i] > 0x7f) { | |
320 /* not ASCII! */ | |
9826 | 321 charset = AIM_CHARSET_CUSTOM; |
5129 | 322 break; |
323 } | |
324 i++; | |
325 } | |
326 while (utf8[i]) { | |
327 /* ISO-8859-1 is 0x00-0xbf in the first byte | |
328 * followed by 0xc0-0xc3 in the second */ | |
329 if ((unsigned char)utf8[i] < 0x80) { | |
330 i++; | |
331 continue; | |
332 } else if (((unsigned char)utf8[i] & 0xfc) == 0xc0 && | |
333 ((unsigned char)utf8[i + 1] & 0xc0) == 0x80) { | |
334 i += 2; | |
335 continue; | |
336 } | |
9826 | 337 charset = AIM_CHARSET_UNICODE; |
5129 | 338 break; |
339 } | |
340 | |
9807 | 341 return charset; |
5129 | 342 } |
343 | |
8225 | 344 /* |
345 * Take a string of the form charset="bleh" where bleh is | |
346 * one of us-ascii, utf-8, iso-8859-1, or unicode-2-0, and | |
347 * return a newly allocated string containing bleh. | |
348 */ | |
349 static gchar *oscar_encoding_extract(const char *encoding) | |
5129 | 350 { |
8225 | 351 gchar *ret = NULL; |
352 char *begin, *end; | |
353 | |
9933 | 354 g_return_val_if_fail(encoding != NULL, NULL); |
355 | |
8735
92cbf9713795
[gaim-migrate @ 9490]
Christian Hammond <chipx86@chipx86.com>
parents:
8733
diff
changeset
|
356 /* Make sure encoding begins with charset= */ |
8225 | 357 if (strncmp(encoding, "text/aolrtf; charset=", 21)) |
358 return NULL; | |
359 | |
360 begin = strchr(encoding, '"'); | |
361 end = strrchr(encoding, '"'); | |
362 | |
363 if ((begin == NULL) || (end == NULL) || (begin >= end)) | |
364 return NULL; | |
365 | |
366 ret = g_strndup(begin+1, (end-1) - begin); | |
367 | |
368 return ret; | |
369 } | |
370 | |
9830 | 371 static gchar * |
372 oscar_encoding_to_utf8(const char *encoding, const char *text, int textlen) | |
5129 | 373 { |
374 gchar *utf8 = NULL; | |
9595 | 375 |
376 if ((encoding == NULL) || encoding[0] == '\0') { | |
377 gaim_debug_info("oscar", "Empty encoding, assuming UTF-8\n"); | |
378 | |
9639 | 379 } else if (!strcmp(encoding, "iso-8859-1") |
380 || !strcmp(encoding, "ISO-8859-1-Windows-3.1-Latin-1")) { | |
9595 | 381 utf8 = g_convert(text, textlen, "UTF-8", "ISO-8859-1", NULL, NULL, NULL); |
382 | |
383 } else if (!strcmp(encoding, "unicode-2-0")) { | |
384 utf8 = g_convert(text, textlen, "UTF-8", "UCS-2BE", NULL, NULL, NULL); | |
385 | |
386 } else if (strcmp(encoding, "us-ascii") && strcmp(encoding, "utf-8")) { | |
387 gaim_debug_warning("oscar", "Unrecognized character encoding \"%s\", " | |
10096 | 388 "attempting to convert to UTF-8 anyway\n", encoding); |
9595 | 389 utf8 = g_convert(text, textlen, "UTF-8", encoding, NULL, NULL, NULL); |
390 } | |
391 | |
392 /* | |
393 * If utf8 is still NULL then either the encoding is us-ascii/utf-8 or | |
394 * we have been unable to convert the text to utf-8 from the encoding | |
395 * that was specified. So we check if the text is valid utf-8 then | |
396 * just copy it. | |
397 */ | |
398 if (utf8 == NULL) { | |
9638 | 399 if (textlen != 0 && *text != '\0' |
400 && !g_utf8_validate(text, textlen, NULL)) | |
9908 | 401 utf8 = g_strdup(_("(There was an error receiving this message. The buddy you are speaking to most likely has a buggy client.)")); |
9476 | 402 else |
9481 | 403 utf8 = g_strndup(text, textlen); |
5129 | 404 } |
405 | |
406 return utf8; | |
407 } | |
408 | |
9830 | 409 static gchar * |
9908 | 410 gaim_plugin_oscar_convert_to_utf8(const fu8_t *data, fu16_t datalen, const char *charsetstr, gboolean fallback) |
9830 | 411 { |
412 gchar *ret = NULL; | |
413 GError *err = NULL; | |
414 | |
9908 | 415 if ((charsetstr == NULL) || (*charsetstr == '\0')) |
416 return NULL; | |
417 | |
418 if (strcasecmp("UTF-8", charsetstr)) { | |
419 if (fallback) | |
420 ret = g_convert_with_fallback(data, datalen, "UTF-8", charsetstr, "?", NULL, NULL, &err); | |
421 else | |
422 ret = g_convert(data, datalen, "UTF-8", charsetstr, NULL, NULL, &err); | |
423 if (err != NULL) { | |
424 gaim_debug_warning("oscar", "Conversation from %s failed: %s.\n", | |
425 charsetstr, err->message); | |
426 g_error_free(err); | |
427 } | |
428 } else { | |
429 if (g_utf8_validate(data, datalen, NULL)) | |
430 ret = g_strndup(data, datalen); | |
431 else | |
432 gaim_debug_warning("oscar", "String is not valid UTF-8.\n"); | |
433 } | |
434 | |
435 return ret; | |
436 } | |
437 | |
438 /* | |
439 * We try decoding using two different character sets. The charset | |
440 * specified in the IM determines the order in which we attempt to | |
441 * decode. We do this because there are lots of broken ICQ clients | |
442 * that don't correctly send non-ASCII messages. And if Gaim isn't | |
443 * able to deal with that crap, then people complain like banshees. | |
444 * charsetstr1 is always set to what the correct encoding should be. | |
445 */ | |
446 static gchar * | |
447 gaim_plugin_oscar_decode_im_part(GaimAccount *account, const char *sourcesn, fu16_t charset, fu16_t charsubset, fu8_t *data, fu16_t datalen) | |
448 { | |
449 gchar *ret = NULL; | |
450 const gchar *charsetstr1, *charsetstr2; | |
451 | |
452 gaim_debug_info("oscar", "Parsing IM part, charset=0x%04hx, charsubset=0x%04hx, datalen=%hd\n", charset, charsubset, datalen); | |
9830 | 453 |
454 if ((datalen == 0) || (data == NULL)) | |
455 return NULL; | |
456 | |
9908 | 457 if (charset == AIM_CHARSET_UNICODE) { |
458 charsetstr1 = "UCS-2BE"; | |
459 charsetstr2 = "UTF-8"; | |
460 } else if (charset == AIM_CHARSET_CUSTOM) { | |
9975 | 461 if ((sourcesn != NULL) && aim_sn_is_icq(sourcesn)) |
9908 | 462 charsetstr1 = gaim_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); |
9830 | 463 else |
9908 | 464 charsetstr1 = "ISO-8859-1"; |
465 charsetstr2 = "UTF-8"; | |
466 } else if (charset == AIM_CHARSET_ASCII) { | |
467 /* Should just be "ASCII" */ | |
9914 | 468 charsetstr1 = "ASCII"; |
9908 | 469 charsetstr2 = gaim_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); |
470 } else if (charset == 0x000d) { | |
9830 | 471 /* Mobile AIM client on a Nokia 3100 and an LG VX6000 */ |
9908 | 472 charsetstr1 = "ISO-8859-1"; |
473 charsetstr2 = gaim_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); | |
474 } else { | |
9830 | 475 /* Unknown, hope for valid UTF-8... */ |
9908 | 476 charsetstr1 = "UTF-8"; |
477 charsetstr2 = gaim_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); | |
478 } | |
479 | |
480 ret = gaim_plugin_oscar_convert_to_utf8(data, datalen, charsetstr1, FALSE); | |
481 if (ret == NULL) | |
482 ret = gaim_plugin_oscar_convert_to_utf8(data, datalen, charsetstr2, TRUE); | |
483 if (ret == NULL) | |
484 ret = g_strdup(_("(There was an error receiving this message. The buddy you are speaking to most likely has a buggy client.)")); | |
9830 | 485 |
486 return ret; | |
487 } | |
488 | |
489 static void | |
490 gaim_plugin_oscar_convert_to_best_encoding(GaimConnection *gc, const char *destsn, const gchar *from, | |
10039 | 491 gchar **msg, int *msglen_int, |
9830 | 492 fu16_t *charset, fu16_t *charsubset) |
493 { | |
494 OscarData *od = gc->proto_data; | |
495 GaimAccount *account = gaim_connection_get_account(gc); | |
496 GError *err = NULL; | |
497 aim_userinfo_t *userinfo = NULL; | |
498 const gchar *charsetstr; | |
10039 | 499 gsize msglen; |
9830 | 500 |
10097 | 501 *charset = oscar_charset_check(from); |
502 | |
9830 | 503 /* Attempt to send as ASCII */ |
10097 | 504 if (*charset == AIM_CHARSET_ASCII) { |
505 *msg = g_convert(from, strlen(from), "ASCII", "UTF-8", NULL, &msglen, NULL); | |
9830 | 506 *charsubset = 0x0000; |
10039 | 507 *msglen_int = msglen; |
9830 | 508 return; |
509 } | |
510 | |
511 /* | |
9908 | 512 * If we're sending to an ICQ user, and they are advertising the |
513 * Unicode capability, then attempt to send as UCS-2BE. | |
9830 | 514 */ |
9975 | 515 if ((destsn != NULL) && aim_sn_is_icq(destsn)) |
9830 | 516 userinfo = aim_locate_finduserinfo(od->sess, destsn); |
517 | |
518 if ((userinfo != NULL) && (userinfo->capabilities & AIM_CAPS_ICQUTF8)) { | |
10039 | 519 *msg = g_convert(from, strlen(from), "UCS-2BE", "UTF-8", NULL, &msglen, NULL); |
9830 | 520 if (*msg != NULL) { |
521 *charset = AIM_CHARSET_UNICODE; | |
522 *charsubset = 0x0000; | |
10039 | 523 *msglen_int = msglen; |
9830 | 524 return; |
525 } | |
526 } | |
527 | |
528 /* | |
529 * If this is AIM then attempt to send as ISO-8859-1. If this is | |
530 * ICQ then attempt to send as the user specified character encoding. | |
531 */ | |
532 charsetstr = "ISO-8859-1"; | |
9975 | 533 if ((destsn != NULL) && aim_sn_is_icq(destsn)) |
9830 | 534 charsetstr = gaim_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); |
535 | |
10097 | 536 /* |
537 * XXX - We need a way to only attempt to convert if we KNOW "from" | |
538 * can be converted to "charsetstr" | |
539 */ | |
10039 | 540 *msg = g_convert(from, strlen(from), charsetstr, "UTF-8", NULL, &msglen, NULL); |
9830 | 541 if (*msg != NULL) { |
542 *charset = AIM_CHARSET_CUSTOM; | |
543 *charsubset = 0x0000; | |
10039 | 544 *msglen_int = msglen; |
9830 | 545 return; |
546 } | |
547 | |
548 /* | |
549 * Nothing else worked, so send as UCS-2BE. | |
550 */ | |
10039 | 551 *msg = g_convert(from, strlen(from), "UCS-2BE", "UTF-8", NULL, &msglen, &err); |
9830 | 552 if (*msg != NULL) { |
553 *charset = AIM_CHARSET_UNICODE; | |
554 *charsubset = 0x0000; | |
10039 | 555 *msglen_int = msglen; |
9830 | 556 return; |
557 } | |
558 | |
9908 | 559 gaim_debug_error("oscar", "Error converting a Unicode message: %s\n", err->message); |
9830 | 560 g_error_free(err); |
561 | |
562 gaim_debug_error("oscar", "This should NEVER happen! Sending UTF-8 text flagged as ASCII.\n"); | |
563 *msg = g_strdup(from); | |
10039 | 564 *msglen_int = strlen(*msg); |
9830 | 565 *charset = AIM_CHARSET_ASCII; |
566 *charsubset = 0x0000; | |
567 return; | |
568 } | |
569 | |
9407 | 570 gchar *oscar_caps_to_string(guint caps) |
8701 | 571 { |
9407 | 572 GString *str; |
573 gchar *tmp; | |
8701 | 574 guint bit = 1; |
575 | |
9407 | 576 str = g_string_new(""); |
577 | |
8701 | 578 if (!caps) { |
579 return NULL; | |
580 } else while (bit <= AIM_CAPS_LAST) { | |
581 if (bit & caps) { | |
582 switch (bit) { | |
583 case AIM_CAPS_BUDDYICON: | |
584 tmp = _("Buddy Icon"); | |
585 break; | |
586 case AIM_CAPS_TALK: | |
587 tmp = _("Voice"); | |
588 break; | |
589 case AIM_CAPS_DIRECTIM: | |
590 tmp = _("AIM Direct IM"); | |
591 break; | |
592 case AIM_CAPS_CHAT: | |
593 tmp = _("Chat"); | |
594 break; | |
595 case AIM_CAPS_GETFILE: | |
596 tmp = _("Get File"); | |
597 break; | |
598 case AIM_CAPS_SENDFILE: | |
599 tmp = _("Send File"); | |
600 break; | |
601 case AIM_CAPS_GAMES: | |
602 case AIM_CAPS_GAMES2: | |
603 tmp = _("Games"); | |
604 break; | |
605 case AIM_CAPS_ADDINS: | |
606 tmp = _("Add-Ins"); | |
607 break; | |
608 case AIM_CAPS_SENDBUDDYLIST: | |
609 tmp = _("Send Buddy List"); | |
610 break; | |
611 case AIM_CAPS_ICQ_DIRECT: | |
612 tmp = _("ICQ Direct Connect"); | |
613 break; | |
614 case AIM_CAPS_APINFO: | |
615 tmp = _("AP User"); | |
616 break; | |
617 case AIM_CAPS_ICQRTF: | |
618 tmp = _("ICQ RTF"); | |
619 break; | |
620 case AIM_CAPS_EMPTY: | |
621 tmp = _("Nihilist"); | |
622 break; | |
623 case AIM_CAPS_ICQSERVERRELAY: | |
624 tmp = _("ICQ Server Relay"); | |
625 break; | |
626 case AIM_CAPS_ICQUTF8OLD: | |
627 tmp = _("Old ICQ UTF8"); | |
628 break; | |
629 case AIM_CAPS_TRILLIANCRYPT: | |
630 tmp = _("Trillian Encryption"); | |
631 break; | |
632 case AIM_CAPS_ICQUTF8: | |
633 tmp = _("ICQ UTF8"); | |
634 break; | |
635 case AIM_CAPS_HIPTOP: | |
636 tmp = _("Hiptop"); | |
637 break; | |
638 case AIM_CAPS_SECUREIM: | |
639 tmp = _("Security Enabled"); | |
640 break; | |
641 case AIM_CAPS_VIDEO: | |
642 tmp = _("Video Chat"); | |
643 break; | |
644 /* Not actually sure about this one... WinAIM doesn't show anything */ | |
645 case AIM_CAPS_ICHATAV: | |
646 tmp = _("iChat AV"); | |
647 break; | |
648 case AIM_CAPS_LIVEVIDEO: | |
649 tmp = _("Live Video"); | |
650 break; | |
651 case AIM_CAPS_CAMERA: | |
652 tmp = _("Camera"); | |
653 break; | |
654 default: | |
655 tmp = NULL; | |
656 break; | |
657 } | |
658 if (tmp) | |
9532 | 659 g_string_append_printf(str, "%s%s", (*(str->str) == '\0' ? "" : ", "), tmp); |
8701 | 660 } |
661 bit <<= 1; | |
662 } | |
9407 | 663 |
664 return g_string_free(str, FALSE); | |
8701 | 665 } |
666 | |
667 static char *oscar_icqstatus(int state) { | |
668 /* Make a cute little string that shows the status of the dude or dudet */ | |
669 if (state & AIM_ICQ_STATE_CHAT) | |
670 return g_strdup_printf(_("Free For Chat")); | |
671 else if (state & AIM_ICQ_STATE_DND) | |
672 return g_strdup_printf(_("Do Not Disturb")); | |
673 else if (state & AIM_ICQ_STATE_OUT) | |
674 return g_strdup_printf(_("Not Available")); | |
675 else if (state & AIM_ICQ_STATE_BUSY) | |
676 return g_strdup_printf(_("Occupied")); | |
677 else if (state & AIM_ICQ_STATE_AWAY) | |
678 return g_strdup_printf(_("Away")); | |
679 else if (state & AIM_ICQ_STATE_WEBAWARE) | |
680 return g_strdup_printf(_("Web Aware")); | |
681 else if (state & AIM_ICQ_STATE_INVISIBLE) | |
682 return g_strdup_printf(_("Invisible")); | |
683 else | |
684 return g_strdup_printf(_("Online")); | |
685 } | |
686 | |
9973 | 687 static void |
688 oscar_string_append(GString *str, const char *newline, const char *name, const char *value) | |
8700 | 689 { |
690 gchar *utf8; | |
691 | |
692 if (value && value[0] && (utf8 = gaim_utf8_try_convert(value))) { | |
8701 | 693 g_string_append_printf(str, "%s<b>%s:</b> %s", newline, name, utf8); |
8700 | 694 g_free(utf8); |
695 } | |
696 } | |
697 | |
9973 | 698 static void oscar_string_append_info(GaimConnection *gc, GString *str, const char *newline, GaimBuddy *b, aim_userinfo_t *userinfo) |
8701 | 699 { |
10042 | 700 OscarData *od; |
701 GaimAccount *account; | |
702 GaimPresence *presence; | |
703 GaimPresence *buddy_presence; | |
8701 | 704 GaimGroup *g = NULL; |
705 struct buddyinfo *bi = NULL; | |
706 char *tmp; | |
707 | |
10042 | 708 od = gc->proto_data; |
709 account = gaim_connection_get_account(gc); | |
710 presence = gaim_account_get_presence(account); | |
711 buddy_presence = gaim_buddy_get_presence(b); | |
712 | |
713 if ((str == NULL) || (newline == NULL) || ((b == NULL) && (userinfo == NULL))) | |
8701 | 714 return; |
715 | |
716 if (userinfo == NULL) | |
717 userinfo = aim_locate_finduserinfo(od->sess, b->name); | |
718 | |
719 if (b == NULL) | |
10042 | 720 b = gaim_find_buddy(account, userinfo->sn); |
8701 | 721 |
722 if (b != NULL) | |
723 g = gaim_find_buddys_group(b); | |
724 | |
725 if (userinfo != NULL) | |
726 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(account, userinfo->sn)); | |
727 | |
8733 | 728 if (b != NULL) { |
10042 | 729 if (gaim_presence_is_online(buddy_presence)) { |
9975 | 730 if (aim_sn_is_icq(b->name)) { |
8733 | 731 tmp = oscar_icqstatus((b->uc & 0xffff0000) >> 16); |
732 oscar_string_append(str, newline, _("Status"), tmp); | |
733 g_free(tmp); | |
734 } | |
735 } else { | |
9625 | 736 tmp = aim_ssi_itemlist_findparentname(od->sess->ssi.local, b->name); |
8733 | 737 if (aim_ssi_waitingforauth(od->sess->ssi.local, tmp, b->name)) |
738 oscar_string_append(str, newline, _("Status"), _("Not Authorized")); | |
739 else | |
740 oscar_string_append(str, newline, _("Status"), _("Offline")); | |
8701 | 741 } |
8733 | 742 } |
8701 | 743 |
744 if ((bi != NULL) && (bi->ipaddr != 0)) { | |
9625 | 745 tmp = g_strdup_printf("%hhu.%hhu.%hhu.%hhu", |
8701 | 746 (bi->ipaddr & 0xff000000) >> 24, |
747 (bi->ipaddr & 0x00ff0000) >> 16, | |
748 (bi->ipaddr & 0x0000ff00) >> 8, | |
749 (bi->ipaddr & 0x000000ff)); | |
750 oscar_string_append(str, newline, _("IP Address"), tmp); | |
751 g_free(tmp); | |
752 } | |
753 | |
754 if ((userinfo != NULL) && (userinfo->capabilities != 0)) { | |
755 tmp = oscar_caps_to_string(userinfo->capabilities); | |
756 oscar_string_append(str, newline, _("Capabilities"), tmp); | |
9407 | 757 g_free(tmp); |
8701 | 758 } |
759 | |
760 if ((b != NULL) && (b->name != NULL) && (g != NULL) && (g->name != NULL)) { | |
761 tmp = aim_ssi_getcomment(od->sess->ssi.local, g->name, b->name); | |
762 if (tmp != NULL) { | |
9625 | 763 char *tmp2 = g_markup_escape_text(tmp, strlen(tmp)); |
8701 | 764 g_free(tmp); |
9625 | 765 oscar_string_append(str, newline, _("Buddy Comment"), tmp2); |
766 g_free(tmp2); | |
8701 | 767 } |
768 } | |
769 | |
10042 | 770 if ((bi != NULL) && (bi->availmsg != NULL) && gaim_presence_is_available(presence)) { |
8701 | 771 tmp = g_markup_escape_text(bi->availmsg, strlen(bi->availmsg)); |
772 oscar_string_append(str, newline, _("Available"), tmp); | |
773 g_free(tmp); | |
774 } | |
775 } | |
776 | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
777 static char *extract_name(const char *name) { |
4121 | 778 char *tmp, *x; |
2086 | 779 int i, j; |
4120 | 780 |
781 if (!name) | |
4121 | 782 return NULL; |
10042 | 783 |
4120 | 784 x = strchr(name, '-'); |
4121 | 785 |
2086 | 786 if (!x) return NULL; |
787 x = strchr(++x, '-'); | |
788 if (!x) return NULL; | |
789 tmp = g_strdup(++x); | |
790 | |
791 for (i = 0, j = 0; x[i]; i++) { | |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
792 char hex[3]; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
793 if (x[i] != '%') { |
2086 | 794 tmp[j++] = x[i]; |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
795 continue; |
2086 | 796 } |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
797 strncpy(hex, x + ++i, 2); hex[2] = 0; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
798 i++; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
799 tmp[j++] = strtol(hex, NULL, 16); |
2086 | 800 } |
801 | |
802 tmp[j] = 0; | |
803 return tmp; | |
804 } | |
805 | |
5575 | 806 static struct chat_connection *find_oscar_chat(GaimConnection *gc, int id) { |
7283 | 807 GSList *g = ((OscarData *)gc->proto_data)->oscar_chats; |
2086 | 808 struct chat_connection *c = NULL; |
809 | |
810 while (g) { | |
811 c = (struct chat_connection *)g->data; | |
812 if (c->id == id) | |
813 break; | |
814 g = g->next; | |
815 c = NULL; | |
816 } | |
817 | |
818 return c; | |
819 } | |
820 | |
5575 | 821 static struct chat_connection *find_oscar_chat_by_conn(GaimConnection *gc, |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
822 aim_conn_t *conn) { |
7283 | 823 GSList *g = ((OscarData *)gc->proto_data)->oscar_chats; |
2086 | 824 struct chat_connection *c = NULL; |
825 | |
826 while (g) { | |
827 c = (struct chat_connection *)g->data; | |
828 if (c->conn == conn) | |
829 break; | |
830 g = g->next; | |
831 c = NULL; | |
832 } | |
833 | |
834 return c; | |
835 } | |
836 | |
8219 | 837 static struct chat_connection *find_oscar_chat_by_conv(GaimConnection *gc, |
838 GaimConversation *conv) { | |
839 GSList *g = ((OscarData *)gc->proto_data)->oscar_chats; | |
840 struct chat_connection *c = NULL; | |
841 | |
842 while (g) { | |
843 c = (struct chat_connection *)g->data; | |
8733 | 844 if (c->conv == conv) |
8219 | 845 break; |
846 g = g->next; | |
847 c = NULL; | |
848 } | |
849 | |
850 return c; | |
851 } | |
852 | |
8971 | 853 /***************************************************************************** |
854 * Begin scary direct im stuff | |
855 *****************************************************************************/ | |
856 | |
857 static struct oscar_direct_im *oscar_direct_im_find(OscarData *od, const char *who) { | |
858 GSList *d = od->direct_ims; | |
859 struct oscar_direct_im *m = NULL; | |
860 | |
861 while (d) { | |
862 m = (struct oscar_direct_im *)d->data; | |
863 if (!aim_sncmp(who, m->name)) | |
864 return m; | |
865 d = d->next; | |
866 } | |
867 | |
868 return NULL; | |
869 } | |
870 | |
871 static void oscar_direct_im_destroy(OscarData *od, struct oscar_direct_im *dim) | |
872 { | |
873 gaim_debug_info("oscar", | |
874 "destroying Direct IM for %s.\n", dim->name); | |
875 | |
876 od->direct_ims = g_slist_remove(od->direct_ims, dim); | |
8978 | 877 if (dim->gpc_pend) { |
878 dim->killme = TRUE; | |
879 return; | |
880 } | |
8971 | 881 if (dim->watcher) |
882 gaim_input_remove(dim->watcher); | |
883 if (dim->conn) { | |
884 aim_conn_close(dim->conn); | |
885 aim_conn_kill(od->sess, &dim->conn); | |
886 } | |
887 g_free(dim); | |
888 } | |
889 | |
890 /* the only difference between this and destroy is this writes a conv message */ | |
891 static void oscar_direct_im_disconnect(OscarData *od, struct oscar_direct_im *dim) | |
892 { | |
893 GaimConversation *conv; | |
894 char buf[256]; | |
895 | |
896 gaim_debug_info("oscar", | |
897 "%s disconnected Direct IM.\n", dim->name); | |
898 | |
899 if (dim->connected) | |
900 g_snprintf(buf, sizeof buf, _("Direct IM with %s closed"), dim->name); | |
8978 | 901 else |
8971 | 902 g_snprintf(buf, sizeof buf, _("Direct IM with %s failed"), dim->name); |
903 | |
904 conv = gaim_find_conversation_with_account(dim->name, gaim_connection_get_account(dim->gc)); | |
905 if (conv) { | |
906 gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL)); | |
9463 | 907 gaim_conversation_update_progress(conv, 0); |
8971 | 908 } else { |
909 gaim_notify_error(dim->gc, NULL, _("Direct Connect failed"), buf); | |
910 } | |
911 | |
912 oscar_direct_im_destroy(od, dim); | |
913 | |
914 return; | |
915 } | |
916 | |
917 /* oops i made two of these. this one just calls the other one. */ | |
918 static void gaim_odc_disconnect(aim_session_t *sess, aim_conn_t *conn) | |
919 { | |
920 GaimConnection *gc = sess->aux_data; | |
921 OscarData *od = (OscarData *)gc->proto_data; | |
922 struct oscar_direct_im *dim; | |
923 char *sn; | |
924 | |
925 sn = g_strdup(aim_odc_getsn(conn)); | |
926 dim = oscar_direct_im_find(od, sn); | |
927 oscar_direct_im_disconnect(od, dim); | |
928 g_free(sn); | |
929 } | |
930 | |
931 static void destroy_direct_im_request(struct ask_direct *d) { | |
932 gaim_debug_info("oscar", "Freeing DirectIM prompts.\n"); | |
933 | |
934 g_free(d->sn); | |
935 g_free(d); | |
936 } | |
937 | |
938 /* this is just a gaim_proxy_connect cb that sets up the rest of the cbs */ | |
939 static void oscar_odc_callback(gpointer data, gint source, GaimInputCondition condition) { | |
940 struct oscar_direct_im *dim = data; | |
941 GaimConnection *gc = dim->gc; | |
942 OscarData *od = gc->proto_data; | |
943 GaimConversation *conv; | |
944 char buf[256]; | |
945 struct sockaddr name; | |
946 socklen_t name_len = 1; | |
947 | |
948 g_return_if_fail(gc != NULL); | |
949 | |
8978 | 950 dim->gpc_pend = FALSE; |
951 if (dim->killme) { | |
952 oscar_direct_im_destroy(od, dim); | |
953 return; | |
954 } | |
955 | |
8971 | 956 if (!g_list_find(gaim_connections_get_all(), gc)) { |
957 oscar_direct_im_destroy(od, dim); | |
958 return; | |
959 } | |
960 | |
961 if (source < 0) { | |
8984 | 962 if (dim->donttryagain) { |
963 oscar_direct_im_disconnect(od, dim); | |
964 return; | |
965 } else { | |
966 fu8_t cookie[8]; | |
967 char *who = g_strdup(dim->name); | |
968 const char *tmp = aim_odc_getcookie(dim->conn); | |
969 | |
970 memcpy(cookie, tmp, 8); | |
971 oscar_direct_im_destroy(od, dim); | |
972 oscar_direct_im_initiate(gc, who, cookie); | |
973 gaim_debug_info("oscar", "asking direct im initiator to connect to us\n"); | |
974 g_free(who); | |
975 return; | |
976 } | |
8971 | 977 } |
978 | |
979 dim->conn->fd = source; | |
980 aim_conn_completeconnect(od->sess, dim->conn); | |
981 conv = gaim_conversation_new(GAIM_CONV_IM, dim->gc->account, dim->name); | |
982 | |
983 /* This is the best way to see if we're connected or not */ | |
8983 | 984 /* Is this really needed? */ |
8971 | 985 if (getpeername(source, &name, &name_len) == 0) { |
986 g_snprintf(buf, sizeof buf, _("Direct IM with %s established"), dim->name); | |
987 dim->connected = TRUE; | |
988 gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL)); | |
8983 | 989 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, oscar_callback, dim->conn); |
990 } else { | |
8984 | 991 if (dim->donttryagain) { |
992 oscar_direct_im_disconnect(od, dim); | |
993 return; | |
994 } else { | |
995 fu8_t cookie[8]; | |
996 char *who = g_strdup(dim->name); | |
997 const char *tmp = aim_odc_getcookie(dim->conn); | |
998 | |
999 memcpy(cookie, tmp, 8); | |
1000 oscar_direct_im_destroy(od, dim); | |
1001 oscar_direct_im_initiate(gc, who, cookie); | |
1002 gaim_debug_info("oscar", "asking direct im initiator to connect to us\n"); | |
1003 g_free(who); | |
1004 return; | |
1005 } | |
8983 | 1006 } |
1007 | |
1008 | |
8971 | 1009 } |
1010 | |
1011 static void accept_direct_im_request(struct ask_direct *d) { | |
1012 GaimConnection *gc = d->gc; | |
1013 OscarData *od; | |
1014 struct oscar_direct_im *dim; | |
1015 char *host; int port = 5190; | |
1016 int i, rc; | |
8982 | 1017 char *tmp; |
1018 GaimConversation *conv; | |
8971 | 1019 |
1020 if (!g_list_find(gaim_connections_get_all(), gc)) { | |
1021 destroy_direct_im_request(d); | |
1022 return; | |
1023 } | |
1024 | |
1025 od = (OscarData *)gc->proto_data; | |
1026 gaim_debug_info("oscar", "Accepted DirectIM.\n"); | |
1027 | |
1028 dim = oscar_direct_im_find(od, d->sn); | |
1029 if (dim && dim->connected) { | |
1030 destroy_direct_im_request(d); /* 40 */ /* what does that 40 mean? */ | |
1031 gaim_debug_info("oscar", "Wait, we're already connected, ignoring DirectIM.\n"); | |
1032 return; | |
1033 } | |
1034 dim = g_new0(struct oscar_direct_im, 1); | |
1035 dim->gc = d->gc; | |
8984 | 1036 dim->donttryagain = d->donttryagain; |
8971 | 1037 g_snprintf(dim->name, sizeof dim->name, "%s", d->sn); |
1038 | |
1039 dim->conn = aim_odc_connect(od->sess, d->sn, NULL, d->cookie); | |
1040 od->direct_ims = g_slist_append(od->direct_ims, dim); | |
1041 if (!dim->conn) { | |
1042 oscar_direct_im_disconnect(od, dim); | |
1043 destroy_direct_im_request(d); | |
1044 return; | |
1045 } | |
1046 | |
1047 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, | |
1048 gaim_odc_incoming, 0); | |
1049 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, | |
1050 gaim_odc_typing, 0); | |
1051 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER, | |
1052 gaim_odc_update_ui, 0); | |
1053 | |
1054 gaim_debug_info("oscar", "ip is %s.\n", d->ip); | |
1055 for (i = 0; i < (int)strlen(d->ip); i++) { | |
1056 if (d->ip[i] == ':') { | |
1057 port = atoi(&(d->ip[i+1])); | |
1058 break; | |
1059 } | |
1060 } | |
1061 host = g_strndup(d->ip, i); | |
1062 dim->conn->status |= AIM_CONN_STATUS_INPROGRESS; | |
8978 | 1063 dim->gpc_pend = TRUE; |
8971 | 1064 rc = gaim_proxy_connect(gc->account, host, port, oscar_odc_callback, dim); |
8982 | 1065 |
1066 conv = gaim_conversation_new(GAIM_CONV_IM, dim->gc->account, d->sn); | |
1067 tmp = g_strdup_printf(_("Attempting to connect to %s at %s:%hu for Direct IM."), d->sn, host, | |
1068 port); | |
1069 gaim_conversation_write(conv, NULL, tmp, GAIM_MESSAGE_SYSTEM, time(NULL)); | |
1070 g_free(tmp); | |
8983 | 1071 |
8971 | 1072 g_free(host); |
1073 if (rc < 0) { | |
8978 | 1074 dim->gpc_pend = FALSE; |
8971 | 1075 oscar_direct_im_disconnect(od, dim); |
1076 destroy_direct_im_request(d); | |
1077 return; | |
1078 } | |
1079 | |
1080 destroy_direct_im_request(d); | |
1081 | |
1082 return; | |
1083 } | |
1084 | |
1085 /* | |
1086 * We have just established a socket with the other dude, so set up some handlers. | |
1087 */ | |
1088 static int gaim_odc_initiate(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 1089 GaimConnection *gc = sess->aux_data; |
7283 | 1090 OscarData *od = (OscarData *)gc->proto_data; |
8733 | 1091 GaimConversation *conv; |
8971 | 1092 struct oscar_direct_im *dim; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1093 char buf[256]; |
8971 | 1094 char *sn; |
1095 va_list ap; | |
1096 aim_conn_t *newconn, *listenerconn; | |
1097 | |
1098 va_start(ap, fr); | |
1099 newconn = va_arg(ap, aim_conn_t *); | |
1100 listenerconn = va_arg(ap, aim_conn_t *); | |
1101 va_end(ap); | |
1102 | |
1103 aim_conn_close(listenerconn); | |
1104 aim_conn_kill(sess, &listenerconn); | |
1105 | |
1106 sn = g_strdup(aim_odc_getsn(newconn)); | |
1107 | |
1108 gaim_debug_info("oscar", | |
1109 "DirectIM: initiate success to %s\n", sn); | |
1110 dim = oscar_direct_im_find(od, sn); | |
1111 | |
1112 conv = gaim_conversation_new(GAIM_CONV_IM, dim->gc->account, sn); | |
1113 gaim_input_remove(dim->watcher); | |
1114 dim->conn = newconn; | |
1115 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, oscar_callback, dim->conn); | |
1116 dim->connected = TRUE; | |
1117 g_snprintf(buf, sizeof buf, _("Direct IM with %s established"), sn); | |
1118 g_free(sn); | |
1119 gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL)); | |
1120 | |
1121 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, gaim_odc_incoming, 0); | |
1122 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, gaim_odc_typing, 0); | |
1123 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER, gaim_odc_update_ui, 0); | |
1124 | |
1125 return 1; | |
1126 } | |
1127 | |
1128 /* | |
1129 * This is called when each chunk of an image is received. It can be used to | |
1130 * update a progress bar, or to eat lots of dry cat food. Wet cat food is | |
1131 * nasty, you sicko. | |
1132 */ | |
1133 static int gaim_odc_update_ui(aim_session_t *sess, aim_frame_t *fr, ...) { | |
1134 va_list ap; | |
1135 char *sn; | |
1136 double percent; | |
1137 GaimConnection *gc = sess->aux_data; | |
1138 OscarData *od = (OscarData *)gc->proto_data; | |
1139 GaimConversation *c; | |
1140 struct oscar_direct_im *dim; | |
1141 | |
1142 va_start(ap, fr); | |
1143 sn = va_arg(ap, char *); | |
1144 percent = va_arg(ap, double); | |
1145 va_end(ap); | |
1146 | |
1147 if (!sn || !(dim = oscar_direct_im_find(od, sn))) | |
1148 return 1; | |
1149 if (dim->watcher) { | |
1150 gaim_input_remove(dim->watcher); /* Otherwise, the callback will callback */ | |
1151 /* The callback will callback? I don't get how that would happen here. */ | |
1152 dim->watcher = 0; | |
1153 } | |
1154 | |
1155 c = gaim_find_conversation_with_account(sn, gaim_connection_get_account(gc)); | |
1156 if (c != NULL) | |
1157 gaim_conversation_update_progress(c, percent); | |
1158 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, | |
1159 oscar_callback, dim->conn); | |
1160 | |
1161 return 1; | |
1162 } | |
1163 | |
1164 /* | |
1165 * This is called after a direct IM has been received in its entirety. This | |
1166 * function is passed a long chunk of data which contains the IM with any | |
1167 * data chunks (images) appended to it. | |
1168 * | |
1169 * This function rips out all the data chunks and creates an imgstore for | |
1170 * each one. In order to do this, it first goes through the IM and takes | |
1171 * out all the IMG tags. When doing so, it rewrites the original IMG tag | |
1172 * with one compatible with the imgstore Gaim core code. For each one, we | |
1173 * then read in chunks of data from the end of the message and actually | |
1174 * create the img store using the given data. | |
1175 * | |
1176 * For somewhat easy reference, here's a sample message | |
1177 * (without the whitespace and asterisks): | |
1178 * | |
1179 * <HTML><BODY BGCOLOR="#ffffff"> | |
1180 * <FONT LANG="0"> | |
1181 * This is a really stupid picture:<BR> | |
1182 * <IMG SRC="Sample.jpg" ID="1" WIDTH="283" HEIGHT="212" DATASIZE="9894"><BR> | |
1183 * Yeah it is<BR> | |
1184 * Here is another one:<BR> | |
1185 * <IMG SRC="Soap Bubbles.bmp" ID="2" WIDTH="256" HEIGHT="256" DATASIZE="65978"> | |
1186 * </FONT> | |
1187 * </BODY></HTML> | |
1188 * <BINARY> | |
1189 * <DATA ID="1" SIZE="9894">datadatadatadata</DATA> | |
1190 * <DATA ID="2" SIZE="65978">datadatadatadata</DATA> | |
1191 * </BINARY> | |
1192 */ | |
1193 static int gaim_odc_incoming(aim_session_t *sess, aim_frame_t *fr, ...) { | |
1194 GaimConnection *gc = sess->aux_data; | |
1195 GaimConvImFlags imflags = 0; | |
1196 gchar *utf8; | |
1197 GString *newmsg = g_string_new(""); | |
1198 GSList *images = NULL; | |
1199 va_list ap; | |
1200 const char *sn, *msg, *msgend, *binary; | |
1201 size_t len; | |
1202 int encoding, isawaymsg; | |
1203 | |
1204 va_start(ap, fr); | |
1205 sn = va_arg(ap, const char *); | |
1206 msg = va_arg(ap, const char *); | |
1207 len = va_arg(ap, size_t); | |
1208 encoding = va_arg(ap, int); | |
1209 isawaymsg = va_arg(ap, int); | |
1210 va_end(ap); | |
1211 msgend = msg + len; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1212 |
8660 | 1213 gaim_debug_info("oscar", |
8971 | 1214 "Got DirectIM message from %s\n", sn); |
1215 | |
1216 if (isawaymsg) | |
1217 imflags |= GAIM_CONV_IM_AUTO_RESP; | |
1218 | |
1219 /* message has a binary trailer */ | |
1220 if ((binary = gaim_strcasestr(msg, "<binary>"))) { | |
1221 GData *attribs; | |
1222 const char *tmp, *start, *end, *last = NULL; | |
1223 | |
1224 tmp = msg; | |
1225 | |
1226 /* for each valid image tag... */ | |
1227 while (gaim_markup_find_tag("img", tmp, &start, &end, &attribs)) { | |
1228 const char *id, *src, *datasize; | |
1229 const char *tag = NULL, *data = NULL; | |
1230 size_t size; | |
1231 int imgid = 0; | |
1232 | |
1233 /* update the location of the last img tag */ | |
1234 last = end; | |
1235 | |
1236 /* grab attributes */ | |
1237 id = g_datalist_get_data(&attribs, "id"); | |
1238 src = g_datalist_get_data(&attribs, "src"); | |
1239 datasize = g_datalist_get_data(&attribs, "datasize"); | |
1240 | |
1241 /* if we have id & datasize, build the data tag */ | |
1242 if (id && datasize) | |
1243 tag = g_strdup_printf("<data id=\"%s\" size=\"%s\">", id, datasize); | |
1244 | |
1245 /* if we have a tag, find the start of the data */ | |
1246 if (tag && (data = gaim_strcasestr(binary, tag))) | |
1247 data += strlen(tag); | |
1248 | |
1249 /* check the data is here and store it */ | |
1250 if (data + (size = atoi(datasize)) <= msgend) | |
1251 imgid = gaim_imgstore_add(data, size, src); | |
1252 | |
1253 /* | |
1254 * XXX - The code below contains some calls to oscar_encoding_to_utf8 | |
1255 * The hardcoded "us-ascii" value REALLY needs to be removed. | |
1256 */ | |
1257 /* if we have a stored image... */ | |
1258 if (imgid) { | |
1259 /* append the message up to the tag */ | |
1260 utf8 = oscar_encoding_to_utf8("us-ascii", tmp, start - tmp); | |
1261 if (utf8 != NULL) { | |
1262 newmsg = g_string_append(newmsg, utf8); | |
1263 g_free(utf8); | |
1264 } | |
1265 | |
1266 /* write the new image tag */ | |
1267 g_string_append_printf(newmsg, "<IMG ID=\"%d\">", imgid); | |
1268 | |
1269 /* and record the image number */ | |
1270 images = g_slist_append(images, GINT_TO_POINTER(imgid)); | |
1271 } else { | |
1272 /* otherwise, copy up to the end of the tag */ | |
1273 utf8 = oscar_encoding_to_utf8("us-ascii", tmp, (end + 1) - tmp); | |
1274 if (utf8 != NULL) { | |
1275 newmsg = g_string_append(newmsg, utf8); | |
1276 g_free(utf8); | |
1277 } | |
1278 } | |
1279 | |
1280 /* clear the attribute list */ | |
1281 g_datalist_clear(&attribs); | |
1282 | |
1283 /* continue from the end of the tag */ | |
1284 tmp = end + 1; | |
1285 } | |
1286 | |
1287 /* append any remaining message data (without the > :-) */ | |
1288 if (last++ && (last < binary)) | |
1289 newmsg = g_string_append_len(newmsg, last, binary - last); | |
1290 | |
1291 /* set the flag if we caught any images */ | |
1292 if (images) | |
1293 imflags |= GAIM_CONV_IM_IMAGES; | |
1294 } else { | |
1295 g_string_append_len(newmsg, msg, len); | |
1296 } | |
1297 | |
1298 /* XXX - I imagine Paco-Paco will want to do some voodoo with the encoding here */ | |
1299 serv_got_im(gc, sn, newmsg->str, imflags, time(NULL)); | |
1300 | |
1301 /* free up the message */ | |
1302 g_string_free(newmsg, TRUE); | |
1303 | |
1304 /* unref any images we allocated */ | |
1305 if (images) { | |
1306 GSList *tmp; | |
1307 int id; | |
1308 | |
1309 for (tmp = images; tmp != NULL; tmp = tmp->next) { | |
1310 id = GPOINTER_TO_INT(tmp->data); | |
1311 gaim_imgstore_unref(id); | |
1312 } | |
1313 | |
1314 g_slist_free(images); | |
1315 } | |
1316 | |
1317 return 1; | |
1318 } | |
1319 | |
1320 static int gaim_odc_typing(aim_session_t *sess, aim_frame_t *fr, ...) { | |
1321 va_list ap; | |
1322 char *sn; | |
1323 int typing; | |
1324 GaimConnection *gc = sess->aux_data; | |
1325 | |
1326 va_start(ap, fr); | |
1327 sn = va_arg(ap, char *); | |
1328 typing = va_arg(ap, int); | |
1329 va_end(ap); | |
1330 | |
1331 if (typing == 0x0002) { | |
1332 /* I had to leave this. It's just too funny. It reminds me of my sister. */ | |
1333 gaim_debug_info("oscar", | |
1334 "ohmigod! %s has started typing (DirectIM). He's going to send you a message! *squeal*\n", sn); | |
1335 serv_got_typing(gc, sn, 0, GAIM_TYPING); | |
1336 } else if (typing == 0x0001) | |
1337 serv_got_typing(gc, sn, 0, GAIM_TYPED); | |
1338 else | |
1339 serv_got_typing_stopped(gc, sn); | |
1340 return 1; | |
1341 } | |
1342 | |
1343 static int gaim_odc_send_im(aim_session_t *sess, aim_conn_t *conn, const char *message, GaimConvImFlags imflags) { | |
1344 char *buf; | |
1345 size_t len; | |
1346 int ret; | |
1347 GString *msg = g_string_new("<HTML><BODY>"); | |
1348 GString *data = g_string_new("</BODY></HTML><BINARY>"); | |
1349 GData *attribs; | |
1350 const char *start, *end, *last; | |
1351 int oscar_id = 0; | |
1352 | |
1353 last = message; | |
1354 | |
1355 /* for each valid IMG tag... */ | |
1356 while (last && *last && gaim_markup_find_tag("img", last, &start, &end, &attribs)) { | |
1357 GaimStoredImage *image = NULL; | |
1358 const char *id; | |
1359 | |
1360 if (start - last) { | |
1361 g_string_append_len(msg, last, start - last); | |
1362 } | |
1363 | |
1364 id = g_datalist_get_data(&attribs, "id"); | |
1365 | |
1366 /* ... if it refers to a valid gaim image ... */ | |
1367 if (id && (image = gaim_imgstore_get(atoi(id)))) { | |
1368 /* ... append the message from start to the tag ... */ | |
9126 | 1369 unsigned long size = gaim_imgstore_get_size(image); |
8971 | 1370 const char *filename = gaim_imgstore_get_filename(image); |
1371 gpointer imgdata = gaim_imgstore_get_data(image); | |
1372 | |
1373 oscar_id++; | |
1374 | |
1375 /* ... insert a new img tag with the oscar id ... */ | |
1376 if (filename) | |
1377 g_string_append_printf(msg, | |
9126 | 1378 "<IMG SRC=\"%s\" ID=\"%d\" DATASIZE=\"%lu\">", |
8971 | 1379 filename, oscar_id, size); |
1380 else | |
1381 g_string_append_printf(msg, | |
9126 | 1382 "<IMG ID=\"%d\" DATASIZE=\"%lu\">", |
8971 | 1383 oscar_id, size); |
1384 | |
1385 /* ... and append the data to the binary section ... */ | |
9126 | 1386 g_string_append_printf(data, "<DATA ID=\"%d\" SIZE=\"%lu\">", |
8971 | 1387 oscar_id, size); |
1388 data = g_string_append_len(data, imgdata, size); | |
1389 data = g_string_append(data, "</DATA>"); | |
1390 } | |
1391 /* If the tag is invalid, skip it, thus no else here */ | |
1392 | |
1393 g_datalist_clear(&attribs); | |
1394 | |
1395 /* continue from the end of the tag */ | |
1396 last = end + 1; | |
1397 } | |
1398 | |
1399 /* append any remaining message data (without the > :-) */ | |
1400 if (last && *last) | |
1401 msg = g_string_append(msg, last); | |
1402 | |
1403 /* if we inserted any images in the binary section, append it */ | |
1404 if (oscar_id) { | |
1405 msg = g_string_append_len(msg, data->str, data->len); | |
1406 msg = g_string_append(msg, "</BINARY>"); | |
1407 } | |
1408 | |
1409 len = msg->len; | |
1410 buf = msg->str; | |
1411 g_string_free(msg, FALSE); | |
1412 g_string_free(data, TRUE); | |
1413 | |
1414 | |
1415 /* XXX - The last parameter below is the encoding. Let Paco-Paco do something with it. */ | |
1416 if (imflags & GAIM_CONV_IM_AUTO_RESP) | |
1417 ret = aim_odc_send_im(sess, conn, buf, len, 0, 1); | |
1418 else | |
1419 ret = aim_odc_send_im(sess, conn, buf, len, 0, 0); | |
1420 | |
1421 g_free(buf); | |
1422 | |
1423 return ret; | |
1424 } | |
1425 | |
1426 struct ask_do_dir_im { | |
1427 char *who; | |
1428 GaimConnection *gc; | |
1429 }; | |
1430 | |
1431 static void oscar_cancel_direct_im(struct ask_do_dir_im *data) { | |
1432 g_free(data->who); | |
1433 g_free(data); | |
1434 } | |
1435 | |
8983 | 1436 /* this function is used to initiate a direct im session with someone. |
1437 * we start listening on a port and send a request. they either connect | |
1438 * or send some kind of reply. If they can't connect, they ask us to | |
1439 * connect to them, and so we do that. | |
1440 * | |
1441 * this function will also get called if the other side initiate's a direct | |
1442 * im and we try to connect and fail. in that case cookie will not be null. | |
1443 * | |
1444 * note that cookie is an 8 byte string that isn't NULL terminated | |
1445 */ | |
1446 static void oscar_direct_im_initiate(GaimConnection *gc, const char *who, const char *cookie) { | |
8971 | 1447 OscarData *od; |
1448 struct oscar_direct_im *dim; | |
1449 int listenfd; | |
8982 | 1450 const char *ip; |
8971 | 1451 |
1452 od = (OscarData *)gc->proto_data; | |
1453 | |
8983 | 1454 dim = oscar_direct_im_find(od, who); |
8971 | 1455 if (dim) { |
1456 if (!(dim->connected)) { /* We'll free the old, unconnected dim, and start over */ | |
1457 oscar_direct_im_disconnect(od, dim); | |
1458 gaim_debug_info("oscar", | |
1459 "Gave up on old direct IM, trying again\n"); | |
1460 } else { | |
1461 gaim_notify_error(gc, NULL, "DirectIM already open.", NULL); | |
8980 | 1462 return; |
8971 | 1463 } |
1464 } | |
1465 dim = g_new0(struct oscar_direct_im, 1); | |
1466 dim->gc = gc; | |
8983 | 1467 g_snprintf(dim->name, sizeof dim->name, "%s", who); |
8971 | 1468 |
1469 listenfd = gaim_network_listen_range(5190, 5199); | |
8982 | 1470 ip = gaim_network_get_my_ip(od->conn ? od->conn->fd : -1); |
9455 | 1471 if (listenfd >= 0) |
1472 dim->conn = aim_odc_initiate(od->sess, who, listenfd, gaim_network_ip_atoi(ip), gaim_network_get_port_from_fd(listenfd), cookie); | |
8971 | 1473 if (dim->conn != NULL) { |
8982 | 1474 char *tmp; |
1475 GaimConversation *conv; | |
1476 | |
8971 | 1477 od->direct_ims = g_slist_append(od->direct_ims, dim); |
1478 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, | |
1479 oscar_callback, dim->conn); | |
1480 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIM_ESTABLISHED, | |
1481 gaim_odc_initiate, 0); | |
8982 | 1482 |
8983 | 1483 conv = gaim_conversation_new(GAIM_CONV_IM, dim->gc->account, who); |
1484 tmp = g_strdup_printf(_("Asking %s to connect to us at %s:%hu for Direct IM."), who, ip, | |
8982 | 1485 gaim_network_get_port_from_fd(listenfd)); |
1486 gaim_conversation_write(conv, NULL, tmp, GAIM_MESSAGE_SYSTEM, time(NULL)); | |
1487 g_free(tmp); | |
8971 | 1488 } else { |
1489 gaim_notify_error(gc, NULL, _("Unable to open Direct IM"), NULL); | |
1490 oscar_direct_im_destroy(od, dim); | |
1491 } | |
8983 | 1492 } |
1493 | |
1494 static void oscar_direct_im(struct ask_do_dir_im *data) { | |
1495 GaimConnection *gc = data->gc; | |
1496 | |
1497 if (!g_list_find(gaim_connections_get_all(), gc)) { | |
1498 g_free(data->who); | |
1499 g_free(data); | |
1500 return; | |
1501 } | |
1502 | |
1503 oscar_direct_im_initiate(gc, data->who, NULL); | |
8971 | 1504 g_free(data->who); |
1505 g_free(data); | |
1506 } | |
1507 | |
1508 /* this is the right click menu cb thingy */ | |
9030 | 1509 static void oscar_ask_direct_im(GaimBlistNode *node, gpointer ignored) { |
1510 | |
1511 GaimBuddy *buddy; | |
1512 GaimConnection *gc; | |
8971 | 1513 gchar *buf; |
9030 | 1514 struct ask_do_dir_im *data; |
1515 | |
1516 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); | |
1517 | |
1518 buddy = (GaimBuddy *) node; | |
1519 gc = gaim_account_get_connection(buddy->account); | |
1520 | |
1521 data = g_new0(struct ask_do_dir_im, 1); | |
1522 data->who = g_strdup(buddy->name); | |
8971 | 1523 data->gc = gc; |
9030 | 1524 buf = g_strdup_printf(_("You have selected to open a Direct IM connection with %s."), |
1525 buddy->name); | |
8971 | 1526 |
1527 gaim_request_action(gc, NULL, buf, | |
9030 | 1528 _("Because this reveals your IP address, it " |
1529 "may be considered a privacy risk. Do you " | |
1530 "wish to continue?"), | |
1531 0, data, 2, | |
1532 _("Connect"), G_CALLBACK(oscar_direct_im), | |
1533 _("Cancel"), G_CALLBACK(oscar_cancel_direct_im)); | |
8971 | 1534 g_free(buf); |
1535 } | |
1536 | |
1537 /***************************************************************************** | |
1538 * End scary direct im stuff | |
1539 *****************************************************************************/ | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1540 |
4617 | 1541 static void oscar_callback(gpointer data, gint source, GaimInputCondition condition) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1542 aim_conn_t *conn = (aim_conn_t *)data; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1543 aim_session_t *sess = aim_conn_getsess(conn); |
5575 | 1544 GaimConnection *gc = sess ? sess->aux_data : NULL; |
7283 | 1545 OscarData *od; |
2086 | 1546 |
1547 if (!gc) { | |
8660 | 1548 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1549 "oscar callback for closed connection (1).\n"); |
2086 | 1550 return; |
1551 } | |
1552 | |
7283 | 1553 od = (OscarData *)gc->proto_data; |
2086 | 1554 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1555 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 1556 /* oh boy. this is probably bad. i guess the only thing we |
1557 * can really do is return? */ | |
8660 | 1558 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1559 "oscar callback for closed connection (2).\n"); |
8660 | 1560 gaim_debug_misc("oscar", "gc = %p\n", gc); |
2086 | 1561 return; |
1562 } | |
1563 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1564 if (condition & GAIM_INPUT_READ) { |
4617 | 1565 if (conn->type == AIM_CONN_TYPE_LISTENER) { |
8660 | 1566 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1567 "got information on rendezvous listener\n"); |
4617 | 1568 if (aim_handlerendconnect(od->sess, conn) < 0) { |
8660 | 1569 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1570 "connection error (rendezvous listener)\n"); |
4617 | 1571 aim_conn_kill(od->sess, &conn); |
8446 | 1572 /* AAA - Don't we need to gaim_xfer_cancel here? --marv */ |
2086 | 1573 } |
1574 } else { | |
4617 | 1575 if (aim_get_command(od->sess, conn) >= 0) { |
1576 aim_rxdispatch(od->sess); | |
6029 | 1577 if (od->killme) { |
8660 | 1578 gaim_debug_error("oscar", "Waiting to be destroyed\n"); |
6029 | 1579 return; |
1580 } | |
2086 | 1581 } else { |
1582 if ((conn->type == AIM_CONN_TYPE_BOS) || | |
4617 | 1583 !(aim_getconn_type(od->sess, AIM_CONN_TYPE_BOS))) { |
8660 | 1584 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1585 "major connection error\n"); |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1586 gaim_connection_error(gc, _("Disconnected.")); |
2086 | 1587 } else if (conn->type == AIM_CONN_TYPE_CHAT) { |
1588 struct chat_connection *c = find_oscar_chat_by_conn(gc, conn); | |
9627 | 1589 GaimConversation *conv = gaim_find_chat(gc, c->id); |
5420 | 1590 char *buf; |
8660 | 1591 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1592 "disconnected from chat room %s\n", c->name); |
2086 | 1593 c->conn = NULL; |
1594 if (c->inpa > 0) | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1595 gaim_input_remove(c->inpa); |
2086 | 1596 c->inpa = 0; |
1597 c->fd = -1; | |
4617 | 1598 aim_conn_kill(od->sess, &conn); |
5420 | 1599 buf = g_strdup_printf(_("You have been disconnected from chat room %s."), c->name); |
9627 | 1600 if (conv) |
1601 gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_ERROR, time(NULL)); | |
1602 else | |
1603 gaim_notify_error(gc, NULL, buf, NULL); | |
5420 | 1604 g_free(buf); |
2086 | 1605 } else if (conn->type == AIM_CONN_TYPE_CHATNAV) { |
4617 | 1606 if (od->cnpa > 0) |
1607 gaim_input_remove(od->cnpa); | |
1608 od->cnpa = 0; | |
8660 | 1609 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1610 "removing chatnav input watcher\n"); |
4617 | 1611 while (od->create_rooms) { |
1612 struct create_room *cr = od->create_rooms->data; | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
1613 g_free(cr->name); |
4617 | 1614 od->create_rooms = |
1615 g_slist_remove(od->create_rooms, cr); | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
1616 g_free(cr); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1617 gaim_notify_error(gc, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1618 _("Chat is currently unavailable"), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1619 NULL); |
2086 | 1620 } |
4617 | 1621 aim_conn_kill(od->sess, &conn); |
2086 | 1622 } else if (conn->type == AIM_CONN_TYPE_AUTH) { |
4617 | 1623 if (od->paspa > 0) |
1624 gaim_input_remove(od->paspa); | |
1625 od->paspa = 0; | |
8660 | 1626 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1627 "removing authconn input watcher\n"); |
4617 | 1628 aim_conn_kill(od->sess, &conn); |
3694 | 1629 } else if (conn->type == AIM_CONN_TYPE_EMAIL) { |
4617 | 1630 if (od->emlpa > 0) |
1631 gaim_input_remove(od->emlpa); | |
1632 od->emlpa = 0; | |
8660 | 1633 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1634 "removing email input watcher\n"); |
4617 | 1635 aim_conn_kill(od->sess, &conn); |
4804 | 1636 } else if (conn->type == AIM_CONN_TYPE_ICON) { |
1637 if (od->icopa > 0) | |
1638 gaim_input_remove(od->icopa); | |
1639 od->icopa = 0; | |
8660 | 1640 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1641 "removing icon input watcher\n"); |
4804 | 1642 aim_conn_kill(od->sess, &conn); |
2086 | 1643 } else if (conn->type == AIM_CONN_TYPE_RENDEZVOUS) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1644 if (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM) |
4617 | 1645 gaim_odc_disconnect(od->sess, conn); |
1646 aim_conn_kill(od->sess, &conn); | |
2086 | 1647 } else { |
8660 | 1648 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1649 "holy crap! generic connection error! %hu\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1650 conn->type); |
4617 | 1651 aim_conn_kill(od->sess, &conn); |
2086 | 1652 } |
1653 } | |
1654 } | |
1655 } | |
1656 } | |
1657 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1658 static void oscar_debug(aim_session_t *sess, int level, const char *format, va_list va) { |
5575 | 1659 GaimConnection *gc = sess->aux_data; |
7285 | 1660 gchar *s = g_strdup_vprintf(format, va); |
1661 gchar *buf; | |
1662 | |
1663 buf = g_strdup_printf("%s %d: %s", gaim_account_get_username(gaim_connection_get_account(gc)), level, s); | |
8660 | 1664 gaim_debug_info("oscar", buf); |
7285 | 1665 if (buf[strlen(buf)-1] != '\n') |
8660 | 1666 gaim_debug_info(NULL, "\n"); |
7285 | 1667 g_free(buf); |
2086 | 1668 g_free(s); |
1669 } | |
1670 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1671 static void oscar_login_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 1672 { |
5575 | 1673 GaimConnection *gc = data; |
7283 | 1674 OscarData *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1675 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1676 aim_conn_t *conn; |
2086 | 1677 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1678 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 1679 close(source); |
1680 return; | |
1681 } | |
1682 | |
4617 | 1683 od = gc->proto_data; |
1684 sess = od->sess; | |
2086 | 1685 conn = aim_getconn_type_all(sess, AIM_CONN_TYPE_AUTH); |
4366 | 1686 conn->fd = source; |
2086 | 1687 |
1688 if (source < 0) { | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1689 gaim_connection_error(gc, _("Couldn't connect to host")); |
2086 | 1690 return; |
1691 } | |
1692 | |
1693 aim_conn_completeconnect(sess, conn); | |
4617 | 1694 gc->inpa = gaim_input_add(conn->fd, GAIM_INPUT_READ, oscar_callback, conn); |
7282 | 1695 aim_request_login(sess, conn, gaim_account_get_username(gaim_connection_get_account(gc))); |
1696 | |
8660 | 1697 gaim_debug_info("oscar", |
7282 | 1698 "Screen name sent, waiting for response\n"); |
7283 | 1699 gaim_connection_update_progress(gc, _("Screen name sent"), 1, OSCAR_CONNECT_STEPS); |
8341 | 1700 ck[1] = 0x65; |
2086 | 1701 } |
1702 | |
5575 | 1703 static void oscar_login(GaimAccount *account) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1704 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1705 aim_conn_t *conn; |
5575 | 1706 GaimConnection *gc = gaim_account_get_connection(account); |
7283 | 1707 OscarData *od = gc->proto_data = g_new0(OscarData, 1); |
2086 | 1708 |
8660 | 1709 gaim_debug_misc("oscar", "oscar_login: gc = %p\n", gc); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
1710 |
8437 | 1711 if (!aim_snvalid(gaim_account_get_username(account))) { |
1712 gchar *buf; | |
8590 | 1713 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 | 1714 gaim_connection_error(gc, buf); |
1715 g_free(buf); | |
1716 } | |
1717 | |
9975 | 1718 if (aim_sn_is_icq((gaim_account_get_username(account)))) { |
4617 | 1719 od->icq = TRUE; |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
1720 } else { |
6622 | 1721 gc->flags |= GAIM_CONNECTION_HTML; |
1722 gc->flags |= GAIM_CONNECTION_AUTO_RESP; | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
1723 } |
5836 | 1724 od->buddyinfo = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, oscar_free_buddyinfo); |
2086 | 1725 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1726 sess = g_new0(aim_session_t, 1); |
7285 | 1727 aim_session_init(sess, TRUE, 0); |
2086 | 1728 aim_setdebuggingcb(sess, oscar_debug); |
7282 | 1729 /* |
1730 * We need an immediate queue because we don't use a while-loop | |
1731 * to see if things need to be sent. | |
1732 */ | |
2086 | 1733 aim_tx_setenqueue(sess, AIM_TX_IMMEDIATE, NULL); |
4617 | 1734 od->sess = sess; |
2086 | 1735 sess->aux_data = gc; |
1736 | |
9935 | 1737 /* Connect to core Gaim signals */ |
10087 | 1738 gaim_prefs_connect_callback(gc, "/plugins/prpl/oscar/recent_buddies", recent_buddies_cb, gc); |
9935 | 1739 |
2086 | 1740 conn = aim_newconn(sess, AIM_CONN_TYPE_AUTH, NULL); |
1741 if (conn == NULL) { | |
8660 | 1742 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1743 "internal connection error\n"); |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1744 gaim_connection_error(gc, _("Unable to login to AIM")); |
2086 | 1745 return; |
1746 } | |
1747 | |
4649 | 1748 aim_conn_addhandler(sess, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2086 | 1749 aim_conn_addhandler(sess, conn, 0x0017, 0x0007, gaim_parse_login, 0); |
1750 aim_conn_addhandler(sess, conn, 0x0017, 0x0003, gaim_parse_auth_resp, 0); | |
1751 | |
1752 conn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1753 if (gaim_proxy_connect(account, gaim_account_get_string(account, "server", FAIM_LOGIN_SERVER), |
5575 | 1754 gaim_account_get_int(account, "port", FAIM_LOGIN_PORT), |
1755 oscar_login_connect, gc) < 0) { | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1756 gaim_connection_error(gc, _("Couldn't connect to host")); |
2086 | 1757 return; |
1758 } | |
7282 | 1759 |
7283 | 1760 gaim_connection_update_progress(gc, _("Connecting"), 0, OSCAR_CONNECT_STEPS); |
8341 | 1761 ck[0] = 0x5a; |
5575 | 1762 } |
1763 | |
1764 static void oscar_close(GaimConnection *gc) { | |
7283 | 1765 OscarData *od = (OscarData *)gc->proto_data; |
4617 | 1766 |
1767 while (od->oscar_chats) { | |
1768 struct chat_connection *n = od->oscar_chats->data; | |
2086 | 1769 if (n->inpa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1770 gaim_input_remove(n->inpa); |
2086 | 1771 g_free(n->name); |
1772 g_free(n->show); | |
4617 | 1773 od->oscar_chats = g_slist_remove(od->oscar_chats, n); |
2086 | 1774 g_free(n); |
1775 } | |
4617 | 1776 while (od->direct_ims) { |
8971 | 1777 struct oscar_direct_im *n = od->direct_ims->data; |
1778 oscar_direct_im_destroy(od, n); | |
2086 | 1779 } |
4617 | 1780 /* BBB */ |
1781 while (od->file_transfers) { | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
1782 GaimXfer *xfer; |
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
1783 xfer = (GaimXfer *)od->file_transfers->data; |
7805 | 1784 gaim_xfer_cancel_local(xfer); |
3630 | 1785 } |
4804 | 1786 while (od->requesticon) { |
1787 char *sn = od->requesticon->data; | |
1788 od->requesticon = g_slist_remove(od->requesticon, sn); | |
1789 free(sn); | |
1790 } | |
4738 | 1791 g_hash_table_destroy(od->buddyinfo); |
4617 | 1792 while (od->create_rooms) { |
1793 struct create_room *cr = od->create_rooms->data; | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
1794 g_free(cr->name); |
4617 | 1795 od->create_rooms = g_slist_remove(od->create_rooms, cr); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
1796 g_free(cr); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
1797 } |
4617 | 1798 if (od->email) |
1799 g_free(od->email); | |
1800 if (od->newp) | |
1801 g_free(od->newp); | |
1802 if (od->oldp) | |
1803 g_free(od->oldp); | |
2086 | 1804 if (gc->inpa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1805 gaim_input_remove(gc->inpa); |
4617 | 1806 if (od->cnpa > 0) |
1807 gaim_input_remove(od->cnpa); | |
1808 if (od->paspa > 0) | |
1809 gaim_input_remove(od->paspa); | |
1810 if (od->emlpa > 0) | |
1811 gaim_input_remove(od->emlpa); | |
4804 | 1812 if (od->icopa > 0) |
1813 gaim_input_remove(od->icopa); | |
6907 | 1814 if (od->icontimer > 0) |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
1815 gaim_timeout_remove(od->icontimer); |
8341 | 1816 if (od->getblisttimer > 0) |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
1817 gaim_timeout_remove(od->getblisttimer); |
8341 | 1818 if (od->getinfotimer > 0) |
1819 gaim_timeout_remove(od->getinfotimer); | |
10087 | 1820 gaim_prefs_disconnect_by_handle(gc); |
9971 | 1821 |
4617 | 1822 aim_session_kill(od->sess); |
1823 g_free(od->sess); | |
1824 od->sess = NULL; | |
2086 | 1825 g_free(gc->proto_data); |
1826 gc->proto_data = NULL; | |
8660 | 1827 gaim_debug_info("oscar", "Signed off.\n"); |
2086 | 1828 } |
1829 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1830 static void oscar_bos_connect(gpointer data, gint source, GaimInputCondition cond) { |
5575 | 1831 GaimConnection *gc = data; |
7283 | 1832 OscarData *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1833 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1834 aim_conn_t *bosconn; |
2086 | 1835 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1836 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 1837 close(source); |
1838 return; | |
1839 } | |
1840 | |
4617 | 1841 od = gc->proto_data; |
1842 sess = od->sess; | |
1843 bosconn = od->conn; | |
4366 | 1844 bosconn->fd = source; |
2086 | 1845 |
1846 if (source < 0) { | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1847 gaim_connection_error(gc, _("Could Not Connect")); |
2086 | 1848 return; |
1849 } | |
1850 | |
1851 aim_conn_completeconnect(sess, bosconn); | |
4617 | 1852 gc->inpa = gaim_input_add(bosconn->fd, GAIM_INPUT_READ, oscar_callback, bosconn); |
7283 | 1853 |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1854 gaim_connection_update_progress(gc, |
7283 | 1855 _("Connection established, cookie sent"), 4, OSCAR_CONNECT_STEPS); |
8341 | 1856 ck[4] = 0x61; |
2086 | 1857 } |
1858 | |
4617 | 1859 /* BBB */ |
4656 | 1860 /* |
1861 * This little area in oscar.c is the nexus of file transfer code, | |
1862 * so I wrote a little explanation of what happens. I am such a | |
1863 * ninja. | |
1864 * | |
1865 * The series of events for a file send is: | |
1866 * -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
|
1867 * -User chooses a file and oscar_xfer_init is called. It establishes a |
4656 | 1868 * listening socket, then asks the remote user to connect to us (and |
1869 * gives them the file name, port, IP, etc.) | |
1870 * -They connect to us and we send them an AIM_CB_OFT_PROMPT (this happens | |
1871 * in oscar_sendfile_estblsh) | |
1872 * -They send us an AIM_CB_OFT_ACK and then we start sending data | |
1873 * -When we finish, they send us an AIM_CB_OFT_DONE and they close the | |
1874 * connection. | |
1875 * -We get drunk because file transfer kicks ass. | |
1876 * | |
1877 * The series of events for a file receive is: | |
1878 * -Create xfer and call gaim_xfer request (this happens in incomingim_chan2) | |
1879 * -Gaim user selects file to name and location to save file to and | |
1880 * oscar_xfer_init is called | |
1881 * -It connects to the remote user using the IP they gave us earlier | |
1882 * -After connecting, they send us an AIM_CB_OFT_PROMPT. In reply, we send | |
1883 * them an AIM_CB_OFT_ACK. | |
1884 * -They begin to send us lots of raw data. | |
1885 * -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
|
1886 * the connection. |
4656 | 1887 */ |
1888 static void oscar_sendfile_connected(gpointer data, gint source, GaimInputCondition condition); | |
1889 | |
8446 | 1890 /* |
1891 * Miscellaneous xfer functions | |
1892 */ | |
1893 static GaimXfer *oscar_find_xfer_by_cookie(GSList *fts, const fu8_t *ck) | |
4656 | 1894 { |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
1895 GaimXfer *xfer; |
5146 | 1896 struct aim_oft_info *oft_info; |
4656 | 1897 |
1898 while (fts) { | |
1899 xfer = fts->data; | |
5146 | 1900 oft_info = xfer->data; |
1901 | |
8446 | 1902 if (oft_info && !memcmp(ck, oft_info->cookie, 8)) |
4656 | 1903 return xfer; |
1904 | |
1905 fts = g_slist_next(fts); | |
1906 } | |
1907 | |
1908 return NULL; | |
1909 } | |
1910 | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
1911 static GaimXfer *oscar_find_xfer_by_conn(GSList *fts, aim_conn_t *conn) |
4656 | 1912 { |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
1913 GaimXfer *xfer; |
5146 | 1914 struct aim_oft_info *oft_info; |
4656 | 1915 |
1916 while (fts) { | |
1917 xfer = fts->data; | |
5146 | 1918 oft_info = xfer->data; |
1919 | |
1920 if (oft_info && (conn == oft_info->conn)) | |
4656 | 1921 return xfer; |
1922 | |
1923 fts = g_slist_next(fts); | |
1924 } | |
1925 | |
1926 return NULL; | |
1927 } | |
1928 | |
8446 | 1929 static void oscar_xfer_end(GaimXfer *xfer) |
1930 { | |
1931 struct aim_oft_info *oft_info = xfer->data; | |
1932 GaimConnection *gc = oft_info->sess->aux_data; | |
1933 OscarData *od = gc->proto_data; | |
1934 | |
8660 | 1935 gaim_debug_info("oscar", "AAA - in oscar_xfer_end\n"); |
8446 | 1936 |
1937 if (gaim_xfer_get_type(xfer) == GAIM_XFER_RECEIVE) { | |
1938 oft_info->fh.nrecvd = gaim_xfer_get_bytes_sent(xfer); | |
1939 aim_oft_sendheader(oft_info->sess, AIM_CB_OFT_DONE, oft_info); | |
1940 } | |
1941 | |
1942 aim_conn_kill(oft_info->sess, &oft_info->conn); | |
1943 aim_oft_destroyinfo(oft_info); | |
1944 xfer->data = NULL; | |
1945 od->file_transfers = g_slist_remove(od->file_transfers, xfer); | |
1946 } | |
1947 | |
1948 /* | |
1949 * xfer functions used when receiving files | |
1950 */ | |
1951 | |
1952 static void oscar_xfer_init_recv(GaimXfer *xfer) | |
1953 { | |
1954 struct aim_oft_info *oft_info = xfer->data; | |
1955 GaimConnection *gc = oft_info->sess->aux_data; | |
1956 OscarData *od = gc->proto_data; | |
1957 | |
8660 | 1958 gaim_debug_info("oscar", "AAA - in oscar_xfer_recv_init\n"); |
8446 | 1959 |
1960 oft_info->conn = aim_newconn(od->sess, AIM_CONN_TYPE_RENDEZVOUS, NULL); | |
1961 if (oft_info->conn) { | |
1962 oft_info->conn->subtype = AIM_CONN_SUBTYPE_OFT_SENDFILE; | |
1963 aim_conn_addhandler(od->sess, oft_info->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_PROMPT, oscar_sendfile_prompt, 0); | |
1964 oft_info->conn->fd = xfer->fd = gaim_proxy_connect(gaim_connection_get_account(gc), | |
1965 xfer->remote_ip, xfer->remote_port, oscar_sendfile_connected, xfer); | |
1966 if (xfer->fd == -1) { | |
1967 gaim_xfer_error(GAIM_XFER_RECEIVE, xfer->who, | |
1968 _("Unable to establish file descriptor.")); | |
1969 gaim_xfer_cancel_local(xfer); | |
1970 } | |
1971 } else { | |
1972 gaim_xfer_error(GAIM_XFER_RECEIVE, xfer->who, | |
1973 _("Unable to create new connection.")); | |
1974 gaim_xfer_cancel_local(xfer); | |
1975 /* Try a different port? Ask them to connect to us? /join #gaim and whine? */ | |
1976 } | |
1977 | |
1978 } | |
1979 | |
1980 static void oscar_xfer_cancel_recv(GaimXfer *xfer) | |
1981 { | |
1982 struct aim_oft_info *oft_info = xfer->data; | |
1983 GaimConnection *gc = oft_info->sess->aux_data; | |
1984 OscarData *od = gc->proto_data; | |
1985 | |
8660 | 1986 gaim_debug_info("oscar", "AAA - in oscar_xfer_cancel_recv\n"); |
8446 | 1987 |
9771 | 1988 if (gaim_xfer_get_status(xfer) != GAIM_XFER_STATUS_CANCEL_REMOTE) |
1989 aim_im_sendch2_sendfile_cancel(oft_info->sess, oft_info); | |
8446 | 1990 |
1991 aim_conn_kill(oft_info->sess, &oft_info->conn); | |
1992 aim_oft_destroyinfo(oft_info); | |
1993 xfer->data = NULL; | |
1994 od->file_transfers = g_slist_remove(od->file_transfers, xfer); | |
1995 } | |
1996 | |
1997 static void oscar_xfer_ack_recv(GaimXfer *xfer, const char *buffer, size_t size) | |
1998 { | |
1999 struct aim_oft_info *oft_info = xfer->data; | |
2000 | |
2001 /* Update our rolling checksum. Like Walmart, yo. */ | |
2002 oft_info->fh.recvcsum = aim_oft_checksum_chunk(buffer, size, oft_info->fh.recvcsum); | |
2003 } | |
2004 | |
2005 /* | |
2006 * xfer functions used when sending files | |
2007 */ | |
2008 | |
2009 static void oscar_xfer_init_send(GaimXfer *xfer) | |
2010 { | |
2011 struct aim_oft_info *oft_info = xfer->data; | |
2012 GaimConnection *gc = oft_info->sess->aux_data; | |
2013 OscarData *od = gc->proto_data; | |
2014 int listenfd; | |
2015 | |
8660 | 2016 gaim_debug_info("oscar", "AAA - in oscar_xfer_send_init\n"); |
8446 | 2017 |
2018 xfer->filename = g_path_get_basename(xfer->local_filename); | |
2019 strncpy(oft_info->fh.name, xfer->filename, 64); | |
2020 oft_info->fh.name[63] = '\0'; | |
2021 oft_info->fh.totsize = gaim_xfer_get_size(xfer); | |
2022 oft_info->fh.size = gaim_xfer_get_size(xfer); | |
2023 oft_info->fh.checksum = aim_oft_checksum_file(xfer->local_filename); | |
2024 | |
2025 /* Create a listening socket and an associated libfaim conn */ | |
2026 if ((listenfd = gaim_network_listen_range(5190, 5199)) < 0) { | |
2027 gaim_xfer_cancel_local(xfer); | |
2028 return; | |
2029 } | |
2030 xfer->local_port = gaim_network_get_port_from_fd(listenfd); | |
2031 oft_info->port = xfer->local_port; | |
2032 if (aim_sendfile_listen(od->sess, oft_info, listenfd) != 0) { | |
2033 gaim_xfer_cancel_local(xfer); | |
2034 return; | |
2035 } | |
8660 | 2036 gaim_debug_misc("oscar", |
8446 | 2037 "port is %hu, ip is %s\n", |
2038 xfer->local_port, oft_info->clientip); | |
2039 if (oft_info->conn) { | |
2040 xfer->watcher = gaim_input_add(oft_info->conn->fd, GAIM_INPUT_READ, oscar_callback, oft_info->conn); | |
2041 aim_im_sendch2_sendfile_ask(od->sess, oft_info); | |
2042 aim_conn_addhandler(od->sess, oft_info->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_ESTABLISHED, oscar_sendfile_estblsh, 0); | |
2043 } else { | |
2044 gaim_xfer_error(GAIM_XFER_SEND, xfer->who, | |
2045 _("Unable to establish listener socket.")); | |
2046 gaim_xfer_cancel_local(xfer); | |
2047 } | |
2048 } | |
2049 | |
2050 static void oscar_xfer_cancel_send(GaimXfer *xfer) | |
2051 { | |
2052 struct aim_oft_info *oft_info = xfer->data; | |
2053 GaimConnection *gc = oft_info->sess->aux_data; | |
2054 OscarData *od = gc->proto_data; | |
2055 | |
8660 | 2056 gaim_debug_info("oscar", "AAA - in oscar_xfer_cancel_send\n"); |
8446 | 2057 |
9771 | 2058 if (gaim_xfer_get_status(xfer) != GAIM_XFER_STATUS_CANCEL_REMOTE) |
2059 aim_im_sendch2_sendfile_cancel(oft_info->sess, oft_info); | |
8446 | 2060 |
2061 aim_conn_kill(oft_info->sess, &oft_info->conn); | |
2062 aim_oft_destroyinfo(oft_info); | |
2063 xfer->data = NULL; | |
2064 od->file_transfers = g_slist_remove(od->file_transfers, xfer); | |
2065 } | |
2066 | |
2067 static void oscar_xfer_ack_send(GaimXfer *xfer, const char *buffer, size_t size) | |
2068 { | |
2069 struct aim_oft_info *oft_info = xfer->data; | |
2070 | |
2071 /* I'm not sure I like how we do this. --marv | |
2072 * I do. AIM file transfers aren't really meant to be thought | |
2073 * of as a transferring just a single file. The rendezvous | |
2074 * establishes a connection between two computers, and then | |
2075 * those computers can use the same connection for transferring | |
2076 * multiple files. So we don't want the Gaim core up and closing | |
2077 * the socket all willy-nilly. We want to do that in the oscar | |
2078 * prpl, whenever one side or the other says they're finished | |
2079 * using the connection. There might be a better way to intercept | |
2080 * the socket from the core, however... --KingAnt | |
2081 */ | |
2082 | |
2083 /* | |
2084 * If we're done sending, intercept the socket from the core ft code | |
2085 * and wait for the other guy to send the "done" OFT packet. | |
2086 */ | |
2087 if (gaim_xfer_get_bytes_remaining(xfer) <= 0) { | |
2088 gaim_input_remove(xfer->watcher); | |
2089 xfer->watcher = gaim_input_add(xfer->fd, GAIM_INPUT_READ, oscar_callback, oft_info->conn); | |
2090 xfer->fd = 0; | |
2091 gaim_xfer_set_completed(xfer, TRUE); | |
2092 } | |
2093 } | |
2094 | |
9466 | 2095 static gboolean oscar_can_receive_file(GaimConnection *gc, const char *who) { |
2096 gboolean can_receive = FALSE; | |
2097 OscarData *od = gc->proto_data; | |
2098 | |
2099 if (!od->icq) { | |
2100 aim_userinfo_t *userinfo; | |
2101 userinfo = aim_locate_finduserinfo(od->sess, who); | |
2102 if (userinfo && userinfo->capabilities & AIM_CAPS_SENDFILE) | |
2103 can_receive = TRUE; | |
2104 } | |
2105 | |
2106 return can_receive; | |
2107 } | |
2108 | |
2109 static void oscar_send_file(GaimConnection *gc, const char *who, const char *file) { | |
9030 | 2110 |
2111 OscarData *od; | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2112 GaimXfer *xfer; |
5146 | 2113 struct aim_oft_info *oft_info; |
8231
f50c059b6384
[gaim-migrate @ 8954]
Christian Hammond <chipx86@chipx86.com>
parents:
8227
diff
changeset
|
2114 const char *ip; |
3752 | 2115 |
9030 | 2116 od = (OscarData *)gc->proto_data; |
2117 | |
4617 | 2118 /* You want to send a file to someone else, you're so generous */ |
2119 | |
2120 /* Build the file transfer handle */ | |
9466 | 2121 xfer = gaim_xfer_new(gc->account, GAIM_XFER_SEND, who); |
4617 | 2122 |
5146 | 2123 /* Create the oscar-specific data */ |
8838 | 2124 ip = gaim_network_get_my_ip(od->conn ? od->conn->fd : -1); |
9466 | 2125 oft_info = aim_oft_createinfo(od->sess, NULL, who, ip, 0, 0, 0, NULL); |
5146 | 2126 xfer->data = oft_info; |
2127 | |
4617 | 2128 /* Setup our I/O op functions */ |
8446 | 2129 gaim_xfer_set_init_fnc(xfer, oscar_xfer_init_send); |
4617 | 2130 gaim_xfer_set_end_fnc(xfer, oscar_xfer_end); |
4675
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
2131 gaim_xfer_set_cancel_send_fnc(xfer, oscar_xfer_cancel_send); |
8446 | 2132 gaim_xfer_set_request_denied_fnc(xfer, oscar_xfer_cancel_send); |
2133 gaim_xfer_set_ack_fnc(xfer, oscar_xfer_ack_send); | |
4617 | 2134 |
2135 /* Keep track of this transfer for later */ | |
2136 od->file_transfers = g_slist_append(od->file_transfers, xfer); | |
2137 | |
2138 /* Now perform the request */ | |
9466 | 2139 if (file) |
2140 gaim_xfer_request_accepted(xfer, file); | |
2141 else | |
2142 gaim_xfer_request(xfer); | |
3630 | 2143 } |
2144 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2145 static int gaim_parse_auth_resp(aim_session_t *sess, aim_frame_t *fr, ...) { |
6029 | 2146 GaimConnection *gc = sess->aux_data; |
7283 | 2147 OscarData *od = gc->proto_data; |
6029 | 2148 GaimAccount *account = gc->account; |
2149 aim_conn_t *bosconn; | |
2150 char *host; int port; | |
2151 int i, rc; | |
2086 | 2152 va_list ap; |
2704 | 2153 struct aim_authresp_info *info; |
6029 | 2154 |
5575 | 2155 port = gaim_account_get_int(account, "port", FAIM_LOGIN_PORT); |
2086 | 2156 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2157 va_start(ap, fr); |
2704 | 2158 info = va_arg(ap, struct aim_authresp_info *); |
2086 | 2159 va_end(ap); |
2160 | |
8660 | 2161 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2162 "inside auth_resp (Screen name: %s)\n", info->sn); |
2704 | 2163 |
4293 | 2164 if (info->errorcode || !info->bosip || !info->cookielen || !info->cookie) { |
4056 | 2165 char buf[256]; |
2704 | 2166 switch (info->errorcode) { |
2086 | 2167 case 0x05: |
2168 /* Incorrect nick/password */ | |
6498 | 2169 gc->wants_to_die = TRUE; |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
2170 gaim_connection_error(gc, _("Incorrect nickname or password.")); |
2086 | 2171 break; |
2172 case 0x11: | |
2173 /* Suspended account */ | |
6498 | 2174 gc->wants_to_die = TRUE; |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
2175 gaim_connection_error(gc, _("Your account is currently suspended.")); |
2086 | 2176 break; |
3498 | 2177 case 0x14: |
2178 /* service temporarily unavailable */ | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
2179 gaim_connection_error(gc, _("The AOL Instant Messenger service is temporarily unavailable.")); |
3498 | 2180 break; |
2086 | 2181 case 0x18: |
2182 /* connecting too frequently */ | |
6498 | 2183 gc->wants_to_die = TRUE; |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
2184 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 | 2185 break; |
2186 case 0x1c: | |
2187 /* client too old */ | |
6498 | 2188 gc->wants_to_die = TRUE; |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6350
diff
changeset
|
2189 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
|
2190 gaim_connection_error(gc, buf); |
2086 | 2191 break; |
2192 default: | |
6623 | 2193 gaim_connection_error(gc, _("Authentication failed")); |
2086 | 2194 break; |
2195 } | |
8660 | 2196 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2197 "Login Error Code 0x%04hx\n", info->errorcode); |
8660 | 2198 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2199 "Error URL: %s\n", info->errorurl); |
2086 | 2200 od->killme = TRUE; |
2201 return 1; | |
2202 } | |
2203 | |
2204 | |
9992 | 2205 gaim_debug_misc("oscar", "Reg status: %hu\n", info->regstatus); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2206 |
2704 | 2207 if (info->email) { |
8660 | 2208 gaim_debug_misc("oscar", "Email: %s\n", info->email); |
2086 | 2209 } else { |
8660 | 2210 gaim_debug_misc("oscar", "Email is NULL\n"); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2211 } |
10042 | 2212 |
8660 | 2213 gaim_debug_misc("oscar", "BOSIP: %s\n", info->bosip); |
2214 gaim_debug_info("oscar", | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2215 "Closing auth connection...\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2216 aim_conn_kill(sess, &fr->conn); |
2086 | 2217 |
2218 bosconn = aim_newconn(sess, AIM_CONN_TYPE_BOS, NULL); | |
2219 if (bosconn == NULL) { | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
2220 gaim_connection_error(gc, _("Internal Error")); |
2086 | 2221 od->killme = TRUE; |
2222 return 0; | |
2223 } | |
2224 | |
4649 | 2225 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 2226 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_bos, 0); |
2086 | 2227 aim_conn_addhandler(sess, bosconn, 0x0009, 0x0003, gaim_bosrights, 0); |
2228 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ACK, AIM_CB_ACK_ACK, NULL, 0); | |
2229 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_REDIRECT, gaim_handle_redirect, 0); | |
2993 | 2230 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_RIGHTSINFO, gaim_parse_locaterights, 0); |
2086 | 2231 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_RIGHTSINFO, gaim_parse_buddyrights, 0); |
2232 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_ONCOMING, gaim_parse_oncoming, 0); | |
2233 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_OFFGOING, gaim_parse_offgoing, 0); | |
2234 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_INCOMING, gaim_parse_incoming_im, 0); | |
2235 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_ERROR, gaim_parse_locerr, 0); | |
2236 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_MISSEDCALL, gaim_parse_misses, 0); | |
3212 | 2237 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_CLIENTAUTORESP, gaim_parse_clientauto, 0); |
2086 | 2238 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_RATECHANGE, gaim_parse_ratechange, 0); |
2239 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_EVIL, gaim_parse_evilnotify, 0); | |
2240 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOK, AIM_CB_LOK_ERROR, gaim_parse_searcherror, 0); | |
2241 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOK, 0x0003, gaim_parse_searchreply, 0); | |
2242 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ERROR, gaim_parse_msgerr, 0); | |
3595 | 2243 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_MTN, gaim_parse_mtn, 0); |
7011 | 2244 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_USERINFO, gaim_parse_userinfo, 0); |
8341 | 2245 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_REQUESTINFOTIMEOUT, gaim_reqinfo_timeout, 0); |
2086 | 2246 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ACK, gaim_parse_msgack, 0); |
2247 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
|
2248 aim_conn_addhandler(sess, bosconn, 0x0004, 0x0005, gaim_icbm_param_info, 0); |
2086 | 2249 aim_conn_addhandler(sess, bosconn, 0x0001, 0x0001, gaim_parse_genericerr, 0); |
2250 aim_conn_addhandler(sess, bosconn, 0x0003, 0x0001, gaim_parse_genericerr, 0); | |
2251 aim_conn_addhandler(sess, bosconn, 0x0009, 0x0001, gaim_parse_genericerr, 0); | |
2252 aim_conn_addhandler(sess, bosconn, 0x0001, 0x001f, gaim_memrequest, 0); | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2253 aim_conn_addhandler(sess, bosconn, 0x0001, 0x000f, gaim_selfinfo, 0); |
5844 | 2254 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
|
2255 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
|
2256 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
|
2257 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_POP, 0x0002, gaim_popup, 0); |
4759 | 2258 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_ALIAS, gaim_icqalias, 0); |
4624 | 2259 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_INFO, gaim_icqinfo, 0); |
4230 | 2260 #ifndef NOSSI |
4642 | 2261 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_ERROR, gaim_ssi_parseerr, 0); |
2991 | 2262 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RIGHTSINFO, gaim_ssi_parserights, 0); |
2263 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_LIST, gaim_ssi_parselist, 0); | |
2264 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_NOLIST, gaim_ssi_parselist, 0); | |
4230 | 2265 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_SRVACK, gaim_ssi_parseack, 0); |
8227 | 2266 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_ADD, gaim_ssi_parseadd, 0); |
4230 | 2267 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RECVAUTH, gaim_ssi_authgiven, 0); |
2268 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RECVAUTHREQ, gaim_ssi_authrequest, 0); | |
2269 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RECVAUTHREP, gaim_ssi_authreply, 0); | |
2270 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_ADDED, gaim_ssi_gotadded, 0); | |
2271 #endif | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
2272 |
7283 | 2273 od->conn = bosconn; |
2704 | 2274 for (i = 0; i < (int)strlen(info->bosip); i++) { |
2275 if (info->bosip[i] == ':') { | |
2276 port = atoi(&(info->bosip[i+1])); | |
2086 | 2277 break; |
2278 } | |
2279 } | |
2704 | 2280 host = g_strndup(info->bosip, i); |
2086 | 2281 bosconn->status |= AIM_CONN_STATUS_INPROGRESS; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2282 rc = gaim_proxy_connect(gc->account, host, port, oscar_bos_connect, gc); |
2086 | 2283 g_free(host); |
4366 | 2284 if (rc < 0) { |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
2285 gaim_connection_error(gc, _("Could Not Connect")); |
2086 | 2286 od->killme = TRUE; |
2287 return 0; | |
2288 } | |
4293 | 2289 aim_sendcookie(sess, bosconn, info->cookielen, info->cookie); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
2290 gaim_input_remove(gc->inpa); |
2704 | 2291 |
7283 | 2292 gaim_connection_update_progress(gc, _("Received authorization"), 3, OSCAR_CONNECT_STEPS); |
8341 | 2293 ck[3] = 0x64; |
7282 | 2294 |
2086 | 2295 return 1; |
2296 } | |
2297 | |
7285 | 2298 /* XXX - Should use gaim_url_fetch for the below stuff */ |
2086 | 2299 struct pieceofcrap { |
5575 | 2300 GaimConnection *gc; |
2086 | 2301 unsigned long offset; |
2302 unsigned long len; | |
2303 char *modname; | |
2304 int fd; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2305 aim_conn_t *conn; |
2086 | 2306 unsigned int inpa; |
2307 }; | |
2308 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
2309 static void damn_you(gpointer data, gint source, GaimInputCondition c) |
2086 | 2310 { |
2311 struct pieceofcrap *pos = data; | |
7283 | 2312 OscarData *od = pos->gc->proto_data; |
2086 | 2313 char in = '\0'; |
2314 int x = 0; | |
2315 unsigned char m[17]; | |
2316 | |
2317 while (read(pos->fd, &in, 1) == 1) { | |
2318 if (in == '\n') | |
2319 x++; | |
2320 else if (in != '\r') | |
2321 x = 0; | |
2322 if (x == 2) | |
2323 break; | |
2324 in = '\0'; | |
2325 } | |
2326 if (in != '\n') { | |
4056 | 2327 char buf[256]; |
2328 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
|
2329 "this is fixed. Check %s for updates."), GAIM_WEBSITE); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2330 gaim_notify_warning(pos->gc, NULL, |
7422 | 2331 _("Gaim was unable to get a valid AIM login hash."), |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2332 buf); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
2333 gaim_input_remove(pos->inpa); |
2086 | 2334 close(pos->fd); |
2335 g_free(pos); | |
2336 return; | |
2337 } | |
2338 read(pos->fd, m, 16); | |
2339 m[16] = '\0'; | |
8660 | 2340 gaim_debug_misc("oscar", "Sending hash: "); |
2086 | 2341 for (x = 0; x < 16; x++) |
8660 | 2342 gaim_debug_misc(NULL, "%02hhx ", (unsigned char)m[x]); |
2343 | |
2344 gaim_debug_misc(NULL, "\n"); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
2345 gaim_input_remove(pos->inpa); |
2086 | 2346 close(pos->fd); |
2347 aim_sendmemblock(od->sess, pos->conn, 0, 16, m, AIM_SENDMEMBLOCK_FLAG_ISHASH); | |
2348 g_free(pos); | |
2349 } | |
2350 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
2351 static void straight_to_hell(gpointer data, gint source, GaimInputCondition cond) { |
2086 | 2352 struct pieceofcrap *pos = data; |
5420 | 2353 gchar *buf; |
2086 | 2354 |
4366 | 2355 pos->fd = source; |
2356 | |
2086 | 2357 if (source < 0) { |
5420 | 2358 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
|
2359 "this is fixed. Check %s for updates."), GAIM_WEBSITE); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2360 gaim_notify_warning(pos->gc, NULL, |
7422 | 2361 _("Gaim was unable to get a valid AIM login hash."), |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2362 buf); |
5420 | 2363 g_free(buf); |
2086 | 2364 if (pos->modname) |
2365 g_free(pos->modname); | |
2366 g_free(pos); | |
2367 return; | |
2368 } | |
2369 | |
5420 | 2370 buf = g_strdup_printf("GET " AIMHASHDATA "?offset=%ld&len=%ld&modname=%s HTTP/1.0\n\n", |
2086 | 2371 pos->offset, pos->len, pos->modname ? pos->modname : ""); |
2372 write(pos->fd, buf, strlen(buf)); | |
5420 | 2373 g_free(buf); |
2086 | 2374 if (pos->modname) |
2375 g_free(pos->modname); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
2376 pos->inpa = gaim_input_add(pos->fd, GAIM_INPUT_READ, damn_you, pos); |
2086 | 2377 return; |
2378 } | |
2379 | |
2380 /* size of icbmui.ocm, the largest module in AIM 3.5 */ | |
2381 #define AIM_MAX_FILE_SIZE 98304 | |
2382 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2383 int gaim_memrequest(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2384 va_list ap; |
2385 struct pieceofcrap *pos; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2386 fu32_t offset, len; |
2086 | 2387 char *modname; |
2388 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2389 va_start(ap, fr); |
4200 | 2390 offset = va_arg(ap, fu32_t); |
2391 len = va_arg(ap, fu32_t); | |
2086 | 2392 modname = va_arg(ap, char *); |
2393 va_end(ap); | |
2394 | |
8660 | 2395 gaim_debug_misc("oscar", |
5556 | 2396 "offset: %u, len: %u, file: %s\n", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2397 offset, len, (modname ? modname : "aim.exe")); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2398 |
2086 | 2399 if (len == 0) { |
8660 | 2400 gaim_debug_misc("oscar", "len is 0, hashing NULL\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2401 aim_sendmemblock(sess, fr->conn, offset, len, NULL, |
2086 | 2402 AIM_SENDMEMBLOCK_FLAG_ISREQUEST); |
2403 return 1; | |
2404 } | |
9625 | 2405 /* uncomment this when you're convinced it's right. remember, it's been wrong before. */ |
2406 #if 0 | |
2086 | 2407 if (offset > AIM_MAX_FILE_SIZE || len > AIM_MAX_FILE_SIZE) { |
2408 char *buf; | |
2409 int i = 8; | |
2410 if (modname) | |
2411 i += strlen(modname); | |
2412 buf = g_malloc(i); | |
2413 i = 0; | |
2414 if (modname) { | |
2415 memcpy(buf, modname, strlen(modname)); | |
2416 i += strlen(modname); | |
2417 } | |
2418 buf[i++] = offset & 0xff; | |
2419 buf[i++] = (offset >> 8) & 0xff; | |
2420 buf[i++] = (offset >> 16) & 0xff; | |
2421 buf[i++] = (offset >> 24) & 0xff; | |
2422 buf[i++] = len & 0xff; | |
2423 buf[i++] = (len >> 8) & 0xff; | |
2424 buf[i++] = (len >> 16) & 0xff; | |
2425 buf[i++] = (len >> 24) & 0xff; | |
8660 | 2426 gaim_debug_misc("oscar", "len + offset is invalid, " |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2427 "hashing request\n"); |
2086 | 2428 aim_sendmemblock(sess, command->conn, offset, i, buf, AIM_SENDMEMBLOCK_FLAG_ISREQUEST); |
2429 g_free(buf); | |
2430 return 1; | |
2431 } | |
9625 | 2432 #endif |
2086 | 2433 |
2434 pos = g_new0(struct pieceofcrap, 1); | |
2435 pos->gc = sess->aux_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2436 pos->conn = fr->conn; |
2086 | 2437 |
2438 pos->offset = offset; | |
2439 pos->len = len; | |
2440 pos->modname = modname ? g_strdup(modname) : NULL; | |
2441 | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2442 if (gaim_proxy_connect(pos->gc->account, "gaim.sourceforge.net", 80, straight_to_hell, pos) != 0) { |
4056 | 2443 char buf[256]; |
2086 | 2444 if (pos->modname) |
2445 g_free(pos->modname); | |
2446 g_free(pos); | |
4056 | 2447 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
|
2448 "this is fixed. Check %s for updates."), GAIM_WEBSITE); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2449 gaim_notify_warning(pos->gc, NULL, |
7422 | 2450 _("Gaim was unable to get a valid login hash."), |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2451 buf); |
2086 | 2452 } |
2453 | |
2454 return 1; | |
2455 } | |
2456 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2457 static int gaim_parse_login(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 2458 GaimConnection *gc = sess->aux_data; |
7283 | 2459 OscarData *od = gc->proto_data; |
5591
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2460 GaimAccount *account = gaim_connection_get_account(gc); |
5575 | 2461 GaimAccount *ac = gaim_connection_get_account(gc); |
7282 | 2462 #if 0 |
2463 struct client_info_s info = {"gaim", 7, 3, 2003, "us", "en", 0x0004, 0x0000, 0x04b}; | |
2464 #endif | |
7011 | 2465 va_list ap; |
2466 char *key; | |
2086 | 2467 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2468 va_start(ap, fr); |
2086 | 2469 key = va_arg(ap, char *); |
2470 va_end(ap); | |
2471 | |
4617 | 2472 if (od->icq) { |
3458 | 2473 struct client_info_s info = CLIENTINFO_ICQ_KNOWNGOOD; |
5591
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2474 aim_send_login(sess, fr->conn, gaim_account_get_username(ac), |
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2475 gaim_account_get_password(account), &info, key); |
3458 | 2476 } else { |
2477 struct client_info_s info = CLIENTINFO_AIM_KNOWNGOOD; | |
5591
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2478 aim_send_login(sess, fr->conn, gaim_account_get_username(ac), |
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2479 gaim_account_get_password(account), &info, key); |
3458 | 2480 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2481 |
7283 | 2482 gaim_connection_update_progress(gc, _("Password sent"), 2, OSCAR_CONNECT_STEPS); |
8341 | 2483 ck[2] = 0x6c; |
7282 | 2484 |
2086 | 2485 return 1; |
2486 } | |
2487 | |
2675 | 2488 static int conninitdone_chat(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 2489 GaimConnection *gc = sess->aux_data; |
2647 | 2490 struct chat_connection *chatcon; |
2491 static int id = 1; | |
2492 | |
6905 | 2493 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
|
2494 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
|
2495 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
|
2496 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
|
2497 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_INCOMINGMSG, gaim_conv_chat_incoming_msg, 0); |
2675 | 2498 |
2672 | 2499 aim_clientready(sess, fr->conn); |
2675 | 2500 |
2647 | 2501 chatcon = find_oscar_chat_by_conn(gc, fr->conn); |
2502 chatcon->id = id; | |
8733 | 2503 chatcon->conv = serv_got_joined_chat(gc, id++, chatcon->show); |
2647 | 2504 |
2505 return 1; | |
2506 } | |
2507 | |
2675 | 2508 static int conninitdone_chatnav(aim_session_t *sess, aim_frame_t *fr, ...) { |
2509 | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2510 aim_conn_addhandler(sess, fr->conn, 0x000d, 0x0001, gaim_parse_genericerr, 0); |
2647 | 2511 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CTN, AIM_CB_CTN_INFO, gaim_chatnav_info, 0); |
2675 | 2512 |
2513 aim_clientready(sess, fr->conn); | |
2514 | |
2515 aim_chatnav_reqrights(sess, fr->conn); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2516 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2517 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2518 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2519 |
3694 | 2520 static int conninitdone_email(aim_session_t *sess, aim_frame_t *fr, ...) { |
2521 | |
2522 aim_conn_addhandler(sess, fr->conn, 0x0018, 0x0001, gaim_parse_genericerr, 0); | |
2523 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_EML, AIM_CB_EML_MAILSTATUS, gaim_email_parseupdate, 0); | |
2524 | |
7282 | 2525 aim_email_sendcookies(sess); |
2526 aim_email_activate(sess); | |
3694 | 2527 aim_clientready(sess, fr->conn); |
2528 | |
2529 return 1; | |
2530 } | |
2531 | |
4804 | 2532 static int conninitdone_icon(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 2533 GaimConnection *gc = sess->aux_data; |
7283 | 2534 OscarData *od = gc->proto_data; |
4804 | 2535 |
2536 aim_conn_addhandler(sess, fr->conn, 0x0018, 0x0001, gaim_parse_genericerr, 0); | |
2537 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ICO, AIM_CB_ICO_ERROR, gaim_icon_error, 0); | |
2538 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ICO, AIM_CB_ICO_RESPONSE, gaim_icon_parseicon, 0); | |
2539 | |
2540 aim_clientready(sess, fr->conn); | |
2541 | |
4823 | 2542 od->iconconnecting = FALSE; |
2543 | |
4804 | 2544 if (od->icontimer) |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
2545 gaim_timeout_remove(od->icontimer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
2546 od->icontimer = gaim_timeout_add(100, gaim_icon_timerfunc, gc); |
4804 | 2547 |
2548 return 1; | |
2549 } | |
2550 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2551 static void oscar_chatnav_connect(gpointer data, gint source, GaimInputCondition cond) { |
5575 | 2552 GaimConnection *gc = data; |
7283 | 2553 OscarData *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2554 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2555 aim_conn_t *tstconn; |
2086 | 2556 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2557 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 2558 close(source); |
2559 return; | |
2560 } | |
2561 | |
4617 | 2562 od = gc->proto_data; |
2563 sess = od->sess; | |
2086 | 2564 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_CHATNAV); |
4366 | 2565 tstconn->fd = source; |
2086 | 2566 |
2567 if (source < 0) { | |
2568 aim_conn_kill(sess, &tstconn); | |
8660 | 2569 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2570 "unable to connect to chatnav server\n"); |
2086 | 2571 return; |
2572 } | |
2573 | |
2574 aim_conn_completeconnect(sess, tstconn); | |
4617 | 2575 od->cnpa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); |
8660 | 2576 gaim_debug_info("oscar", "chatnav: connected\n"); |
2086 | 2577 } |
2578 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
2579 static void oscar_auth_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 2580 { |
5575 | 2581 GaimConnection *gc = data; |
7283 | 2582 OscarData *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2583 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2584 aim_conn_t *tstconn; |
2086 | 2585 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2586 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 2587 close(source); |
2588 return; | |
2589 } | |
2590 | |
4617 | 2591 od = gc->proto_data; |
2592 sess = od->sess; | |
2086 | 2593 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_AUTH); |
4366 | 2594 tstconn->fd = source; |
2086 | 2595 |
2596 if (source < 0) { | |
2597 aim_conn_kill(sess, &tstconn); | |
8660 | 2598 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2599 "unable to connect to authorizer\n"); |
2086 | 2600 return; |
2601 } | |
2602 | |
2603 aim_conn_completeconnect(sess, tstconn); | |
4617 | 2604 od->paspa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); |
8660 | 2605 gaim_debug_info("oscar", "admin: connected\n"); |
2086 | 2606 } |
2607 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
2608 static void oscar_chat_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 2609 { |
2610 struct chat_connection *ccon = data; | |
5575 | 2611 GaimConnection *gc = ccon->gc; |
7283 | 2612 OscarData *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2613 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2614 aim_conn_t *tstconn; |
2086 | 2615 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2616 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 2617 close(source); |
2618 g_free(ccon->show); | |
2619 g_free(ccon->name); | |
2620 g_free(ccon); | |
2621 return; | |
2622 } | |
2623 | |
4617 | 2624 od = gc->proto_data; |
2625 sess = od->sess; | |
2086 | 2626 tstconn = ccon->conn; |
4366 | 2627 tstconn->fd = source; |
2086 | 2628 |
2629 if (source < 0) { | |
2630 aim_conn_kill(sess, &tstconn); | |
2631 g_free(ccon->show); | |
2632 g_free(ccon->name); | |
2633 g_free(ccon); | |
2634 return; | |
2635 } | |
2636 | |
2637 aim_conn_completeconnect(sess, ccon->conn); | |
4617 | 2638 ccon->inpa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); |
2639 od->oscar_chats = g_slist_append(od->oscar_chats, ccon); | |
2086 | 2640 } |
2641 | |
3694 | 2642 static void oscar_email_connect(gpointer data, gint source, GaimInputCondition cond) { |
5575 | 2643 GaimConnection *gc = data; |
7283 | 2644 OscarData *od; |
3694 | 2645 aim_session_t *sess; |
2646 aim_conn_t *tstconn; | |
2647 | |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2648 if (!g_list_find(gaim_connections_get_all(), gc)) { |
3694 | 2649 close(source); |
2650 return; | |
2651 } | |
2652 | |
4617 | 2653 od = gc->proto_data; |
2654 sess = od->sess; | |
3694 | 2655 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_EMAIL); |
4366 | 2656 tstconn->fd = source; |
3694 | 2657 |
2658 if (source < 0) { | |
2659 aim_conn_kill(sess, &tstconn); | |
8660 | 2660 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2661 "unable to connect to email server\n"); |
3694 | 2662 return; |
2663 } | |
2664 | |
2665 aim_conn_completeconnect(sess, tstconn); | |
4617 | 2666 od->emlpa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); |
8660 | 2667 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2668 "email: connected\n"); |
3694 | 2669 } |
2670 | |
4804 | 2671 static void oscar_icon_connect(gpointer data, gint source, GaimInputCondition cond) { |
5575 | 2672 GaimConnection *gc = data; |
7283 | 2673 OscarData *od; |
4804 | 2674 aim_session_t *sess; |
2675 aim_conn_t *tstconn; | |
2676 | |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2677 if (!g_list_find(gaim_connections_get_all(), gc)) { |
4804 | 2678 close(source); |
2679 return; | |
2680 } | |
2681 | |
2682 od = gc->proto_data; | |
2683 sess = od->sess; | |
2684 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_ICON); | |
2685 tstconn->fd = source; | |
2686 | |
2687 if (source < 0) { | |
2688 aim_conn_kill(sess, &tstconn); | |
8660 | 2689 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2690 "unable to connect to icon server\n"); |
4804 | 2691 return; |
2692 } | |
2693 | |
2694 aim_conn_completeconnect(sess, tstconn); | |
2695 od->icopa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); | |
8660 | 2696 gaim_debug_info("oscar", "icon: connected\n"); |
4804 | 2697 } |
2698 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2699 /* 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
|
2700 static int gaim_handle_redirect(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 2701 GaimConnection *gc = sess->aux_data; |
2702 GaimAccount *account = gaim_connection_get_account(gc); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2703 aim_conn_t *tstconn; |
4452 | 2704 int i; |
2086 | 2705 char *host; |
2706 int port; | |
4821 | 2707 va_list ap; |
2708 struct aim_redirect_data *redir; | |
2086 | 2709 |
5575 | 2710 port = gaim_account_get_int(account, "port", FAIM_LOGIN_PORT); |
2086 | 2711 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2712 va_start(ap, fr); |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2713 redir = va_arg(ap, struct aim_redirect_data *); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2714 va_end(ap); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2715 |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2716 for (i = 0; i < (int)strlen(redir->ip); i++) { |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2717 if (redir->ip[i] == ':') { |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2718 port = atoi(&(redir->ip[i+1])); |
2086 | 2719 break; |
2720 } | |
2721 } | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2722 host = g_strndup(redir->ip, i); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2723 |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2724 switch(redir->group) { |
2086 | 2725 case 0x7: /* Authorizer */ |
8660 | 2726 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2727 "Reconnecting with authorizor...\n"); |
2086 | 2728 tstconn = aim_newconn(sess, AIM_CONN_TYPE_AUTH, NULL); |
2729 if (tstconn == NULL) { | |
8660 | 2730 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2731 "unable to reconnect with authorizer\n"); |
2086 | 2732 g_free(host); |
2733 return 1; | |
2734 } | |
4649 | 2735 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 2736 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_admin, 0); |
2086 | 2737 |
2738 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2739 if (gaim_proxy_connect(account, host, port, oscar_auth_connect, gc) != 0) { |
2086 | 2740 aim_conn_kill(sess, &tstconn); |
8660 | 2741 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2742 "unable to reconnect with authorizer\n"); |
2086 | 2743 g_free(host); |
2744 return 1; | |
2745 } | |
4293 | 2746 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
4194 | 2747 break; |
2748 | |
2086 | 2749 case 0xd: /* ChatNav */ |
2750 tstconn = aim_newconn(sess, AIM_CONN_TYPE_CHATNAV, NULL); | |
2751 if (tstconn == NULL) { | |
8660 | 2752 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2753 "unable to connect to chatnav server\n"); |
2086 | 2754 g_free(host); |
2755 return 1; | |
2756 } | |
4649 | 2757 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 2758 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_chatnav, 0); |
2086 | 2759 |
2760 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2761 if (gaim_proxy_connect(account, host, port, oscar_chatnav_connect, gc) != 0) { |
2086 | 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 chatnav server\n"); |
2086 | 2765 g_free(host); |
2766 return 1; | |
2767 } | |
4293 | 2768 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
4194 | 2769 break; |
2770 | |
2771 case 0xe: { /* Chat */ | |
2086 | 2772 struct chat_connection *ccon; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2773 |
2086 | 2774 tstconn = aim_newconn(sess, AIM_CONN_TYPE_CHAT, NULL); |
2775 if (tstconn == NULL) { | |
8660 | 2776 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2777 "unable to connect to chat server\n"); |
2086 | 2778 g_free(host); |
2779 return 1; | |
2780 } | |
2781 | |
4649 | 2782 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 2783 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_chat, 0); |
2784 | |
2086 | 2785 ccon = g_new0(struct chat_connection, 1); |
2786 ccon->conn = tstconn; | |
2787 ccon->gc = gc; | |
2788 ccon->fd = -1; | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2789 ccon->name = g_strdup(redir->chat.room); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2790 ccon->exchange = redir->chat.exchange; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2791 ccon->instance = redir->chat.instance; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
2792 ccon->show = extract_name(redir->chat.room); |
4634 | 2793 |
2086 | 2794 ccon->conn->status |= AIM_CONN_STATUS_INPROGRESS; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2795 if (gaim_proxy_connect(account, host, port, oscar_chat_connect, ccon) != 0) { |
2086 | 2796 aim_conn_kill(sess, &tstconn); |
8660 | 2797 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2798 "unable to connect to chat server\n"); |
2086 | 2799 g_free(host); |
2800 g_free(ccon->show); | |
2801 g_free(ccon->name); | |
2802 g_free(ccon); | |
2803 return 1; | |
2804 } | |
4293 | 2805 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
8660 | 2806 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2807 "Connected to chat room %s exchange %hu\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2808 ccon->name, ccon->exchange); |
4194 | 2809 } break; |
3694 | 2810 |
4804 | 2811 case 0x0010: { /* icon */ |
2812 if (!(tstconn = aim_newconn(sess, AIM_CONN_TYPE_ICON, NULL))) { | |
8660 | 2813 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2814 "unable to connect to icon server\n"); |
4804 | 2815 g_free(host); |
2816 return 1; | |
2817 } | |
2818 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); | |
2819 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_icon, 0); | |
2820 | |
2821 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2822 if (gaim_proxy_connect(account, host, port, oscar_icon_connect, gc) != 0) { |
4804 | 2823 aim_conn_kill(sess, &tstconn); |
8660 | 2824 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2825 "unable to connect to icon server\n"); |
4804 | 2826 g_free(host); |
2827 return 1; | |
2828 } | |
2829 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); | |
2830 } break; | |
2831 | |
3694 | 2832 case 0x0018: { /* email */ |
2833 if (!(tstconn = aim_newconn(sess, AIM_CONN_TYPE_EMAIL, NULL))) { | |
8660 | 2834 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2835 "unable to connect to email server\n"); |
3694 | 2836 g_free(host); |
2837 return 1; | |
2838 } | |
4649 | 2839 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
3694 | 2840 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_email, 0); |
2841 | |
2842 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2843 if (gaim_proxy_connect(account, host, port, oscar_email_connect, gc) != 0) { |
3694 | 2844 aim_conn_kill(sess, &tstconn); |
8660 | 2845 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2846 "unable to connect to email server\n"); |
3694 | 2847 g_free(host); |
2848 return 1; | |
2849 } | |
4293 | 2850 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
3694 | 2851 } break; |
2852 | |
2086 | 2853 default: /* huh? */ |
8660 | 2854 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2855 "got redirect for unknown service 0x%04hx\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2856 redir->group); |
2086 | 2857 break; |
2858 } | |
2859 | |
2860 g_free(host); | |
2861 return 1; | |
2862 } | |
2863 | |
10042 | 2864 static int gaim_parse_oncoming(aim_session_t *sess, aim_frame_t *fr, ...) |
2865 { | |
2866 GaimConnection *gc; | |
2867 GaimAccount *account; | |
2868 OscarData *od; | |
4738 | 2869 struct buddyinfo *bi; |
2993 | 2870 time_t time_idle = 0, signon = 0; |
2871 int type = 0; | |
2872 int caps = 0; | |
2086 | 2873 va_list ap; |
4738 | 2874 aim_userinfo_t *info; |
10042 | 2875 gboolean buddy_is_away = FALSE; |
2876 | |
2877 gc = sess->aux_data; | |
2878 account = gaim_connection_get_account(gc); | |
2879 od = gc->proto_data; | |
4194 | 2880 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2881 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2882 info = va_arg(ap, aim_userinfo_t *); |
2086 | 2883 va_end(ap); |
2884 | |
2993 | 2885 if (info->present & AIM_USERINFO_PRESENT_CAPABILITIES) |
2886 caps = info->capabilities; | |
3267 | 2887 |
4766 | 2888 if (info->present & AIM_USERINFO_PRESENT_FLAGS) { |
2889 if (info->flags & AIM_FLAG_AWAY) | |
10042 | 2890 buddy_is_away = TRUE; |
2891 } | |
2892 | |
2993 | 2893 if (info->present & AIM_USERINFO_PRESENT_ICQEXTSTATUS) { |
3595 | 2894 type = (info->icqinfo.status << 16); |
3013 | 2895 if (!(info->icqinfo.status & AIM_ICQ_STATE_CHAT) && |
2896 (info->icqinfo.status != AIM_ICQ_STATE_NORMAL)) { | |
10042 | 2897 buddy_is_away = TRUE; |
3013 | 2898 } |
2993 | 2899 } |
2900 | |
7141 | 2901 if (caps & AIM_CAPS_ICQ_DIRECT) |
2902 caps ^= AIM_CAPS_ICQ_DIRECT; | |
2993 | 2903 |
2904 if (info->present & AIM_USERINFO_PRESENT_IDLE) { | |
2086 | 2905 time(&time_idle); |
2906 time_idle -= info->idletime*60; | |
9295 | 2907 /* time_idle should be the seconds since epoch at which the user became idle */ |
2993 | 2908 } |
2909 | |
5836 | 2910 if (info->present & AIM_USERINFO_PRESENT_ONLINESINCE) |
2911 signon = info->onlinesince; | |
2912 else if (info->present & AIM_USERINFO_PRESENT_SESSIONLEN) | |
2993 | 2913 signon = time(NULL) - info->sessionlen; |
2086 | 2914 |
9982 | 2915 if (!aim_sncmp(gaim_account_get_username(account), info->sn)) |
5575 | 2916 gaim_connection_set_display_name(gc, info->sn); |
2305
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
2917 |
9982 | 2918 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(account, info->sn)); |
4738 | 2919 if (!bi) { |
2920 bi = g_new0(struct buddyinfo, 1); | |
9982 | 2921 g_hash_table_insert(od->buddyinfo, g_strdup(gaim_normalize(account, info->sn)), bi); |
4738 | 2922 } |
4739 | 2923 bi->typingnot = FALSE; |
2924 bi->ico_informed = FALSE; | |
6857 | 2925 bi->ipaddr = info->icqinfo.ipaddr; |
2926 | |
2927 /* Available message stuff */ | |
6292 | 2928 free(bi->availmsg); |
7011 | 2929 if (info->avail != NULL) |
8225 | 2930 bi->availmsg = oscar_encoding_to_utf8(info->avail_encoding, info->avail, info->avail_len); |
5837 | 2931 else |
6292 | 2932 bi->availmsg = NULL; |
4732 | 2933 |
4804 | 2934 /* Server stored icon stuff */ |
4853 | 2935 if (info->iconcsumlen) { |
7125 | 2936 const char *filename = NULL, *saved_b16 = NULL; |
9801 | 2937 char *b16 = NULL, *filepath = NULL; |
7093 | 2938 GaimBuddy *b = NULL; |
4853 | 2939 |
7106
db6bd3e794d8
[gaim-migrate @ 7671]
Christian Hammond <chipx86@chipx86.com>
parents:
7098
diff
changeset
|
2940 b16 = gaim_base16_encode(info->iconcsum, info->iconcsumlen); |
9982 | 2941 b = gaim_find_buddy(account, info->sn); |
7093 | 2942 /* |
2943 * If for some reason the checksum is valid, but cached file is not.. | |
2944 * we want to know. | |
2945 */ | |
7693 | 2946 filename = gaim_blist_node_get_string((GaimBlistNode*)b, "buddy_icon"); |
7093 | 2947 if (filename != NULL) { |
2948 if (g_file_test(filename, G_FILE_TEST_EXISTS)) | |
7693 | 2949 saved_b16 = gaim_blist_node_get_string((GaimBlistNode*)b, |
2950 "icon_checksum"); | |
9801 | 2951 else { |
2952 filepath = g_build_filename(gaim_buddy_icons_get_cache_dir(), | |
2953 filename, NULL); | |
2954 if (g_file_test(filepath, G_FILE_TEST_EXISTS)) | |
2955 saved_b16 = gaim_blist_node_get_string((GaimBlistNode*)b, | |
2956 "icon_checksum"); | |
2957 g_free(filepath); | |
2958 } | |
7093 | 2959 } else |
2960 saved_b16 = NULL; | |
7054
7c04a0775918
[gaim-migrate @ 7617]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
7045
diff
changeset
|
2961 |
4853 | 2962 if (!b16 || !saved_b16 || strcmp(b16, saved_b16)) { |
2963 GSList *cur = od->requesticon; | |
2964 while (cur && aim_sncmp((char *)cur->data, info->sn)) | |
2965 cur = cur->next; | |
2966 if (!cur) { | |
9982 | 2967 od->requesticon = g_slist_append(od->requesticon, g_strdup(gaim_normalize(account, info->sn))); |
4853 | 2968 if (od->icontimer) |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
2969 gaim_timeout_remove(od->icontimer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
2970 od->icontimer = gaim_timeout_add(500, gaim_icon_timerfunc, gc); |
4853 | 2971 } |
2972 } | |
6053 | 2973 g_free(b16); |
4853 | 2974 } |
2975 | |
10042 | 2976 /* XXX - Represent other ICQ statuses */ |
2977 if (buddy_is_away == TRUE) | |
2978 gaim_prpl_got_user_status(account, info->sn, OSCAR_STATUS_ID_AWAY, NULL); | |
2979 else | |
2980 gaim_prpl_got_user_status(account, info->sn, OSCAR_STATUS_ID_AVAILABLE, NULL); | |
9982 | 2981 gaim_prpl_got_user_login_time(account, info->sn, signon); |
2982 gaim_prpl_got_user_warning_level(account, info->sn, info->warnlevel/10.0 + 0.5); | |
2983 | |
2984 if (time_idle > 0) | |
2985 gaim_prpl_got_user_idle(account, info->sn, TRUE, time_idle); | |
10009 | 2986 else |
2987 gaim_prpl_got_user_idle(account, info->sn, FALSE, 0); | |
2086 | 2988 |
2989 return 1; | |
2990 } | |
2991 | |
8341 | 2992 static void gaim_check_comment(OscarData *od, const char *str) { |
2993 if ((str == NULL) || strcmp(str, ck)) | |
2994 aim_locate_setcaps(od->sess, caps_aim); | |
2995 else | |
2996 aim_locate_setcaps(od->sess, caps_aim | AIM_CAPS_SECUREIM); | |
2997 } | |
2998 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2999 static int gaim_parse_offgoing(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3000 GaimConnection *gc = sess->aux_data; |
7283 | 3001 OscarData *od = gc->proto_data; |
9982 | 3002 GaimAccount *account = gaim_connection_get_account(gc); |
2086 | 3003 va_list ap; |
4739 | 3004 aim_userinfo_t *info; |
2086 | 3005 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3006 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3007 info = va_arg(ap, aim_userinfo_t *); |
2086 | 3008 va_end(ap); |
3009 | |
9982 | 3010 gaim_prpl_got_user_status(account, info->sn, OSCAR_STATUS_ID_OFFLINE, NULL); |
2086 | 3011 |
7261 | 3012 g_hash_table_remove(od->buddyinfo, gaim_normalize(gc->account, info->sn)); |
5837 | 3013 |
2086 | 3014 return 1; |
3015 } | |
3016 | |
4617 | 3017 /* BBB */ |
3952 | 3018 /* |
4617 | 3019 * This is called after a remote AIM user has connected to us. We |
3020 * want to do some voodoo with the socket file descriptors, add a | |
3021 * callback or two, and then send the AIM_CB_OFT_PROMPT. | |
3952 | 3022 */ |
4656 | 3023 static int oscar_sendfile_estblsh(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3024 GaimConnection *gc = sess->aux_data; |
7283 | 3025 OscarData *od = (OscarData *)gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
3026 GaimXfer *xfer; |
5146 | 3027 struct aim_oft_info *oft_info; |
3630 | 3028 va_list ap; |
3029 aim_conn_t *conn, *listenerconn; | |
4656 | 3030 |
8660 | 3031 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3032 "AAA - in oscar_sendfile_estblsh\n"); |
3630 | 3033 va_start(ap, fr); |
3034 conn = va_arg(ap, aim_conn_t *); | |
3035 listenerconn = va_arg(ap, aim_conn_t *); | |
3036 va_end(ap); | |
3037 | |
4617 | 3038 if (!(xfer = oscar_find_xfer_by_conn(od->file_transfers, listenerconn))) |
3039 return 1; | |
3040 | |
5146 | 3041 if (!(oft_info = xfer->data)) |
4617 | 3042 return 1; |
3043 | |
3630 | 3044 /* Stop watching listener conn; watch transfer conn instead */ |
4617 | 3045 gaim_input_remove(xfer->watcher); |
3630 | 3046 aim_conn_kill(sess, &listenerconn); |
3047 | |
5146 | 3048 oft_info->conn = conn; |
3049 xfer->fd = oft_info->conn->fd; | |
3050 | |
3051 aim_conn_addhandler(sess, oft_info->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_ACK, oscar_sendfile_ack, 0); | |
3052 aim_conn_addhandler(sess, oft_info->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DONE, oscar_sendfile_done, 0); | |
3053 xfer->watcher = gaim_input_add(oft_info->conn->fd, GAIM_INPUT_READ, oscar_callback, oft_info->conn); | |
4617 | 3054 |
3055 /* Inform the other user that we are connected and ready to transfer */ | |
5146 | 3056 aim_oft_sendheader(sess, AIM_CB_OFT_PROMPT, oft_info); |
3630 | 3057 |
3058 return 0; | |
3059 } | |
3060 | |
3952 | 3061 /* |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
3062 * This is the gaim callback passed to gaim_proxy_connect when connecting to another AIM |
4617 | 3063 * user in order to transfer a file. |
3952 | 3064 */ |
4617 | 3065 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
|
3066 GaimXfer *xfer; |
5146 | 3067 struct aim_oft_info *oft_info; |
4656 | 3068 |
8660 | 3069 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3070 "AAA - in oscar_sendfile_connected\n"); |
4617 | 3071 if (!(xfer = data)) |
3072 return; | |
5146 | 3073 if (!(oft_info = xfer->data)) |
3630 | 3074 return; |
8446 | 3075 if (source < 0) { |
3076 gaim_xfer_cancel_remote(xfer); | |
4617 | 3077 return; |
8446 | 3078 } |
4617 | 3079 |
3080 xfer->fd = source; | |
5146 | 3081 oft_info->conn->fd = source; |
3082 | |
3083 aim_conn_completeconnect(oft_info->sess, oft_info->conn); | |
3084 xfer->watcher = gaim_input_add(xfer->fd, GAIM_INPUT_READ, oscar_callback, oft_info->conn); | |
4617 | 3085 |
3086 /* Inform the other user that we are connected and ready to transfer */ | |
5146 | 3087 aim_im_sendch2_sendfile_accept(oft_info->sess, oft_info); |
4617 | 3088 |
3089 return; | |
3630 | 3090 } |
3091 | |
3952 | 3092 /* |
4617 | 3093 * This is called when a buddy sends us some file info. This happens when they |
3094 * are sending a file to you, and you have just established a connection to them. | |
4650 | 3095 * You should send them the exact same info except use the real cookie. We also |
4617 | 3096 * get like totally ready to like, receive the file, kay? |
3952 | 3097 */ |
4617 | 3098 static int oscar_sendfile_prompt(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3099 GaimConnection *gc = sess->aux_data; |
7283 | 3100 OscarData *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
3101 GaimXfer *xfer; |
5146 | 3102 struct aim_oft_info *oft_info; |
4617 | 3103 va_list ap; |
3104 aim_conn_t *conn; | |
3105 fu8_t *cookie; | |
3106 struct aim_fileheader_t *fh; | |
4656 | 3107 |
8660 | 3108 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3109 "AAA - in oscar_sendfile_prompt\n"); |
4617 | 3110 va_start(ap, fr); |
3111 conn = va_arg(ap, aim_conn_t *); | |
3112 cookie = va_arg(ap, fu8_t *); | |
3113 fh = va_arg(ap, struct aim_fileheader_t *); | |
3114 va_end(ap); | |
3115 | |
3116 if (!(xfer = oscar_find_xfer_by_conn(od->file_transfers, conn))) | |
3117 return 1; | |
3118 | |
5146 | 3119 if (!(oft_info = xfer->data)) |
4617 | 3120 return 1; |
3121 | |
3122 /* We want to stop listening with a normal thingy */ | |
3123 gaim_input_remove(xfer->watcher); | |
3124 xfer->watcher = 0; | |
3125 | |
5146 | 3126 /* They sent us some information about the file they're sending */ |
3127 memcpy(&oft_info->fh, fh, sizeof(*fh)); | |
3128 | |
3129 /* Fill in the cookie */ | |
3130 memcpy(&oft_info->fh.bcookie, oft_info->cookie, 8); | |
3131 | |
4617 | 3132 /* XXX - convert the name from UTF-8 to UCS-2 if necessary, and pass the encoding to the call below */ |
5146 | 3133 aim_oft_sendheader(oft_info->sess, AIM_CB_OFT_ACK, oft_info); |
4617 | 3134 gaim_xfer_start(xfer, xfer->fd, NULL, 0); |
3135 | |
3136 return 0; | |
3630 | 3137 } |
3138 | |
3952 | 3139 /* |
4657 | 3140 * We are sending a file to someone else. They have just acknowledged our |
4617 | 3141 * prompt, so we want to start sending data like there's no tomorrow. |
3952 | 3142 */ |
4617 | 3143 static int oscar_sendfile_ack(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3144 GaimConnection *gc = sess->aux_data; |
7283 | 3145 OscarData *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
3146 GaimXfer *xfer; |
4617 | 3147 va_list ap; |
3148 aim_conn_t *conn; | |
3149 fu8_t *cookie; | |
3150 struct aim_fileheader_t *fh; | |
4656 | 3151 |
8660 | 3152 gaim_debug_info("oscar", "AAA - in oscar_sendfile_ack\n"); |
4617 | 3153 va_start(ap, fr); |
3154 conn = va_arg(ap, aim_conn_t *); | |
3155 cookie = va_arg(ap, fu8_t *); | |
3156 fh = va_arg(ap, struct aim_fileheader_t *); | |
3157 va_end(ap); | |
3158 | |
3159 if (!(xfer = oscar_find_xfer_by_cookie(od->file_transfers, cookie))) | |
3160 return 1; | |
3161 | |
4656 | 3162 /* We want to stop listening with a normal thingy */ |
3163 gaim_input_remove(xfer->watcher); | |
3164 xfer->watcher = 0; | |
3165 | |
4617 | 3166 gaim_xfer_start(xfer, xfer->fd, NULL, 0); |
3167 | |
3168 return 0; | |
3630 | 3169 } |
4617 | 3170 |
3171 /* | |
3172 * We just sent a file to someone. They said they got it and everything, | |
3173 * so we can close our direct connection and what not. | |
3174 */ | |
3175 static int oscar_sendfile_done(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 3176 GaimConnection *gc = sess->aux_data; |
7283 | 3177 OscarData *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
3178 GaimXfer *xfer; |
4617 | 3179 va_list ap; |
3180 aim_conn_t *conn; | |
3181 fu8_t *cookie; | |
3182 struct aim_fileheader_t *fh; | |
4656 | 3183 |
8660 | 3184 gaim_debug_info("oscar", "AAA - in oscar_sendfile_done\n"); |
4617 | 3185 va_start(ap, fr); |
3186 conn = va_arg(ap, aim_conn_t *); | |
3187 cookie = va_arg(ap, fu8_t *); | |
3188 fh = va_arg(ap, struct aim_fileheader_t *); | |
3189 va_end(ap); | |
3190 | |
3191 if (!(xfer = oscar_find_xfer_by_conn(od->file_transfers, conn))) | |
3192 return 1; | |
3193 | |
4656 | 3194 xfer->fd = conn->fd; |
4617 | 3195 gaim_xfer_end(xfer); |
3196 | |
3197 return 0; | |
3198 } | |
3630 | 3199 |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3200 static int incomingim_chan1(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch1_args *args) { |
5575 | 3201 GaimConnection *gc = sess->aux_data; |
7283 | 3202 OscarData *od = gc->proto_data; |
8708 | 3203 GaimAccount *account = gaim_connection_get_account(gc); |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
3204 GaimConvImFlags flags = 0; |
4738 | 3205 struct buddyinfo *bi; |
5575 | 3206 const char *iconfile; |
9806 | 3207 GString *message; |
3208 gchar *tmp; | |
3209 aim_mpmsg_section_t *curpart; | |
3210 | |
3211 gaim_debug_misc("oscar", "Recived IM from %s with %d parts\n", | |
3212 userinfo->sn, args->mpmsg.numparts); | |
4738 | 3213 |
8708 | 3214 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(account, userinfo->sn)); |
4738 | 3215 if (!bi) { |
3216 bi = g_new0(struct buddyinfo, 1); | |
8708 | 3217 g_hash_table_insert(od->buddyinfo, g_strdup(gaim_normalize(account, userinfo->sn)), bi); |
4738 | 3218 } |
2273
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
3219 |
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
3220 if (args->icbmflags & AIM_IMFLAGS_AWAY) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
3221 flags |= GAIM_CONV_IM_AUTO_RESP; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3222 |
4738 | 3223 if (args->icbmflags & AIM_IMFLAGS_TYPINGNOT) |
3224 bi->typingnot = TRUE; | |
3225 else | |
3226 bi->typingnot = FALSE; | |
3227 | |
4380 | 3228 if ((args->icbmflags & AIM_IMFLAGS_HASICON) && (args->iconlen) && (args->iconsum) && (args->iconstamp)) { |
8660 | 3229 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3230 "%s has an icon\n", userinfo->sn); |
4738 | 3231 if ((args->iconlen != bi->ico_len) || (args->iconsum != bi->ico_csum) || (args->iconstamp != bi->ico_time)) { |
3232 bi->ico_need = TRUE; | |
3233 bi->ico_len = args->iconlen; | |
3234 bi->ico_csum = args->iconsum; | |
3235 bi->ico_time = args->iconstamp; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3236 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3237 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3238 |
8708 | 3239 if ((iconfile = gaim_account_get_buddy_icon(account)) && |
7406 | 3240 (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
|
3241 FILE *file; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3242 struct stat st; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3243 |
5575 | 3244 if (!stat(iconfile, &st)) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3245 char *buf = g_malloc(st.st_size); |
5575 | 3246 file = fopen(iconfile, "rb"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3247 if (file) { |
9532 | 3248 /* XXX - Use g_file_get_contents() */ |
2603
24664768a739
[gaim-migrate @ 2616]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2597
diff
changeset
|
3249 int len = fread(buf, 1, st.st_size, file); |
8660 | 3250 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3251 "Sending buddy icon to %s (%d bytes, " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3252 "%lu reported)\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3253 userinfo->sn, len, st.st_size); |
4617 | 3254 aim_im_sendch2_icon(sess, userinfo->sn, buf, st.st_size, |
3255 st.st_mtime, aimutil_iconsum(buf, st.st_size)); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3256 fclose(file); |
2336
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
3257 } else |
8660 | 3258 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3259 "Can't open buddy icon file!\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3260 g_free(buf); |
2336
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
3261 } else |
8660 | 3262 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3263 "Can't stat buddy icon file!\n"); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3264 } |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3265 |
9806 | 3266 message = g_string_new(""); |
3267 curpart = args->mpmsg.parts; | |
3268 while (curpart != NULL) { | |
9908 | 3269 tmp = gaim_plugin_oscar_decode_im_part(account, userinfo->sn, curpart->charset, curpart->charsubset, |
9806 | 3270 curpart->data, curpart->datalen); |
3271 if (tmp != NULL) { | |
3272 g_string_append(message, tmp); | |
3273 g_free(tmp); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3274 } |
9806 | 3275 |
3276 curpart = curpart->next; | |
3277 } | |
3278 tmp = g_string_free(message, FALSE); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3279 |
8666 | 3280 /* |
8995 | 3281 * If the message is being received by an ICQ user then escape any HTML, |
9016 | 3282 * because HTML is not sent over ICQ as a means to format a message. |
8995 | 3283 * so any HTML we receive is intended to be displayed |
3284 * | |
3285 * Note: There *may* be some clients which send messages as HTML formatted - | |
3286 * they need to be special-cased somehow. | |
8666 | 3287 */ |
9982 | 3288 if (aim_sn_is_icq(gaim_account_get_username(account)) && aim_sn_is_icq(userinfo->sn)) { |
8995 | 3289 /* being recevied by ICQ from ICQ - escape HTML so it is displayed as sent */ |
3290 gchar *tmp2 = gaim_escape_html(tmp); | |
8493 | 3291 g_free(tmp); |
3292 tmp = tmp2; | |
3293 } | |
3294 | |
6982 | 3295 serv_got_im(gc, userinfo->sn, tmp, flags, time(NULL)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3296 g_free(tmp); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3297 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3298 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3299 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3300 |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3301 static int incomingim_chan2(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args) { |
9070 | 3302 GaimConnection *gc; |
9933 | 3303 GaimAccount *account; |
9070 | 3304 OscarData *od; |
9933 | 3305 const char *username = NULL; |
3306 char *message = NULL; | |
9070 | 3307 |
3308 g_return_val_if_fail(sess != NULL, 0); | |
3309 g_return_val_if_fail(sess->aux_data != NULL, 0); | |
3310 | |
3311 gc = sess->aux_data; | |
9933 | 3312 account = gaim_connection_get_account(gc); |
9070 | 3313 od = gc->proto_data; |
9933 | 3314 username = gaim_account_get_username(account); |
3315 | |
3316 if (args == NULL) | |
4121 | 3317 return 0; |
4194 | 3318 |
9933 | 3319 gaim_debug_misc("oscar", "rendezvous with %s, status is %hu\n", |
3320 userinfo->sn, args->status); | |
3321 | |
3322 if (args->msg != NULL) | |
3323 { | |
3324 if (args->encoding != NULL) | |
3325 { | |
3326 char *encoding = NULL; | |
3327 encoding = oscar_encoding_extract(args->encoding); | |
3328 message = oscar_encoding_to_utf8(encoding, args->msg, args->msglen); | |
3329 g_free(encoding); | |
3330 } else { | |
3331 if (g_utf8_validate(args->msg, args->msglen, NULL)) | |
3332 message = g_strdup(args->msg); | |
3333 } | |
3334 } | |
2869 | 3335 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3336 if (args->reqclass & AIM_CAPS_CHAT) { |
4121 | 3337 char *name; |
5234 | 3338 GHashTable *components; |
3339 | |
9933 | 3340 if (!args->info.chat.roominfo.name || !args->info.chat.roominfo.exchange) { |
3341 g_free(message); | |
4121 | 3342 return 1; |
9933 | 3343 } |
5234 | 3344 components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, |
3345 g_free); | |
4121 | 3346 name = extract_name(args->info.chat.roominfo.name); |
5234 | 3347 g_hash_table_replace(components, g_strdup("room"), g_strdup(name ? name : args->info.chat.roominfo.name)); |
3348 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
|
3349 serv_got_chat_invite(gc, |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3350 name ? name : args->info.chat.roominfo.name, |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3351 userinfo->sn, |
9933 | 3352 message, |
5234 | 3353 components); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3354 if (name) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3355 g_free(name); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3356 } else if (args->reqclass & AIM_CAPS_SENDFILE) { |
4617 | 3357 /* BBB */ |
3358 if (args->status == AIM_RENDEZVOUS_PROPOSE) { | |
3359 /* Someone wants to send a file (or files) to us */ | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
3360 GaimXfer *xfer; |
5146 | 3361 struct aim_oft_info *oft_info; |
3362 | |
3363 if (!args->cookie || !args->port || !args->verifiedip || | |
3364 !args->info.sendfile.filename || !args->info.sendfile.totsize || | |
4656 | 3365 !args->info.sendfile.totfiles || !args->reqclass) { |
8660 | 3366 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3367 "%s tried to send you a file with incomplete " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3368 "information.\n", userinfo->sn); |
5146 | 3369 if (args->proxyip) |
8660 | 3370 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3371 "IP for a proxy server was given. Gaim " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3372 "does not support this yet.\n"); |
9933 | 3373 g_free(message); |
4617 | 3374 return 1; |
4656 | 3375 } |
4617 | 3376 |
3377 if (args->info.sendfile.subtype == AIM_OFT_SUBTYPE_SEND_DIR) { | |
3378 /* 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
|
3379 * directory -- remove the star and trailing slash so we don't save |
4617 | 3380 * directories that look like 'dirname\*' -- arl */ |
3381 char *tmp = strrchr(args->info.sendfile.filename, '\\'); | |
3382 if (tmp && (tmp[1] == '*')) { | |
3383 tmp[0] = '\0'; | |
3384 } | |
8660 | 3385 gaim_debug_warning("oscar", |
8446 | 3386 "We're receiving a whole directory! What fun! " |
3387 "Especially since we don't support that!\n"); | |
4617 | 3388 } |
3389 | |
3390 /* Build the file transfer handle */ | |
3391 xfer = gaim_xfer_new(gc->account, GAIM_XFER_RECEIVE, userinfo->sn); | |
5163 | 3392 xfer->remote_ip = g_strdup(args->verifiedip); |
5146 | 3393 xfer->remote_port = args->port; |
4617 | 3394 gaim_xfer_set_filename(xfer, args->info.sendfile.filename); |
3395 gaim_xfer_set_size(xfer, args->info.sendfile.totsize); | |
9933 | 3396 gaim_xfer_set_message(xfer, message); |
5146 | 3397 |
3398 /* Create the oscar-specific data */ | |
5163 | 3399 oft_info = aim_oft_createinfo(od->sess, args->cookie, userinfo->sn, args->clientip, xfer->remote_port, 0, 0, NULL); |
4898 | 3400 if (args->proxyip) |
5146 | 3401 oft_info->proxyip = g_strdup(args->proxyip); |
4898 | 3402 if (args->verifiedip) |
5146 | 3403 oft_info->verifiedip = g_strdup(args->verifiedip); |
3404 xfer->data = oft_info; | |
4617 | 3405 |
3406 /* Setup our I/O op functions */ | |
8446 | 3407 gaim_xfer_set_init_fnc(xfer, oscar_xfer_init_recv); |
4617 | 3408 gaim_xfer_set_end_fnc(xfer, oscar_xfer_end); |
8446 | 3409 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
|
3410 gaim_xfer_set_cancel_recv_fnc(xfer, oscar_xfer_cancel_recv); |
8446 | 3411 gaim_xfer_set_ack_fnc(xfer, oscar_xfer_ack_recv); |
4617 | 3412 |
3413 /* Keep track of this transfer for later */ | |
3414 od->file_transfers = g_slist_append(od->file_transfers, xfer); | |
3415 | |
3416 /* Now perform the request */ | |
3417 gaim_xfer_request(xfer); | |
3418 } else if (args->status == AIM_RENDEZVOUS_CANCEL) { | |
3419 /* The other user wants to cancel a file transfer */ | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
3420 GaimXfer *xfer; |
8660 | 3421 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3422 "AAA - File transfer canceled by remote user\n"); |
4617 | 3423 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
|
3424 gaim_xfer_cancel_remote(xfer); |
4617 | 3425 } else if (args->status == AIM_RENDEZVOUS_ACCEPT) { |
3426 /* | |
3427 * This gets sent by the receiver of a file | |
3428 * as they connect directly to us. If we don't | |
3429 * get this, then maybe a third party connected | |
3430 * to us, and we shouldn't send them anything. | |
3431 */ | |
3432 } else { | |
8660 | 3433 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3434 "unknown rendezvous status!\n"); |
3630 | 3435 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3436 } else if (args->reqclass & AIM_CAPS_GETFILE) { |
8092 | 3437 } else if (args->reqclass & AIM_CAPS_TALK) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3438 } else if (args->reqclass & AIM_CAPS_BUDDYICON) { |
9933 | 3439 gaim_buddy_icons_set_for_user(account, userinfo->sn, |
3440 args->info.icon.icon, | |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
3441 args->info.icon.length); |
6871 | 3442 } else if (args->reqclass & AIM_CAPS_DIRECTIM) { |
8971 | 3443 /* 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
|
3444 struct ask_direct *d = g_new0(struct ask_direct, 1); |
8971 | 3445 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
|
3446 char buf[256]; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3447 |
4212 | 3448 if (!args->verifiedip) { |
8983 | 3449 /* TODO: do something about this, after figuring out what it means */ |
8660 | 3450 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3451 "directim kill blocked (%s)\n", userinfo->sn); |
9933 | 3452 g_free(message); |
4650 | 3453 return 1; |
4212 | 3454 } |
3455 | |
8660 | 3456 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3457 "%s received direct im request from %s (%s)\n", |
8983 | 3458 username, userinfo->sn, args->clientip); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3459 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3460 d->gc = gc; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3461 d->sn = g_strdup(userinfo->sn); |
8983 | 3462 /* Let's use the clientip here, because I think that's what AIM does. |
3463 * Besides, if the clientip is wrong, we'll probably timeout faster, | |
3464 * and then ask them to connect to us. */ | |
3465 snprintf(d->ip, sizeof(d->ip), "%s:%d", args->clientip, args->port?args->port:5190); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3466 memcpy(d->cookie, args->cookie, 8); |
9070 | 3467 if (dim && !dim->connected && aim_odc_getcookie(dim->conn) && args->cookie && |
3468 (!memcmp(aim_odc_getcookie(dim->conn), args->cookie, 8))) { | |
3469 | |
8971 | 3470 oscar_direct_im_destroy(od, dim); |
8984 | 3471 d->donttryagain = TRUE; |
8971 | 3472 accept_direct_im_request(d); |
3473 } else { | |
8983 | 3474 if (dim && !dim->connected) |
8971 | 3475 gaim_debug_warning("oscar", "DirectIM: received direct im request while " |
3476 "already connected to that buddy!"); | |
5575 | 3477 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
|
3478 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3479 gaim_request_action(gc, NULL, buf, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3480 _("This requires a direct connection between " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3481 "the two computers and is necessary for IM " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3482 "Images. Because your IP address will be " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3483 "revealed, this may be considered a privacy " |
9972 | 3484 "risk."), |
3485 GAIM_DEFAULT_ACTION_NONE, d, 2, | |
8971 | 3486 _("Connect"), G_CALLBACK(accept_direct_im_request), |
3487 _("Cancel"), G_CALLBACK(destroy_direct_im_request)); | |
3488 /* FIXME: we should actually send a packet on cancel */ | |
3489 } | |
8708 | 3490 } else if (args->reqclass & AIM_CAPS_ICQSERVERRELAY) { |
3491 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
|
3492 } else { |
8660 | 3493 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3494 "Unknown reqclass %hu\n", args->reqclass); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3495 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3496 |
9933 | 3497 g_free(message); |
3498 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3499 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3500 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3501 |
3453 | 3502 /* |
4230 | 3503 * Authorization Functions |
3504 * Most of these are callbacks from dialogs. They're used by both | |
3505 * methods of authorization (SSI and old-school channel 4 ICBM) | |
3453 | 3506 */ |
4269 | 3507 /* When you ask other people for authorization */ |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3508 static void gaim_auth_request(struct name_data *data, char *msg) { |
5575 | 3509 GaimConnection *gc = data->gc; |
4244 | 3510 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
3511 if (g_list_find(gaim_connections_get_all(), gc)) { |
7283 | 3512 OscarData *od = gc->proto_data; |
6695 | 3513 GaimBuddy *buddy = gaim_find_buddy(gc->account, data->name); |
3514 GaimGroup *group = gaim_find_buddys_group(buddy); | |
4244 | 3515 if (buddy && group) { |
8660 | 3516 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3517 "ssi: adding buddy %s to group %s\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3518 buddy->name, group->name); |
4889 | 3519 aim_ssi_sendauthrequest(od->sess, data->name, msg ? msg : _("Please authorize me so I can add you to my buddy list.")); |
4269 | 3520 if (!aim_ssi_itemlist_finditem(od->sess->ssi.local, group->name, buddy->name, AIM_SSI_TYPE_BUDDY)) |
9620 | 3521 aim_ssi_addbuddy(od->sess, buddy->name, group->name, gaim_buddy_get_alias_only(buddy), NULL, NULL, 1); |
4244 | 3522 } |
4230 | 3523 } |
4337 | 3524 } |
3525 | |
3526 static void gaim_auth_request_msgprompt(struct name_data *data) { | |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
3527 gaim_request_input(data->gc, NULL, _("Authorization Request Message:"), |
8697 | 3528 NULL, _("Please authorize me!"), TRUE, FALSE, NULL, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
3529 _("OK"), G_CALLBACK(gaim_auth_request), |
5836 | 3530 _("Cancel"), G_CALLBACK(oscar_free_name_data), |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
3531 data); |
4230 | 3532 } |
3533 | |
3534 static void gaim_auth_dontrequest(struct name_data *data) { | |
5575 | 3535 GaimConnection *gc = data->gc; |
4244 | 3536 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
3537 if (g_list_find(gaim_connections_get_all(), gc)) { |
8151 | 3538 /* Remove from local list */ |
3539 GaimBuddy *b = gaim_find_buddy(gaim_connection_get_account(gc), data->name); | |
3540 gaim_blist_remove_buddy(b); | |
4244 | 3541 } |
3542 | |
5836 | 3543 oscar_free_name_data(data); |
4230 | 3544 } |
3545 | |
9030 | 3546 |
3547 static void gaim_auth_sendrequest(GaimConnection *gc, char *name) { | |
4269 | 3548 struct name_data *data = g_new(struct name_data, 1); |
6695 | 3549 GaimBuddy *buddy; |
4269 | 3550 gchar *dialog_msg, *nombre; |
3551 | |
4687 | 3552 buddy = gaim_find_buddy(gc->account, name); |
9620 | 3553 if (buddy && (gaim_buddy_get_alias_only(buddy))) |
3554 nombre = g_strdup_printf("%s (%s)", name, gaim_buddy_get_alias_only(buddy)); | |
4269 | 3555 else |
4830 | 3556 nombre = NULL; |
3557 | |
3558 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 | 3559 data->gc = gc; |
3560 data->name = g_strdup(name); | |
3561 data->nick = NULL; | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3562 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3563 gaim_request_action(gc, NULL, _("Request Authorization"), dialog_msg, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3564 0, data, 2, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3565 _("Request Authorization"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3566 G_CALLBACK(gaim_auth_request_msgprompt), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3567 _("Cancel"), G_CALLBACK(gaim_auth_dontrequest)); |
4269 | 3568 |
3569 g_free(dialog_msg); | |
3570 g_free(nombre); | |
3571 } | |
3572 | |
9030 | 3573 |
3574 static void gaim_auth_sendrequest_menu(GaimBlistNode *node, gpointer ignored) { | |
3575 GaimBuddy *buddy; | |
3576 GaimConnection *gc; | |
3577 | |
3578 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); | |
3579 | |
3580 buddy = (GaimBuddy *) node; | |
3581 gc = gaim_account_get_connection(buddy->account); | |
3582 gaim_auth_sendrequest(gc, buddy->name); | |
3583 } | |
3584 | |
4230 | 3585 /* When other people ask you for authorization */ |
3586 static void gaim_auth_grant(struct name_data *data) { | |
5575 | 3587 GaimConnection *gc = data->gc; |
4244 | 3588 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
3589 if (g_list_find(gaim_connections_get_all(), gc)) { |
7283 | 3590 OscarData *od = gc->proto_data; |
4236 | 3591 #ifdef NOSSI |
6695 | 3592 GaimBuddy *buddy; |
4244 | 3593 gchar message; |
3594 message = 0; | |
4687 | 3595 buddy = gaim_find_buddy(gc->account, data->name); |
4617 | 3596 aim_im_sendch4(od->sess, data->name, AIM_ICQMSG_AUTHGRANTED, &message); |
9620 | 3597 gaim_account_notify_added(gc->account, NULL, data->name, (buddy ? gaim_buddy_get_alias_only(buddy) : NULL), NULL); |
4230 | 3598 #else |
4889 | 3599 aim_ssi_sendauthreply(od->sess, data->name, 0x01, NULL); |
4230 | 3600 #endif |
4244 | 3601 } |
3602 | |
5836 | 3603 oscar_free_name_data(data); |
3141 | 3604 } |
3605 | |
4230 | 3606 /* When other people ask you for authorization */ |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3607 static void gaim_auth_dontgrant(struct name_data *data, char *msg) { |
5575 | 3608 GaimConnection *gc = data->gc; |
4244 | 3609 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
3610 if (g_list_find(gaim_connections_get_all(), gc)) { |
7283 | 3611 OscarData *od = gc->proto_data; |
4230 | 3612 #ifdef NOSSI |
4617 | 3613 aim_im_sendch4(od->sess, data->name, AIM_ICQMSG_AUTHDENIED, msg ? msg : _("No reason given.")); |
4230 | 3614 #else |
4889 | 3615 aim_ssi_sendauthreply(od->sess, data->name, 0x00, msg ? msg : _("No reason given.")); |
4230 | 3616 #endif |
4244 | 3617 } |
4337 | 3618 } |
3619 | |
3620 static void gaim_auth_dontgrant_msgprompt(struct name_data *data) { | |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
3621 gaim_request_input(data->gc, NULL, _("Authorization Denied Message:"), |
8697 | 3622 NULL, _("No reason given."), TRUE, FALSE, NULL, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
3623 _("OK"), G_CALLBACK(gaim_auth_dontgrant), |
5836 | 3624 _("Cancel"), G_CALLBACK(oscar_free_name_data), |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
3625 data); |
3141 | 3626 } |
3627 | |
7023 | 3628 /* When someone sends you buddies */ |
3629 static void gaim_icq_buddyadd(struct name_data *data) { | |
5575 | 3630 GaimConnection *gc = data->gc; |
4244 | 3631 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
3632 if (g_list_find(gaim_connections_get_all(), gc)) { |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7054
diff
changeset
|
3633 gaim_blist_request_add_buddy(gaim_connection_get_account(gc), data->name, NULL, data->nick); |
4244 | 3634 } |
3635 | |
5836 | 3636 oscar_free_name_data(data); |
3453 | 3637 } |
3638 | |
4075 | 3639 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 | 3640 GaimConnection *gc = sess->aux_data; |
9908 | 3641 GaimAccount *account = gaim_connection_get_account(gc); |
4076 | 3642 gchar **msg1, **msg2; |
6051 | 3643 int i, numtoks; |
4076 | 3644 |
4121 | 3645 if (!args->type || !args->msg || !args->uin) |
3646 return 1; | |
4194 | 3647 |
8660 | 3648 gaim_debug_info("oscar", |
9908 | 3649 "Received a channel 4 message of type 0x%02hhx.\n", |
3650 args->type); | |
4076 | 3651 |
9919 | 3652 /* |
3653 * Split up the message at the delimeter character, then convert each | |
3654 * string to UTF-8. Unless, of course, this is a type 1 message. If | |
3655 * this is a type 1 message, then the delimiter 0xfe could be a valid | |
3656 * character in whatever encoding the message was sent in. Type 1 | |
3657 * messages are always made up of only one part, so we can easily account | |
3658 * for this suck-ass part of the protocol by splitting the string into at | |
3659 * most 1 baby string. | |
3660 */ | |
3661 msg1 = g_strsplit(args->msg, "\376", (args->type == 0x01 ? 1 : 0)); | |
6051 | 3662 for (numtoks=0; msg1[numtoks]; numtoks++); |
3663 msg2 = (gchar **)g_malloc((numtoks+1)*sizeof(gchar *)); | |
4076 | 3664 for (i=0; msg1[i]; i++) { |
7478
3c21f3084ff0
[gaim-migrate @ 8091]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
7475
diff
changeset
|
3665 gaim_str_strip_cr(msg1[i]); |
9908 | 3666 msg2[i] = gaim_plugin_oscar_decode_im_part(account, "1", AIM_CHARSET_ASCII, 0x0000, msg1[i], strlen(msg1[i])); |
4076 | 3667 } |
3668 msg2[i] = NULL; | |
3669 | |
3952 | 3670 switch (args->type) { |
4173 | 3671 case 0x01: { /* MacICQ message or basic offline message */ |
4076 | 3672 if (i >= 1) { |
5556 | 3673 gchar *uin = g_strdup_printf("%u", args->uin); |
8493 | 3674 gchar *tmp; |
3675 | |
3676 /* If the message came from an ICQ user then escape any HTML */ | |
8501 | 3677 tmp = gaim_escape_html(msg2[0]); |
8493 | 3678 |
4076 | 3679 if (t) { /* This is an offline message */ |
9680 | 3680 /* The timestamp is UTC-ish, so we need to get the offset */ |
9698 | 3681 #ifdef HAVE_TM_GMTOFF |
9724 | 3682 time_t now; |
3683 struct tm *tm; | |
3684 now = time(NULL); | |
3685 tm = localtime(&now); | |
3686 t += tm->tm_gmtoff; | |
9698 | 3687 #else |
3688 # ifdef HAVE_TIMEZONE | |
9680 | 3689 tzset(); |
3690 t -= timezone; | |
9698 | 3691 # endif |
3692 #endif | |
8514 | 3693 serv_got_im(gc, uin, tmp, 0, t); |
4076 | 3694 } else { /* This is a message from MacICQ/Miranda */ |
8514 | 3695 serv_got_im(gc, uin, tmp, 0, time(NULL)); |
4076 | 3696 } |
3697 g_free(uin); | |
8493 | 3698 g_free(tmp); |
4075 | 3699 } |
3316 | 3700 } break; |
3701 | |
4173 | 3702 case 0x04: { /* Someone sent you a URL */ |
4076 | 3703 if (i >= 2) { |
7385 | 3704 if (msg2[1] != NULL) { |
3705 gchar *uin = g_strdup_printf("%u", args->uin); | |
3706 gchar *message = g_strdup_printf("<A HREF=\"%s\">%s</A>", | |
3707 msg2[1], | |
3708 (msg2[0] && msg2[0][0]) ? msg2[0] : msg2[1]); | |
3709 serv_got_im(gc, uin, message, 0, time(NULL)); | |
3710 g_free(uin); | |
3711 g_free(message); | |
3712 } | |
3453 | 3713 } |
3714 } break; | |
3715 | |
4173 | 3716 case 0x06: { /* Someone requested authorization */ |
4076 | 3717 if (i >= 6) { |
4230 | 3718 struct name_data *data = g_new(struct name_data, 1); |
5556 | 3719 gchar *dialog_msg = g_strdup_printf(_("The user %u wants to add you to their buddy list for the following reason:\n%s"), args->uin, msg2[5] ? msg2[5] : _("No reason given.")); |
8660 | 3720 gaim_debug_info("oscar", |
5556 | 3721 "Received an authorization request from UIN %u\n", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3722 args->uin); |
4076 | 3723 data->gc = gc; |
5556 | 3724 data->name = g_strdup_printf("%u", args->uin); |
4230 | 3725 data->nick = NULL; |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3726 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3727 gaim_request_action(gc, NULL, _("Authorization Request"), |
9948 | 3728 dialog_msg, GAIM_DEFAULT_ACTION_NONE, data, |
3729 2, _("Authorize"), | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3730 G_CALLBACK(gaim_auth_grant), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3731 _("Deny"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3732 G_CALLBACK(gaim_auth_dontgrant_msgprompt)); |
4076 | 3733 g_free(dialog_msg); |
3734 } | |
3141 | 3735 } break; |
3736 | |
4173 | 3737 case 0x07: { /* Someone has denied you authorization */ |
4076 | 3738 if (i >= 1) { |
7023 | 3739 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
|
3740 gaim_notify_info(gc, NULL, _("ICQ authorization denied."), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3741 dialog_msg); |
4076 | 3742 g_free(dialog_msg); |
3743 } | |
3141 | 3744 } break; |
3745 | |
4173 | 3746 case 0x08: { /* Someone has granted you authorization */ |
7023 | 3747 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
|
3748 gaim_notify_info(gc, NULL, "ICQ authorization accepted.", |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3749 dialog_msg); |
3141 | 3750 g_free(dialog_msg); |
3751 } break; | |
3752 | |
4333 | 3753 case 0x09: { /* Message from the Godly ICQ server itself, I think */ |
3754 if (i >= 5) { | |
3755 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
|
3756 gaim_notify_info(gc, NULL, "ICQ Server Message", dialog_msg); |
4333 | 3757 g_free(dialog_msg); |
3758 } | |
3759 } break; | |
3760 | |
4173 | 3761 case 0x0d: { /* Someone has sent you a pager message from http://www.icq.com/your_uin */ |
4076 | 3762 if (i >= 6) { |
4194 | 3763 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
|
3764 gaim_notify_info(gc, NULL, "ICQ Page", dialog_msg); |
4076 | 3765 g_free(dialog_msg); |
3766 } | |
4075 | 3767 } break; |
3768 | |
4173 | 3769 case 0x0e: { /* Someone has emailed you at your_uin@pager.icq.com */ |
4076 | 3770 if (i >= 6) { |
4308 | 3771 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
|
3772 gaim_notify_info(gc, NULL, "ICQ Email", dialog_msg); |
4076 | 3773 g_free(dialog_msg); |
3774 } | |
4075 | 3775 } break; |
3776 | |
4173 | 3777 case 0x12: { |
3141 | 3778 /* Ack for authorizing/denying someone. Or possibly an ack for sending any system notice */ |
7023 | 3779 /* Someone added you to their buddy list? */ |
3141 | 3780 } break; |
3781 | |
7023 | 3782 case 0x13: { /* Someone has sent you some ICQ buddies */ |
7631 | 3783 guint i, num; |
3453 | 3784 gchar **text; |
4173 | 3785 text = g_strsplit(args->msg, "\376", 0); |
3453 | 3786 if (text) { |
3787 num = 0; | |
3788 for (i=0; i<strlen(text[0]); i++) | |
3789 num = num*10 + text[0][i]-48; | |
3790 for (i=0; i<num; i++) { | |
4230 | 3791 struct name_data *data = g_new(struct name_data, 1); |
7023 | 3792 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 | 3793 data->gc = gc; |
4790 | 3794 data->name = g_strdup(text[i*2+1]); |
3795 data->nick = g_strdup(text[i*2+2]); | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3796 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3797 gaim_request_action(gc, NULL, message, |
7023 | 3798 _("Do you want to add this buddy " |
3799 "to your buddy list?"), | |
9972 | 3800 GAIM_DEFAULT_ACTION_NONE, data, 2, |
7023 | 3801 _("Add"), G_CALLBACK(gaim_icq_buddyadd), |
5836 | 3802 _("Decline"), G_CALLBACK(oscar_free_name_data)); |
3453 | 3803 g_free(message); |
3804 } | |
3805 g_strfreev(text); | |
3806 } | |
3807 } break; | |
3808 | |
7023 | 3809 case 0x1a: { /* Someone has sent you a greeting card or requested buddies? */ |
3453 | 3810 /* This is boring and silly. */ |
3811 } break; | |
3812 | |
3141 | 3813 default: { |
8660 | 3814 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3815 "Received a channel 4 message of unknown type " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3816 "(type 0x%02hhx).\n", args->type); |
3141 | 3817 } break; |
3818 } | |
3819 | |
4076 | 3820 g_strfreev(msg1); |
3821 g_strfreev(msg2); | |
3822 | |
3141 | 3823 return 1; |
3824 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3825 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3826 static int gaim_parse_incoming_im(aim_session_t *sess, aim_frame_t *fr, ...) { |
4200 | 3827 fu16_t channel; |
3828 int ret = 0; | |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3829 aim_userinfo_t *userinfo; |
2086 | 3830 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3831 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3832 va_start(ap, fr); |
4200 | 3833 channel = (fu16_t)va_arg(ap, unsigned int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3834 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 3835 |
3141 | 3836 switch (channel) { |
3837 case 1: { /* standard message */ | |
3838 struct aim_incomingim_ch1_args *args; | |
3839 args = va_arg(ap, struct aim_incomingim_ch1_args *); | |
3840 ret = incomingim_chan1(sess, fr->conn, userinfo, args); | |
3841 } break; | |
3842 | |
8735
92cbf9713795
[gaim-migrate @ 9490]
Christian Hammond <chipx86@chipx86.com>
parents:
8733
diff
changeset
|
3843 case 2: { /* rendezvous */ |
3141 | 3844 struct aim_incomingim_ch2_args *args; |
3845 args = va_arg(ap, struct aim_incomingim_ch2_args *); | |
3846 ret = incomingim_chan2(sess, fr->conn, userinfo, args); | |
3847 } break; | |
3848 | |
3849 case 4: { /* ICQ */ | |
3850 struct aim_incomingim_ch4_args *args; | |
3851 args = va_arg(ap, struct aim_incomingim_ch4_args *); | |
4075 | 3852 ret = incomingim_chan4(sess, fr->conn, userinfo, args, 0); |
3141 | 3853 } break; |
3854 | |
3855 default: { | |
8660 | 3856 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3857 "ICBM received on unsupported channel (channel " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3858 "0x%04hx).", channel); |
3141 | 3859 } break; |
2086 | 3860 } |
3861 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3862 va_end(ap); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3863 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3864 return ret; |
2086 | 3865 } |
3866 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3867 static int gaim_parse_misses(aim_session_t *sess, aim_frame_t *fr, ...) { |
8733 | 3868 GaimConnection *gc = sess->aux_data; |
3869 GaimAccount *account = gaim_connection_get_account(gc); | |
5420 | 3870 char *buf; |
2086 | 3871 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3872 fu16_t chan, nummissed, reason; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3873 aim_userinfo_t *userinfo; |
2086 | 3874 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3875 va_start(ap, fr); |
4200 | 3876 chan = (fu16_t)va_arg(ap, unsigned int); |
3877 userinfo = va_arg(ap, aim_userinfo_t *); | |
3878 nummissed = (fu16_t)va_arg(ap, unsigned int); | |
3879 reason = (fu16_t)va_arg(ap, unsigned int); | |
2086 | 3880 va_end(ap); |
3881 | |
3882 switch(reason) { | |
5420 | 3883 case 0: /* Invalid (0) */ |
3884 buf = g_strdup_printf( | |
3885 ngettext( | |
4276 | 3886 "You missed %hu message from %s because it was invalid.", |
3887 "You missed %hu messages from %s because they were invalid.", | |
3888 nummissed), | |
4282 | 3889 nummissed, |
3890 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3891 break; |
5420 | 3892 case 1: /* Message too large */ |
3893 buf = g_strdup_printf( | |
3894 ngettext( | |
4276 | 3895 "You missed %hu message from %s because it was too large.", |
3896 "You missed %hu messages from %s because they were too large.", | |
3897 nummissed), | |
4282 | 3898 nummissed, |
3899 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3900 break; |
5420 | 3901 case 2: /* Rate exceeded */ |
3902 buf = g_strdup_printf( | |
3903 ngettext( | |
4276 | 3904 "You missed %hu message from %s because the rate limit has been exceeded.", |
3905 "You missed %hu messages from %s because the rate limit has been exceeded.", | |
3906 nummissed), | |
4282 | 3907 nummissed, |
3908 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3909 break; |
5420 | 3910 case 3: /* Evil Sender */ |
3911 buf = g_strdup_printf( | |
3912 ngettext( | |
4276 | 3913 "You missed %hu message from %s because he/she was too evil.", |
3914 "You missed %hu messages from %s because he/she was too evil.", | |
3915 nummissed), | |
4282 | 3916 nummissed, |
3917 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3918 break; |
5420 | 3919 case 4: /* Evil Receiver */ |
3920 buf = g_strdup_printf( | |
3921 ngettext( | |
4276 | 3922 "You missed %hu message from %s because you are too evil.", |
3923 "You missed %hu messages from %s because you are too evil.", | |
3924 nummissed), | |
4282 | 3925 nummissed, |
3926 userinfo->sn); | |
2086 | 3927 break; |
3928 default: | |
5420 | 3929 buf = g_strdup_printf( |
3930 ngettext( | |
4276 | 3931 "You missed %hu message from %s for an unknown reason.", |
3932 "You missed %hu messages from %s for an unknown reason.", | |
3933 nummissed), | |
4282 | 3934 nummissed, |
3935 userinfo->sn); | |
2086 | 3936 break; |
3937 } | |
8733 | 3938 |
9627 | 3939 if (!gaim_conv_present_error(userinfo->sn, account, buf)) |
8733 | 3940 gaim_notify_error(sess->aux_data, NULL, buf, NULL); |
5420 | 3941 g_free(buf); |
2086 | 3942 |
3943 return 1; | |
3944 } | |
3945 | |
4194 | 3946 static int gaim_parse_clientauto_ch2(aim_session_t *sess, const char *who, fu16_t reason, const char *cookie) { |
5575 | 3947 GaimConnection *gc = sess->aux_data; |
7283 | 3948 OscarData *od = gc->proto_data; |
4617 | 3949 |
3950 /* BBB */ | |
3630 | 3951 switch (reason) { |
4151 | 3952 case 3: { /* Decline sendfile. */ |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
3953 GaimXfer *xfer; |
8971 | 3954 struct oscar_direct_im *dim; |
3955 | |
8660 | 3956 gaim_debug_info("oscar", |
9070 | 3957 "AAA - Other user declined some sort of direct " |
8971 | 3958 "connect attempt (automaticly?)\n"); |
4617 | 3959 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
|
3960 gaim_xfer_cancel_remote(xfer); |
8971 | 3961 else if ((dim = oscar_direct_im_find(od, who))) { |
3962 /* AAA should use find by cookie or something here */ | |
3963 oscar_direct_im_disconnect(od, dim); | |
3964 } | |
4151 | 3965 } break; |
3966 | |
3967 default: { | |
8660 | 3968 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3969 "Received an unknown rendezvous client auto-response " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3970 "from %s. Type 0x%04hx\n", who, reason); |
4151 | 3971 } |
3630 | 3972 |
3973 } | |
3974 | |
3975 return 0; | |
3976 } | |
3977 | |
4194 | 3978 static int gaim_parse_clientauto_ch4(aim_session_t *sess, char *who, fu16_t reason, fu32_t state, char *msg) { |
5575 | 3979 GaimConnection *gc = sess->aux_data; |
4151 | 3980 |
3981 switch(reason) { | |
3982 case 0x0003: { /* Reply from an ICQ status message request */ | |
9244 | 3983 char *title, *statusmsg, **splitmsg, *dialogmsg; |
3984 | |
3985 title = g_strdup_printf(_("Info for %s"), who); | |
4151 | 3986 |
3987 /* Split at (carriage return/newline)'s, then rejoin later with BRs between. */ | |
9244 | 3988 statusmsg = oscar_icqstatus(state); |
4151 | 3989 splitmsg = g_strsplit(msg, "\r\n", 0); |
9244 | 3990 dialogmsg = g_strdup_printf(_("<B>UIN:</B> %s<BR><B>Status:</B> %s<HR>%s"), who, statusmsg, g_strjoinv("<BR>", splitmsg)); |
3991 g_free(statusmsg); | |
4151 | 3992 g_strfreev(splitmsg); |
9244 | 3993 |
9797 | 3994 gaim_notify_userinfo(gc, who, title, _("Buddy Information"), NULL, dialogmsg, NULL, NULL); |
9244 | 3995 |
3996 g_free(title); | |
3997 g_free(dialogmsg); | |
4151 | 3998 } break; |
3999 | |
4000 default: { | |
8660 | 4001 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4002 "Received an unknown client auto-response from %s. " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4003 "Type 0x%04hx\n", who, reason); |
4151 | 4004 } break; |
4005 } /* end of switch */ | |
4006 | |
4007 return 0; | |
4008 } | |
4009 | |
3212 | 4010 static int gaim_parse_clientauto(aim_session_t *sess, aim_frame_t *fr, ...) { |
4011 va_list ap; | |
4012 fu16_t chan, reason; | |
4013 char *who; | |
4014 | |
4015 va_start(ap, fr); | |
4200 | 4016 chan = (fu16_t)va_arg(ap, unsigned int); |
3212 | 4017 who = va_arg(ap, char *); |
4200 | 4018 reason = (fu16_t)va_arg(ap, unsigned int); |
3212 | 4019 |
3952 | 4020 if (chan == 0x0002) { /* File transfer declined */ |
3630 | 4021 char *cookie = va_arg(ap, char *); |
4151 | 4022 return gaim_parse_clientauto_ch2(sess, who, reason, cookie); |
3952 | 4023 } else if (chan == 0x0004) { /* ICQ message */ |
4200 | 4024 fu32_t state = 0; |
4151 | 4025 char *msg = NULL; |
4026 if (reason == 0x0003) { | |
4200 | 4027 state = va_arg(ap, fu32_t); |
4151 | 4028 msg = va_arg(ap, char *); |
4029 } | |
4030 return gaim_parse_clientauto_ch4(sess, who, reason, state, msg); | |
4031 } | |
3952 | 4032 |
3212 | 4033 va_end(ap); |
4034 | |
4035 return 1; | |
4036 } | |
4037 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4038 static int gaim_parse_genericerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 4039 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4040 fu16_t reason; |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
4041 char *m; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4042 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4043 va_start(ap, fr); |
4199 | 4044 reason = (fu16_t) va_arg(ap, unsigned int); |
2086 | 4045 va_end(ap); |
4046 | |
8660 | 4047 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4048 "snac threw error (reason 0x%04hx: %s)\n", reason, |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4049 (reason < msgerrreasonlen) ? msgerrreason[reason] : "unknown"); |
2086 | 4050 |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
4051 m = g_strdup_printf(_("SNAC threw error: %s\n"), |
5411 | 4052 reason < msgerrreasonlen ? _(msgerrreason[reason]) : _("Unknown error")); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4053 gaim_notify_error(sess->aux_data, NULL, m, NULL); |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
4054 g_free(m); |
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
4055 |
2086 | 4056 return 1; |
4057 } | |
4058 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4059 static int gaim_parse_msgerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
9627 | 4060 GaimConnection *gc = sess->aux_data; |
4617 | 4061 #if 0 |
7283 | 4062 OscarData *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
4063 GaimXfer *xfer; |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
4064 #endif |
4617 | 4065 va_list ap; |
4066 fu16_t reason; | |
4067 char *data, *buf; | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
4068 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4069 va_start(ap, fr); |
4617 | 4070 reason = (fu16_t)va_arg(ap, unsigned int); |
3752 | 4071 data = va_arg(ap, char *); |
2086 | 4072 va_end(ap); |
4073 | |
8660 | 4074 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4075 "Message error with data %s and reason %hu\n", data, reason); |
4617 | 4076 |
4077 /* BBB */ | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
4078 #if 0 |
4617 | 4079 /* If this was a file transfer request, data is a cookie */ |
4080 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
|
4081 gaim_xfer_cancel_remote(xfer); |
3630 | 4082 return 1; |
4083 } | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
4084 #endif |
3630 | 4085 |
4617 | 4086 /* Data is assumed to be the destination sn */ |
9826 | 4087 buf = g_strdup_printf(_("Unable to send message: %s"), (reason < msgerrreasonlen) ? msgerrreason[reason] : _("Unknown reason.")); |
4088 if (!gaim_conv_present_error(data, gaim_connection_get_account(gc), buf)) { | |
4089 g_free(buf); | |
4090 buf = g_strdup_printf(_("Unable to send message to %s:"), data ? data : "(unknown)"); | |
9627 | 4091 gaim_notify_error(sess->aux_data, NULL, buf, |
9826 | 4092 (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("Unknown reason.")); |
4093 } | |
4094 g_free(buf); | |
4095 | |
2086 | 4096 return 1; |
4097 } | |
4098 | |
3595 | 4099 static int gaim_parse_mtn(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4100 GaimConnection *gc = sess->aux_data; |
3595 | 4101 va_list ap; |
4102 fu16_t type1, type2; | |
4103 char *sn; | |
4104 | |
4105 va_start(ap, fr); | |
4199 | 4106 type1 = (fu16_t) va_arg(ap, unsigned int); |
3595 | 4107 sn = va_arg(ap, char *); |
4199 | 4108 type2 = (fu16_t) va_arg(ap, unsigned int); |
3595 | 4109 va_end(ap); |
4110 | |
4111 switch (type2) { | |
4112 case 0x0000: { /* Text has been cleared */ | |
4113 serv_got_typing_stopped(gc, sn); | |
4114 } break; | |
4115 | |
4116 case 0x0001: { /* Paused typing */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
4117 serv_got_typing(gc, sn, 0, GAIM_TYPED); |
3595 | 4118 } break; |
4119 | |
4120 case 0x0002: { /* Typing */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
4121 serv_got_typing(gc, sn, 0, GAIM_TYPING); |
3595 | 4122 } break; |
4123 | |
4124 default: { | |
8660 | 4125 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 | 4126 } break; |
4127 } | |
4128 | |
4129 return 1; | |
4130 } | |
4131 | |
7141 | 4132 /* |
4133 * We get this error when there was an error in the locate family. This | |
7259 | 4134 * happens when you request info of someone who is offline. |
7141 | 4135 */ |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4136 static int gaim_parse_locerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
9826 | 4137 gchar *buf; |
2086 | 4138 va_list ap; |
5420 | 4139 fu16_t reason; |
2086 | 4140 char *destn; |
4141 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4142 va_start(ap, fr); |
4199 | 4143 reason = (fu16_t) va_arg(ap, unsigned int); |
2086 | 4144 destn = va_arg(ap, char *); |
4145 va_end(ap); | |
4146 | |
7781 | 4147 if (destn == NULL) |
7793 | 4148 return 1; |
9627 | 4149 |
9826 | 4150 buf = g_strdup_printf(_("User information not available: %s"), (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("Unknown reason.")); |
4151 if (!gaim_conv_present_error(destn, gaim_connection_get_account((GaimConnection*)sess->aux_data), buf)) { | |
4152 g_free(buf); | |
9627 | 4153 buf = g_strdup_printf(_("User information for %s unavailable:"), destn); |
9826 | 4154 gaim_notify_error(sess->aux_data, NULL, buf, (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("Unknown reason.")); |
4155 } | |
4156 g_free(buf); | |
2086 | 4157 |
4158 return 1; | |
4159 } | |
4160 | |
7011 | 4161 static int gaim_parse_userinfo(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4162 GaimConnection *gc = sess->aux_data; |
8700 | 4163 GaimAccount *account = gaim_connection_get_account(gc); |
4164 GString *str; | |
9244 | 4165 gchar *tmp = NULL, *info_utf8 = NULL, *away_utf8 = NULL, *title = NULL; |
4791 | 4166 va_list ap; |
7011 | 4167 aim_userinfo_t *userinfo; |
2086 | 4168 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4169 va_start(ap, fr); |
7011 | 4170 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 4171 va_end(ap); |
4172 | |
8700 | 4173 str = g_string_new(""); |
4174 g_string_append_printf(str, "<b>%s:</b> %s", _("Screen Name"), userinfo->sn); | |
4175 g_string_append_printf(str, "\n<br><b>%s</b>: %d%%", _("Warning Level"), (int)((userinfo->warnlevel/10.0) + 0.5)); | |
7011 | 4176 |
4177 if (userinfo->present & AIM_USERINFO_PRESENT_ONLINESINCE) | |
8701 | 4178 oscar_string_append(str, "\n<br>", _("Online Since"), |
8700 | 4179 asctime(localtime((time_t *)&userinfo->onlinesince))); |
7011 | 4180 |
4181 if (userinfo->present & AIM_USERINFO_PRESENT_MEMBERSINCE) | |
8701 | 4182 oscar_string_append(str, "\n<br>", _("Member Since"), |
8700 | 4183 asctime(localtime((time_t *)&userinfo->membersince))); |
7011 | 4184 |
4185 if (userinfo->present & AIM_USERINFO_PRESENT_IDLE) { | |
8700 | 4186 tmp = gaim_str_seconds_to_string(userinfo->idletime*60); |
8701 | 4187 oscar_string_append(str, "\n<br>", _("Idle"), tmp); |
8700 | 4188 g_free(tmp); |
4189 } | |
4190 | |
8701 | 4191 oscar_string_append_info(gc, str, "\n<br>", NULL, userinfo); |
7011 | 4192 |
4193 if ((userinfo->flags & AIM_FLAG_AWAY) && (userinfo->away_len > 0) && (userinfo->away != NULL) && (userinfo->away_encoding != NULL)) { | |
8700 | 4194 tmp = oscar_encoding_extract(userinfo->away_encoding); |
4195 away_utf8 = oscar_encoding_to_utf8(tmp, userinfo->away, userinfo->away_len); | |
4196 g_free(tmp); | |
7011 | 4197 if (away_utf8 != NULL) { |
8700 | 4198 g_string_append_printf(str, "\n<hr>%s", away_utf8); |
7011 | 4199 g_free(away_utf8); |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4200 } |
7011 | 4201 } |
4202 | |
4203 if ((userinfo->info_len > 0) && (userinfo->info != NULL) && (userinfo->info_encoding != NULL)) { | |
8700 | 4204 tmp = oscar_encoding_extract(userinfo->info_encoding); |
4205 info_utf8 = oscar_encoding_to_utf8(tmp, userinfo->info, userinfo->info_len); | |
4206 g_free(tmp); | |
7011 | 4207 if (info_utf8 != NULL) { |
8700 | 4208 g_string_append_printf(str, "\n<hr>%s", info_utf8); |
7011 | 4209 g_free(info_utf8); |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4210 } |
7011 | 4211 } |
4212 | |
8701 | 4213 tmp = gaim_str_sub_away_formatters(str->str, gaim_account_get_username(account)); |
8700 | 4214 g_string_free(str, TRUE); |
9244 | 4215 title = g_strdup_printf(_("Info for %s"), userinfo->sn); |
9797 | 4216 gaim_notify_userinfo(gc, userinfo->sn, title, _("Buddy Information"), NULL, tmp, NULL, NULL); |
9244 | 4217 g_free(title); |
8700 | 4218 g_free(tmp); |
4151 | 4219 |
2086 | 4220 return 1; |
4221 } | |
4222 | |
8341 | 4223 static gboolean gaim_reqinfo_timeout_cb(void *data) |
4224 { | |
4225 aim_session_t *sess = data; | |
4226 GaimConnection *gc = sess->aux_data; | |
4227 OscarData *od = (OscarData *)gc->proto_data; | |
4228 | |
4229 aim_locate_dorequest(data); | |
4230 od->getinfotimer = 0; | |
4231 | |
4232 return FALSE; | |
4233 } | |
4234 | |
4235 static int gaim_reqinfo_timeout(aim_session_t *sess, aim_frame_t *fr, ...) | |
4236 { | |
4237 GaimConnection *gc = sess->aux_data; | |
4238 OscarData *od = (OscarData *)gc->proto_data; | |
4239 | |
4240 /* | |
4241 * Wait a little while then call aim_locate_dorequest(sess). This keeps | |
4242 * us from hitting the rate limit due to request away messages and info | |
4243 * too quickly. | |
4244 */ | |
4245 if (od->getinfotimer == 0) | |
4246 od->getinfotimer = gaim_timeout_add(1200, gaim_reqinfo_timeout_cb, sess); | |
4247 | |
4248 return 1; | |
4249 } | |
4250 | |
4251 static int gaim_parse_motd(aim_session_t *sess, aim_frame_t *fr, ...) | |
4252 { | |
2086 | 4253 char *msg; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4254 fu16_t id; |
2086 | 4255 va_list ap; |
4256 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4257 va_start(ap, fr); |
4199 | 4258 id = (fu16_t) va_arg(ap, unsigned int); |
2086 | 4259 msg = va_arg(ap, char *); |
4260 va_end(ap); | |
4261 | |
8660 | 4262 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4263 "MOTD: %s (%hu)\n", msg ? msg : "Unknown", id); |
2092
59b0377d18aa
[gaim-migrate @ 2102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
4264 if (id < 4) |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4265 gaim_notify_warning(sess->aux_data, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4266 _("Your AIM connection may be lost."), NULL); |
2086 | 4267 |
4268 return 1; | |
4269 } | |
4270 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4271 static int gaim_chatnav_info(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 4272 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4273 fu16_t type; |
5575 | 4274 GaimConnection *gc = sess->aux_data; |
7283 | 4275 OscarData *od = (OscarData *)gc->proto_data; |
2086 | 4276 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4277 va_start(ap, fr); |
4199 | 4278 type = (fu16_t) va_arg(ap, unsigned int); |
2086 | 4279 |
4280 switch(type) { | |
4281 case 0x0002: { | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4282 fu8_t maxrooms; |
2086 | 4283 struct aim_chat_exchangeinfo *exchanges; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4284 int exchangecount, i; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4285 |
4199 | 4286 maxrooms = (fu8_t) va_arg(ap, unsigned int); |
2086 | 4287 exchangecount = va_arg(ap, int); |
4288 exchanges = va_arg(ap, struct aim_chat_exchangeinfo *); | |
4289 | |
8660 | 4290 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4291 "chat info: Chat Rights:\n"); |
8660 | 4292 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4293 "chat info: \tMax Concurrent Rooms: %hhd\n", maxrooms); |
8660 | 4294 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4295 "chat info: \tExchange List: (%d total)\n", exchangecount); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4296 for (i = 0; i < exchangecount; i++) |
8660 | 4297 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4298 "chat info: \t\t%hu %s\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4299 exchanges[i].number, exchanges[i].name ? exchanges[i].name : ""); |
4617 | 4300 while (od->create_rooms) { |
4301 struct create_room *cr = od->create_rooms->data; | |
8660 | 4302 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4303 "creating room %s\n", cr->name); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
4304 aim_chatnav_createroom(sess, fr->conn, cr->name, cr->exchange); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
4305 g_free(cr->name); |
4617 | 4306 od->create_rooms = g_slist_remove(od->create_rooms, cr); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
4307 g_free(cr); |
2086 | 4308 } |
4309 } | |
4310 break; | |
4311 case 0x0008: { | |
4312 char *fqcn, *name, *ck; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4313 fu16_t instance, flags, maxmsglen, maxoccupancy, unknown, exchange; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4314 fu8_t createperms; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4315 fu32_t createtime; |
2086 | 4316 |
4317 fqcn = va_arg(ap, char *); | |
4200 | 4318 instance = (fu16_t)va_arg(ap, unsigned int); |
4319 exchange = (fu16_t)va_arg(ap, unsigned int); | |
4320 flags = (fu16_t)va_arg(ap, unsigned int); | |
4321 createtime = va_arg(ap, fu32_t); | |
4322 maxmsglen = (fu16_t)va_arg(ap, unsigned int); | |
4323 maxoccupancy = (fu16_t)va_arg(ap, unsigned int); | |
4324 createperms = (fu8_t)va_arg(ap, unsigned int); | |
4325 unknown = (fu16_t)va_arg(ap, unsigned int); | |
4326 name = va_arg(ap, char *); | |
4327 ck = va_arg(ap, char *); | |
4194 | 4328 |
8660 | 4329 gaim_debug_misc("oscar", |
5556 | 4330 "created room: %s %hu %hu %hu %u %hu %hu %hhu %hu %s %s\n", |
2086 | 4331 fqcn, |
4332 exchange, instance, flags, | |
4333 createtime, | |
4334 maxmsglen, maxoccupancy, createperms, unknown, | |
4335 name, ck); | |
4617 | 4336 aim_chat_join(od->sess, od->conn, exchange, ck, instance); |
2086 | 4337 } |
4338 break; | |
4339 default: | |
8660 | 4340 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4341 "chatnav info: unknown type (%04hx)\n", type); |
2086 | 4342 break; |
4343 } | |
4194 | 4344 |
4345 va_end(ap); | |
4346 | |
2086 | 4347 return 1; |
4348 } | |
4349 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
4350 static int gaim_conv_chat_join(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 4351 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4352 int count, i; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4353 aim_userinfo_t *info; |
5575 | 4354 GaimConnection *g = sess->aux_data; |
2086 | 4355 |
4356 struct chat_connection *c = NULL; | |
4357 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4358 va_start(ap, fr); |
2086 | 4359 count = va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4360 info = va_arg(ap, aim_userinfo_t *); |
2086 | 4361 va_end(ap); |
4362 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4363 c = find_oscar_chat_by_conn(g, fr->conn); |
2086 | 4364 if (!c) |
4365 return 1; | |
4366 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4367 for (i = 0; i < count; i++) |
9846 | 4368 gaim_conv_chat_add_user(GAIM_CONV_CHAT(c->conv), info[i].sn, NULL, GAIM_CBFLAGS_NONE, TRUE); |
2086 | 4369 |
4370 return 1; | |
4371 } | |
4372 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
4373 static int gaim_conv_chat_leave(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 4374 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4375 int count, i; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4376 aim_userinfo_t *info; |
5575 | 4377 GaimConnection *g = sess->aux_data; |
2086 | 4378 |
4379 struct chat_connection *c = NULL; | |
4380 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4381 va_start(ap, fr); |
2086 | 4382 count = va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4383 info = va_arg(ap, aim_userinfo_t *); |
2086 | 4384 va_end(ap); |
4385 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4386 c = find_oscar_chat_by_conn(g, fr->conn); |
2086 | 4387 if (!c) |
4388 return 1; | |
4389 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4390 for (i = 0; i < count; i++) |
8733 | 4391 gaim_conv_chat_remove_user(GAIM_CONV_CHAT(c->conv), info[i].sn, NULL); |
2086 | 4392 |
4393 return 1; | |
4394 } | |
4395 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
4396 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
|
4397 va_list ap; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4398 aim_userinfo_t *userinfo; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4399 struct aim_chat_roominfo *roominfo; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4400 char *roomname; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4401 int usercount; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4402 char *roomdesc; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4403 fu16_t unknown_c9, unknown_d2, unknown_d5, maxmsglen, maxvisiblemsglen; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4404 fu32_t creationtime; |
5575 | 4405 GaimConnection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4406 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
|
4407 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4408 va_start(ap, fr); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4409 roominfo = va_arg(ap, struct aim_chat_roominfo *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4410 roomname = va_arg(ap, char *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4411 usercount= va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4412 userinfo = va_arg(ap, aim_userinfo_t *); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4413 roomdesc = va_arg(ap, char *); |
4200 | 4414 unknown_c9 = (fu16_t)va_arg(ap, unsigned int); |
4415 creationtime = va_arg(ap, fu32_t); | |
4416 maxmsglen = (fu16_t)va_arg(ap, unsigned int); | |
4417 unknown_d2 = (fu16_t)va_arg(ap, unsigned int); | |
4418 unknown_d5 = (fu16_t)va_arg(ap, unsigned int); | |
4419 maxvisiblemsglen = (fu16_t)va_arg(ap, unsigned int); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4420 va_end(ap); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4421 |
8660 | 4422 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4423 "inside chat_info_update (maxmsglen = %hu, maxvislen = %hu)\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4424 maxmsglen, maxvisiblemsglen); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4425 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4426 ccon->maxlen = maxmsglen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4427 ccon->maxvis = maxvisiblemsglen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4428 |
2086 | 4429 return 1; |
4430 } | |
4431 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
4432 static int gaim_conv_chat_incoming_msg(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4433 GaimConnection *gc = sess->aux_data; |
8225 | 4434 struct chat_connection *ccon = find_oscar_chat_by_conn(gc, fr->conn); |
4435 gchar *utf8; | |
2086 | 4436 va_list ap; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4437 aim_userinfo_t *info; |
8225 | 4438 int len; |
2086 | 4439 char *msg; |
8219 | 4440 char *charset; |
2086 | 4441 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4442 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4443 info = va_arg(ap, aim_userinfo_t *); |
8219 | 4444 len = va_arg(ap, int); |
4194 | 4445 msg = va_arg(ap, char *); |
8219 | 4446 charset = va_arg(ap, char *); |
4194 | 4447 va_end(ap); |
2086 | 4448 |
8225 | 4449 utf8 = oscar_encoding_to_utf8(charset, msg, len); |
8667 | 4450 if (utf8 == NULL) |
4451 /* The conversion failed! */ | |
8668 | 4452 utf8 = g_strdup(_("[Unable to display a message from this user because it contained invalid characters.]")); |
8225 | 4453 serv_got_chat_in(gc, ccon->id, info->sn, 0, utf8, time((time_t)NULL)); |
4454 g_free(utf8); | |
2086 | 4455 |
4456 return 1; | |
4457 } | |
4458 | |
3694 | 4459 static int gaim_email_parseupdate(aim_session_t *sess, aim_frame_t *fr, ...) { |
4460 va_list ap; | |
5575 | 4461 GaimConnection *gc = sess->aux_data; |
3694 | 4462 struct aim_emailinfo *emailinfo; |
3725 | 4463 int havenewmail; |
7297 | 4464 char *alertitle, *alerturl; |
3694 | 4465 |
4466 va_start(ap, fr); | |
4467 emailinfo = va_arg(ap, struct aim_emailinfo *); | |
3725 | 4468 havenewmail = va_arg(ap, int); |
7301 | 4469 alertitle = va_arg(ap, char *); |
4470 alerturl = va_arg(ap, char *); | |
3694 | 4471 va_end(ap); |
4472 | |
9661 | 4473 if ((emailinfo != NULL) && gaim_account_get_check_mail(gc->account)) { |
4474 gchar *to = g_strdup_printf("%s%s%s", gaim_account_get_username(gaim_connection_get_account(gc)), | |
4475 emailinfo->domain ? "@" : "", | |
4476 emailinfo->domain ? emailinfo->domain : ""); | |
5542 | 4477 if (emailinfo->unread && havenewmail) |
4478 gaim_notify_emails(gc, emailinfo->nummsgs, FALSE, NULL, NULL, (const char **)&to, (const char **)&emailinfo->url, NULL, NULL); | |
5537 | 4479 g_free(to); |
3694 | 4480 } |
7297 | 4481 |
7301 | 4482 if (alertitle) |
8660 | 4483 gaim_debug_misc("oscar", "Got an alert '%s' %s\n", alertitle, alerturl ? alerturl : ""); |
3694 | 4484 |
4485 return 1; | |
4486 } | |
4487 | |
4804 | 4488 static int gaim_icon_error(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4489 GaimConnection *gc = sess->aux_data; |
7283 | 4490 OscarData *od = gc->proto_data; |
4804 | 4491 char *sn; |
4492 | |
4493 sn = od->requesticon->data; | |
8660 | 4494 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4495 "removing %s from hash table\n", sn); |
4804 | 4496 od->requesticon = g_slist_remove(od->requesticon, sn); |
4497 free(sn); | |
4498 | |
4499 if (od->icontimer) | |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
4500 gaim_timeout_remove(od->icontimer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
4501 od->icontimer = gaim_timeout_add(500, gaim_icon_timerfunc, gc); |
4804 | 4502 |
4503 return 1; | |
4504 } | |
4505 | |
4506 static int gaim_icon_parseicon(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 4507 GaimConnection *gc = sess->aux_data; |
7283 | 4508 OscarData *od = gc->proto_data; |
4804 | 4509 GSList *cur; |
4510 va_list ap; | |
4511 char *sn; | |
4853 | 4512 fu8_t *iconcsum, *icon; |
4513 fu16_t iconcsumlen, iconlen; | |
4804 | 4514 |
4515 va_start(ap, fr); | |
4516 sn = va_arg(ap, char *); | |
4853 | 4517 iconcsum = va_arg(ap, fu8_t *); |
4518 iconcsumlen = va_arg(ap, int); | |
4804 | 4519 icon = va_arg(ap, fu8_t *); |
4520 iconlen = va_arg(ap, int); | |
4521 va_end(ap); | |
4522 | |
4853 | 4523 if (iconlen > 0) { |
4524 char *b16; | |
6695 | 4525 GaimBuddy *b = gaim_find_buddy(gc->account, sn); |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
4526 gaim_buddy_icons_set_for_user(gaim_connection_get_account(gc), |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
4527 sn, icon, iconlen); |
7106
db6bd3e794d8
[gaim-migrate @ 7671]
Christian Hammond <chipx86@chipx86.com>
parents:
7098
diff
changeset
|
4528 b16 = gaim_base16_encode(iconcsum, iconcsumlen); |
5129 | 4529 if (b16) { |
7693 | 4530 gaim_blist_node_set_string((GaimBlistNode*)b, "icon_checksum", b16); |
7162 | 4531 g_free(b16); |
5129 | 4532 } |
4853 | 4533 } |
4804 | 4534 |
4535 cur = od->requesticon; | |
4536 while (cur) { | |
4537 char *cursn = cur->data; | |
4538 if (!aim_sncmp(cursn, sn)) { | |
4539 od->requesticon = g_slist_remove(od->requesticon, cursn); | |
4540 free(cursn); | |
4541 cur = od->requesticon; | |
4542 } else | |
4543 cur = cur->next; | |
4544 } | |
4545 | |
4546 if (od->icontimer) | |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
4547 gaim_timeout_remove(od->icontimer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
4548 od->icontimer = gaim_timeout_add(250, gaim_icon_timerfunc, gc); |
4804 | 4549 |
4550 return 1; | |
4551 } | |
4552 | |
4553 static gboolean gaim_icon_timerfunc(gpointer data) { | |
5575 | 4554 GaimConnection *gc = data; |
7283 | 4555 OscarData *od = gc->proto_data; |
7011 | 4556 aim_userinfo_t *userinfo; |
4804 | 4557 aim_conn_t *conn; |
4558 | |
4559 conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_ICON); | |
5892 | 4560 if (!conn) { |
4561 if (!od->iconconnecting) { | |
4562 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_ICON); | |
4563 od->iconconnecting = TRUE; | |
4564 } | |
4804 | 4565 return FALSE; |
4566 } | |
4567 | |
5842 | 4568 if (od->set_icon) { |
6039 | 4569 struct stat st; |
4570 const char *iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc)); | |
4571 if (iconfile == NULL) { | |
8363 | 4572 aim_ssi_delicon(od->sess); |
6039 | 4573 } else if (!stat(iconfile, &st)) { |
4574 char *buf = g_malloc(st.st_size); | |
4575 FILE *file = fopen(iconfile, "rb"); | |
4576 if (file) { | |
9532 | 4577 /* XXX - Use g_file_get_contents()? */ |
6039 | 4578 fread(buf, 1, st.st_size, file); |
4579 fclose(file); | |
8660 | 4580 gaim_debug_info("oscar", |
6039 | 4581 "Uploading icon to icon server\n"); |
6879 | 4582 aim_bart_upload(od->sess, buf, st.st_size); |
5842 | 4583 } else |
8660 | 4584 gaim_debug_error("oscar", |
6039 | 4585 "Can't open buddy icon file!\n"); |
4586 g_free(buf); | |
4587 } else { | |
8660 | 4588 gaim_debug_error("oscar", |
6039 | 4589 "Can't stat buddy icon file!\n"); |
5842 | 4590 } |
4591 od->set_icon = FALSE; | |
4592 } | |
4593 | |
4594 if (!od->requesticon) { | |
8660 | 4595 gaim_debug_misc("oscar", |
5842 | 4596 "no more icons to request\n"); |
4597 return FALSE; | |
4598 } | |
4599 | |
7045 | 4600 userinfo = aim_locate_finduserinfo(od->sess, (char *)od->requesticon->data); |
7011 | 4601 if ((userinfo != NULL) && (userinfo->iconcsumlen > 0)) { |
4602 aim_bart_request(od->sess, od->requesticon->data, userinfo->iconcsum, userinfo->iconcsumlen); | |
4804 | 4603 return FALSE; |
4604 } else { | |
4605 char *sn = od->requesticon->data; | |
4606 od->requesticon = g_slist_remove(od->requesticon, sn); | |
4607 free(sn); | |
4608 } | |
4609 | |
4610 return TRUE; | |
4611 } | |
4612 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4613 /* |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4614 * 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
|
4615 */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4616 static int gaim_parse_msgack(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 4617 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4618 fu16_t type; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4619 char *sn; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4620 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4621 va_start(ap, fr); |
4199 | 4622 type = (fu16_t) va_arg(ap, unsigned int); |
2086 | 4623 sn = va_arg(ap, char *); |
4624 va_end(ap); | |
4625 | |
8660 | 4626 gaim_debug_info("oscar", "Sent message to %s.\n", sn); |
2086 | 4627 |
4628 return 1; | |
4629 } | |
4630 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4631 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
|
4632 static const char *codes[5] = { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4633 "invalid", |
4194 | 4634 "change", |
4635 "warning", | |
4636 "limit", | |
4637 "limit cleared", | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4638 }; |
2086 | 4639 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4640 fu16_t code, rateclass; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4641 fu32_t windowsize, clear, alert, limit, disconnect, currentavg, maxavg; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4642 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4643 va_start(ap, fr); |
4200 | 4644 code = (fu16_t)va_arg(ap, unsigned int); |
4645 rateclass= (fu16_t)va_arg(ap, unsigned int); | |
4646 windowsize = va_arg(ap, fu32_t); | |
4647 clear = va_arg(ap, fu32_t); | |
4648 alert = va_arg(ap, fu32_t); | |
4649 limit = va_arg(ap, fu32_t); | |
4650 disconnect = va_arg(ap, fu32_t); | |
4651 currentavg = va_arg(ap, fu32_t); | |
4652 maxavg = va_arg(ap, fu32_t); | |
2086 | 4653 va_end(ap); |
4654 | |
8660 | 4655 gaim_debug_misc("oscar", |
5556 | 4656 "rate %s (param ID 0x%04hx): curavg = %u, maxavg = %u, alert at %u, " |
4657 "clear warning at %u, limit at %u, disconnect at %u (window size = %u)\n", | |
2086 | 4658 (code < 5) ? codes[code] : codes[0], |
4659 rateclass, | |
4660 currentavg, maxavg, | |
4661 alert, clear, | |
4662 limit, disconnect, | |
4663 windowsize); | |
4664 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4665 /* XXX fix these values */ |
2086 | 4666 if (code == AIM_RATE_CODE_CHANGE) { |
4667 if (currentavg >= clear) | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4668 aim_conn_setlatency(fr->conn, 0); |
2086 | 4669 } else if (code == AIM_RATE_CODE_WARNING) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4670 aim_conn_setlatency(fr->conn, windowsize/4); |
2909
48ec70928d7f
[gaim-migrate @ 2922]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2906
diff
changeset
|
4671 } else if (code == AIM_RATE_CODE_LIMIT) { |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4672 gaim_notify_error(sess->aux_data, NULL, _("Rate limiting error."), |
6040 | 4673 _("The last action you attempted could not be " |
4674 "performed because you are over the rate limit. " | |
4675 "Please wait 10 seconds and try again.")); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4676 aim_conn_setlatency(fr->conn, windowsize/2); |
2086 | 4677 } else if (code == AIM_RATE_CODE_CLEARLIMIT) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4678 aim_conn_setlatency(fr->conn, 0); |
2086 | 4679 } |
4680 | |
4681 return 1; | |
4682 } | |
4683 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4684 static int gaim_parse_evilnotify(aim_session_t *sess, aim_frame_t *fr, ...) { |
9982 | 4685 GaimConnection *gc = sess->aux_data; |
4686 GaimAccount *account = gaim_connection_get_account(gc); | |
2086 | 4687 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4688 fu16_t newevil; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4689 aim_userinfo_t *userinfo; |
2086 | 4690 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4691 va_start(ap, fr); |
4199 | 4692 newevil = (fu16_t) va_arg(ap, unsigned int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
4693 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 4694 va_end(ap); |
4695 | |
9982 | 4696 /* XXX - What's with the + 0.5? */ |
4697 gaim_prpl_got_account_warning_level(account, (userinfo && userinfo->sn) ? userinfo->sn : NULL, (newevil/10.0) + 0.5); | |
2086 | 4698 |
4699 return 1; | |
4700 } | |
4701 | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4702 static int gaim_selfinfo(aim_session_t *sess, aim_frame_t *fr, ...) { |
9982 | 4703 GaimConnection *gc = sess->aux_data; |
4704 GaimAccount *account = gaim_connection_get_account(gc); | |
4705 int warning_level; | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4706 va_list ap; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4707 aim_userinfo_t *info; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4708 |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4709 va_start(ap, fr); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4710 info = va_arg(ap, aim_userinfo_t *); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4711 va_end(ap); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4712 |
9982 | 4713 warning_level = info->warnlevel/10.0 + 0.5; |
4714 | |
4715 /* | |
4716 * XXX - Calling this is probably not good. We just want to set the | |
4717 * warning level for our account, not tell the user that we were just | |
4718 * warned. | |
4719 */ | |
4720 gaim_prpl_got_account_warning_level(account, NULL, warning_level); | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4721 |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4722 return 1; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4723 } |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
4724 |
4649 | 4725 static int gaim_connerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4726 GaimConnection *gc = sess->aux_data; |
7283 | 4727 OscarData *od = gc->proto_data; |
4649 | 4728 va_list ap; |
4729 fu16_t code; | |
4730 char *msg; | |
4731 | |
4732 va_start(ap, fr); | |
4733 code = (fu16_t)va_arg(ap, int); | |
4734 msg = va_arg(ap, char *); | |
4735 va_end(ap); | |
4736 | |
8660 | 4737 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4738 "Disconnected. Code is 0x%04x and msg is %s\n", code, msg); |
4649 | 4739 if ((fr) && (fr->conn) && (fr->conn->type == AIM_CONN_TYPE_BOS)) { |
4651 | 4740 if (code == 0x0001) { |
6113 | 4741 gc->wants_to_die = TRUE; |
5579 | 4742 gaim_connection_error(gc, _("You have been disconnected because you have signed on with this screen name at another location.")); |
4651 | 4743 } else { |
5579 | 4744 gaim_connection_error(gc, _("You have been signed off for an unknown reason.")); |
4651 | 4745 } |
4666 | 4746 od->killme = TRUE; |
4649 | 4747 } |
4748 | |
4749 return 1; | |
4750 } | |
4751 | |
2675 | 4752 static int conninitdone_bos(aim_session_t *sess, aim_frame_t *fr, ...) { |
7283 | 4753 GaimConnection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4754 |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4755 aim_reqpersonalinfo(sess, fr->conn); |
4230 | 4756 |
4757 #ifndef NOSSI | |
8660 | 4758 gaim_debug_info("oscar", "ssi: requesting rights and list\n"); |
4889 | 4759 aim_ssi_reqrights(sess); |
6350 | 4760 aim_ssi_reqdata(sess); |
4230 | 4761 #endif |
4762 | |
7011 | 4763 aim_locate_reqrights(sess); |
7285 | 4764 aim_buddylist_reqrights(sess, fr->conn); |
4617 | 4765 aim_im_reqparams(sess); |
7334 | 4766 aim_bos_reqrights(sess, fr->conn); /* XXX - Don't call this with ssi */ |
4230 | 4767 |
4768 #ifdef NOSSI | |
8660 | 4769 gaim_debug_info("oscar", "bos: requesting rights\n"); |
7334 | 4770 aim_bos_reqrights(sess, fr->conn); |
4230 | 4771 aim_bos_setgroupperm(sess, fr->conn, AIM_FLAG_ALLUSERS); |
4772 aim_bos_setprivacyflags(sess, fr->conn, AIM_PRIVFLAGS_ALLOWIDLE | AIM_PRIVFLAGS_ALLOWMEMBERSINCE); | |
4773 #endif | |
2086 | 4774 |
7283 | 4775 gaim_connection_update_progress(gc, _("Finalizing connection"), 5, OSCAR_CONNECT_STEPS); |
4776 | |
2086 | 4777 return 1; |
4778 } | |
4779 | |
2675 | 4780 static int conninitdone_admin(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4781 GaimConnection *gc = sess->aux_data; |
7283 | 4782 OscarData *od = gc->proto_data; |
2647 | 4783 |
6905 | 4784 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ADM, 0x0003, gaim_info_change, 0); |
4785 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ADM, 0x0005, gaim_info_change, 0); | |
4786 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ADM, 0x0007, gaim_account_confirm, 0); | |
4787 | |
2672 | 4788 aim_clientready(sess, fr->conn); |
8660 | 4789 gaim_debug_info("oscar", "connected to admin\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4790 |
2647 | 4791 if (od->chpass) { |
8660 | 4792 gaim_debug_info("oscar", "changing password\n"); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4793 aim_admin_changepasswd(sess, fr->conn, od->newp, od->oldp); |
2647 | 4794 g_free(od->oldp); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4795 od->oldp = NULL; |
2647 | 4796 g_free(od->newp); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4797 od->newp = NULL; |
2647 | 4798 od->chpass = FALSE; |
4799 } | |
2979 | 4800 if (od->setnick) { |
8660 | 4801 gaim_debug_info("oscar", "formatting screen name\n"); |
2979 | 4802 aim_admin_setnick(sess, fr->conn, od->newsn); |
4803 g_free(od->newsn); | |
4804 od->newsn = NULL; | |
4805 od->setnick = FALSE; | |
4806 } | |
2647 | 4807 if (od->conf) { |
8660 | 4808 gaim_debug_info("oscar", "confirming account\n"); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4809 aim_admin_reqconfirm(sess, fr->conn); |
2647 | 4810 od->conf = FALSE; |
4811 } | |
4812 if (od->reqemail) { | |
8660 | 4813 gaim_debug_info("oscar", "requesting email\n"); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4814 aim_admin_getinfo(sess, fr->conn, 0x0011); |
2647 | 4815 od->reqemail = FALSE; |
4816 } | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4817 if (od->setemail) { |
8660 | 4818 gaim_debug_info("oscar", "setting email\n"); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4819 aim_admin_setemail(sess, fr->conn, od->email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4820 g_free(od->email); |
5497 | 4821 od->email = NULL; |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4822 od->setemail = FALSE; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4823 } |
2647 | 4824 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4825 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4826 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4827 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4828 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
|
4829 struct aim_icbmparameters *params; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4830 va_list ap; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4831 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4832 va_start(ap, fr); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4833 params = va_arg(ap, struct aim_icbmparameters *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4834 va_end(ap); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4835 |
4194 | 4836 /* XXX - evidently this crashes on solaris. i have no clue why |
8660 | 4837 gaim_debug_misc("oscar", "ICBM Parameters: maxchannel = %hu, default flags = 0x%08lx, max msg len = %hu, " |
5556 | 4838 "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
|
4839 params->maxchan, params->flags, params->maxmsglen, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4840 ((float)params->maxsenderwarn)/10.0, ((float)params->maxrecverwarn)/10.0, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4841 params->minmsginterval); |
2427
5bc3b39fc0a5
[gaim-migrate @ 2440]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2421
diff
changeset
|
4842 */ |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4843 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4844 /* Maybe senderwarn and recverwarn should be user preferences... */ |
3595 | 4845 params->flags = 0x0000000b; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4846 params->maxmsglen = 8000; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4847 params->minmsginterval = 0; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4848 |
4617 | 4849 aim_im_setparams(sess, params); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4850 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4851 return 1; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4852 } |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4853 |
2993 | 4854 static int gaim_parse_locaterights(aim_session_t *sess, aim_frame_t *fr, ...) |
4855 { | |
5575 | 4856 GaimConnection *gc = sess->aux_data; |
7283 | 4857 OscarData *od = (OscarData *)gc->proto_data; |
5306 | 4858 va_list ap; |
4859 fu16_t maxsiglen; | |
2993 | 4860 |
4861 va_start(ap, fr); | |
4199 | 4862 maxsiglen = (fu16_t) va_arg(ap, int); |
2993 | 4863 va_end(ap); |
4864 | |
8660 | 4865 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4866 "locate rights: max sig len = %d\n", maxsiglen); |
2993 | 4867 |
4617 | 4868 od->rights.maxsiglen = od->rights.maxawaymsglen = (guint)maxsiglen; |
4869 | |
4870 if (od->icq) | |
7334 | 4871 aim_locate_setcaps(od->sess, caps_icq); |
5301 | 4872 else |
7334 | 4873 aim_locate_setcaps(od->sess, caps_aim); |
4874 oscar_set_info(gc, gc->account->user_info); | |
2993 | 4875 |
4876 return 1; | |
4877 } | |
4878 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4879 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
|
4880 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4881 fu16_t maxbuddies, maxwatchers; |
5575 | 4882 GaimConnection *gc = sess->aux_data; |
7283 | 4883 OscarData *od = (OscarData *)gc->proto_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4884 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4885 va_start(ap, fr); |
4199 | 4886 maxbuddies = (fu16_t) va_arg(ap, unsigned int); |
4887 maxwatchers = (fu16_t) va_arg(ap, unsigned int); | |
2086 | 4888 va_end(ap); |
4889 | |
8660 | 4890 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4891 "buddy list rights: Max buddies = %hu / Max watchers = %hu\n", maxbuddies, maxwatchers); |
2086 | 4892 |
4617 | 4893 od->rights.maxbuddies = (guint)maxbuddies; |
4894 od->rights.maxwatchers = (guint)maxwatchers; | |
2993 | 4895 |
2086 | 4896 return 1; |
4897 } | |
4898 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4899 static int gaim_bosrights(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4900 GaimConnection *gc = sess->aux_data; |
7283 | 4901 OscarData *od = (OscarData *)gc->proto_data; |
7334 | 4902 va_list ap; |
4903 fu16_t maxpermits, maxdenies; | |
2086 | 4904 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4905 va_start(ap, fr); |
4199 | 4906 maxpermits = (fu16_t) va_arg(ap, unsigned int); |
4907 maxdenies = (fu16_t) va_arg(ap, unsigned int); | |
2086 | 4908 va_end(ap); |
4909 | |
8660 | 4910 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4911 "BOS rights: Max permit = %hu / Max deny = %hu\n", maxpermits, maxdenies); |
2086 | 4912 |
4617 | 4913 od->rights.maxpermits = (guint)maxpermits; |
4914 od->rights.maxdenies = (guint)maxdenies; | |
2993 | 4915 |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
4916 gaim_connection_set_state(gc, GAIM_CONNECTED); |
2993 | 4917 serv_finish_login(gc); |
4918 | |
8660 | 4919 gaim_debug_info("oscar", "buddy list loaded\n"); |
2993 | 4920 |
2672 | 4921 aim_clientready(sess, fr->conn); |
5948 | 4922 aim_srv_setavailmsg(sess, NULL); |
7474 | 4923 aim_srv_setidle(sess, 0); |
4617 | 4924 |
4664 | 4925 if (od->icq) { |
4926 aim_icq_reqofflinemsgs(sess); | |
4927 aim_icq_hideip(sess); | |
4928 } | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4929 |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4930 aim_reqservice(sess, fr->conn, AIM_CONN_TYPE_CHATNAV); |
4102 | 4931 if (sess->authinfo->email) |
4932 aim_reqservice(sess, fr->conn, AIM_CONN_TYPE_EMAIL); | |
2086 | 4933 |
4934 return 1; | |
4935 } | |
4936 | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4937 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
|
4938 va_list ap; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4939 struct aim_icq_offlinemsg *msg; |
4075 | 4940 struct aim_incomingim_ch4_args args; |
4941 time_t t; | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4942 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4943 va_start(ap, fr); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4944 msg = va_arg(ap, struct aim_icq_offlinemsg *); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4945 va_end(ap); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4946 |
8660 | 4947 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4948 "Received offline message. Converting to channel 4 ICBM...\n"); |
4075 | 4949 args.uin = msg->sender; |
4950 args.type = msg->type; | |
4173 | 4951 args.flags = msg->flags; |
4076 | 4952 args.msglen = msg->msglen; |
4075 | 4953 args.msg = msg->msg; |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4954 t = gaim_time_build(msg->year, msg->month, msg->day, msg->hour, msg->minute, 0); |
4075 | 4955 incomingim_chan4(sess, fr->conn, NULL, &args, t); |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4956 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4957 return 1; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4958 } |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4959 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4960 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
|
4961 { |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4962 aim_icq_ackofflinemsgs(sess); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4963 return 1; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4964 } |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4965 |
7388 | 4966 #if 0 |
4967 /* | |
7465 | 4968 * Update, 2003-11-09: |
4969 * Joseph S. Myers, a gcc dude, fixed this for gcc 3.4! Rock on! | |
4970 * | |
7388 | 4971 * It may not be my place to do this, but... |
4972 * I feel pretty strongly that the "last 2 digits" warning is ridiculously | |
4973 * stupid, and should not exist for % switches (%x in our case) that request | |
4974 * a year in the preferred representation for the current locale. For that | |
4975 * reason I've chosen to not use this workaround (n., see kluge). | |
4976 * | |
4977 * I have a date. I want to show it to the user in the "preferred" way. | |
4978 * Whether that displays a 2 digit year is perfectly fine--after all, it's | |
4979 * what the locale wanted. | |
4980 * | |
4981 * If I have a necessity for a full representation of the year in the current | |
4982 * locale, then I'll use a switch that returns a full representation of the | |
4983 * year. | |
4984 * | |
4985 * If you think the preferred locale should show 4 digits instead of 2 digits | |
4986 * (because you're anal, or whatever), then change the f***ing locale. | |
4987 * | |
4988 * I guess the bottom line is--I'm trying to show a date to the user how they | |
4989 * prefer to see it, why the hell does gcc want me to change that? | |
7389 | 4990 * |
4991 * See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=3190 | |
4992 * See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=8714 | |
7388 | 4993 */ |
4994 | |
4995 /* | |
4996 * This function was recommended by the STRFTIME(3) man page to remove the | |
7386 | 4997 * "last 2 digits" warning. |
4998 */ | |
4999 static size_t my_strftime(char *s, size_t max, const char *fmt, | |
5000 const struct tm *tm) | |
5001 { | |
5002 return strftime(s, max, fmt, tm); | |
5003 } | |
7388 | 5004 #endif |
7386 | 5005 |
4624 | 5006 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
|
5007 { |
5575 | 5008 GaimConnection *gc = sess->aux_data; |
8670 | 5009 OscarData *od = (OscarData *)gc->proto_data; |
5010 GaimBuddy *buddy; | |
8853 | 5011 struct buddyinfo *bi = NULL; |
4624 | 5012 gchar who[16]; |
8670 | 5013 GString *str; |
5014 gchar *primary, *utf8; | |
9634 | 5015 const gchar *alias; |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5016 va_list ap; |
4151 | 5017 struct aim_icq_info *info; |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5018 |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5019 va_start(ap, fr); |
4151 | 5020 info = va_arg(ap, struct aim_icq_info *); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5021 va_end(ap); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5022 |
4664 | 5023 if (!info->uin) |
5024 return 0; | |
5025 | |
8670 | 5026 str = g_string_sized_new(100); |
5556 | 5027 g_snprintf(who, sizeof(who), "%u", info->uin); |
8670 | 5028 buddy = gaim_find_buddy(gaim_connection_get_account(gc), who); |
5029 if (buddy != NULL) | |
5030 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(buddy->account, buddy->name)); | |
5031 | |
5032 g_string_append_printf(str, "<b>%s:</b> %s", _("UIN"), who); | |
8701 | 5033 oscar_string_append(str, "\n<br>", _("Nick"), info->nick); |
8670 | 5034 if ((bi != NULL) && (bi->ipaddr != 0)) { |
5035 char *tstr = g_strdup_printf("%hhu.%hhu.%hhu.%hhu", | |
5036 (bi->ipaddr & 0xff000000) >> 24, | |
5037 (bi->ipaddr & 0x00ff0000) >> 16, | |
5038 (bi->ipaddr & 0x0000ff00) >> 8, | |
5039 (bi->ipaddr & 0x000000ff)); | |
8701 | 5040 oscar_string_append(str, "\n<br>", _("IP Address"), tstr); |
8670 | 5041 g_free(tstr); |
5042 } | |
8701 | 5043 oscar_string_append(str, "\n<br>", _("First Name"), info->first); |
5044 oscar_string_append(str, "\n<br>", _("Last Name"), info->last); | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
5045 if (info->email && info->email[0] && (utf8 = gaim_utf8_try_convert(info->email))) { |
8670 | 5046 g_string_append_printf(str, "\n<br><b>%s:</b> <a href=\"mailto:%s\">%s</a>", _("Email Address"), utf8, utf8); |
5047 g_free(utf8); | |
4625 | 5048 } |
5049 if (info->numaddresses && info->email2) { | |
5050 int i; | |
5051 for (i = 0; i < info->numaddresses; i++) { | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
5052 if (info->email2[i] && info->email2[i][0] && (utf8 = gaim_utf8_try_convert(info->email2[i]))) { |
8670 | 5053 g_string_append_printf(str, "\n<br><b>%s:</b> <a href=\"mailto%s\">%s</a>", _("Email Address"), utf8, utf8); |
5054 g_free(utf8); | |
4643 | 5055 } |
4625 | 5056 } |
4624 | 5057 } |
8701 | 5058 oscar_string_append(str, "\n<br>", _("Mobile Phone"), info->mobile); |
10022 | 5059 if (info->gender != 0) |
5060 oscar_string_append(str, "\n<br>", _("Gender"), info->gender == 1 ? _("Female") : _("Male")); | |
4624 | 5061 if (info->birthyear || info->birthmonth || info->birthday) { |
4627 | 5062 char date[30]; |
5063 struct tm tm; | |
5064 tm.tm_mday = (int)info->birthday; | |
5065 tm.tm_mon = (int)info->birthmonth-1; | |
5066 tm.tm_year = (int)info->birthyear-1900; | |
7388 | 5067 strftime(date, sizeof(date), "%x", &tm); |
8701 | 5068 oscar_string_append(str, "\n<br>", _("Birthday"), date); |
4151 | 5069 } |
4624 | 5070 if (info->age) { |
5071 char age[5]; | |
5072 snprintf(age, sizeof(age), "%hhd", info->age); | |
8701 | 5073 oscar_string_append(str, "\n<br>", _("Age"), age); |
4819 | 5074 } |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
5075 if (info->personalwebpage && info->personalwebpage[0] && (utf8 = gaim_utf8_try_convert(info->personalwebpage))) { |
8670 | 5076 g_string_append_printf(str, "\n<br><b>%s:</b> <a href=\"%s\">%s</a>", _("Personal Web Page"), utf8, utf8); |
5077 g_free(utf8); | |
4819 | 5078 } |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
5079 if (info->info && info->info[0] && (utf8 = gaim_utf8_try_convert(info->info))) { |
8670 | 5080 g_string_append_printf(str, "<hr><b>%s:</b><br>%s", _("Additional Information"), utf8); |
5081 g_free(utf8); | |
5082 } | |
5083 g_string_append_printf(str, "<hr>\n"); | |
4641 | 5084 if ((info->homeaddr && (info->homeaddr[0])) || (info->homecity && info->homecity[0]) || (info->homestate && info->homestate[0]) || (info->homezip && info->homezip[0])) { |
8670 | 5085 g_string_append_printf(str, "<b>%s:</b>", _("Home Address")); |
8701 | 5086 oscar_string_append(str, "\n<br>", _("Address"), info->homeaddr); |
5087 oscar_string_append(str, "\n<br>", _("City"), info->homecity); | |
5088 oscar_string_append(str, "\n<br>", _("State"), info->homestate); | |
5089 oscar_string_append(str, "\n<br>", _("Zip Code"), info->homezip); | |
8670 | 5090 g_string_append_printf(str, "\n<hr>\n"); |
4151 | 5091 } |
4641 | 5092 if ((info->workaddr && info->workaddr[0]) || (info->workcity && info->workcity[0]) || (info->workstate && info->workstate[0]) || (info->workzip && info->workzip[0])) { |
8670 | 5093 g_string_append_printf(str, "<b>%s:</b>", _("Work Address")); |
8701 | 5094 oscar_string_append(str, "\n<br>", _("Address"), info->workaddr); |
5095 oscar_string_append(str, "\n<br>", _("City"), info->workcity); | |
5096 oscar_string_append(str, "\n<br>", _("State"), info->workstate); | |
5097 oscar_string_append(str, "\n<br>", _("Zip Code"), info->workzip); | |
8670 | 5098 g_string_append_printf(str, "\n<hr>\n"); |
4624 | 5099 } |
4641 | 5100 if ((info->workcompany && info->workcompany[0]) || (info->workdivision && info->workdivision[0]) || (info->workposition && info->workposition[0]) || (info->workwebpage && info->workwebpage[0])) { |
8670 | 5101 g_string_append_printf(str, "<b>%s:</b>", _("Work Information")); |
8701 | 5102 oscar_string_append(str, "\n<br>", _("Company"), info->workcompany); |
5103 oscar_string_append(str, "\n<br>", _("Division"), info->workdivision); | |
5104 oscar_string_append(str, "\n<br>", _("Position"), info->workposition); | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
5105 if (info->workwebpage && info->workwebpage[0] && (utf8 = gaim_utf8_try_convert(info->workwebpage))) { |
8670 | 5106 g_string_append_printf(str, "\n<br><b>%s:</b> <a href=\"%s\">%s</a>", _("Web Page"), utf8, utf8); |
5107 g_free(utf8); | |
4624 | 5108 } |
8670 | 5109 g_string_append_printf(str, "\n<hr>\n"); |
5110 } | |
5111 | |
9634 | 5112 if (buddy != NULL) |
5113 alias = gaim_buddy_get_alias(buddy); | |
5114 else | |
5115 alias = who; | |
5116 primary = g_strdup_printf(_("ICQ Info for %s"), alias); | |
9810 | 5117 gaim_notify_userinfo(gc, who, NULL, primary, NULL, str->str, NULL, NULL); |
6873 | 5118 g_free(primary); |
8670 | 5119 g_string_free(str, TRUE); |
4151 | 5120 |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5121 return 1; |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5122 } |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5123 |
4759 | 5124 static int gaim_icqalias(aim_session_t *sess, aim_frame_t *fr, ...) |
5125 { | |
5575 | 5126 GaimConnection *gc = sess->aux_data; |
4820 | 5127 gchar who[16], *utf8; |
6695 | 5128 GaimBuddy *b; |
4759 | 5129 va_list ap; |
5130 struct aim_icq_info *info; | |
5131 | |
5132 va_start(ap, fr); | |
5133 info = va_arg(ap, struct aim_icq_info *); | |
5134 va_end(ap); | |
5135 | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
5136 if (info->uin && info->nick && info->nick[0] && (utf8 = gaim_utf8_try_convert(info->nick))) { |
5556 | 5137 g_snprintf(who, sizeof(who), "%u", info->uin); |
4820 | 5138 serv_got_alias(gc, who, utf8); |
4759 | 5139 if ((b = gaim_find_buddy(gc->account, who))) { |
7693 | 5140 gaim_blist_node_set_string((GaimBlistNode*)b, "servernick", utf8); |
4759 | 5141 } |
4820 | 5142 g_free(utf8); |
4759 | 5143 } |
5144 | |
5145 return 1; | |
5146 } | |
5147 | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5148 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
|
5149 { |
7032 | 5150 GaimConnection *gc = sess->aux_data; |
5151 gchar *text; | |
5152 va_list ap; | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5153 char *msg, *url; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5154 fu16_t wid, hei, delay; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5155 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5156 va_start(ap, fr); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5157 msg = va_arg(ap, char *); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5158 url = va_arg(ap, char *); |
4199 | 5159 wid = (fu16_t) va_arg(ap, int); |
5160 hei = (fu16_t) va_arg(ap, int); | |
5161 delay = (fu16_t) va_arg(ap, int); | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5162 va_end(ap); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5163 |
7032 | 5164 text = g_strdup_printf("%s<br><a href=\"%s\">%s</a>", msg, url, url); |
5165 gaim_notify_formatted(gc, NULL, _("Pop-Up Message"), NULL, text, NULL, NULL); | |
5166 g_free(text); | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5167 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5168 return 1; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5169 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5170 |
7032 | 5171 static int gaim_parse_searchreply(aim_session_t *sess, aim_frame_t *fr, ...) |
5172 { | |
6873 | 5173 GaimConnection *gc = sess->aux_data; |
5174 gchar *secondary; | |
5175 GString *text; | |
5176 int i, num; | |
2086 | 5177 va_list ap; |
6873 | 5178 char *email, *SNs; |
2086 | 5179 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5180 va_start(ap, fr); |
6873 | 5181 email = va_arg(ap, char *); |
2086 | 5182 num = va_arg(ap, int); |
5183 SNs = va_arg(ap, char *); | |
5184 va_end(ap); | |
5185 | |
8152 | 5186 secondary = g_strdup_printf(_("The following screen names are associated with %s"), email); |
6873 | 5187 text = g_string_new(""); |
2086 | 5188 for (i = 0; i < num; i++) |
6873 | 5189 g_string_append_printf(text, "%s<br>", &SNs[i * (MAXSNLEN + 1)]); |
5190 gaim_notify_formatted(gc, NULL, _("Search Results"), secondary, text->str, NULL, NULL); | |
5191 | |
5192 g_free(secondary); | |
5193 g_string_free(text, TRUE); | |
2086 | 5194 |
5195 return 1; | |
5196 } | |
5197 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5198 static int gaim_parse_searcherror(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 5199 va_list ap; |
6873 | 5200 char *email; |
5420 | 5201 char *buf; |
2086 | 5202 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5203 va_start(ap, fr); |
6873 | 5204 email = va_arg(ap, char *); |
2086 | 5205 va_end(ap); |
5206 | |
6873 | 5207 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
|
5208 gaim_notify_error(sess->aux_data, NULL, buf, NULL); |
5420 | 5209 g_free(buf); |
2086 | 5210 |
5211 return 1; | |
5212 } | |
5213 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5214 static int gaim_account_confirm(aim_session_t *sess, aim_frame_t *fr, ...) { |
6873 | 5215 GaimConnection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5216 fu16_t status; |
2086 | 5217 va_list ap; |
5218 char msg[256]; | |
5219 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5220 va_start(ap, fr); |
4199 | 5221 status = (fu16_t) va_arg(ap, unsigned int); /* status code of confirmation request */ |
2086 | 5222 va_end(ap); |
5223 | |
8660 | 5224 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5225 "account confirmation returned status 0x%04x (%s)\n", status, |
3912 | 5226 status ? "unknown" : "email sent"); |
5227 if (!status) { | |
5302 | 5228 g_snprintf(msg, sizeof(msg), _("You should receive an email asking to confirm %s."), |
5575 | 5229 gaim_account_get_username(gaim_connection_get_account(gc))); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5230 gaim_notify_info(gc, NULL, _("Account Confirmation Requested"), msg); |
2086 | 5231 } |
5232 | |
5233 return 1; | |
5234 } | |
5235 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5236 static int gaim_info_change(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 5237 GaimConnection *gc = sess->aux_data; |
2086 | 5238 va_list ap; |
3912 | 5239 fu16_t perms, err; |
5240 char *url, *sn, *email; | |
5241 int change; | |
2086 | 5242 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5243 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5244 change = va_arg(ap, int); |
4199 | 5245 perms = (fu16_t) va_arg(ap, unsigned int); |
5246 err = (fu16_t) va_arg(ap, unsigned int); | |
3912 | 5247 url = va_arg(ap, char *); |
5248 sn = va_arg(ap, char *); | |
5249 email = va_arg(ap, char *); | |
2086 | 5250 va_end(ap); |
5251 | |
8660 | 5252 gaim_debug_misc("oscar", |
9626 | 5253 "account info: because of %s, perms=0x%04x, err=0x%04x, url=%s, sn=%s, email=%s\n", |
5254 change ? "change" : "request", perms, err, | |
5255 (url != NULL) ? url : "(null)", | |
5256 (sn != NULL) ? sn : "(null)", | |
5257 (email != NULL) ? email : "(null)"); | |
5258 | |
5259 if ((err > 0) && (url != NULL)) { | |
3912 | 5260 char *dialog_msg; |
5261 char *dialog_top = g_strdup_printf(_("Error Changing Account Info")); | |
5262 switch (err) { | |
5263 case 0x0001: { | |
5264 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name differs from the original."), err); | |
5265 } break; | |
5266 case 0x0006: { | |
5267 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name ends in a space."), err); | |
5268 } break; | |
5269 case 0x000b: { | |
5270 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name is too long."), err); | |
5271 } break; | |
5272 case 0x001d: { | |
5273 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); | |
5274 } break; | |
5275 case 0x0021: { | |
5276 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); | |
5277 } break; | |
5278 case 0x0023: { | |
5279 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to change email address because the given address is invalid."), err); | |
5280 } break; | |
5281 default: { | |
5282 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unknown error."), err); | |
5283 } break; | |
5284 } | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5285 gaim_notify_error(gc, NULL, dialog_top, dialog_msg); |
3912 | 5286 g_free(dialog_top); |
5287 g_free(dialog_msg); | |
5288 return 1; | |
5289 } | |
5290 | |
9626 | 5291 if (sn != NULL) { |
4585 | 5292 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
|
5293 gaim_notify_info(gc, NULL, _("Account Info"), dialog_msg); |
3912 | 5294 g_free(dialog_msg); |
5295 } | |
5296 | |
9626 | 5297 if (email != NULL) { |
5575 | 5298 char *dialog_msg = g_strdup_printf(_("The email address for %s is %s"), |
5299 gaim_account_get_username(gaim_connection_get_account(gc)), email); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5300 gaim_notify_info(gc, NULL, _("Account Info"), dialog_msg); |
3912 | 5301 g_free(dialog_msg); |
2086 | 5302 } |
5303 | |
5304 return 1; | |
5305 } | |
5306 | |
5575 | 5307 static void oscar_keepalive(GaimConnection *gc) { |
7283 | 5308 OscarData *od = (OscarData *)gc->proto_data; |
4617 | 5309 aim_flap_nop(od->sess, od->conn); |
2086 | 5310 } |
5311 | |
6059 | 5312 static int oscar_send_typing(GaimConnection *gc, const char *name, int typing) { |
7283 | 5313 OscarData *od = (OscarData *)gc->proto_data; |
8971 | 5314 struct oscar_direct_im *dim = oscar_direct_im_find(od, name); |
5315 if (dim && dim->connected) | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
5316 if (typing == GAIM_TYPING) |
4870 | 5317 aim_odc_send_typing(od->sess, dim->conn, 0x0002); |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
5318 else if (typing == GAIM_TYPED) |
4870 | 5319 aim_odc_send_typing(od->sess, dim->conn, 0x0001); |
5320 else | |
5321 aim_odc_send_typing(od->sess, dim->conn, 0x0000); | |
3595 | 5322 else { |
5300 | 5323 /* Don't send if this turkey is in our deny list */ |
5324 GSList *list; | |
5325 for (list=gc->account->deny; (list && aim_sncmp(name, list->data)); list=list->next); | |
5326 if (!list) { | |
7261 | 5327 struct buddyinfo *bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(gc->account, name)); |
5300 | 5328 if (bi && bi->typingnot) { |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
5329 if (typing == GAIM_TYPING) |
5300 | 5330 aim_im_sendmtn(od->sess, 0x0001, name, 0x0002); |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
5331 else if (typing == GAIM_TYPED) |
5300 | 5332 aim_im_sendmtn(od->sess, 0x0001, name, 0x0001); |
5333 else | |
5334 aim_im_sendmtn(od->sess, 0x0001, name, 0x0000); | |
5335 } | |
3595 | 5336 } |
5337 } | |
2993 | 5338 return 0; |
5339 } | |
9030 | 5340 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
5341 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
|
5342 |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
5343 static int oscar_send_im(GaimConnection *gc, const char *name, const char *message, GaimConvImFlags imflags) { |
7283 | 5344 OscarData *od = (OscarData *)gc->proto_data; |
8971 | 5345 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
|
5346 int ret = 0; |
5575 | 5347 const char *iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc)); |
8800 | 5348 char *tmpmsg = NULL, *tmpmsg2 = NULL; |
3458 | 5349 |
4838 | 5350 if (dim && dim->connected) { |
5351 /* If we're directly connected, send a direct IM */ | |
6982 | 5352 ret = gaim_odc_send_im(od->sess, dim->conn, message, imflags); |
2086 | 5353 } else { |
4738 | 5354 struct buddyinfo *bi; |
3008 | 5355 struct aim_sendimext_args args; |
5356 struct stat st; | |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
5357 gsize len; |
8962 | 5358 GaimConversation *conv = gaim_find_conversation_with_account(name, gaim_connection_get_account(gc)); |
5359 | |
5360 if (strstr(message, "<IMG ")) | |
5361 gaim_conversation_write(conv, "", | |
5362 _("Your IM Image was not sent. " | |
5363 "You must be Direct Connected to send IM Images."), | |
5364 GAIM_MESSAGE_ERROR, time(NULL)); | |
4269 | 5365 |
7261 | 5366 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(gc->account, name)); |
4738 | 5367 if (!bi) { |
5368 bi = g_new0(struct buddyinfo, 1); | |
7261 | 5369 g_hash_table_insert(od->buddyinfo, g_strdup(gaim_normalize(gc->account, name)), bi); |
4738 | 5370 } |
5371 | |
3008 | 5372 args.flags = AIM_IMFLAGS_ACK | AIM_IMFLAGS_CUSTOMFEATURES; |
4665 | 5373 if (od->icq) { |
5374 args.features = features_icq; | |
5375 args.featureslen = sizeof(features_icq); | |
3008 | 5376 args.flags |= AIM_IMFLAGS_OFFLINE; |
4665 | 5377 } else { |
5378 args.features = features_aim; | |
5379 args.featureslen = sizeof(features_aim); | |
4972 | 5380 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
5381 if (imflags & GAIM_CONV_IM_AUTO_RESP) |
4972 | 5382 args.flags |= AIM_IMFLAGS_AWAY; |
4665 | 5383 } |
4269 | 5384 |
4738 | 5385 if (bi->ico_need) { |
8660 | 5386 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5387 "Sending buddy icon request with message\n"); |
3008 | 5388 args.flags |= AIM_IMFLAGS_BUDDYREQ; |
4738 | 5389 bi->ico_need = FALSE; |
3008 | 5390 } |
4269 | 5391 |
5575 | 5392 if (iconfile && !stat(iconfile, &st)) { |
8361 | 5393 FILE *file = fopen(iconfile, "rb"); |
3008 | 5394 if (file) { |
5395 char *buf = g_malloc(st.st_size); | |
9532 | 5396 /* XXX - Use g_file_get_contents()? */ |
3008 | 5397 fread(buf, 1, st.st_size, file); |
6039 | 5398 fclose(file); |
4269 | 5399 |
3008 | 5400 args.iconlen = st.st_size; |
4617 | 5401 args.iconsum = aimutil_iconsum(buf, st.st_size); |
3008 | 5402 args.iconstamp = st.st_mtime; |
5403 | |
7406 | 5404 if ((args.iconlen != bi->ico_me_len) || (args.iconsum != bi->ico_me_csum) || (args.iconstamp != bi->ico_me_time)) { |
4738 | 5405 bi->ico_informed = FALSE; |
7406 | 5406 bi->ico_sent = FALSE; |
5407 } | |
4738 | 5408 |
5409 if (!bi->ico_informed) { | |
8660 | 5410 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5411 "Claiming to have a buddy icon\n"); |
4738 | 5412 args.flags |= AIM_IMFLAGS_HASICON; |
5413 bi->ico_me_len = args.iconlen; | |
5414 bi->ico_me_csum = args.iconsum; | |
5415 bi->ico_me_time = args.iconstamp; | |
5416 bi->ico_informed = TRUE; | |
5417 } | |
5418 | |
3008 | 5419 g_free(buf); |
2086 | 5420 } |
5421 } | |
4269 | 5422 |
3008 | 5423 args.destsn = name; |
4269 | 5424 |
8985 | 5425 /* |
5426 * If we're IMing an ICQ user then send newlines as CR/LF and | |
5427 * strip all HTML | |
5428 */ | |
9975 | 5429 if (aim_sn_is_icq(name) ) { |
8995 | 5430 /* being sent to an ICQ user */ |
9975 | 5431 if (!aim_sn_is_icq(gaim_account_get_username(gc->account))) { |
8995 | 5432 /* from an AIM user - ICQ receiving from AIM *expects the messsage to be HTML formatted* */ |
5433 tmpmsg = gaim_str_add_cr(message); | |
5434 } else { | |
5435 /* from an ICQ user - do nothing */ | |
5436 tmpmsg = g_strdup(message); | |
5437 } | |
5438 } else { | |
5439 /* being sent to an AIM user */ | |
9975 | 5440 if (aim_sn_is_icq(gaim_account_get_username(gc->account))) { |
8995 | 5441 /* from an ICQ user */ |
5442 tmpmsg2 = gaim_strdup_withhtml(message); | |
5443 tmpmsg = gaim_escape_html(tmpmsg2); | |
5444 g_free(tmpmsg2); | |
5445 } else | |
5446 tmpmsg = gaim_strdup_withhtml(message); | |
5447 } | |
6310 | 5448 len = strlen(tmpmsg); |
5449 | |
9830 | 5450 gaim_plugin_oscar_convert_to_best_encoding(gc, name, tmpmsg, (char **)&args.msg, &args.msglen, &args.charset, &args.charsubset); |
5451 gaim_debug_info("oscar", "Sending IM, charset=0x%04hx, charsubset=0x%04hx, length=%d\n", | |
5452 args.charset, args.charsubset, args.msglen); | |
4617 | 5453 ret = aim_im_sendch1_ext(od->sess, &args); |
9830 | 5454 g_free((char *)args.msg); |
2086 | 5455 } |
4838 | 5456 |
6310 | 5457 g_free(tmpmsg); |
5458 | |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
5459 if (ret >= 0) |
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
5460 return 1; |
6310 | 5461 |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
5462 return ret; |
2086 | 5463 } |
5464 | |
7011 | 5465 static void oscar_get_info(GaimConnection *gc, const char *name) { |
7283 | 5466 OscarData *od = (OscarData *)gc->proto_data; |
7011 | 5467 |
9975 | 5468 if (od->icq && aim_sn_is_icq(name)) |
4624 | 5469 aim_icq_getallinfo(od->sess, name); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
5470 else |
7235 | 5471 aim_locate_getinfoshort(od->sess, name, 0x00000003); |
7011 | 5472 } |
5473 | |
8950 | 5474 #if 0 |
7011 | 5475 static void oscar_set_dir(GaimConnection *gc, const char *first, const char *middle, const char *last, |
3466 | 5476 const char *maiden, const char *city, const char *state, const char *country, int web) { |
4617 | 5477 /* XXX - some of these things are wrong, but i'm lazy */ |
7283 | 5478 OscarData *od = (OscarData *)gc->proto_data; |
7011 | 5479 aim_locate_setdirinfo(od->sess, first, middle, last, |
2086 | 5480 maiden, NULL, NULL, city, state, NULL, 0, web); |
5481 } | |
8950 | 5482 #endif |
2086 | 5483 |
5575 | 5484 static void oscar_set_idle(GaimConnection *gc, int time) { |
7283 | 5485 OscarData *od = (OscarData *)gc->proto_data; |
7474 | 5486 aim_srv_setidle(od->sess, time); |
2086 | 5487 } |
5488 | |
5954 | 5489 static void oscar_set_info(GaimConnection *gc, const char *text) { |
7283 | 5490 OscarData *od = (OscarData *)gc->proto_data; |
9807 | 5491 int charset = 0; |
6019 | 5492 char *text_html = NULL; |
5129 | 5493 char *msg = NULL; |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
5494 gsize msglen = 0; |
2993 | 5495 |
4617 | 5496 if (od->rights.maxsiglen == 0) |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5497 gaim_notify_warning(gc, NULL, _("Unable to set AIM profile."), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5498 _("You have probably requested to set your " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5499 "profile before the login procedure completed. " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5500 "Your profile remains unset; try setting it " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5501 "again when you are fully connected.")); |
4617 | 5502 |
7334 | 5503 if (!text) { |
5504 aim_locate_setprofile(od->sess, NULL, "", 0, NULL, NULL, 0); | |
5505 return; | |
5506 } | |
10097 | 5507 |
7334 | 5508 text_html = gaim_strdup_withhtml(text); |
9807 | 5509 charset = oscar_charset_check(text_html); |
9826 | 5510 if (charset == AIM_CHARSET_UNICODE) { |
7334 | 5511 msg = g_convert(text_html, strlen(text_html), "UCS-2BE", "UTF-8", NULL, &msglen, NULL); |
5512 aim_locate_setprofile(od->sess, "unicode-2-0", msg, (msglen > od->rights.maxsiglen ? od->rights.maxsiglen : msglen), NULL, NULL, 0); | |
5513 g_free(msg); | |
9826 | 5514 } else if (charset == AIM_CHARSET_CUSTOM) { |
7334 | 5515 msg = g_convert(text_html, strlen(text_html), "ISO-8859-1", "UTF-8", NULL, &msglen, NULL); |
5516 aim_locate_setprofile(od->sess, "iso-8859-1", msg, (msglen > od->rights.maxsiglen ? od->rights.maxsiglen : msglen), NULL, NULL, 0); | |
5517 g_free(msg); | |
5518 } else { | |
5519 msglen = strlen(text_html); | |
5520 aim_locate_setprofile(od->sess, "us-ascii", text_html, (msglen > od->rights.maxsiglen ? od->rights.maxsiglen : msglen), NULL, NULL, 0); | |
5521 } | |
5522 | |
5523 if (msglen > od->rights.maxsiglen) { | |
5524 gchar *errstr; | |
5525 errstr = g_strdup_printf(ngettext("The maximum profile length of %d byte " | |
5526 "has been exceeded. Gaim has truncated it for you.", | |
5527 "The maximum profile length of %d bytes " | |
5528 "has been exceeded. Gaim has truncated it for you.", | |
5529 od->rights.maxsiglen), od->rights.maxsiglen); | |
5530 gaim_notify_warning(gc, NULL, _("Profile too long."), errstr); | |
5531 g_free(errstr); | |
5532 } | |
5533 | |
5534 g_free(text_html); | |
2993 | 5535 |
5536 return; | |
2086 | 5537 } |
5538 | |
9991 | 5539 static void |
5540 oscar_set_status_aim(GaimAccount *account, GaimStatus *status) | |
2993 | 5541 { |
9991 | 5542 GaimConnection *gc = gaim_account_get_connection(account); |
5543 OscarData *od = (OscarData *)gc->proto_data; | |
9992 | 5544 GaimStatusType *status_type; |
9991 | 5545 GaimStatusPrimitive primitive; |
5546 GaimPresence *presence; | |
5547 const gchar *status_id; | |
9807 | 5548 int charset = 0; |
6019 | 5549 gchar *text_html = NULL; |
5129 | 5550 char *msg = NULL; |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
5551 gsize msglen = 0; |
2993 | 5552 |
9992 | 5553 status_type = gaim_status_get_type(status); |
5554 primitive = gaim_status_type_get_primitive(status_type); | |
9991 | 5555 status_id = gaim_status_get_id(status); |
5556 presence = gaim_account_get_presence(account); | |
5557 | |
5558 if (primitive == GAIM_STATUS_HIDDEN) | |
8257 | 5559 aim_setextstatus(od->sess, AIM_ICQ_STATE_INVISIBLE); |
9991 | 5560 else |
5561 aim_setextstatus(od->sess, AIM_ICQ_STATE_NORMAL); | |
5562 | |
8476 | 5563 |
8257 | 5564 aim_setextstatus(od->sess, AIM_ICQ_STATE_NORMAL); |
5565 | |
2993 | 5566 if (od->rights.maxawaymsglen == 0) |
9991 | 5567 gaim_notify_warning(gc, NULL, _("Unable to set AIM away message."), |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5568 _("You have probably requested to set your " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5569 "away message before the login procedure " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5570 "completed. You remain in a \"present\" " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5571 "state; try setting it again when you are " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5572 "fully connected.")); |
5129 | 5573 |
9992 | 5574 if (primitive == GAIM_STATUS_AVAILABLE) { |
7334 | 5575 aim_locate_setprofile(od->sess, NULL, NULL, 0, NULL, "", 0); |
9995 | 5576 #if 0 |
5577 /* Set an available message */ | |
5578 aim_locate_setprofile(od->sess, NULL, NULL, 0, NULL, "", 0); | |
5579 aim_srv_setavailmsg(od->sess, text); | |
5580 #endif | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
5581 return; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
5582 } |
9995 | 5583 |
5584 /* | |
5585 * XXX - Using status_id below is definitely wrong. We want to get | |
5586 * the away message that the Gaim user just set. We probably want | |
5587 * to get a certain attribute from status->attr_values, but I don't | |
5588 * think any of that is implemented yet. | |
5589 * | |
5590 * Something like | |
5591 * text_html = gaim_status_get_attr_string(status, "message"); | |
5592 */ | |
5593 status_id = gaim_status_get_name(status); | |
9991 | 5594 text_html = gaim_strdup_withhtml(status_id); |
5595 | |
9807 | 5596 charset = oscar_charset_check(text_html); |
9826 | 5597 if (charset == AIM_CHARSET_UNICODE) { |
6019 | 5598 msg = g_convert(text_html, strlen(text_html), "UCS-2BE", "UTF-8", NULL, &msglen, NULL); |
7011 | 5599 aim_locate_setprofile(od->sess, NULL, NULL, 0, "unicode-2-0", msg, |
7334 | 5600 (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen)); |
5129 | 5601 g_free(msg); |
9826 | 5602 } else if (charset == AIM_CHARSET_CUSTOM) { |
6019 | 5603 msg = g_convert(text_html, strlen(text_html), "ISO-8859-1", "UTF-8", NULL, &msglen, NULL); |
7011 | 5604 aim_locate_setprofile(od->sess, NULL, NULL, 0, "iso-8859-1", msg, |
7334 | 5605 (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen)); |
5129 | 5606 g_free(msg); |
5607 } else { | |
6019 | 5608 msglen = strlen(text_html); |
7011 | 5609 aim_locate_setprofile(od->sess, NULL, NULL, 0, "us-ascii", text_html, |
7334 | 5610 (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen)); |
5129 | 5611 } |
5612 | |
5613 if (msglen > od->rights.maxawaymsglen) { | |
2993 | 5614 gchar *errstr; |
5615 | |
6308 | 5616 errstr = g_strdup_printf(ngettext("The maximum away message length of %d byte " |
5617 "has been exceeded. Gaim has truncated it for you.", | |
5618 "The maximum away message length of %d bytes " | |
5619 "has been exceeded. Gaim has truncated it for you.", | |
5620 od->rights.maxawaymsglen), od->rights.maxawaymsglen); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5621 gaim_notify_warning(gc, NULL, _("Away message too long."), errstr); |
2993 | 5622 g_free(errstr); |
5623 } | |
10097 | 5624 |
6019 | 5625 g_free(text_html); |
8257 | 5626 |
2993 | 5627 return; |
5628 } | |
5629 | |
9991 | 5630 static void |
5631 oscar_set_status_icq(GaimAccount *account, GaimStatus *status) | |
2993 | 5632 { |
9991 | 5633 GaimConnection *gc = gaim_account_get_connection(account); |
5634 OscarData *od = (OscarData *)gc->proto_data; | |
5635 const gchar *status_id = gaim_status_get_id(status); | |
5636 | |
5637 if (gaim_status_type_get_primitive(gaim_status_get_type(status)) == GAIM_STATUS_HIDDEN) | |
5575 | 5638 account->perm_deny = 4; |
8265 | 5639 else |
5575 | 5640 account->perm_deny = 3; |
9991 | 5641 |
8265 | 5642 if ((od->sess->ssi.received_data) && (aim_ssi_getpermdeny(od->sess->ssi.local) != account->perm_deny)) |
5643 aim_ssi_setpermdeny(od->sess, account->perm_deny, 0xffffffff); | |
4342 | 5644 |
9991 | 5645 if (!strcmp(status_id, OSCAR_STATUS_ID_ONLINE)) |
4901 | 5646 aim_setextstatus(od->sess, AIM_ICQ_STATE_NORMAL); |
9991 | 5647 |
5648 else if (!strcmp(status_id, OSCAR_STATUS_ID_AWAY)) | |
4901 | 5649 aim_setextstatus(od->sess, AIM_ICQ_STATE_AWAY); |
9991 | 5650 |
5651 else if (!strcmp(status_id, OSCAR_STATUS_ID_DND)) | |
4901 | 5652 aim_setextstatus(od->sess, AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_DND | AIM_ICQ_STATE_BUSY); |
9991 | 5653 |
5654 else if (!strcmp(status_id, OSCAR_STATUS_ID_NA)) | |
4901 | 5655 aim_setextstatus(od->sess, AIM_ICQ_STATE_OUT | AIM_ICQ_STATE_AWAY); |
9991 | 5656 |
5657 else if (!strcmp(status_id, OSCAR_STATUS_ID_OCCUPIED)) | |
4901 | 5658 aim_setextstatus(od->sess, AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_BUSY); |
9991 | 5659 |
5660 else if (!strcmp(status_id, OSCAR_STATUS_ID_FREE4CHAT)) | |
4901 | 5661 aim_setextstatus(od->sess, AIM_ICQ_STATE_CHAT); |
9991 | 5662 |
5663 else if (!strcmp(status_id, OSCAR_STATUS_ID_INVISIBLE)) | |
4901 | 5664 aim_setextstatus(od->sess, AIM_ICQ_STATE_INVISIBLE); |
9991 | 5665 |
5666 else if (!strcmp(status_id, OSCAR_STATUS_ID_CUSTOM)) | |
5667 aim_setextstatus(od->sess, AIM_ICQ_STATE_OUT | AIM_ICQ_STATE_AWAY); | |
2993 | 5668 |
5669 return; | |
5670 } | |
5671 | |
9991 | 5672 static void |
5673 oscar_set_status(GaimAccount *account, GaimStatus *status) | |
2993 | 5674 { |
9991 | 5675 GaimConnection *gc = gaim_account_get_connection(account); |
5676 OscarData *od = (OscarData *)gc->proto_data; | |
2993 | 5677 |
5678 if (od->icq) | |
9988 | 5679 oscar_set_status_icq(account, status); |
2993 | 5680 else |
9988 | 5681 oscar_set_status_aim(account, status); |
2993 | 5682 |
5683 return; | |
2086 | 5684 } |
5685 | |
9991 | 5686 static void |
5687 oscar_warn(GaimConnection *gc, const char *name, gboolean anonymous) { | |
7283 | 5688 OscarData *od = (OscarData *)gc->proto_data; |
9753 | 5689 aim_im_warn(od->sess, od->conn, name, anonymous ? AIM_WARN_ANON : 0); |
2086 | 5690 } |
5691 | |
9285 | 5692 static void oscar_add_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *group) { |
7283 | 5693 OscarData *od = (OscarData *)gc->proto_data; |
9285 | 5694 |
5695 if (!aim_snvalid(buddy->name)) { | |
8092 | 5696 gchar *buf; |
9285 | 5697 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 | 5698 if (!gaim_conv_present_error(buddy->name, gaim_connection_get_account(gc), buf)) |
5699 gaim_notify_error(gc, NULL, _("Unable To Add"), buf); | |
8092 | 5700 g_free(buf); |
8150 | 5701 |
5702 /* Remove from local list */ | |
9285 | 5703 gaim_blist_remove_buddy(buddy); |
8150 | 5704 |
8092 | 5705 return; |
5706 } | |
5707 | |
4230 | 5708 #ifdef NOSSI |
9285 | 5709 aim_buddylist_addbuddy(od->sess, od->conn, buddy->name); |
4230 | 5710 #else |
9285 | 5711 if ((od->sess->ssi.received_data) && !(aim_ssi_itemlist_finditem(od->sess->ssi.local, group->name, buddy->name, AIM_SSI_TYPE_BUDDY))) { |
5712 if (buddy && group) { | |
8660 | 5713 gaim_debug_info("oscar", |
9285 | 5714 "ssi: adding buddy %s to group %s\n", buddy->name, group->name); |
9620 | 5715 aim_ssi_addbuddy(od->sess, buddy->name, group->name, gaim_buddy_get_alias_only(buddy), NULL, NULL, 0); |
4230 | 5716 } |
5717 } | |
5718 #endif | |
8150 | 5719 |
4759 | 5720 if (od->icq) |
9285 | 5721 aim_icq_getalias(od->sess, buddy->name); |
5722 } | |
5723 | |
5724 static void oscar_add_buddies(GaimConnection *gc, GList *buddies, GList *groups) { | |
7283 | 5725 OscarData *od = (OscarData *)gc->proto_data; |
4230 | 5726 #ifdef NOSSI |
5727 char buf[MSG_LEN]; | |
5728 int n=0; | |
9285 | 5729 |
4230 | 5730 while (buddies) { |
9381 | 5731 GaimBuddy *buddy = buddies->data; |
4230 | 5732 if (n > MSG_LEN - 18) { |
7285 | 5733 aim_buddylist_set(od->sess, od->conn, buf); |
4230 | 5734 n = 0; |
3092 | 5735 } |
9381 | 5736 n += g_snprintf(buf + n, sizeof(buf) - n, "%s&", buddy->name); |
4230 | 5737 buddies = buddies->next; |
5738 } | |
7285 | 5739 aim_buddylist_set(od->sess, od->conn, buf); |
4230 | 5740 #else |
9285 | 5741 |
4230 | 5742 if (od->sess->ssi.received_data) { |
9285 | 5743 GList *curb = buddies; |
5744 GList *curg = groups; | |
5745 while ((curb != NULL) && (curg != NULL)) { | |
5746 GaimBuddy *buddy = curb->data; | |
5747 GaimGroup *group = curg->data; | |
5748 oscar_add_buddy(gc, buddy, group); | |
5749 curb = curb->next; | |
5750 curg = curg->next; | |
4230 | 5751 } |
5752 } | |
5753 #endif | |
5754 } | |
5755 | |
9285 | 5756 static void oscar_remove_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *group) { |
7283 | 5757 OscarData *od = (OscarData *)gc->proto_data; |
9285 | 5758 |
4230 | 5759 #ifdef NOSSI |
9285 | 5760 aim_buddylist_removebuddy(od->sess, od->conn, buddy->name); |
4230 | 5761 #else |
5762 if (od->sess->ssi.received_data) { | |
8660 | 5763 gaim_debug_info("oscar", |
9285 | 5764 "ssi: deleting buddy %s from group %s\n", buddy->name, group->name); |
5765 aim_ssi_delbuddy(od->sess, buddy->name, group->name); | |
4230 | 5766 } |
5767 #endif | |
5768 } | |
5769 | |
9285 | 5770 static void oscar_remove_buddies(GaimConnection *gc, GList *buddies, GList *groups) { |
7283 | 5771 OscarData *od = (OscarData *)gc->proto_data; |
9285 | 5772 |
4230 | 5773 #ifdef NOSSI |
9285 | 5774 for (cur = buddies; cur != NULL; cur = cur->next) { |
5775 GaimBuddy *buddy = cur->data; | |
5776 aim_buddylist_removebuddy(od->sess, od->conn, buddy->name); | |
5777 } | |
4230 | 5778 #else |
5779 if (od->sess->ssi.received_data) { | |
9285 | 5780 GList *curb = buddies; |
5781 GList *curg = groups; | |
5782 while ((curb != NULL) && (curg != NULL)) { | |
5783 GaimBuddy *buddy = curb->data; | |
5784 GaimGroup *group = curg->data; | |
5785 oscar_remove_buddy(gc, buddy, group); | |
5786 curb = curb->next; | |
5787 curg = curg->next; | |
3092 | 5788 } |
4230 | 5789 } |
5790 #endif | |
5791 } | |
5792 | |
5793 #ifndef NOSSI | |
5575 | 5794 static void oscar_move_buddy(GaimConnection *gc, const char *name, const char *old_group, const char *new_group) { |
7283 | 5795 OscarData *od = (OscarData *)gc->proto_data; |
4303 | 5796 if (od->sess->ssi.received_data && strcmp(old_group, new_group)) { |
8660 | 5797 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5798 "ssi: moving buddy %s from group %s to group %s\n", name, old_group, new_group); |
4889 | 5799 aim_ssi_movebuddy(od->sess, old_group, new_group, name); |
4269 | 5800 } |
5801 } | |
5802 | |
5575 | 5803 static void oscar_alias_buddy(GaimConnection *gc, const char *name, const char *alias) { |
7283 | 5804 OscarData *od = (OscarData *)gc->proto_data; |
4269 | 5805 if (od->sess->ssi.received_data) { |
5806 char *gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, name); | |
5807 if (gname) { | |
8660 | 5808 gaim_debug_info("oscar", |
9586 | 5809 "ssi: changing the alias for buddy %s to %s\n", name, alias ? alias : "(none)"); |
4889 | 5810 aim_ssi_aliasbuddy(od->sess, gname, name, alias); |
4269 | 5811 } |
5812 } | |
5813 } | |
5814 | |
9285 | 5815 static void oscar_rename_group(GaimConnection *gc, const char *old_name, GaimGroup *group, GList *moved_buddies) { |
8341 | 5816 OscarData *od = (OscarData *)gc->proto_data; |
4230 | 5817 |
5818 if (od->sess->ssi.received_data) { | |
9285 | 5819 if (aim_ssi_itemlist_finditem(od->sess->ssi.local, group->name, NULL, AIM_SSI_TYPE_GROUP)) { |
5820 GList *cur, *groups = NULL; | |
5821 | |
5822 /* Make a list of what the groups each buddy is in */ | |
5823 for (cur = moved_buddies; cur != NULL; cur = cur->next) { | |
5824 GaimBlistNode *node = cur->data; | |
5825 groups = g_list_append(groups, node->parent); | |
5826 } | |
5827 | |
5828 oscar_remove_buddies(gc, moved_buddies, groups); | |
5829 oscar_add_buddies(gc, moved_buddies, groups); | |
5830 g_list_free(groups); | |
8660 | 5831 gaim_debug_info("oscar", |
9285 | 5832 "ssi: moved all buddies from group %s to %s\n", old_name, group->name); |
4230 | 5833 } else { |
9285 | 5834 aim_ssi_rename_group(od->sess, old_name, group->name); |
8660 | 5835 gaim_debug_info("oscar", |
9285 | 5836 "ssi: renamed group %s to %s\n", old_name, group->name); |
2995 | 5837 } |
5838 } | |
5839 } | |
5840 | |
5968 | 5841 static gboolean gaim_ssi_rerequestdata(gpointer data) { |
5842 aim_session_t *sess = data; | |
6350 | 5843 aim_ssi_reqdata(sess); |
5968 | 5844 return FALSE; |
5845 } | |
5846 | |
4642 | 5847 static int gaim_ssi_parseerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 5848 GaimConnection *gc = sess->aux_data; |
7283 | 5849 OscarData *od = gc->proto_data; |
4642 | 5850 va_list ap; |
5851 fu16_t reason; | |
5852 | |
5853 va_start(ap, fr); | |
5854 reason = (fu16_t)va_arg(ap, unsigned int); | |
5855 va_end(ap); | |
5856 | |
8660 | 5857 gaim_debug_error("oscar", "ssi: SNAC error %hu\n", reason); |
4642 | 5858 |
5859 if (reason == 0x0005) { | |
5892 | 5860 gaim_notify_error(gc, NULL, _("Unable To Retrieve Buddy List"), |
5828 | 5861 _("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
|
5862 od->getblisttimer = gaim_timeout_add(300000, gaim_ssi_rerequestdata, od->sess); |
4642 | 5863 } |
5864 | |
5865 /* Activate SSI */ | |
5866 /* Sending the enable causes other people to be able to see you, and you to see them */ | |
5867 /* Make sure your privacy setting/invisibility is set how you want it before this! */ | |
8660 | 5868 gaim_debug_info("oscar", "ssi: activating server-stored buddy list\n"); |
4642 | 5869 aim_ssi_enable(od->sess); |
5870 | |
5871 return 1; | |
5872 } | |
5873 | |
2991 | 5874 static int gaim_ssi_parserights(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 5875 GaimConnection *gc = sess->aux_data; |
7283 | 5876 OscarData *od = (OscarData *)gc->proto_data; |
9982 | 5877 int i; |
5878 va_list ap; | |
5879 int numtypes; | |
4230 | 5880 fu16_t *maxitems; |
2991 | 5881 |
5882 va_start(ap, fr); | |
4230 | 5883 numtypes = va_arg(ap, int); |
5884 maxitems = va_arg(ap, fu16_t *); | |
2991 | 5885 va_end(ap); |
5886 | |
8660 | 5887 gaim_debug_misc("oscar", "ssi rights:"); |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
5888 |
4230 | 5889 for (i=0; i<numtypes; i++) |
8660 | 5890 gaim_debug_misc(NULL, " max type 0x%04x=%hd,", |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
5891 i, maxitems[i]); |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
5892 |
8660 | 5893 gaim_debug_misc(NULL, "\n"); |
4230 | 5894 |
5895 if (numtypes >= 0) | |
5896 od->rights.maxbuddies = maxitems[0]; | |
5897 if (numtypes >= 1) | |
5898 od->rights.maxgroups = maxitems[1]; | |
5899 if (numtypes >= 2) | |
5900 od->rights.maxpermits = maxitems[2]; | |
5901 if (numtypes >= 3) | |
5902 od->rights.maxdenies = maxitems[3]; | |
2991 | 5903 |
5904 return 1; | |
5905 } | |
5906 | |
5907 static int gaim_ssi_parselist(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 5908 GaimConnection *gc = sess->aux_data; |
5909 GaimAccount *account = gaim_connection_get_account(gc); | |
9988 | 5910 GaimStatus *status; |
7283 | 5911 OscarData *od = (OscarData *)gc->proto_data; |
8150 | 5912 GaimGroup *g; |
5913 GaimBuddy *b; | |
2995 | 5914 struct aim_ssi_item *curitem; |
2991 | 5915 int tmp; |
4230 | 5916 va_list ap; |
8219 | 5917 fu16_t fmtver, numitems; |
5918 struct aim_ssi_item *items; | |
5919 fu32_t timestamp; | |
4230 | 5920 |
5921 va_start(ap, fr); | |
5922 fmtver = (fu16_t)va_arg(ap, int); | |
5923 numitems = (fu16_t)va_arg(ap, int); | |
8219 | 5924 items = va_arg(ap, struct aim_ssi_item *); |
4230 | 5925 timestamp = va_arg(ap, fu32_t); |
8219 | 5926 va_end(ap); |
2991 | 5927 |
8660 | 5928 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5929 "ssi: syncing local list and server list\n"); |
2991 | 5930 |
8219 | 5931 if ((timestamp == 0) || (numitems == 0)) { |
8660 | 5932 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 | 5933 return 1; |
5934 } | |
5935 | |
2991 | 5936 /* Clean the buddy list */ |
4889 | 5937 aim_ssi_cleanlist(sess); |
2991 | 5938 |
8150 | 5939 { /* If not in server list then prune from local list */ |
5940 GaimBlistNode *gnode, *cnode, *bnode; | |
5941 GaimBuddyList *blist; | |
9539 | 5942 GSList *cur, *next; |
8150 | 5943 |
5944 /* Buddies */ | |
5945 cur = NULL; | |
5946 if ((blist = gaim_get_blist()) != NULL) { | |
5947 for (gnode = blist->root; gnode; gnode = gnode->next) { | |
5948 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
5949 continue; | |
5950 g = (GaimGroup *)gnode; | |
5951 for (cnode = gnode->child; cnode; cnode = cnode->next) { | |
5952 if(!GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
5953 continue; | |
5954 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
5955 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
5956 continue; | |
5957 b = (GaimBuddy *)bnode; | |
5958 if (b->account == gc->account) { | |
5959 if (aim_ssi_itemlist_exists(sess->ssi.local, b->name)) { | |
5960 /* If the buddy is an ICQ user then load his nickname */ | |
5961 const char *servernick = gaim_blist_node_get_string((GaimBlistNode*)b, "servernick"); | |
8214 | 5962 char *alias; |
8150 | 5963 if (servernick) |
5964 serv_got_alias(gc, b->name, servernick); | |
5965 | |
5966 /* Store local alias on server */ | |
8214 | 5967 alias = aim_ssi_getalias(sess->ssi.local, g->name, b->name); |
8150 | 5968 if (!alias && b->alias && strlen(b->alias)) |
5969 aim_ssi_aliasbuddy(sess, g->name, b->name, b->alias); | |
5970 free(alias); | |
5971 } else { | |
8660 | 5972 gaim_debug_info("oscar", |
8150 | 5973 "ssi: removing buddy %s from local list\n", b->name); |
5974 /* We can't actually remove now because it will screw up our looping */ | |
5975 cur = g_slist_prepend(cur, b); | |
5976 } | |
5977 } | |
5978 } | |
5979 } | |
5980 } | |
5981 } | |
8175 | 5982 |
8150 | 5983 while (cur != NULL) { |
5984 b = cur->data; | |
5985 cur = g_slist_remove(cur, b); | |
5986 gaim_blist_remove_buddy(b); | |
5987 } | |
5988 | |
5989 /* Permit list */ | |
5990 if (gc->account->permit) { | |
9539 | 5991 next = gc->account->permit; |
5992 while (next != NULL) { | |
5993 cur = next; | |
5994 next = next->next; | |
8150 | 5995 if (!aim_ssi_itemlist_finditem(sess->ssi.local, NULL, cur->data, AIM_SSI_TYPE_PERMIT)) { |
8660 | 5996 gaim_debug_info("oscar", |
8150 | 5997 "ssi: removing permit %s from local list\n", (const char *)cur->data); |
5998 gaim_privacy_permit_remove(account, cur->data, TRUE); | |
5999 } | |
9539 | 6000 } |
8150 | 6001 } |
6002 | |
6003 /* Deny list */ | |
6004 if (gc->account->deny) { | |
9539 | 6005 next = gc->account->deny; |
6006 while (next != NULL) { | |
6007 cur = next; | |
6008 next = next->next; | |
8150 | 6009 if (!aim_ssi_itemlist_finditem(sess->ssi.local, NULL, cur->data, AIM_SSI_TYPE_DENY)) { |
8660 | 6010 gaim_debug_info("oscar", |
8150 | 6011 "ssi: removing deny %s from local list\n", (const char *)cur->data); |
6012 gaim_privacy_deny_remove(account, cur->data, TRUE); | |
6013 } | |
9539 | 6014 } |
8150 | 6015 } |
6016 /* Presence settings (idle time visibility) */ | |
6017 if ((tmp = aim_ssi_getpresence(sess->ssi.local)) != 0xFFFFFFFF) | |
6018 if (!(tmp & 0x400)) | |
6019 aim_ssi_setpresence(sess, tmp | 0x400); | |
6020 } /* end pruning buddies from local list */ | |
6021 | |
2991 | 6022 /* Add from server list to local list */ |
4230 | 6023 for (curitem=sess->ssi.local; curitem; curitem=curitem->next) { |
7328 | 6024 if ((curitem->name == NULL) || (g_utf8_validate(curitem->name, -1, NULL))) |
2991 | 6025 switch (curitem->type) { |
4230 | 6026 case 0x0000: { /* Buddy */ |
4251 | 6027 if (curitem->name) { |
4292 | 6028 char *gname = aim_ssi_itemlist_findparentname(sess->ssi.local, curitem->name); |
7166 | 6029 char *gname_utf8 = gname ? gaim_utf8_try_convert(gname) : NULL; |
4282 | 6030 char *alias = aim_ssi_getalias(sess->ssi.local, gname, curitem->name); |
7166 | 6031 char *alias_utf8 = alias ? gaim_utf8_try_convert(alias) : NULL; |
8150 | 6032 b = gaim_find_buddy(gc->account, curitem->name); |
4458 | 6033 /* Should gname be freed here? -- elb */ |
4754 | 6034 /* Not with the current code, but that might be cleaner -- med */ |
4458 | 6035 free(alias); |
8150 | 6036 if (b) { |
4292 | 6037 /* Get server stored alias */ |
4705 | 6038 if (alias_utf8) { |
8150 | 6039 g_free(b->alias); |
6040 b->alias = g_strdup(alias_utf8); | |
4705 | 6041 } |
4282 | 6042 } else { |
8150 | 6043 b = gaim_buddy_new(gc->account, curitem->name, alias_utf8); |
5146 | 6044 |
4754 | 6045 if (!(g = gaim_find_group(gname_utf8 ? gname_utf8 : _("Orphans")))) { |
4687 | 6046 g = gaim_group_new(gname_utf8 ? gname_utf8 : _("Orphans")); |
4754 | 6047 gaim_blist_add_group(g, NULL); |
6048 } | |
5146 | 6049 |
8660 | 6050 gaim_debug_info("oscar", |
9285 | 6051 "ssi: adding buddy %s to group %s to local list\n", curitem->name, gname_utf8 ? gname_utf8 : _("Orphans")); |
8150 | 6052 gaim_blist_add_buddy(b, NULL, g, NULL); |
4251 | 6053 } |
8341 | 6054 if (!aim_sncmp(curitem->name, account->username)) { |
6055 char *comment = aim_ssi_getcomment(sess->ssi.local, gname, curitem->name); | |
6056 gaim_check_comment(od, comment); | |
6057 free(comment); | |
6058 } | |
7162 | 6059 g_free(gname_utf8); |
6060 g_free(alias_utf8); | |
2991 | 6061 } |
4230 | 6062 } break; |
6063 | |
6064 case 0x0001: { /* Group */ | |
4282 | 6065 /* Shouldn't add empty groups */ |
4230 | 6066 } break; |
6067 | |
6068 case 0x0002: { /* Permit buddy */ | |
2991 | 6069 if (curitem->name) { |
4230 | 6070 /* if (!find_permdeny_by_name(gc->permit, curitem->name)) { AAA */ |
2991 | 6071 GSList *list; |
5575 | 6072 for (list=account->permit; (list && aim_sncmp(curitem->name, list->data)); list=list->next); |
2991 | 6073 if (!list) { |
8660 | 6074 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6075 "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
|
6076 gaim_privacy_permit_add(account, curitem->name, TRUE); |
2991 | 6077 } |
6078 } | |
4230 | 6079 } break; |
6080 | |
6081 case 0x0003: { /* Deny buddy */ | |
2991 | 6082 if (curitem->name) { |
6083 GSList *list; | |
5575 | 6084 for (list=account->deny; (list && aim_sncmp(curitem->name, list->data)); list=list->next); |
2991 | 6085 if (!list) { |
8660 | 6086 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6087 "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
|
6088 gaim_privacy_deny_add(account, curitem->name, TRUE); |
2991 | 6089 } |
6090 } | |
4230 | 6091 } break; |
6092 | |
6093 case 0x0004: { /* Permit/deny setting */ | |
2991 | 6094 if (curitem->data) { |
6095 fu8_t permdeny; | |
5575 | 6096 if ((permdeny = aim_ssi_getpermdeny(sess->ssi.local)) && (permdeny != account->perm_deny)) { |
8660 | 6097 gaim_debug_info("oscar", |
5575 | 6098 "ssi: changing permdeny from %d to %hhu\n", account->perm_deny, permdeny); |
6099 account->perm_deny = permdeny; | |
6100 if (od->icq && account->perm_deny == 0x03) { | |
9991 | 6101 gaim_presence_switch_status(account->presence, OSCAR_STATUS_ID_INVISIBLE); |
4342 | 6102 } |
2991 | 6103 } |
6104 } | |
4230 | 6105 } break; |
6106 | |
6107 case 0x0005: { /* Presence setting */ | |
3109 | 6108 /* We don't want to change Gaim's setting because it applies to all accounts */ |
4230 | 6109 } break; |
2991 | 6110 } /* End of switch on curitem->type */ |
6111 } /* End of for loop */ | |
4230 | 6112 |
9991 | 6113 /* |
6114 * XXX - STATUS - Set our ICQ status. We probably don't want to do | |
6115 * this. We probably want the SSI status setting to override the local | |
6116 * setting. | |
6117 */ | |
9982 | 6118 status = gaim_presence_get_active_status(account->presence); |
6119 if (gaim_status_is_available(status)) | |
4901 | 6120 aim_setextstatus(sess, AIM_ICQ_STATE_NORMAL); |
6121 | |
4342 | 6122 /* Activate SSI */ |
6123 /* Sending the enable causes other people to be able to see you, and you to see them */ | |
6124 /* Make sure your privacy setting/invisibility is set how you want it before this! */ | |
8660 | 6125 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6126 "ssi: activating server-stored buddy list\n"); |
4642 | 6127 aim_ssi_enable(sess); |
4342 | 6128 |
2991 | 6129 return 1; |
2086 | 6130 } |
4230 | 6131 |
6132 static int gaim_ssi_parseack(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 6133 GaimConnection *gc = sess->aux_data; |
4230 | 6134 va_list ap; |
6135 struct aim_ssi_tmp *retval; | |
6136 | |
6137 va_start(ap, fr); | |
6138 retval = va_arg(ap, struct aim_ssi_tmp *); | |
6139 va_end(ap); | |
6140 | |
6141 while (retval) { | |
8660 | 6142 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6143 "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 | 6144 |
6145 if (retval->ack != 0xffff) | |
6146 switch (retval->ack) { | |
6147 case 0x0000: { /* added successfully */ | |
6148 } break; | |
6149 | |
4829 | 6150 case 0x000c: { /* you are over the limit, the cheat is to the limit, come on fhqwhgads */ |
6151 gchar *buf; | |
6152 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 | 6153 if ((retval->name != NULL) && !gaim_conv_present_error(retval->name, gaim_connection_get_account(gc), buf)) |
9627 | 6154 gaim_notify_error(gc, NULL, _("Unable To Add"), buf); |
4829 | 6155 g_free(buf); |
6156 } | |
6157 | |
7023 | 6158 case 0x000e: { /* buddy requires authorization */ |
4828 | 6159 if ((retval->action == AIM_CB_SSI_ADD) && (retval->name)) |
4269 | 6160 gaim_auth_sendrequest(gc, retval->name); |
4230 | 6161 } break; |
6162 | |
6163 default: { /* La la la */ | |
5197 | 6164 gchar *buf; |
8660 | 6165 gaim_debug_error("oscar", "ssi: Action 0x%04hx was unsuccessful with error 0x%04hx\n", retval->action, retval->ack); |
5402 | 6166 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 | 6167 if ((retval->name != NULL) && !gaim_conv_present_error(retval->name, gaim_connection_get_account(gc), buf)) |
9627 | 6168 gaim_notify_error(gc, NULL, _("Unable To Add"), buf); |
5197 | 6169 g_free(buf); |
4230 | 6170 } break; |
6171 } | |
6172 | |
6173 retval = retval->next; | |
6174 } | |
6175 | |
6176 return 1; | |
6177 } | |
6178 | |
8227 | 6179 static int gaim_ssi_parseadd(aim_session_t *sess, aim_frame_t *fr, ...) { |
6180 GaimConnection *gc = sess->aux_data; | |
6181 char *gname, *gname_utf8, *alias, *alias_utf8; | |
6182 GaimBuddy *b; | |
6183 GaimGroup *g; | |
6184 va_list ap; | |
6185 fu16_t type; | |
6186 const char *name; | |
6187 | |
6188 va_start(ap, fr); | |
6189 type = (fu16_t)va_arg(ap, int); | |
6190 name = va_arg(ap, char *); | |
6191 va_end(ap); | |
6192 | |
6193 if ((type != 0x0000) || (name == NULL)) | |
6194 return 1; | |
6195 | |
6196 gname = aim_ssi_itemlist_findparentname(sess->ssi.local, name); | |
6197 gname_utf8 = gname ? gaim_utf8_try_convert(gname) : NULL; | |
6198 alias = aim_ssi_getalias(sess->ssi.local, gname, name); | |
6199 alias_utf8 = alias ? gaim_utf8_try_convert(alias) : NULL; | |
6200 b = gaim_find_buddy(gc->account, name); | |
6201 free(alias); | |
6202 | |
6203 if (b) { | |
6204 /* Get server stored alias */ | |
6205 if (alias_utf8) { | |
6206 g_free(b->alias); | |
6207 b->alias = g_strdup(alias_utf8); | |
6208 } | |
6209 } else { | |
6210 b = gaim_buddy_new(gc->account, name, alias_utf8); | |
6211 | |
6212 if (!(g = gaim_find_group(gname_utf8 ? gname_utf8 : _("Orphans")))) { | |
6213 g = gaim_group_new(gname_utf8 ? gname_utf8 : _("Orphans")); | |
6214 gaim_blist_add_group(g, NULL); | |
6215 } | |
6216 | |
8660 | 6217 gaim_debug_info("oscar", |
9285 | 6218 "ssi: adding buddy %s to group %s to local list\n", name, gname_utf8 ? gname_utf8 : _("Orphans")); |
8227 | 6219 gaim_blist_add_buddy(b, NULL, g, NULL); |
6220 } | |
6221 g_free(gname_utf8); | |
6222 g_free(alias_utf8); | |
6223 | |
6224 return 1; | |
6225 } | |
6226 | |
4230 | 6227 static int gaim_ssi_authgiven(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 6228 GaimConnection *gc = sess->aux_data; |
4230 | 6229 va_list ap; |
6230 char *sn, *msg; | |
4236 | 6231 gchar *dialog_msg, *nombre; |
4230 | 6232 struct name_data *data; |
6695 | 6233 GaimBuddy *buddy; |
4230 | 6234 |
6235 va_start(ap, fr); | |
6236 sn = va_arg(ap, char *); | |
6237 msg = va_arg(ap, char *); | |
6238 va_end(ap); | |
6239 | |
8660 | 6240 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6241 "ssi: %s has given you permission to add him to your buddy list\n", sn); |
4230 | 6242 |
4687 | 6243 buddy = gaim_find_buddy(gc->account, sn); |
9620 | 6244 if (buddy && (gaim_buddy_get_alias_only(buddy))) |
6245 nombre = g_strdup_printf("%s (%s)", sn, gaim_buddy_get_alias_only(buddy)); | |
4236 | 6246 else |
6247 nombre = g_strdup(sn); | |
6248 | |
6249 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 | 6250 data = g_new(struct name_data, 1); |
6251 data->gc = gc; | |
6252 data->name = g_strdup(sn); | |
6253 data->nick = NULL; | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6254 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6255 gaim_request_yes_no(gc, NULL, _("Authorization Given"), dialog_msg, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6256 0, data, |
7023 | 6257 G_CALLBACK(gaim_icq_buddyadd), |
5836 | 6258 G_CALLBACK(oscar_free_name_data)); |
4236 | 6259 |
4230 | 6260 g_free(dialog_msg); |
4236 | 6261 g_free(nombre); |
4230 | 6262 |
6263 return 1; | |
6264 } | |
6265 | |
6266 static int gaim_ssi_authrequest(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 6267 GaimConnection *gc = sess->aux_data; |
4230 | 6268 va_list ap; |
6269 char *sn, *msg; | |
4236 | 6270 gchar *dialog_msg, *nombre; |
4230 | 6271 struct name_data *data; |
6695 | 6272 GaimBuddy *buddy; |
4230 | 6273 |
6274 va_start(ap, fr); | |
6275 sn = va_arg(ap, char *); | |
6276 msg = va_arg(ap, char *); | |
6277 va_end(ap); | |
6278 | |
8660 | 6279 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6280 "ssi: received authorization request from %s\n", sn); |
4230 | 6281 |
4687 | 6282 buddy = gaim_find_buddy(gc->account, sn); |
9620 | 6283 if (buddy && (gaim_buddy_get_alias_only(buddy))) |
6284 nombre = g_strdup_printf("%s (%s)", sn, gaim_buddy_get_alias_only(buddy)); | |
4236 | 6285 else |
6286 nombre = g_strdup(sn); | |
6287 | |
4337 | 6288 dialog_msg = g_strdup_printf(_("The user %s wants to add you to their buddy list for the following reason:\n%s"), nombre, msg ? msg : _("No reason given.")); |
4230 | 6289 data = g_new(struct name_data, 1); |
6290 data->gc = gc; | |
6291 data->name = g_strdup(sn); | |
6292 data->nick = NULL; | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6293 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6294 gaim_request_action(gc, NULL, _("Authorization Request"), dialog_msg, |
9972 | 6295 GAIM_DEFAULT_ACTION_NONE, data, 2, |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6296 _("Authorize"), G_CALLBACK(gaim_auth_grant), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6297 _("Deny"), G_CALLBACK(gaim_auth_dontgrant_msgprompt)); |
4236 | 6298 |
4230 | 6299 g_free(dialog_msg); |
4236 | 6300 g_free(nombre); |
4230 | 6301 |
6302 return 1; | |
6303 } | |
6304 | |
6305 static int gaim_ssi_authreply(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 6306 GaimConnection *gc = sess->aux_data; |
4230 | 6307 va_list ap; |
6308 char *sn, *msg; | |
4236 | 6309 gchar *dialog_msg, *nombre; |
4230 | 6310 fu8_t reply; |
6695 | 6311 GaimBuddy *buddy; |
4230 | 6312 |
6313 va_start(ap, fr); | |
6314 sn = va_arg(ap, char *); | |
6315 reply = (fu8_t)va_arg(ap, int); | |
6316 msg = va_arg(ap, char *); | |
6317 va_end(ap); | |
6318 | |
8660 | 6319 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6320 "ssi: received authorization reply from %s. Reply is 0x%04hhx\n", sn, reply); |
4236 | 6321 |
4687 | 6322 buddy = gaim_find_buddy(gc->account, sn); |
9620 | 6323 if (buddy && (gaim_buddy_get_alias_only(buddy))) |
6324 nombre = g_strdup_printf("%s (%s)", sn, gaim_buddy_get_alias_only(buddy)); | |
4236 | 6325 else |
6326 nombre = g_strdup(sn); | |
6327 | |
4230 | 6328 if (reply) { |
6329 /* Granted */ | |
7023 | 6330 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
|
6331 gaim_notify_info(gc, NULL, _("Authorization Granted"), dialog_msg); |
4230 | 6332 } else { |
6333 /* Denied */ | |
7023 | 6334 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
|
6335 gaim_notify_info(gc, NULL, _("Authorization Denied"), dialog_msg); |
4230 | 6336 } |
6337 g_free(dialog_msg); | |
4236 | 6338 g_free(nombre); |
4230 | 6339 |
6340 return 1; | |
6341 } | |
6342 | |
6343 static int gaim_ssi_gotadded(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 6344 GaimConnection *gc = sess->aux_data; |
4230 | 6345 va_list ap; |
6346 char *sn; | |
6695 | 6347 GaimBuddy *buddy; |
4230 | 6348 |
6349 va_start(ap, fr); | |
6350 sn = va_arg(ap, char *); | |
6351 va_end(ap); | |
6352 | |
4687 | 6353 buddy = gaim_find_buddy(gc->account, sn); |
8660 | 6354 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6355 "ssi: %s added you to their buddy list\n", sn); |
9620 | 6356 gaim_account_notify_added(gc->account, NULL, sn, (buddy ? gaim_buddy_get_alias_only(buddy) : NULL), NULL); |
4230 | 6357 |
6358 return 1; | |
6359 } | |
4269 | 6360 #endif |
2086 | 6361 |
5575 | 6362 static GList *oscar_chat_info(GaimConnection *gc) { |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6363 GList *m = NULL; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6364 struct proto_chat_entry *pce; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6365 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6366 pce = g_new0(struct proto_chat_entry, 1); |
9770 | 6367 pce->label = _("_Room:"); |
5234 | 6368 pce->identifier = "room"; |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6369 m = g_list_append(m, pce); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6370 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6371 pce = g_new0(struct proto_chat_entry, 1); |
7841 | 6372 pce->label = _("_Exchange:"); |
5234 | 6373 pce->identifier = "exchange"; |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6374 pce->is_int = TRUE; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6375 pce->min = 4; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6376 pce->max = 20; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6377 m = g_list_append(m, pce); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6378 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6379 return m; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6380 } |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6381 |
9754 | 6382 GHashTable *oscar_chat_info_defaults(GaimConnection *gc, const char *chat_name) |
6383 { | |
6384 GHashTable *defaults; | |
6385 | |
6386 defaults = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free); | |
6387 | |
6388 if (chat_name != NULL) | |
6389 g_hash_table_insert(defaults, "room", g_strdup(chat_name)); | |
6390 | |
6391 return defaults; | |
6392 } | |
6393 | |
9917 | 6394 static char *oscar_get_chat_name(GHashTable *data) { |
6395 return g_strdup(g_hash_table_lookup(data, "room")); | |
6396 } | |
6397 | |
8308 | 6398 static void oscar_join_chat(GaimConnection *gc, GHashTable *data) { |
6399 OscarData *od = (OscarData *)gc->proto_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6400 aim_conn_t *cur; |
5234 | 6401 char *name, *exchange; |
6402 | |
6403 name = g_hash_table_lookup(data, "room"); | |
6404 exchange = g_hash_table_lookup(data, "exchange"); | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
6405 |
8660 | 6406 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6407 "Attempting to join chat room %s.\n", name); |
8308 | 6408 |
6409 if ((name == NULL) || (*name == '\0')) { | |
6410 gaim_notify_error(gc, NULL, _("Invalid chat name specified."), NULL); | |
6411 return; | |
6412 } | |
6413 | |
4617 | 6414 if ((cur = aim_getconn_type(od->sess, AIM_CONN_TYPE_CHATNAV))) { |
8660 | 6415 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6416 "chatnav exists, creating room\n"); |
5234 | 6417 aim_chatnav_createroom(od->sess, cur, name, atoi(exchange)); |
2086 | 6418 } else { |
6419 /* this gets tricky */ | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
6420 struct create_room *cr = g_new0(struct create_room, 1); |
8660 | 6421 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6422 "chatnav does not exist, opening chatnav\n"); |
5234 | 6423 cr->exchange = atoi(exchange); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
6424 cr->name = g_strdup(name); |
4617 | 6425 od->create_rooms = g_slist_append(od->create_rooms, cr); |
6426 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_CHATNAV); | |
2086 | 6427 } |
6428 } | |
6429 | |
8308 | 6430 static void oscar_chat_invite(GaimConnection *gc, int id, const char *message, const char *name) { |
6431 OscarData *od = (OscarData *)gc->proto_data; | |
6432 struct chat_connection *ccon = find_oscar_chat(gc, id); | |
2086 | 6433 |
6434 if (!ccon) | |
6435 return; | |
6436 | |
8225 | 6437 aim_im_sendch2_chatinvite(od->sess, name, message ? message : "", |
2086 | 6438 ccon->exchange, ccon->name, 0x0); |
6439 } | |
6440 | |
8308 | 6441 static void oscar_chat_leave(GaimConnection *gc, int id) { |
6442 OscarData *od = gc ? (OscarData *)gc->proto_data : NULL; | |
6443 GSList *bcs = gc->buddy_chats; | |
5679 | 6444 GaimConversation *b = NULL; |
2086 | 6445 struct chat_connection *c = NULL; |
6446 int count = 0; | |
6447 | |
6448 while (bcs) { | |
6449 count++; | |
5679 | 6450 b = (GaimConversation *)bcs->data; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
6451 if (id == gaim_conv_chat_get_id(GAIM_CONV_CHAT(b))) |
2086 | 6452 break; |
6453 bcs = bcs->next; | |
6454 b = NULL; | |
6455 } | |
6456 | |
6457 if (!b) | |
6458 return; | |
6459 | |
8660 | 6460 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6461 "Attempting to leave room %s (currently in %d rooms)\n", b->name, count); |
2086 | 6462 |
8308 | 6463 c = find_oscar_chat(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(b))); |
2086 | 6464 if (c != NULL) { |
4617 | 6465 if (od) |
6466 od->oscar_chats = g_slist_remove(od->oscar_chats, c); | |
2086 | 6467 if (c->inpa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
6468 gaim_input_remove(c->inpa); |
8308 | 6469 if (gc && od->sess) |
4617 | 6470 aim_conn_kill(od->sess, &c->conn); |
2086 | 6471 g_free(c->name); |
6472 g_free(c->show); | |
6473 g_free(c); | |
6474 } | |
6475 /* we do this because with Oscar it doesn't tell us we left */ | |
8308 | 6476 serv_got_chat_left(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(b))); |
2086 | 6477 } |
6478 | |
8219 | 6479 static int oscar_send_chat(GaimConnection *gc, int id, const char *message) { |
6480 OscarData *od = (OscarData *)gc->proto_data; | |
6481 GaimConversation *conv = NULL; | |
2086 | 6482 struct chat_connection *c = NULL; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
6483 char *buf, *buf2; |
9830 | 6484 fu16_t charset, charsubset; |
9807 | 6485 char *charsetstr = NULL; |
8907 | 6486 gsize len; |
8219 | 6487 |
6488 if (!(conv = gaim_find_chat(gc, id))) | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
6489 return -EINVAL; |
2086 | 6490 |
8219 | 6491 if (!(c = find_oscar_chat_by_conv(gc, conv))) |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
6492 return -EINVAL; |
2086 | 6493 |
8219 | 6494 buf = gaim_strdup_withhtml(message); |
6495 len = strlen(buf); | |
6496 | |
8962 | 6497 if (strstr(buf, "<IMG ")) |
6498 gaim_conversation_write(conv, "", | |
6499 _("Your IM Image was not sent. " | |
6500 "You cannot send IM Images in AIM chats."), | |
6501 GAIM_MESSAGE_ERROR, time(NULL)); | |
6502 | |
9830 | 6503 gaim_plugin_oscar_convert_to_best_encoding(gc, NULL, buf, &buf2, &len, &charset, &charsubset); |
8359 | 6504 if ((len > c->maxlen) || (len > c->maxvis)) { |
6505 g_free(buf2); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
6506 return -E2BIG; |
8359 | 6507 } |
6508 | |
9831 | 6509 if (charset == AIM_CHARSET_ASCII) |
6510 charsetstr = "us-ascii"; | |
6511 else if (charset == AIM_CHARSET_UNICODE) | |
6512 charsetstr = "unicode-2-0"; | |
6513 else if (charset == AIM_CHARSET_CUSTOM) | |
6514 charsetstr = "iso-8859-1"; | |
9807 | 6515 aim_chat_send_im(od->sess, c->conn, 0, buf2, len, charsetstr, "en"); |
8219 | 6516 g_free(buf2); |
8359 | 6517 |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
6518 return 0; |
2086 | 6519 } |
6520 | |
10042 | 6521 static const char *oscar_list_icon(GaimAccount *a, GaimBuddy *b) |
6522 { | |
4766 | 6523 if (!b || (b && b->name && b->name[0] == '+')) { |
9975 | 6524 if (a != NULL && aim_sn_is_icq(gaim_account_get_username(a))) |
4687 | 6525 return "icq"; |
6526 else | |
6527 return "aim"; | |
6528 } | |
5646
48c63ee49961
[gaim-migrate @ 6060]
Christian Hammond <chipx86@chipx86.com>
parents:
5638
diff
changeset
|
6529 |
9975 | 6530 if (b != NULL && aim_sn_is_icq(b->name)) |
4687 | 6531 return "icq"; |
6532 return "aim"; | |
6533 } | |
6534 | |
9972 | 6535 static void oscar_list_emblems(GaimBuddy *b, const char **se, const char **sw, const char **nw, const char **ne) |
4687 | 6536 { |
7334 | 6537 GaimConnection *gc = NULL; |
6538 OscarData *od = NULL; | |
10042 | 6539 GaimAccount *account = NULL; |
6540 GaimPresence *presence; | |
6541 GaimStatus *status; | |
6542 const char *status_id; | |
4687 | 6543 char *emblems[4] = {NULL,NULL,NULL,NULL}; |
6544 int i = 0; | |
7334 | 6545 aim_userinfo_t *userinfo = NULL; |
6546 | |
6547 if (b != NULL) | |
6548 account = b->account; | |
6549 if (account != NULL) | |
6550 gc = account->gc; | |
6551 if (gc != NULL) | |
6552 od = gc->proto_data; | |
7945 | 6553 if (od != NULL) |
6554 userinfo = aim_locate_finduserinfo(od->sess, b->name); | |
4687 | 6555 |
10042 | 6556 presence = gaim_buddy_get_presence(b); |
6557 status = gaim_presence_get_active_status(presence); | |
6558 status_id = gaim_status_get_id(status); | |
6559 | |
6560 if (gaim_presence_is_online(presence) == FALSE) { | |
5131 | 6561 char *gname; |
7334 | 6562 if ((b->name) && (od) && (od->sess->ssi.received_data) && |
5131 | 6563 (gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, b->name)) && |
6564 (aim_ssi_waitingforauth(od->sess->ssi.local, gname, b->name))) { | |
6565 emblems[i++] = "notauthorized"; | |
6566 } else { | |
6567 emblems[i++] = "offline"; | |
6568 } | |
6569 } | |
4916 | 6570 |
10042 | 6571 if (b->name && aim_sn_is_icq(b->name)) { |
6572 if (!strcmp(status_id, OSCAR_STATUS_ID_INVISIBLE)) | |
6573 emblems[i++] = "invisible"; | |
6574 else if (!strcmp(status_id, OSCAR_STATUS_ID_FREE4CHAT)) | |
4960 | 6575 emblems[i++] = "freeforchat"; |
10042 | 6576 else if (!strcmp(status_id, OSCAR_STATUS_ID_DND)) |
4960 | 6577 emblems[i++] = "dnd"; |
10042 | 6578 else if (!strcmp(status_id, OSCAR_STATUS_ID_NA)) |
4960 | 6579 emblems[i++] = "na"; |
10042 | 6580 else if (!strcmp(status_id, OSCAR_STATUS_ID_OCCUPIED)) |
4960 | 6581 emblems[i++] = "occupied"; |
10042 | 6582 else if (!strcmp(status_id, OSCAR_STATUS_ID_AWAY)) |
4766 | 6583 emblems[i++] = "away"; |
10042 | 6584 } else if (!strcmp(status_id, OSCAR_STATUS_ID_AWAY)) { |
6585 emblems[i++] = "away"; | |
6586 } | |
6587 | |
6588 if (userinfo != NULL ) { | |
6589 /* if (userinfo->flags & AIM_FLAG_UNCONFIRMED) | |
6590 emblems[i++] = "unconfirmed"; */ | |
6591 if (userinfo->flags & AIM_FLAG_ADMINISTRATOR) | |
6592 emblems[i++] = "admin"; | |
6593 if (userinfo->flags & AIM_FLAG_AOL) | |
6594 emblems[i++] = "aol"; | |
6595 if (userinfo->flags & AIM_FLAG_WIRELESS) | |
6596 emblems[i++] = "wireless"; | |
6597 if (userinfo->flags & AIM_FLAG_ACTIVEBUDDY) | |
6598 emblems[i++] = "activebuddy"; | |
6599 | |
6600 if ((i < 4) && (userinfo->capabilities & AIM_CAPS_HIPTOP)) | |
7945 | 6601 emblems[i++] = "hiptop"; |
6602 | |
10042 | 6603 if ((i < 4) && (userinfo->capabilities & AIM_CAPS_SECUREIM)) |
7334 | 6604 emblems[i++] = "secure"; |
10042 | 6605 } |
7334 | 6606 |
4687 | 6607 *se = emblems[0]; |
6608 *sw = emblems[1]; | |
6609 *nw = emblems[2]; | |
6610 *ne = emblems[3]; | |
6611 } | |
6612 | |
6695 | 6613 static char *oscar_tooltip_text(GaimBuddy *b) { |
5575 | 6614 GaimConnection *gc = b->account->gc; |
7283 | 6615 OscarData *od = gc->proto_data; |
7045 | 6616 aim_userinfo_t *userinfo = aim_locate_finduserinfo(od->sess, b->name); |
8701 | 6617 GString *str = g_string_new(""); |
5131 | 6618 |
6619 if (GAIM_BUDDY_IS_ONLINE(b)) { | |
8701 | 6620 oscar_string_append_info(gc, str, "\n", b, userinfo); |
7011 | 6621 |
6622 if ((userinfo != NULL) && (userinfo->flags & AIM_FLAG_AWAY) && (userinfo->away_len > 0) && (userinfo->away != NULL) && (userinfo->away_encoding != NULL)) { | |
8225 | 6623 gchar *charset = oscar_encoding_extract(userinfo->away_encoding); |
8392 | 6624 gchar *away_utf8 = oscar_encoding_to_utf8(charset, userinfo->away, userinfo->away_len); |
8225 | 6625 g_free(charset); |
7011 | 6626 if (away_utf8 != NULL) { |
7091 | 6627 gchar *tmp1, *tmp2; |
9627 | 6628 tmp2 = gaim_markup_strip_html(away_utf8); |
8341 | 6629 g_free(away_utf8); |
8571 | 6630 tmp1 = gaim_escape_html(tmp2); |
7091 | 6631 g_free(tmp2); |
8700 | 6632 tmp2 = gaim_str_sub_away_formatters(tmp1, gaim_account_get_username(gaim_connection_get_account(gc))); |
8461 | 6633 g_free(tmp1); |
8701 | 6634 g_string_append_printf(str, "\n<b>%s:</b> %s", _("Away Message"), tmp2); |
8700 | 6635 g_free(tmp2); |
5836 | 6636 } |
5131 | 6637 } |
8701 | 6638 } |
6639 | |
6640 return g_string_free(str, FALSE); | |
5131 | 6641 } |
6642 | |
10042 | 6643 static char *oscar_status_text(GaimBuddy *b) |
6644 { | |
6645 GaimConnection *gc; | |
6646 OscarData *od; | |
6647 GaimStatus *status; | |
5167 | 6648 gchar *ret = NULL; |
6649 | |
10042 | 6650 gc = gaim_account_get_connection(gaim_buddy_get_account(b)); |
6651 od = gc->proto_data; | |
6652 status = gaim_presence_get_active_status(gaim_buddy_get_presence(b)); | |
6653 | |
6654 if (gaim_status_is_available(status) == FALSE || (((b->uc & 0xffff0000) >> 16) & AIM_ICQ_STATE_CHAT)) { | |
9975 | 6655 if (aim_sn_is_icq(b->name)) |
8701 | 6656 ret = oscar_icqstatus((b->uc & 0xffff0000) >> 16); |
7038 | 6657 else |
6658 ret = g_strdup(_("Away")); | |
5836 | 6659 } else if (GAIM_BUDDY_IS_ONLINE(b)) { |
7261 | 6660 struct buddyinfo *bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(b->account, b->name)); |
6292 | 6661 if (bi->availmsg) |
6662 ret = g_markup_escape_text(bi->availmsg, strlen(bi->availmsg)); | |
5836 | 6663 } else { |
5167 | 6664 char *gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, b->name); |
6665 if (aim_ssi_waitingforauth(od->sess->ssi.local, gname, b->name)) | |
6666 ret = g_strdup(_("Not Authorized")); | |
6667 else | |
6668 ret = g_strdup(_("Offline")); | |
6669 } | |
6670 | |
6671 return ret; | |
6672 } | |
6673 | |
5842 | 6674 |
5844 | 6675 static int oscar_icon_req(aim_session_t *sess, aim_frame_t *fr, ...) { |
5842 | 6676 GaimConnection *gc = sess->aux_data; |
7283 | 6677 OscarData *od = gc->proto_data; |
5892 | 6678 va_list ap; |
5842 | 6679 fu16_t type; |
5892 | 6680 fu8_t flags = 0, length = 0; |
6681 char *md5 = NULL; | |
6682 | |
7334 | 6683 |
5842 | 6684 va_start(ap, fr); |
6685 type = va_arg(ap, int); | |
5892 | 6686 |
6687 switch(type) { | |
6688 case 0x0000: | |
6689 case 0x0001: { | |
6690 flags = va_arg(ap, int); | |
6691 length = va_arg(ap, int); | |
6692 md5 = va_arg(ap, char *); | |
6693 | |
6694 if (flags == 0x41) { | |
6695 if (!aim_getconn_type(od->sess, AIM_CONN_TYPE_ICON) && !od->iconconnecting) { | |
6696 od->iconconnecting = TRUE; | |
6697 od->set_icon = TRUE; | |
6698 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_ICON); | |
6699 } else { | |
6039 | 6700 struct stat st; |
6701 const char *iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc)); | |
6702 if (iconfile == NULL) { | |
8363 | 6703 aim_ssi_delicon(od->sess); |
6039 | 6704 } else if (!stat(iconfile, &st)) { |
6705 char *buf = g_malloc(st.st_size); | |
6706 FILE *file = fopen(iconfile, "rb"); | |
6707 if (file) { | |
9532 | 6708 /* XXX - Use g_file_get_contents()? */ |
6039 | 6709 fread(buf, 1, st.st_size, file); |
6710 fclose(file); | |
8660 | 6711 gaim_debug_info("oscar", |
10042 | 6712 "Uploading icon to icon server\n"); |
6879 | 6713 aim_bart_upload(od->sess, buf, st.st_size); |
5892 | 6714 } else |
8660 | 6715 gaim_debug_error("oscar", |
10042 | 6716 "Can't open buddy icon file!\n"); |
6039 | 6717 g_free(buf); |
6718 } else { | |
8660 | 6719 gaim_debug_error("oscar", |
10042 | 6720 "Can't stat buddy icon file!\n"); |
5892 | 6721 } |
6722 } | |
8363 | 6723 } else if (flags == 0x81) { |
6724 const char *iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc)); | |
6725 if (iconfile == NULL) | |
6726 aim_ssi_delicon(od->sess); | |
6727 else | |
6728 aim_ssi_seticon(od->sess, md5, length); | |
6729 } | |
5892 | 6730 } break; |
6731 | |
6732 case 0x0002: { /* We just set an "available" message? */ | |
6733 } break; | |
6734 } | |
6735 | |
5842 | 6736 va_end(ap); |
5844 | 6737 |
6738 return 0; | |
5842 | 6739 } |
5892 | 6740 |
5575 | 6741 static void oscar_set_permit_deny(GaimConnection *gc) { |
6742 GaimAccount *account = gaim_connection_get_account(gc); | |
7283 | 6743 OscarData *od = (OscarData *)gc->proto_data; |
4230 | 6744 #ifdef NOSSI |
8143 | 6745 GSList *list; |
4230 | 6746 char buf[MAXMSGLEN]; |
6747 int at; | |
6748 | |
5575 | 6749 switch(account->perm_deny) { |
8175 | 6750 case GAIM_PRIVACY_ALLOW_ALL: |
5575 | 6751 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_DENYADD, gaim_account_get_username(account)); |
4230 | 6752 break; |
8175 | 6753 case GAIM_PRIVACY_DENY_ALL: |
5575 | 6754 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_PERMITADD, gaim_account_get_username(account)); |
4230 | 6755 break; |
8175 | 6756 case GAIM_PRIVACY_ALLOW_USERS: |
5575 | 6757 list = account->permit; |
4230 | 6758 at = 0; |
6759 while (list) { | |
6760 at += g_snprintf(buf + at, sizeof(buf) - at, "%s&", (char *)list->data); | |
6761 list = list->next; | |
6762 } | |
6763 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_PERMITADD, buf); | |
6764 break; | |
8175 | 6765 case GAIM_PRIVACY_DENY_USERS: |
5575 | 6766 list = account->deny; |
4230 | 6767 at = 0; |
6768 while (list) { | |
6769 at += g_snprintf(buf + at, sizeof(buf) - at, "%s&", (char *)list->data); | |
6770 list = list->next; | |
6771 } | |
6772 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_DENYADD, buf); | |
6773 break; | |
6774 default: | |
6775 break; | |
2086 | 6776 } |
4230 | 6777 #else |
8175 | 6778 if (od->sess->ssi.received_data) { |
6779 switch (account->perm_deny) { | |
6780 case GAIM_PRIVACY_ALLOW_ALL: | |
6781 aim_ssi_setpermdeny(od->sess, 0x01, 0xffffffff); | |
6782 break; | |
6783 case GAIM_PRIVACY_ALLOW_BUDDYLIST: | |
6784 aim_ssi_setpermdeny(od->sess, 0x05, 0xffffffff); | |
6785 break; | |
6786 case GAIM_PRIVACY_ALLOW_USERS: | |
6787 aim_ssi_setpermdeny(od->sess, 0x03, 0xffffffff); | |
6788 break; | |
6789 case GAIM_PRIVACY_DENY_ALL: | |
6790 aim_ssi_setpermdeny(od->sess, 0x02, 0xffffffff); | |
6791 break; | |
6792 case GAIM_PRIVACY_DENY_USERS: | |
6793 aim_ssi_setpermdeny(od->sess, 0x04, 0xffffffff); | |
6794 break; | |
6795 default: | |
6796 aim_ssi_setpermdeny(od->sess, 0x01, 0xffffffff); | |
6797 break; | |
6798 } | |
6799 } | |
4230 | 6800 #endif |
2086 | 6801 } |
6802 | |
5575 | 6803 static void oscar_add_permit(GaimConnection *gc, const char *who) { |
4269 | 6804 #ifdef NOSSI |
8143 | 6805 if (gc->account->perm_deny == 3) |
4269 | 6806 oscar_set_permit_deny(gc); |
6807 #else | |
7283 | 6808 OscarData *od = (OscarData *)gc->proto_data; |
8660 | 6809 gaim_debug_info("oscar", "ssi: About to add a permit\n"); |
4230 | 6810 if (od->sess->ssi.received_data) |
4889 | 6811 aim_ssi_addpermit(od->sess, who); |
4230 | 6812 #endif |
2086 | 6813 } |
6814 | |
5575 | 6815 static void oscar_add_deny(GaimConnection *gc, const char *who) { |
4269 | 6816 #ifdef NOSSI |
8143 | 6817 if (gc->account->perm_deny == 4) |
4269 | 6818 oscar_set_permit_deny(gc); |
6819 #else | |
7283 | 6820 OscarData *od = (OscarData *)gc->proto_data; |
8660 | 6821 gaim_debug_info("oscar", "ssi: About to add a deny\n"); |
4230 | 6822 if (od->sess->ssi.received_data) |
4889 | 6823 aim_ssi_adddeny(od->sess, who); |
4230 | 6824 #endif |
2086 | 6825 } |
6826 | |
5575 | 6827 static void oscar_rem_permit(GaimConnection *gc, const char *who) { |
4269 | 6828 #ifdef NOSSI |
8143 | 6829 if (gc->account->perm_deny == 3) |
4269 | 6830 oscar_set_permit_deny(gc); |
6831 #else | |
7283 | 6832 OscarData *od = (OscarData *)gc->proto_data; |
8660 | 6833 gaim_debug_info("oscar", "ssi: About to delete a permit\n"); |
4230 | 6834 if (od->sess->ssi.received_data) |
4889 | 6835 aim_ssi_delpermit(od->sess, who); |
4230 | 6836 #endif |
2086 | 6837 } |
6838 | |
5575 | 6839 static void oscar_rem_deny(GaimConnection *gc, const char *who) { |
4269 | 6840 #ifdef NOSSI |
8143 | 6841 if (gc->account->perm_deny == 4) |
4269 | 6842 oscar_set_permit_deny(gc); |
6843 #else | |
7283 | 6844 OscarData *od = (OscarData *)gc->proto_data; |
8660 | 6845 gaim_debug_info("oscar", "ssi: About to delete a deny\n"); |
4230 | 6846 if (od->sess->ssi.received_data) |
4889 | 6847 aim_ssi_deldeny(od->sess, who); |
4230 | 6848 #endif |
2086 | 6849 } |
6850 | |
9975 | 6851 static GList * |
6852 oscar_status_types(GaimAccount *account) | |
2086 | 6853 { |
9975 | 6854 GList *status_types = NULL; |
6855 GaimStatusType *type; | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
6856 |
9973 | 6857 g_return_val_if_fail(account != NULL, NULL); |
6858 | |
10042 | 6859 /* Oscar-common status types */ |
9991 | 6860 type = gaim_status_type_new_full(GAIM_STATUS_OFFLINE, |
6861 OSCAR_STATUS_ID_OFFLINE, | |
6862 _("Offline"), FALSE, FALSE, FALSE); | |
9976 | 6863 status_types = g_list_append(status_types, type); |
6864 | |
9991 | 6865 type = gaim_status_type_new_full(GAIM_STATUS_ONLINE, |
6866 OSCAR_STATUS_ID_ONLINE, | |
6867 _("Online"), FALSE, FALSE, FALSE); | |
9976 | 6868 status_types = g_list_append(status_types, type); |
6869 | |
9991 | 6870 type = gaim_status_type_new_full(GAIM_STATUS_AVAILABLE, |
6871 OSCAR_STATUS_ID_AVAILABLE, | |
6872 _("Available"), TRUE, TRUE, FALSE); | |
9976 | 6873 status_types = g_list_append(status_types, type); |
6874 | |
10042 | 6875 type = gaim_status_type_new_full(GAIM_STATUS_AWAY, |
6876 OSCAR_STATUS_ID_AWAY, | |
6877 _("Away"), TRUE, TRUE, FALSE); | |
6878 status_types = g_list_append(status_types, type); | |
6879 | |
6880 type = gaim_status_type_new_full(GAIM_STATUS_HIDDEN, | |
6881 OSCAR_STATUS_ID_INVISIBLE, | |
6882 _("Invisible"), TRUE, TRUE, TRUE); | |
6883 status_types = g_list_append(status_types, type); | |
6884 | |
6885 if (aim_sn_is_icq(gaim_account_get_username(account)) == FALSE ) | |
6886 return status_types; | |
6887 | |
6888 /* ICQ-specific status types */ | |
6889 | |
9991 | 6890 type = gaim_status_type_new_full(GAIM_STATUS_AVAILABLE, |
6891 OSCAR_STATUS_ID_FREE4CHAT, | |
6892 _("Free For Chat"), TRUE, TRUE, FALSE); | |
9982 | 6893 status_types = g_list_append(status_types, type); |
6894 | |
9991 | 6895 type = gaim_status_type_new_full(GAIM_STATUS_UNAVAILABLE, |
6896 OSCAR_STATUS_ID_OCCUPIED, | |
6897 _("Occupied"), TRUE, TRUE, FALSE); | |
9976 | 6898 status_types = g_list_append(status_types, type); |
6899 | |
9991 | 6900 type = gaim_status_type_new_full(GAIM_STATUS_EXTENDED_AWAY, |
6901 OSCAR_STATUS_ID_DND, | |
6902 _("Do Not Disturb"), TRUE, TRUE, FALSE); | |
9976 | 6903 status_types = g_list_append(status_types, type); |
6904 | |
9991 | 6905 type = gaim_status_type_new_full(GAIM_STATUS_EXTENDED_AWAY, |
6906 OSCAR_STATUS_ID_NA, | |
6907 _("Not Available"), TRUE, TRUE, FALSE); | |
9976 | 6908 status_types = g_list_append(status_types, type); |
9975 | 6909 |
6910 return status_types; | |
4333 | 6911 } |
6912 | |
7172 | 6913 static void oscar_ssi_editcomment(struct name_data *data, const char *text) { |
8341 | 6914 GaimConnection *gc = data->gc; |
6915 OscarData *od = gc->proto_data; | |
7172 | 6916 GaimBuddy *b; |
6917 GaimGroup *g; | |
6918 | |
6919 if (!(b = gaim_find_buddy(gaim_connection_get_account(data->gc), data->name))) { | |
6920 oscar_free_name_data(data); | |
6921 return; | |
6922 } | |
6923 | |
6924 if (!(g = gaim_find_buddys_group(b))) { | |
6925 oscar_free_name_data(data); | |
6926 return; | |
6927 } | |
6928 | |
6929 aim_ssi_editcomment(od->sess, g->name, data->name, text); | |
8341 | 6930 |
6931 if (!aim_sncmp(data->name, gc->account->username)) | |
6932 gaim_check_comment(od, text); | |
6933 | |
7172 | 6934 oscar_free_name_data(data); |
6935 } | |
6936 | |
9030 | 6937 static void oscar_buddycb_edit_comment(GaimBlistNode *node, gpointer ignore) { |
6938 | |
6939 GaimBuddy *buddy; | |
6940 GaimConnection *gc; | |
6941 OscarData *od; | |
6942 struct name_data *data; | |
7172 | 6943 GaimGroup *g; |
6944 char *comment; | |
6945 gchar *comment_utf8; | |
9631 | 6946 gchar *title; |
7172 | 6947 |
9030 | 6948 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); |
6949 | |
6950 buddy = (GaimBuddy *) node; | |
6951 gc = gaim_account_get_connection(buddy->account); | |
6952 od = gc->proto_data; | |
6953 | |
6954 data = g_new(struct name_data, 1); | |
6955 | |
6956 if (!(g = gaim_find_buddys_group(buddy))) | |
7172 | 6957 return; |
9030 | 6958 comment = aim_ssi_getcomment(od->sess->ssi.local, g->name, buddy->name); |
7172 | 6959 comment_utf8 = comment ? gaim_utf8_try_convert(comment) : NULL; |
6960 | |
6961 data->gc = gc; | |
9030 | 6962 data->name = g_strdup(buddy->name); |
7172 | 6963 data->nick = NULL; |
6964 | |
9631 | 6965 title = g_strdup_printf(_("Buddy Comment for %s"), data->name); |
6966 gaim_request_input(gc, title, _("Buddy Comment:"), NULL, | |
8697 | 6967 comment_utf8, TRUE, FALSE, NULL, |
7172 | 6968 _("OK"), G_CALLBACK(oscar_ssi_editcomment), |
6969 _("Cancel"), G_CALLBACK(oscar_free_name_data), | |
6970 data); | |
9631 | 6971 g_free(title); |
7172 | 6972 |
6973 free(comment); | |
6974 g_free(comment_utf8); | |
6975 } | |
6976 | |
9030 | 6977 static GList *oscar_buddy_menu(GaimBuddy *buddy) { |
6978 | |
6979 GaimConnection *gc = gaim_account_get_connection(buddy->account); | |
7283 | 6980 OscarData *od = gc->proto_data; |
9030 | 6981 |
4333 | 6982 GList *m = NULL; |
9030 | 6983 GaimBlistNodeAction *act; |
6984 | |
6985 act = gaim_blist_node_action_new(_("Edit Buddy Comment"), | |
6986 oscar_buddycb_edit_comment, NULL); | |
6987 m = g_list_append(m, act); | |
7172 | 6988 |
4333 | 6989 if (od->icq) { |
4624 | 6990 #if 0 |
9030 | 6991 act = gaim_blist_node_action_new(_("Get Status Msg"), |
6992 oscar_get_icqstatusmsg, NULL); | |
6993 m = g_list_append(m, act); | |
4624 | 6994 #endif |
4333 | 6995 } else { |
7011 | 6996 aim_userinfo_t *userinfo; |
9030 | 6997 userinfo = aim_locate_finduserinfo(od->sess, buddy->name); |
6998 | |
6999 if (userinfo && aim_sncmp(gaim_account_get_username(buddy->account), buddy->name) && | |
7000 GAIM_BUDDY_IS_ONLINE(buddy)) { | |
7001 | |
7011 | 7002 if (userinfo->capabilities & AIM_CAPS_DIRECTIM) { |
9030 | 7003 act = gaim_blist_node_action_new(_("Direct IM"), |
7004 oscar_ask_direct_im, NULL); | |
7005 m = g_list_append(m, act); | |
5917 | 7006 } |
9466 | 7007 #if 0 |
7011 | 7008 if (userinfo->capabilities & AIM_CAPS_GETFILE) { |
9030 | 7009 act = gaim_blist_node_action_new(_("Get File"), |
7010 oscar_ask_getfile, NULL); | |
7011 m = g_list_append(m, act); | |
5917 | 7012 } |
4826 | 7013 #endif |
4333 | 7014 } |
5131 | 7015 } |
5197 | 7016 |
5131 | 7017 if (od->sess->ssi.received_data) { |
9030 | 7018 char *gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, buddy->name); |
7019 if (gname && aim_ssi_waitingforauth(od->sess->ssi.local, gname, buddy->name)) { | |
7020 act = gaim_blist_node_action_new(_("Re-request Authorization"), | |
7021 gaim_auth_sendrequest_menu, NULL); | |
7022 m = g_list_append(m, act); | |
4333 | 7023 } |
4916 | 7024 } |
7025 | |
4333 | 7026 return m; |
7027 } | |
7028 | |
9030 | 7029 |
7030 static GList *oscar_blist_node_menu(GaimBlistNode *node) { | |
7031 if(GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
7032 return oscar_buddy_menu((GaimBuddy *) node); | |
7033 } else { | |
7034 return NULL; | |
7035 } | |
7036 } | |
7037 | |
7038 | |
5575 | 7039 static void oscar_format_screenname(GaimConnection *gc, const char *nick) { |
7283 | 7040 OscarData *od = gc->proto_data; |
5575 | 7041 if (!aim_sncmp(gaim_account_get_username(gaim_connection_get_account(gc)), nick)) { |
4333 | 7042 if (!aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH)) { |
7043 od->setnick = TRUE; | |
7044 od->newsn = g_strdup(nick); | |
7045 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
7046 } else { | |
7047 aim_admin_setnick(od->sess, aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH), nick); | |
7048 } | |
7049 } else { | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
7050 gaim_notify_error(gc, NULL, _("The new formatting is invalid."), |
8152 | 7051 _("Screen name formatting can change only capitalization and whitespace.")); |
4333 | 7052 } |
7053 } | |
7054 | |
9015 | 7055 static void oscar_show_format_screenname(GaimPluginAction *action) |
4333 | 7056 { |
9015 | 7057 GaimConnection *gc = (GaimConnection *) action->context; |
8152 | 7058 gaim_request_input(gc, NULL, _("New screen name formatting:"), NULL, |
8697 | 7059 gaim_connection_get_display_name(gc), FALSE, FALSE, NULL, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
7060 _("OK"), G_CALLBACK(oscar_format_screenname), |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
7061 _("Cancel"), NULL, |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
7062 gc); |
4333 | 7063 } |
7064 | |
9015 | 7065 static void oscar_confirm_account(GaimPluginAction *action) |
4333 | 7066 { |
9015 | 7067 GaimConnection *gc = (GaimConnection *) action->context; |
7283 | 7068 OscarData *od = gc->proto_data; |
4333 | 7069 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); |
7070 | |
7071 if (conn) { | |
7072 aim_admin_reqconfirm(od->sess, conn); | |
7073 } else { | |
7074 od->conf = TRUE; | |
7075 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
7076 } | |
7077 } | |
7078 | |
9015 | 7079 static void oscar_show_email(GaimPluginAction *action) |
4333 | 7080 { |
9015 | 7081 GaimConnection *gc = (GaimConnection *) action->context; |
7283 | 7082 OscarData *od = gc->proto_data; |
4333 | 7083 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); |
7084 | |
7085 if (conn) { | |
7086 aim_admin_getinfo(od->sess, conn, 0x11); | |
7087 } else { | |
7088 od->reqemail = TRUE; | |
7089 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
7090 } | |
7091 } | |
7092 | |
5575 | 7093 static void oscar_change_email(GaimConnection *gc, const char *email) |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7094 { |
7283 | 7095 OscarData *od = gc->proto_data; |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7096 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
|
7097 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7098 if (conn) { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7099 aim_admin_setemail(od->sess, conn, email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7100 } else { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7101 od->setemail = TRUE; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7102 od->email = g_strdup(email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7103 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7104 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7105 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
7106 |
9015 | 7107 static void oscar_show_change_email(GaimPluginAction *action) |
4333 | 7108 { |
9015 | 7109 GaimConnection *gc = (GaimConnection *) action->context; |
6035
8c44020a958e
[gaim-migrate @ 6485]
Christian Hammond <chipx86@chipx86.com>
parents:
6029
diff
changeset
|
7110 gaim_request_input(gc, NULL, _("Change Address To:"), NULL, NULL, |
8697 | 7111 FALSE, FALSE, NULL, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
7112 _("OK"), G_CALLBACK(oscar_change_email), |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
7113 _("Cancel"), NULL, |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
7114 gc); |
4333 | 7115 } |
7116 | |
9015 | 7117 static void oscar_show_awaitingauth(GaimPluginAction *action) |
4333 | 7118 { |
9015 | 7119 GaimConnection *gc = (GaimConnection *) action->context; |
7283 | 7120 OscarData *od = gc->proto_data; |
4333 | 7121 gchar *nombre, *text, *tmp; |
6695 | 7122 GaimBlistNode *gnode, *cnode, *bnode; |
4333 | 7123 int num=0; |
7124 | |
6873 | 7125 text = g_strdup(""); |
4333 | 7126 |
4785 | 7127 for (gnode = gaim_get_blist()->root; gnode; gnode = gnode->next) { |
6695 | 7128 GaimGroup *group = (GaimGroup *)gnode; |
4785 | 7129 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) |
7130 continue; | |
6695 | 7131 for (cnode = gnode->child; cnode; cnode = cnode->next) { |
7132 if(!GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
4785 | 7133 continue; |
6695 | 7134 for (bnode = cnode->child; bnode; bnode = bnode->next) { |
7135 GaimBuddy *buddy = (GaimBuddy *)bnode; | |
7136 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
7137 continue; | |
7138 if (buddy->account == gc->account && aim_ssi_waitingforauth(od->sess->ssi.local, group->name, buddy->name)) { | |
9620 | 7139 if (gaim_buddy_get_alias_only(buddy)) |
7140 nombre = g_strdup_printf(" %s (%s)", buddy->name, gaim_buddy_get_alias_only(buddy)); | |
6695 | 7141 else |
7142 nombre = g_strdup_printf(" %s", buddy->name); | |
6873 | 7143 tmp = g_strdup_printf("%s%s<br>", text, nombre); |
6695 | 7144 g_free(text); |
7145 text = tmp; | |
7146 g_free(nombre); | |
7147 num++; | |
7148 } | |
4333 | 7149 } |
2979 | 7150 } |
4333 | 7151 } |
7152 | |
7153 if (!num) { | |
7154 g_free(text); | |
6873 | 7155 text = g_strdup(_("<i>you are not waiting for authorization</i>")); |
7156 } | |
7157 | |
7158 gaim_notify_formatted(gc, NULL, _("You are awaiting authorization from " | |
7159 "the following buddies"), _("You can re-request " | |
7160 "authorization from these buddies by " | |
7161 "right-clicking on them and selecting " | |
7162 "\"Re-request Authorization.\""), text, NULL, NULL); | |
4333 | 7163 g_free(text); |
2979 | 7164 } |
7165 | |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7166 static void search_by_email_cb(GaimConnection *gc, const char *email) |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7167 { |
8950 | 7168 OscarData *od = (OscarData *)gc->proto_data; |
7169 | |
7170 aim_search_address(od->sess, od->conn, email); | |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7171 } |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7172 |
9015 | 7173 static void oscar_show_find_email(GaimPluginAction *action) |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7174 { |
9015 | 7175 GaimConnection *gc = (GaimConnection *) action->context; |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7176 gaim_request_input(gc, _("Find Buddy by E-mail"), |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7177 _("Search for a buddy by e-mail address"), |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7178 _("Type the e-mail address of the buddy you are " |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7179 "searching for."), |
8697 | 7180 NULL, FALSE, FALSE, NULL, |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7181 _("Search"), G_CALLBACK(search_by_email_cb), |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7182 _("Cancel"), NULL, gc); |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7183 } |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
7184 |
9015 | 7185 static void oscar_show_set_info(GaimPluginAction *action) |
7067
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
7186 { |
9015 | 7187 GaimConnection *gc = (GaimConnection *) action->context; |
7067
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
7188 gaim_account_request_change_user_info(gaim_connection_get_account(gc)); |
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
7189 } |
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
7190 |
9015 | 7191 static void oscar_show_set_info_icqurl(GaimPluginAction *action) |
8576 | 7192 { |
9015 | 7193 GaimConnection *gc = (GaimConnection *) action->context; |
9809 | 7194 gaim_notify_uri(gc, "http://www.icq.com/whitepages/user_details.php"); |
8576 | 7195 } |
7196 | |
9015 | 7197 static void oscar_change_pass(GaimPluginAction *action) |
7063
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
7198 { |
9015 | 7199 GaimConnection *gc = (GaimConnection *) action->context; |
7063
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
7200 gaim_account_request_change_password(gaim_connection_get_account(gc)); |
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
7201 } |
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
7202 |
9015 | 7203 static void oscar_show_chpassurl(GaimPluginAction *action) |
4333 | 7204 { |
9015 | 7205 GaimConnection *gc = (GaimConnection *) action->context; |
7283 | 7206 OscarData *od = gc->proto_data; |
5575 | 7207 gchar *substituted = gaim_strreplace(od->sess->authinfo->chpassurl, "%s", gaim_account_get_username(gaim_connection_get_account(gc))); |
6465
fb64cc87bc96
[gaim-migrate @ 6974]
Christian Hammond <chipx86@chipx86.com>
parents:
6400
diff
changeset
|
7208 gaim_notify_uri(gc, substituted); |
5517 | 7209 g_free(substituted); |
4333 | 7210 } |
7211 | |
9015 | 7212 static void oscar_show_imforwardingurl(GaimPluginAction *action) |
7026 | 7213 { |
9015 | 7214 GaimConnection *gc = (GaimConnection *) action->context; |
7026 | 7215 gaim_notify_uri(gc, "http://mymobile.aol.com/dbreg/register?action=imf&clientID=1"); |
7216 } | |
7217 | |
5842 | 7218 static void oscar_set_icon(GaimConnection *gc, const char *iconfile) |
7219 { | |
7283 | 7220 OscarData *od = gc->proto_data; |
5844 | 7221 aim_session_t *sess = od->sess; |
5842 | 7222 FILE *file; |
7223 struct stat st; | |
5844 | 7224 |
6039 | 7225 if (iconfile == NULL) { |
8363 | 7226 aim_ssi_delicon(od->sess); |
6039 | 7227 } else if (!stat(iconfile, &st)) { |
5842 | 7228 char *buf = g_malloc(st.st_size); |
7229 file = fopen(iconfile, "rb"); | |
7230 if (file) { | |
6052 | 7231 md5_state_t *state; |
6039 | 7232 char md5[16]; |
9532 | 7233 /* XXX - Use g_file_get_contents()? */ |
5842 | 7234 int len = fread(buf, 1, st.st_size, file); |
6039 | 7235 fclose(file); |
6052 | 7236 state = g_malloc(sizeof(md5_state_t)); |
5842 | 7237 md5_init(state); |
7238 md5_append(state, buf, len); | |
7239 md5_finish(state, md5); | |
7240 g_free(state); | |
7241 aim_ssi_seticon(sess, md5, 16); | |
7242 } else | |
8660 | 7243 gaim_debug_error("oscar", |
5842 | 7244 "Can't open buddy icon file!\n"); |
7245 g_free(buf); | |
7246 } else | |
8660 | 7247 gaim_debug_error("oscar", |
5842 | 7248 "Can't stat buddy icon file!\n"); |
7249 } | |
7250 | |
7251 | |
9015 | 7252 static GList *oscar_actions(GaimPlugin *plugin, gpointer context) |
2086 | 7253 { |
9015 | 7254 GaimConnection *gc = (GaimConnection *) context; |
7283 | 7255 OscarData *od = gc->proto_data; |
4333 | 7256 GList *m = NULL; |
9015 | 7257 GaimPluginAction *act; |
7258 | |
7259 act = gaim_plugin_action_new(_("Set User Info..."), | |
7260 oscar_show_set_info); | |
7261 m = g_list_append(m, act); | |
4333 | 7262 |
8576 | 7263 if (od->icq) { |
9015 | 7264 act = gaim_plugin_action_new(_("Set User Info (URL)..."), |
7265 oscar_show_set_info_icqurl); | |
7266 m = g_list_append(m, act); | |
8576 | 7267 } |
7268 | |
9015 | 7269 act = gaim_plugin_action_new(_("Change Password..."), |
7270 oscar_change_pass); | |
7271 m = g_list_append(m, act); | |
4617 | 7272 |
7273 if (od->sess->authinfo->chpassurl) { | |
9015 | 7274 act = gaim_plugin_action_new(_("Change Password (URL)"), |
7275 oscar_show_chpassurl); | |
7276 m = g_list_append(m, act); | |
7277 | |
7278 act = gaim_plugin_action_new(_("Configure IM Forwarding (URL)"), | |
7279 oscar_show_imforwardingurl); | |
7280 m = g_list_append(m, act); | |
7026 | 7281 } |
7282 | |
5238 | 7283 if (!od->icq) { |
4617 | 7284 /* AIM actions */ |
7285 m = g_list_append(m, NULL); | |
4333 | 7286 |
9015 | 7287 act = gaim_plugin_action_new(_("Format Screen Name..."), |
7288 oscar_show_format_screenname); | |
7289 m = g_list_append(m, act); | |
7290 | |
7291 act = gaim_plugin_action_new(_("Confirm Account"), | |
7292 oscar_confirm_account); | |
7293 m = g_list_append(m, act); | |
7294 | |
7295 act = gaim_plugin_action_new(_("Display Currently Registered Address"), | |
7296 oscar_show_email); | |
7297 m = g_list_append(m, act); | |
7298 | |
7299 act = gaim_plugin_action_new(_("Change Currently Registered Address..."), | |
7300 oscar_show_change_email); | |
7301 m = g_list_append(m, act); | |
2086 | 7302 } |
4333 | 7303 |
7304 m = g_list_append(m, NULL); | |
7305 | |
9015 | 7306 act = gaim_plugin_action_new(_("Show Buddies Awaiting Authorization"), |
7307 oscar_show_awaitingauth); | |
7308 m = g_list_append(m, act); | |
4333 | 7309 |
2086 | 7310 m = g_list_append(m, NULL); |
4333 | 7311 |
9015 | 7312 act = gaim_plugin_action_new(_("Search for Buddy by Email..."), |
7313 oscar_show_find_email); | |
7314 m = g_list_append(m, act); | |
4333 | 7315 |
8591 | 7316 #if 0 |
9015 | 7317 act = gaim_plugin_action_new(_("Search for Buddy by Information"), |
7318 show_find_info); | |
7319 m = g_list_append(m, act); | |
8591 | 7320 #endif |
2086 | 7321 |
7322 return m; | |
7323 } | |
7324 | |
5575 | 7325 static void oscar_change_passwd(GaimConnection *gc, const char *old, const char *new) |
2086 | 7326 { |
7283 | 7327 OscarData *od = gc->proto_data; |
4617 | 7328 |
7329 if (od->icq) { | |
7330 aim_icq_changepasswd(od->sess, new); | |
2086 | 7331 } else { |
4617 | 7332 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); |
7333 if (conn) { | |
7334 aim_admin_changepasswd(od->sess, conn, new, old); | |
7335 } else { | |
7336 od->chpass = TRUE; | |
7337 od->oldp = g_strdup(old); | |
7338 od->newp = g_strdup(new); | |
7339 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
7340 } | |
2086 | 7341 } |
7342 } | |
7343 | |
6059 | 7344 static void oscar_convo_closed(GaimConnection *gc, const char *who) |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
7345 { |
7283 | 7346 OscarData *od = gc->proto_data; |
8971 | 7347 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
|
7348 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
7349 if (!dim) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
7350 return; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
7351 |
8971 | 7352 oscar_direct_im_destroy(od, dim); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
7353 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
7354 |
9935 | 7355 static void |
7356 recent_buddies_cb(const char *name, GaimPrefType type, gpointer value, gpointer data) | |
7357 { | |
7358 GaimConnection *gc = data; | |
7359 OscarData *od = gc->proto_data; | |
7360 aim_session_t *sess = od->sess; | |
7361 fu32_t presence; | |
7362 | |
7363 presence = aim_ssi_getpresence(sess->ssi.local); | |
7364 | |
7365 if (value) { | |
9992 | 7366 /* Based on the packet capture I thought it was the first one */ |
7367 /* Stu thinks it's the second one. */ | |
7368 /* presence |= 0x00400000; */ | |
9971 | 7369 presence &= ~0x00020000; |
9935 | 7370 aim_ssi_setpresence(sess, presence); |
7371 } else { | |
9992 | 7372 /* presence &= ~0x00400000; */ |
9971 | 7373 presence |= 0x00020000; |
9935 | 7374 aim_ssi_setpresence(sess, presence); |
7375 } | |
7376 } | |
7377 | |
7378 static GaimPluginPrefFrame * | |
9936 | 7379 get_plugin_pref_frame(GaimPlugin *plugin) |
7380 { | |
9935 | 7381 GaimPluginPrefFrame *frame; |
7382 GaimPluginPref *ppref; | |
7383 | |
7384 frame = gaim_plugin_pref_frame_new(); | |
7385 | |
7386 ppref = gaim_plugin_pref_new_with_name_and_label("/plugins/prpl/oscar/recent_buddies", _("Use recent buddies group")); | |
7387 gaim_plugin_pref_frame_add(frame, ppref); | |
7388 | |
7389 ppref = gaim_plugin_pref_new_with_name_and_label("/plugins/prpl/oscar/show_idle", _("Show how long you have been idle")); | |
7390 gaim_plugin_pref_frame_add(frame, ppref); | |
7391 | |
7392 return frame; | |
7393 } | |
7394 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7395 static GaimPluginProtocolInfo prpl_info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7396 { |
9308 | 7397 OPT_PROTO_MAIL_CHECK | OPT_PROTO_IM_IMAGE, |
9475 | 7398 NULL, /* user_splits */ |
7399 NULL, /* protocol_options */ | |
7400 {"jpeg,gif,bmp,ico", 48, 48, 50, 50, GAIM_ICON_SCALE_DISPLAY}, /* icon_spec */ | |
7401 oscar_list_icon, /* list_icon */ | |
7402 oscar_list_emblems, /* list_emblems */ | |
7403 oscar_status_text, /* status_text */ | |
7404 oscar_tooltip_text, /* tooltip_text */ | |
9973 | 7405 oscar_status_types, /* status_types */ |
9475 | 7406 oscar_blist_node_menu, /* blist_node_menu */ |
7407 oscar_chat_info, /* chat_info */ | |
9754 | 7408 oscar_chat_info_defaults, /* chat_info_defaults */ |
9475 | 7409 oscar_login, /* login */ |
7410 oscar_close, /* close */ | |
7411 oscar_send_im, /* send_im */ | |
7412 oscar_set_info, /* set_info */ | |
7413 oscar_send_typing, /* send_typing */ | |
7414 oscar_get_info, /* get_info */ | |
9973 | 7415 oscar_set_status, /* set_status */ |
9475 | 7416 oscar_set_idle, /* set_idle */ |
7417 oscar_change_passwd, /* change_passwd */ | |
7418 oscar_add_buddy, /* add_buddy */ | |
7419 oscar_add_buddies, /* add_buddies */ | |
7420 oscar_remove_buddy, /* remove_buddy */ | |
7421 oscar_remove_buddies, /* remove_buddies */ | |
7422 oscar_add_permit, /* add_permit */ | |
7423 oscar_add_deny, /* add_deny */ | |
7424 oscar_rem_permit, /* rem_permit */ | |
7425 oscar_rem_deny, /* rem_deny */ | |
7426 oscar_set_permit_deny, /* set_permit_deny */ | |
7427 oscar_warn, /* warn */ | |
7428 oscar_join_chat, /* join_chat */ | |
7429 NULL, /* reject_chat */ | |
9973 | 7430 oscar_get_chat_name, /* get_chat_name */ |
9475 | 7431 oscar_chat_invite, /* chat_invite */ |
7432 oscar_chat_leave, /* chat_leave */ | |
7433 NULL, /* chat_whisper */ | |
7434 oscar_send_chat, /* chat_send */ | |
7435 oscar_keepalive, /* keepalive */ | |
7436 NULL, /* register_user */ | |
7437 NULL, /* get_cb_info */ | |
7438 NULL, /* get_cb_away */ | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7439 #ifndef NOSSI |
9475 | 7440 oscar_alias_buddy, /* alias_buddy */ |
7441 oscar_move_buddy, /* group_buddy */ | |
7442 oscar_rename_group, /* rename_group */ | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7443 #else |
9475 | 7444 NULL, /* alias_buddy */ |
7445 NULL, /* group_buddy */ | |
7446 NULL, /* rename_group */ | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7447 #endif |
9475 | 7448 NULL, /* buddy_free */ |
7449 oscar_convo_closed, /* convo_closed */ | |
7450 NULL, /* normalize */ | |
7451 oscar_set_icon, /* set_buddy_icon */ | |
7452 NULL, /* remove_group */ | |
7453 NULL, /* get_cb_real_name */ | |
7454 NULL, /* set_chat_topic */ | |
7455 NULL, /* find_blist_chat */ | |
7456 NULL, /* roomlist_get_list */ | |
7457 NULL, /* roomlist_cancel */ | |
7458 NULL, /* roomlist_expand_category */ | |
7459 oscar_can_receive_file, /* can_receive_file */ | |
7460 oscar_send_file /* send_file */ | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7461 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7462 |
9935 | 7463 static GaimPluginUiInfo prefs_info = { |
7464 get_plugin_pref_frame | |
7465 }; | |
7466 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7467 static GaimPluginInfo info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7468 { |
9943 | 7469 GAIM_PLUGIN_MAGIC, |
7470 GAIM_MAJOR_VERSION, | |
7471 GAIM_MINOR_VERSION, | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7472 GAIM_PLUGIN_PROTOCOL, /**< type */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7473 NULL, /**< ui_requirement */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7474 0, /**< flags */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7475 NULL, /**< dependencies */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7476 GAIM_PRIORITY_DEFAULT, /**< priority */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7477 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7478 "prpl-oscar", /**< id */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7479 "AIM/ICQ", /**< name */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7480 VERSION, /**< version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7481 /** summary */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7482 N_("AIM/ICQ Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7483 /** description */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7484 N_("AIM/ICQ Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7485 NULL, /**< author */ |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6350
diff
changeset
|
7486 GAIM_WEBSITE, /**< homepage */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7487 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7488 NULL, /**< load */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7489 NULL, /**< unload */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7490 NULL, /**< destroy */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7491 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7492 NULL, /**< ui_info */ |
8993 | 7493 &prpl_info, /**< extra_info */ |
9935 | 7494 &prefs_info, /**< prefs_info */ |
9015 | 7495 oscar_actions |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7496 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7497 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7498 static void |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5917
diff
changeset
|
7499 init_plugin(GaimPlugin *plugin) |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7500 { |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
7501 GaimAccountOption *option; |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
7502 |
9830 | 7503 option = gaim_account_option_string_new(_("Auth host"), "server", FAIM_LOGIN_SERVER); |
7504 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | |
7505 | |
7506 option = gaim_account_option_int_new(_("Auth port"), "port", FAIM_LOGIN_PORT); | |
7507 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | |
7508 | |
7509 option = gaim_account_option_string_new(_("Encoding"), "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); | |
7510 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
|
7511 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7512 my_protocol = plugin; |
9935 | 7513 |
7514 gaim_prefs_add_none("/plugins/prpl/oscar"); | |
7515 gaim_prefs_add_bool("/plugins/prpl/oscar/recent_buddies", FALSE); | |
9942 | 7516 gaim_prefs_add_bool("/plugins/prpl/oscar/show_idle", FALSE); |
2086 | 7517 } |
7518 | |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5917
diff
changeset
|
7519 GAIM_INIT_PLUGIN(oscar, init_plugin, info); |