Mercurial > pidgin
annotate src/protocols/oscar/oscar.c @ 8701:ddcafeb14e35
[gaim-migrate @ 9454]
Alright. There's some code re-use with the Get Info box and the toolip
now. The Get Info box should have everything the tooltip does. Also
got rid of the double "Last Name" field for ICQ info.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sun, 18 Apr 2004 18:40:41 +0000 |
parents | ddd2bf87fe8d |
children | f71c0a3fcb3d |
rev | line source |
---|---|
2086 | 1 /* |
2 * gaim | |
3 * | |
4 * Some code copyright (C) 1998-1999, Mark Spencer <markster@marko.net> | |
6302 | 5 * Some code copyright (C) 1999-2001, Eric Warmenhoven |
6 * Some code copyright (C) 2001-2003, Sean Egan | |
8151 | 7 * Some code copyright (C) 2001-2004, Mark Doliner <thekingant@users.sourceforge.net> |
6302 | 8 * |
9 * Most libfaim code copyright (C) 1998-2001 Adam Fritzler <afritz@auk.cx> | |
8151 | 10 * Some libfaim code copyright (C) 2001-2004 Mark Doliner <thekingant@users.sourceforge.net> |
2086 | 11 * |
12 * This program is free software; you can redistribute it and/or modify | |
13 * it under the terms of the GNU General Public License as published by | |
14 * the Free Software Foundation; either version 2 of the License, or | |
15 * (at your option) any later version. | |
16 * | |
17 * This program is distributed in the hope that it will be useful, | |
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
20 * GNU General Public License for more details. | |
21 * | |
22 * You should have received a copy of the GNU General Public License | |
23 * along with this program; if not, write to the Free Software | |
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
25 * | |
26 */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
27 #include "internal.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
28 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
29 #include "account.h" |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
30 #include "accountopt.h" |
8476 | 31 #include "away.h" |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
32 #include "buddyicon.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
33 #include "conversation.h" |
7083
3100a6e03644
[gaim-migrate @ 7648]
Christian Hammond <chipx86@chipx86.com>
parents:
7082
diff
changeset
|
34 #include "core.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
35 #include "debug.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
36 #include "ft.h" |
6982 | 37 #include "imgstore.h" |
2086 | 38 #include "multi.h" |
8231
f50c059b6384
[gaim-migrate @ 8954]
Christian Hammond <chipx86@chipx86.com>
parents:
8227
diff
changeset
|
39 #include "network.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
40 #include "notify.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
41 #include "privacy.h" |
2086 | 42 #include "prpl.h" |
4889 | 43 #include "proxy.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
44 #include "request.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
45 #include "util.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
46 |
2086 | 47 #include "aim.h" |
5842 | 48 #include "md5.h" |
2086 | 49 |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
50 #define UC_AOL 0x02 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
51 #define UC_ADMIN 0x04 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
52 #define UC_UNCONFIRMED 0x08 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
53 #define UC_NORMAL 0x10 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
54 #define UC_AB 0x20 |
3079 | 55 #define UC_WIRELESS 0x40 |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
56 |
2086 | 57 #define AIMHASHDATA "http://gaim.sourceforge.net/aim_data.php3" |
58 | |
7283 | 59 #define OSCAR_CONNECT_STEPS 6 |
60 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
61 static GaimPlugin *my_protocol = NULL; |
4249 | 62 |
7376 | 63 static int caps_aim = AIM_CAPS_CHAT | AIM_CAPS_BUDDYICON | AIM_CAPS_DIRECTIM | AIM_CAPS_SENDFILE | AIM_CAPS_INTEROPERATE | AIM_CAPS_ICHAT; |
64 static int caps_icq = AIM_CAPS_BUDDYICON | AIM_CAPS_DIRECTIM | AIM_CAPS_SENDFILE | AIM_CAPS_ICQUTF8 | AIM_CAPS_INTEROPERATE | AIM_CAPS_ICHAT; | |
3458 | 65 |
4665 | 66 static fu8_t features_aim[] = {0x01, 0x01, 0x01, 0x02}; |
67 static fu8_t features_icq[] = {0x01, 0x06}; | |
8341 | 68 static fu8_t ck[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; |
2086 | 69 |
7283 | 70 typedef struct _OscarData OscarData; |
71 struct _OscarData { | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
72 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
73 aim_conn_t *conn; |
2086 | 74 |
75 guint cnpa; | |
76 guint paspa; | |
3694 | 77 guint emlpa; |
4804 | 78 guint icopa; |
2086 | 79 |
4823 | 80 gboolean iconconnecting; |
5842 | 81 gboolean set_icon; |
4823 | 82 |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
83 GSList *create_rooms; |
2086 | 84 |
85 gboolean conf; | |
86 gboolean reqemail; | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
87 gboolean setemail; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
88 char *email; |
2979 | 89 gboolean setnick; |
90 char *newsn; | |
2086 | 91 gboolean chpass; |
92 char *oldp; | |
93 char *newp; | |
5842 | 94 |
2086 | 95 GSList *oscar_chats; |
96 GSList *direct_ims; | |
3630 | 97 GSList *file_transfers; |
4738 | 98 GHashTable *buddyinfo; |
4804 | 99 GSList *requesticon; |
2086 | 100 |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
101 gboolean killme; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
102 gboolean icq; |
4804 | 103 guint icontimer; |
5968 | 104 guint getblisttimer; |
8341 | 105 guint getinfotimer; |
2993 | 106 |
107 struct { | |
4230 | 108 guint maxwatchers; /* max users who can watch you */ |
2993 | 109 guint maxbuddies; /* max users you can watch */ |
4230 | 110 guint maxgroups; /* max groups in server list */ |
2993 | 111 guint maxpermits; /* max users on permit list */ |
112 guint maxdenies; /* max users on deny list */ | |
113 guint maxsiglen; /* max size (bytes) of profile */ | |
114 guint maxawaymsglen; /* max size (bytes) of posted away message */ | |
115 } rights; | |
2086 | 116 }; |
117 | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
118 struct create_room { |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
119 char *name; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
120 int exchange; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
121 }; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
122 |
2086 | 123 struct chat_connection { |
124 char *name; | |
125 char *show; /* AOL did something funny to us */ | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
126 fu16_t exchange; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
127 fu16_t instance; |
2086 | 128 int fd; /* this is redundant since we have the conn below */ |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
129 aim_conn_t *conn; |
2086 | 130 int inpa; |
131 int id; | |
5575 | 132 GaimConnection *gc; /* i hate this. */ |
5679 | 133 GaimConversation *cnv; /* bah. */ |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
134 int maxlen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
135 int maxvis; |
2086 | 136 }; |
137 | |
138 struct direct_im { | |
5575 | 139 GaimConnection *gc; |
2086 | 140 char name[80]; |
141 int watcher; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
142 aim_conn_t *conn; |
3008 | 143 gboolean connected; |
2086 | 144 }; |
145 | |
146 struct ask_direct { | |
5575 | 147 GaimConnection *gc; |
2086 | 148 char *sn; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
149 char ip[64]; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
150 fu8_t cookie[8]; |
2086 | 151 }; |
152 | |
7011 | 153 /* |
154 * Various PRPL-specific buddy info that we want to keep track of | |
155 * Some other info is maintained by locate.c, and I'd like to move | |
156 * the rest of this to libfaim, mostly im.c | |
157 */ | |
4738 | 158 struct buddyinfo { |
159 gboolean typingnot; | |
6292 | 160 gchar *availmsg; |
6857 | 161 fu32_t ipaddr; |
5836 | 162 |
163 unsigned long ico_me_len; | |
164 unsigned long ico_me_csum; | |
165 time_t ico_me_time; | |
166 gboolean ico_informed; | |
4738 | 167 |
168 unsigned long ico_len; | |
169 unsigned long ico_csum; | |
170 time_t ico_time; | |
171 gboolean ico_need; | |
7406 | 172 gboolean ico_sent; |
2086 | 173 }; |
174 | |
4230 | 175 struct name_data { |
5575 | 176 GaimConnection *gc; |
4230 | 177 gchar *name; |
3453 | 178 gchar *nick; |
3141 | 179 }; |
180 | |
5129 | 181 static char *msgerrreason[] = { |
182 N_("Invalid error"), | |
183 N_("Invalid SNAC"), | |
184 N_("Rate to host"), | |
185 N_("Rate to client"), | |
186 N_("Not logged in"), | |
187 N_("Service unavailable"), | |
188 N_("Service not defined"), | |
189 N_("Obsolete SNAC"), | |
190 N_("Not supported by host"), | |
191 N_("Not supported by client"), | |
192 N_("Refused by client"), | |
193 N_("Reply too big"), | |
194 N_("Responses lost"), | |
195 N_("Request denied"), | |
196 N_("Busted SNAC payload"), | |
197 N_("Insufficient rights"), | |
198 N_("In local permit/deny"), | |
199 N_("Too evil (sender)"), | |
200 N_("Too evil (receiver)"), | |
201 N_("User temporarily unavailable"), | |
202 N_("No match"), | |
203 N_("List overflow"), | |
204 N_("Request ambiguous"), | |
205 N_("Queue full"), | |
206 N_("Not while on AOL") | |
207 }; | |
208 static int msgerrreasonlen = 25; | |
209 | |
210 /* All the libfaim->gaim callback functions */ | |
211 static int gaim_parse_auth_resp (aim_session_t *, aim_frame_t *, ...); | |
212 static int gaim_parse_login (aim_session_t *, aim_frame_t *, ...); | |
213 static int gaim_handle_redirect (aim_session_t *, aim_frame_t *, ...); | |
214 static int gaim_info_change (aim_session_t *, aim_frame_t *, ...); | |
215 static int gaim_account_confirm (aim_session_t *, aim_frame_t *, ...); | |
216 static int gaim_parse_oncoming (aim_session_t *, aim_frame_t *, ...); | |
217 static int gaim_parse_offgoing (aim_session_t *, aim_frame_t *, ...); | |
218 static int gaim_parse_incoming_im(aim_session_t *, aim_frame_t *, ...); | |
219 static int gaim_parse_misses (aim_session_t *, aim_frame_t *, ...); | |
220 static int gaim_parse_clientauto (aim_session_t *, aim_frame_t *, ...); | |
7011 | 221 static int gaim_parse_userinfo (aim_session_t *, aim_frame_t *, ...); |
8341 | 222 static int gaim_reqinfo_timeout (aim_session_t *, aim_frame_t *, ...); |
5129 | 223 static int gaim_parse_motd (aim_session_t *, aim_frame_t *, ...); |
224 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
|
225 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
|
226 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
|
227 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
|
228 static int gaim_conv_chat_incoming_msg(aim_session_t *, aim_frame_t *, ...); |
5129 | 229 static int gaim_email_parseupdate(aim_session_t *, aim_frame_t *, ...); |
230 static int gaim_icon_error (aim_session_t *, aim_frame_t *, ...); | |
231 static int gaim_icon_parseicon (aim_session_t *, aim_frame_t *, ...); | |
5844 | 232 static int oscar_icon_req (aim_session_t *, aim_frame_t *, ...); |
5129 | 233 static int gaim_parse_msgack (aim_session_t *, aim_frame_t *, ...); |
234 static int gaim_parse_ratechange (aim_session_t *, aim_frame_t *, ...); | |
235 static int gaim_parse_evilnotify (aim_session_t *, aim_frame_t *, ...); | |
236 static int gaim_parse_searcherror(aim_session_t *, aim_frame_t *, ...); | |
237 static int gaim_parse_searchreply(aim_session_t *, aim_frame_t *, ...); | |
238 static int gaim_bosrights (aim_session_t *, aim_frame_t *, ...); | |
239 static int gaim_connerr (aim_session_t *, aim_frame_t *, ...); | |
240 static int conninitdone_admin (aim_session_t *, aim_frame_t *, ...); | |
241 static int conninitdone_bos (aim_session_t *, aim_frame_t *, ...); | |
242 static int conninitdone_chatnav (aim_session_t *, aim_frame_t *, ...); | |
243 static int conninitdone_chat (aim_session_t *, aim_frame_t *, ...); | |
244 static int conninitdone_email (aim_session_t *, aim_frame_t *, ...); | |
245 static int conninitdone_icon (aim_session_t *, aim_frame_t *, ...); | |
246 static int gaim_parse_msgerr (aim_session_t *, aim_frame_t *, ...); | |
247 static int gaim_parse_mtn (aim_session_t *, aim_frame_t *, ...); | |
248 static int gaim_parse_locaterights(aim_session_t *, aim_frame_t *, ...); | |
249 static int gaim_parse_buddyrights(aim_session_t *, aim_frame_t *, ...); | |
250 static int gaim_parse_locerr (aim_session_t *, aim_frame_t *, ...); | |
251 static int gaim_icbm_param_info (aim_session_t *, aim_frame_t *, ...); | |
252 static int gaim_parse_genericerr (aim_session_t *, aim_frame_t *, ...); | |
253 static int gaim_memrequest (aim_session_t *, aim_frame_t *, ...); | |
254 static int gaim_selfinfo (aim_session_t *, aim_frame_t *, ...); | |
255 static int gaim_offlinemsg (aim_session_t *, aim_frame_t *, ...); | |
256 static int gaim_offlinemsgdone (aim_session_t *, aim_frame_t *, ...); | |
257 static int gaim_icqalias (aim_session_t *, aim_frame_t *, ...); | |
258 static int gaim_icqinfo (aim_session_t *, aim_frame_t *, ...); | |
259 static int gaim_popup (aim_session_t *, aim_frame_t *, ...); | |
260 #ifndef NOSSI | |
261 static int gaim_ssi_parseerr (aim_session_t *, aim_frame_t *, ...); | |
262 static int gaim_ssi_parserights (aim_session_t *, aim_frame_t *, ...); | |
263 static int gaim_ssi_parselist (aim_session_t *, aim_frame_t *, ...); | |
264 static int gaim_ssi_parseack (aim_session_t *, aim_frame_t *, ...); | |
8227 | 265 static int gaim_ssi_parseadd (aim_session_t *, aim_frame_t *, ...); |
5129 | 266 static int gaim_ssi_authgiven (aim_session_t *, aim_frame_t *, ...); |
267 static int gaim_ssi_authrequest (aim_session_t *, aim_frame_t *, ...); | |
268 static int gaim_ssi_authreply (aim_session_t *, aim_frame_t *, ...); | |
269 static int gaim_ssi_gotadded (aim_session_t *, aim_frame_t *, ...); | |
270 #endif | |
271 | |
272 /* for DirectIM/image transfer */ | |
273 static int gaim_odc_initiate (aim_session_t *, aim_frame_t *, ...); | |
274 static int gaim_odc_incoming (aim_session_t *, aim_frame_t *, ...); | |
275 static int gaim_odc_typing (aim_session_t *, aim_frame_t *, ...); | |
6982 | 276 static int gaim_odc_update_ui (aim_session_t *, aim_frame_t *, ...); |
5129 | 277 |
278 /* for file transfer */ | |
279 static int oscar_sendfile_estblsh(aim_session_t *, aim_frame_t *, ...); | |
280 static int oscar_sendfile_prompt (aim_session_t *, aim_frame_t *, ...); | |
281 static int oscar_sendfile_ack (aim_session_t *, aim_frame_t *, ...); | |
282 static int oscar_sendfile_done (aim_session_t *, aim_frame_t *, ...); | |
283 | |
284 /* for icons */ | |
285 static gboolean gaim_icon_timerfunc(gpointer data); | |
286 | |
8076 | 287 /* remove these at some point? */ |
7282 | 288 /* Because I don't like forward declarations? I think that was why... */ |
5954 | 289 static void oscar_set_info(GaimConnection *gc, const char *text); |
8076 | 290 static void oscar_set_away(GaimConnection *gc, const char *state, const char *message); |
5306 | 291 |
5836 | 292 static void oscar_free_name_data(struct name_data *data) { |
4230 | 293 g_free(data->name); |
294 g_free(data->nick); | |
295 g_free(data); | |
296 } | |
297 | |
5836 | 298 static void oscar_free_buddyinfo(void *data) { |
299 struct buddyinfo *bi = data; | |
6292 | 300 g_free(bi->availmsg); |
5836 | 301 g_free(bi); |
302 } | |
303 | |
5129 | 304 static fu32_t oscar_encoding_check(const char *utf8) |
305 { | |
306 int i = 0; | |
307 fu32_t encodingflag = 0; | |
308 | |
309 /* Determine how we can send this message. Per the warnings elsewhere | |
310 * in this file, these little checks determine the simplest encoding | |
311 * we can use for a given message send using it. */ | |
312 while (utf8[i]) { | |
313 if ((unsigned char)utf8[i] > 0x7f) { | |
314 /* not ASCII! */ | |
315 encodingflag = AIM_IMFLAGS_ISO_8859_1; | |
316 break; | |
317 } | |
318 i++; | |
319 } | |
320 while (utf8[i]) { | |
321 /* ISO-8859-1 is 0x00-0xbf in the first byte | |
322 * followed by 0xc0-0xc3 in the second */ | |
323 if ((unsigned char)utf8[i] < 0x80) { | |
324 i++; | |
325 continue; | |
326 } else if (((unsigned char)utf8[i] & 0xfc) == 0xc0 && | |
327 ((unsigned char)utf8[i + 1] & 0xc0) == 0x80) { | |
328 i += 2; | |
329 continue; | |
330 } | |
331 encodingflag = AIM_IMFLAGS_UNICODE; | |
332 break; | |
333 } | |
334 | |
335 return encodingflag; | |
336 } | |
337 | |
8225 | 338 /* |
339 * Take a string of the form charset="bleh" where bleh is | |
340 * one of us-ascii, utf-8, iso-8859-1, or unicode-2-0, and | |
341 * return a newly allocated string containing bleh. | |
342 */ | |
343 static gchar *oscar_encoding_extract(const char *encoding) | |
5129 | 344 { |
8225 | 345 gchar *ret = NULL; |
346 char *begin, *end; | |
347 | |
348 /* Make sure encoding begings with charset= */ | |
349 if (strncmp(encoding, "text/aolrtf; charset=", 21)) | |
350 return NULL; | |
351 | |
352 begin = strchr(encoding, '"'); | |
353 end = strrchr(encoding, '"'); | |
354 | |
355 if ((begin == NULL) || (end == NULL) || (begin >= end)) | |
356 return NULL; | |
357 | |
358 ret = g_strndup(begin+1, (end-1) - begin); | |
359 | |
360 return ret; | |
361 } | |
362 | |
363 /* | |
364 * Return the flag specifying the given encoding. | |
365 */ | |
366 static fu32_t oscar_encoding_parse(const char *encoding) | |
367 { | |
368 if ((encoding == NULL) || encoding[0] == '\0') { | |
8660 | 369 gaim_debug_warning("oscar", "Empty encoding, assuming ASCII\n"); |
5129 | 370 return 0; |
371 } | |
8225 | 372 |
373 if (!strcmp(encoding, "us-ascii") || !strcmp(encoding, "utf-8")) { | |
374 /* UTF-8 is our native encoding, ASCII is a proper subset */ | |
5129 | 375 return 0; |
8225 | 376 } else if (!strcmp(encoding, "iso-8859-1")) { |
5129 | 377 return AIM_IMFLAGS_ISO_8859_1; |
8225 | 378 } else if (!strcmp(encoding, "unicode-2-0")) { |
5129 | 379 return AIM_IMFLAGS_UNICODE; |
380 } else { | |
8660 | 381 gaim_debug_warning("oscar", |
8250 | 382 "Unrecognized character encoding '%s', attempting to convert to utf8 anyway\n", encoding); |
383 return 99; | |
5129 | 384 } |
385 } | |
386 | |
8233 | 387 gchar *oscar_encoding_to_utf8(const char *encoding, const char *text, int textlen) |
5129 | 388 { |
389 gchar *utf8 = NULL; | |
390 int flags = oscar_encoding_parse(encoding); | |
391 | |
392 switch (flags) { | |
393 case 0: | |
8250 | 394 utf8 = g_convert(text, textlen, "UTF-8", "UTF-8", NULL, NULL, NULL); |
5129 | 395 break; |
396 case AIM_IMFLAGS_ISO_8859_1: | |
397 utf8 = g_convert(text, textlen, "UTF-8", "ISO-8859-1", NULL, NULL, NULL); | |
398 break; | |
399 case AIM_IMFLAGS_UNICODE: | |
400 utf8 = g_convert(text, textlen, "UTF-8", "UCS-2BE", NULL, NULL, NULL); | |
401 break; | |
8250 | 402 case 99: |
403 utf8 = g_convert(text, textlen, "UTF-8", encoding, NULL, NULL, NULL); | |
404 if (utf8 == NULL) { | |
405 utf8 = g_convert(text, textlen, "UTF-8", "UTF-8", NULL, NULL, NULL); | |
406 } | |
407 break; | |
5129 | 408 } |
409 | |
410 return utf8; | |
411 } | |
412 | |
8701 | 413 static char *oscar_caps_to_string(guint caps) |
414 { | |
415 static char buf[512], *tmp; | |
416 int count = 0, i = 0; | |
417 guint bit = 1; | |
418 | |
419 if (!caps) { | |
420 return NULL; | |
421 } else while (bit <= AIM_CAPS_LAST) { | |
422 if (bit & caps) { | |
423 switch (bit) { | |
424 case AIM_CAPS_BUDDYICON: | |
425 tmp = _("Buddy Icon"); | |
426 break; | |
427 case AIM_CAPS_TALK: | |
428 tmp = _("Voice"); | |
429 break; | |
430 case AIM_CAPS_DIRECTIM: | |
431 tmp = _("AIM Direct IM"); | |
432 break; | |
433 case AIM_CAPS_CHAT: | |
434 tmp = _("Chat"); | |
435 break; | |
436 case AIM_CAPS_GETFILE: | |
437 tmp = _("Get File"); | |
438 break; | |
439 case AIM_CAPS_SENDFILE: | |
440 tmp = _("Send File"); | |
441 break; | |
442 case AIM_CAPS_GAMES: | |
443 case AIM_CAPS_GAMES2: | |
444 tmp = _("Games"); | |
445 break; | |
446 case AIM_CAPS_ADDINS: | |
447 tmp = _("Add-Ins"); | |
448 break; | |
449 case AIM_CAPS_SENDBUDDYLIST: | |
450 tmp = _("Send Buddy List"); | |
451 break; | |
452 case AIM_CAPS_ICQ_DIRECT: | |
453 tmp = _("ICQ Direct Connect"); | |
454 break; | |
455 case AIM_CAPS_APINFO: | |
456 tmp = _("AP User"); | |
457 break; | |
458 case AIM_CAPS_ICQRTF: | |
459 tmp = _("ICQ RTF"); | |
460 break; | |
461 case AIM_CAPS_EMPTY: | |
462 tmp = _("Nihilist"); | |
463 break; | |
464 case AIM_CAPS_ICQSERVERRELAY: | |
465 tmp = _("ICQ Server Relay"); | |
466 break; | |
467 case AIM_CAPS_ICQUTF8OLD: | |
468 tmp = _("Old ICQ UTF8"); | |
469 break; | |
470 case AIM_CAPS_TRILLIANCRYPT: | |
471 tmp = _("Trillian Encryption"); | |
472 break; | |
473 case AIM_CAPS_ICQUTF8: | |
474 tmp = _("ICQ UTF8"); | |
475 break; | |
476 case AIM_CAPS_HIPTOP: | |
477 tmp = _("Hiptop"); | |
478 break; | |
479 case AIM_CAPS_SECUREIM: | |
480 tmp = _("Security Enabled"); | |
481 break; | |
482 case AIM_CAPS_VIDEO: | |
483 tmp = _("Video Chat"); | |
484 break; | |
485 /* Not actually sure about this one... WinAIM doesn't show anything */ | |
486 case AIM_CAPS_ICHATAV: | |
487 tmp = _("iChat AV"); | |
488 break; | |
489 case AIM_CAPS_LIVEVIDEO: | |
490 tmp = _("Live Video"); | |
491 break; | |
492 case AIM_CAPS_CAMERA: | |
493 tmp = _("Camera"); | |
494 break; | |
495 default: | |
496 tmp = NULL; | |
497 break; | |
498 } | |
499 if (tmp) | |
500 i += g_snprintf(buf + i, sizeof(buf) - i, "%s%s", (count ? ", " : ""), | |
501 tmp); | |
502 count++; | |
503 } | |
504 bit <<= 1; | |
505 } | |
506 return buf; | |
507 } | |
508 | |
509 static char *oscar_icqstatus(int state) { | |
510 /* Make a cute little string that shows the status of the dude or dudet */ | |
511 if (state & AIM_ICQ_STATE_CHAT) | |
512 return g_strdup_printf(_("Free For Chat")); | |
513 else if (state & AIM_ICQ_STATE_DND) | |
514 return g_strdup_printf(_("Do Not Disturb")); | |
515 else if (state & AIM_ICQ_STATE_OUT) | |
516 return g_strdup_printf(_("Not Available")); | |
517 else if (state & AIM_ICQ_STATE_BUSY) | |
518 return g_strdup_printf(_("Occupied")); | |
519 else if (state & AIM_ICQ_STATE_AWAY) | |
520 return g_strdup_printf(_("Away")); | |
521 else if (state & AIM_ICQ_STATE_WEBAWARE) | |
522 return g_strdup_printf(_("Web Aware")); | |
523 else if (state & AIM_ICQ_STATE_INVISIBLE) | |
524 return g_strdup_printf(_("Invisible")); | |
525 else | |
526 return g_strdup_printf(_("Online")); | |
527 } | |
528 | |
529 static void oscar_string_append(GString *str, char *newline, char *name, char *value) | |
8700 | 530 { |
531 gchar *utf8; | |
532 | |
533 if (value && value[0] && (utf8 = gaim_utf8_try_convert(value))) { | |
8701 | 534 g_string_append_printf(str, "%s<b>%s:</b> %s", newline, name, utf8); |
8700 | 535 g_free(utf8); |
536 } | |
537 } | |
538 | |
8701 | 539 static void oscar_string_append_info(GaimConnection *gc, GString *str, char *newline, GaimBuddy *b, aim_userinfo_t *userinfo) |
540 { | |
541 OscarData *od = gc->proto_data; | |
542 GaimAccount *account = gaim_connection_get_account(gc); | |
543 GaimGroup *g = NULL; | |
544 struct buddyinfo *bi = NULL; | |
545 char *tmp; | |
546 | |
547 if ((str == NULL) || (str == NULL) || (newline == NULL) || ((b == NULL) && (userinfo == NULL))) | |
548 return; | |
549 | |
550 if (userinfo == NULL) | |
551 userinfo = aim_locate_finduserinfo(od->sess, b->name); | |
552 | |
553 if (b == NULL) | |
554 b = gaim_find_buddy(gc->account, userinfo->sn); | |
555 | |
556 if (b != NULL) | |
557 g = gaim_find_buddys_group(b); | |
558 | |
559 if (userinfo != NULL) | |
560 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(account, userinfo->sn)); | |
561 | |
562 | |
563 | |
564 | |
565 if (GAIM_BUDDY_IS_ONLINE(b)) { | |
566 if (isdigit(b->name[0])) { | |
567 tmp = oscar_icqstatus((b->uc & 0xffff0000) >> 16); | |
568 oscar_string_append(str, newline, _("Status"), tmp); | |
569 g_free(tmp); | |
570 } | |
571 } else { | |
572 char *tmp = aim_ssi_itemlist_findparentname(od->sess->ssi.local, b->name); | |
573 if (aim_ssi_waitingforauth(od->sess->ssi.local, tmp, b->name)) | |
574 oscar_string_append(str, newline, _("Status"), _("Not Authorized")); | |
575 else | |
576 oscar_string_append(str, newline, _("Status"), _("Offline")); | |
577 } | |
578 | |
579 | |
580 | |
581 if ((bi != NULL) && (bi->ipaddr != 0)) { | |
582 char *tmp = g_strdup_printf("%hhu.%hhu.%hhu.%hhu", | |
583 (bi->ipaddr & 0xff000000) >> 24, | |
584 (bi->ipaddr & 0x00ff0000) >> 16, | |
585 (bi->ipaddr & 0x0000ff00) >> 8, | |
586 (bi->ipaddr & 0x000000ff)); | |
587 oscar_string_append(str, newline, _("IP Address"), tmp); | |
588 g_free(tmp); | |
589 } | |
590 | |
591 if ((userinfo != NULL) && (userinfo->capabilities != 0)) { | |
592 tmp = oscar_caps_to_string(userinfo->capabilities); | |
593 oscar_string_append(str, newline, _("Capabilities"), tmp); | |
594 } | |
595 | |
596 if ((b != NULL) && (b->name != NULL) && (g != NULL) && (g->name != NULL)) { | |
597 tmp = aim_ssi_getcomment(od->sess->ssi.local, g->name, b->name); | |
598 if (tmp != NULL) { | |
599 oscar_string_append(str, newline, _("Buddy Comment"), tmp); | |
600 g_free(tmp); | |
601 } | |
602 } | |
603 | |
604 if ((bi != NULL) && (bi->availmsg != NULL) && !(b->uc & UC_UNAVAILABLE)) { | |
605 tmp = g_markup_escape_text(bi->availmsg, strlen(bi->availmsg)); | |
606 oscar_string_append(str, newline, _("Available"), tmp); | |
607 g_free(tmp); | |
608 } | |
609 } | |
610 | |
7283 | 611 static struct direct_im *find_direct_im(OscarData *od, const char *who) { |
2086 | 612 GSList *d = od->direct_ims; |
613 struct direct_im *m = NULL; | |
614 | |
615 while (d) { | |
616 m = (struct direct_im *)d->data; | |
4355 | 617 if (!aim_sncmp(who, m->name)) |
4269 | 618 return m; |
2086 | 619 d = d->next; |
620 } | |
621 | |
4269 | 622 return NULL; |
2086 | 623 } |
624 | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
625 static char *extract_name(const char *name) { |
4121 | 626 char *tmp, *x; |
2086 | 627 int i, j; |
4120 | 628 |
629 if (!name) | |
4121 | 630 return NULL; |
631 | |
4120 | 632 x = strchr(name, '-'); |
4121 | 633 |
2086 | 634 if (!x) return NULL; |
635 x = strchr(++x, '-'); | |
636 if (!x) return NULL; | |
637 tmp = g_strdup(++x); | |
638 | |
639 for (i = 0, j = 0; x[i]; i++) { | |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
640 char hex[3]; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
641 if (x[i] != '%') { |
2086 | 642 tmp[j++] = x[i]; |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
643 continue; |
2086 | 644 } |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
645 strncpy(hex, x + ++i, 2); hex[2] = 0; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
646 i++; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
647 tmp[j++] = strtol(hex, NULL, 16); |
2086 | 648 } |
649 | |
650 tmp[j] = 0; | |
651 return tmp; | |
652 } | |
653 | |
5575 | 654 static struct chat_connection *find_oscar_chat(GaimConnection *gc, int id) { |
7283 | 655 GSList *g = ((OscarData *)gc->proto_data)->oscar_chats; |
2086 | 656 struct chat_connection *c = NULL; |
657 | |
658 while (g) { | |
659 c = (struct chat_connection *)g->data; | |
660 if (c->id == id) | |
661 break; | |
662 g = g->next; | |
663 c = NULL; | |
664 } | |
665 | |
666 return c; | |
667 } | |
668 | |
5575 | 669 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
|
670 aim_conn_t *conn) { |
7283 | 671 GSList *g = ((OscarData *)gc->proto_data)->oscar_chats; |
2086 | 672 struct chat_connection *c = NULL; |
673 | |
674 while (g) { | |
675 c = (struct chat_connection *)g->data; | |
676 if (c->conn == conn) | |
677 break; | |
678 g = g->next; | |
679 c = NULL; | |
680 } | |
681 | |
682 return c; | |
683 } | |
684 | |
8219 | 685 static struct chat_connection *find_oscar_chat_by_conv(GaimConnection *gc, |
686 GaimConversation *conv) { | |
687 GSList *g = ((OscarData *)gc->proto_data)->oscar_chats; | |
688 struct chat_connection *c = NULL; | |
689 | |
690 while (g) { | |
691 c = (struct chat_connection *)g->data; | |
692 if (c->cnv == conv) | |
693 break; | |
694 g = g->next; | |
695 c = NULL; | |
696 } | |
697 | |
698 return c; | |
699 } | |
700 | |
4617 | 701 static void gaim_odc_disconnect(aim_session_t *sess, aim_conn_t *conn) { |
5575 | 702 GaimConnection *gc = sess->aux_data; |
7283 | 703 OscarData *od = (OscarData *)gc->proto_data; |
5679 | 704 GaimConversation *cnv; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
705 struct direct_im *dim; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
706 char *sn; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
707 char buf[256]; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
708 |
4617 | 709 sn = g_strdup(aim_odc_getsn(conn)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
710 |
8660 | 711 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
712 "%s disconnected Direct IM.\n", sn); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
713 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
714 dim = find_direct_im(od, sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
715 od->direct_ims = g_slist_remove(od->direct_ims, dim); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
716 gaim_input_remove(dim->watcher); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
717 |
3008 | 718 if (dim->connected) |
719 g_snprintf(buf, sizeof buf, _("Direct IM with %s closed"), sn); | |
720 else | |
721 g_snprintf(buf, sizeof buf, _("Direct IM with %s failed"), sn); | |
6640
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6623
diff
changeset
|
722 |
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6623
diff
changeset
|
723 cnv = gaim_find_conversation_with_account(sn, gaim_connection_get_account(gc)); |
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6623
diff
changeset
|
724 if (cnv) |
6982 | 725 gaim_conversation_write(cnv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL)); |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
726 |
5579 | 727 gaim_conversation_update_progress(cnv, 0); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
728 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
729 g_free(dim); /* I guess? I don't see it anywhere else... -- mid */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
730 g_free(sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
731 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
732 return; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
733 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
734 |
4617 | 735 static void oscar_callback(gpointer data, gint source, GaimInputCondition condition) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
736 aim_conn_t *conn = (aim_conn_t *)data; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
737 aim_session_t *sess = aim_conn_getsess(conn); |
5575 | 738 GaimConnection *gc = sess ? sess->aux_data : NULL; |
7283 | 739 OscarData *od; |
2086 | 740 |
741 if (!gc) { | |
8660 | 742 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
743 "oscar callback for closed connection (1).\n"); |
2086 | 744 return; |
745 } | |
746 | |
7283 | 747 od = (OscarData *)gc->proto_data; |
2086 | 748 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
749 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 750 /* oh boy. this is probably bad. i guess the only thing we |
751 * can really do is return? */ | |
8660 | 752 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
753 "oscar callback for closed connection (2).\n"); |
8660 | 754 gaim_debug_misc("oscar", "gc = %p\n", gc); |
2086 | 755 return; |
756 } | |
757 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
758 if (condition & GAIM_INPUT_READ) { |
4617 | 759 if (conn->type == AIM_CONN_TYPE_LISTENER) { |
8660 | 760 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
761 "got information on rendezvous listener\n"); |
4617 | 762 if (aim_handlerendconnect(od->sess, conn) < 0) { |
8660 | 763 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
764 "connection error (rendezvous listener)\n"); |
4617 | 765 aim_conn_kill(od->sess, &conn); |
8446 | 766 /* AAA - Don't we need to gaim_xfer_cancel here? --marv */ |
2086 | 767 } |
768 } else { | |
4617 | 769 if (aim_get_command(od->sess, conn) >= 0) { |
770 aim_rxdispatch(od->sess); | |
6029 | 771 if (od->killme) { |
8660 | 772 gaim_debug_error("oscar", "Waiting to be destroyed\n"); |
6029 | 773 return; |
774 } | |
2086 | 775 } else { |
776 if ((conn->type == AIM_CONN_TYPE_BOS) || | |
4617 | 777 !(aim_getconn_type(od->sess, AIM_CONN_TYPE_BOS))) { |
8660 | 778 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
779 "major connection error\n"); |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
780 gaim_connection_error(gc, _("Disconnected.")); |
2086 | 781 } else if (conn->type == AIM_CONN_TYPE_CHAT) { |
782 struct chat_connection *c = find_oscar_chat_by_conn(gc, conn); | |
5420 | 783 char *buf; |
8660 | 784 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
785 "disconnected from chat room %s\n", c->name); |
2086 | 786 c->conn = NULL; |
787 if (c->inpa > 0) | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
788 gaim_input_remove(c->inpa); |
2086 | 789 c->inpa = 0; |
790 c->fd = -1; | |
4617 | 791 aim_conn_kill(od->sess, &conn); |
5420 | 792 buf = g_strdup_printf(_("You have been disconnected from chat room %s."), c->name); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
793 gaim_notify_error(gc, NULL, buf, NULL); |
5420 | 794 g_free(buf); |
2086 | 795 } else if (conn->type == AIM_CONN_TYPE_CHATNAV) { |
4617 | 796 if (od->cnpa > 0) |
797 gaim_input_remove(od->cnpa); | |
798 od->cnpa = 0; | |
8660 | 799 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
800 "removing chatnav input watcher\n"); |
4617 | 801 while (od->create_rooms) { |
802 struct create_room *cr = od->create_rooms->data; | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
803 g_free(cr->name); |
4617 | 804 od->create_rooms = |
805 g_slist_remove(od->create_rooms, cr); | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
806 g_free(cr); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
807 gaim_notify_error(gc, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
808 _("Chat is currently unavailable"), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
809 NULL); |
2086 | 810 } |
4617 | 811 aim_conn_kill(od->sess, &conn); |
2086 | 812 } else if (conn->type == AIM_CONN_TYPE_AUTH) { |
4617 | 813 if (od->paspa > 0) |
814 gaim_input_remove(od->paspa); | |
815 od->paspa = 0; | |
8660 | 816 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
817 "removing authconn input watcher\n"); |
4617 | 818 aim_conn_kill(od->sess, &conn); |
3694 | 819 } else if (conn->type == AIM_CONN_TYPE_EMAIL) { |
4617 | 820 if (od->emlpa > 0) |
821 gaim_input_remove(od->emlpa); | |
822 od->emlpa = 0; | |
8660 | 823 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
824 "removing email input watcher\n"); |
4617 | 825 aim_conn_kill(od->sess, &conn); |
4804 | 826 } else if (conn->type == AIM_CONN_TYPE_ICON) { |
827 if (od->icopa > 0) | |
828 gaim_input_remove(od->icopa); | |
829 od->icopa = 0; | |
8660 | 830 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
831 "removing icon input watcher\n"); |
4804 | 832 aim_conn_kill(od->sess, &conn); |
2086 | 833 } else if (conn->type == AIM_CONN_TYPE_RENDEZVOUS) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
834 if (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM) |
4617 | 835 gaim_odc_disconnect(od->sess, conn); |
836 aim_conn_kill(od->sess, &conn); | |
2086 | 837 } else { |
8660 | 838 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
839 "holy crap! generic connection error! %hu\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
840 conn->type); |
4617 | 841 aim_conn_kill(od->sess, &conn); |
2086 | 842 } |
843 } | |
844 } | |
845 } | |
846 } | |
847 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
848 static void oscar_debug(aim_session_t *sess, int level, const char *format, va_list va) { |
5575 | 849 GaimConnection *gc = sess->aux_data; |
7285 | 850 gchar *s = g_strdup_vprintf(format, va); |
851 gchar *buf; | |
852 | |
853 buf = g_strdup_printf("%s %d: %s", gaim_account_get_username(gaim_connection_get_account(gc)), level, s); | |
8660 | 854 gaim_debug_info("oscar", buf); |
7285 | 855 if (buf[strlen(buf)-1] != '\n') |
8660 | 856 gaim_debug_info(NULL, "\n"); |
7285 | 857 g_free(buf); |
2086 | 858 g_free(s); |
859 } | |
860 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
861 static void oscar_login_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 862 { |
5575 | 863 GaimConnection *gc = data; |
7283 | 864 OscarData *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
865 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
866 aim_conn_t *conn; |
2086 | 867 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
868 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 869 close(source); |
870 return; | |
871 } | |
872 | |
4617 | 873 od = gc->proto_data; |
874 sess = od->sess; | |
2086 | 875 conn = aim_getconn_type_all(sess, AIM_CONN_TYPE_AUTH); |
4366 | 876 conn->fd = source; |
2086 | 877 |
878 if (source < 0) { | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
879 gaim_connection_error(gc, _("Couldn't connect to host")); |
2086 | 880 return; |
881 } | |
882 | |
883 aim_conn_completeconnect(sess, conn); | |
4617 | 884 gc->inpa = gaim_input_add(conn->fd, GAIM_INPUT_READ, oscar_callback, conn); |
7282 | 885 aim_request_login(sess, conn, gaim_account_get_username(gaim_connection_get_account(gc))); |
886 | |
8660 | 887 gaim_debug_info("oscar", |
7282 | 888 "Screen name sent, waiting for response\n"); |
7283 | 889 gaim_connection_update_progress(gc, _("Screen name sent"), 1, OSCAR_CONNECT_STEPS); |
8341 | 890 ck[1] = 0x65; |
2086 | 891 } |
892 | |
5575 | 893 static void oscar_login(GaimAccount *account) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
894 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
895 aim_conn_t *conn; |
5575 | 896 GaimConnection *gc = gaim_account_get_connection(account); |
7283 | 897 OscarData *od = gc->proto_data = g_new0(OscarData, 1); |
2086 | 898 |
8660 | 899 gaim_debug_misc("oscar", "oscar_login: gc = %p\n", gc); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
900 |
8437 | 901 if (!aim_snvalid(gaim_account_get_username(account))) { |
902 gchar *buf; | |
8590 | 903 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 | 904 gaim_connection_error(gc, buf); |
905 g_free(buf); | |
906 } | |
907 | |
5575 | 908 if (isdigit(*(gaim_account_get_username(account)))) { |
4617 | 909 od->icq = TRUE; |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
910 } else { |
6622 | 911 gc->flags |= GAIM_CONNECTION_HTML; |
912 gc->flags |= GAIM_CONNECTION_AUTO_RESP; | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
913 } |
5836 | 914 od->buddyinfo = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, oscar_free_buddyinfo); |
2086 | 915 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
916 sess = g_new0(aim_session_t, 1); |
7285 | 917 aim_session_init(sess, TRUE, 0); |
2086 | 918 aim_setdebuggingcb(sess, oscar_debug); |
7282 | 919 /* |
920 * We need an immediate queue because we don't use a while-loop | |
921 * to see if things need to be sent. | |
922 */ | |
2086 | 923 aim_tx_setenqueue(sess, AIM_TX_IMMEDIATE, NULL); |
4617 | 924 od->sess = sess; |
2086 | 925 sess->aux_data = gc; |
926 | |
927 conn = aim_newconn(sess, AIM_CONN_TYPE_AUTH, NULL); | |
928 if (conn == NULL) { | |
8660 | 929 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
930 "internal connection error\n"); |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
931 gaim_connection_error(gc, _("Unable to login to AIM")); |
2086 | 932 return; |
933 } | |
934 | |
4649 | 935 aim_conn_addhandler(sess, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2086 | 936 aim_conn_addhandler(sess, conn, 0x0017, 0x0007, gaim_parse_login, 0); |
937 aim_conn_addhandler(sess, conn, 0x0017, 0x0003, gaim_parse_auth_resp, 0); | |
938 | |
939 conn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
940 if (gaim_proxy_connect(account, gaim_account_get_string(account, "server", FAIM_LOGIN_SERVER), |
5575 | 941 gaim_account_get_int(account, "port", FAIM_LOGIN_PORT), |
942 oscar_login_connect, gc) < 0) { | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
943 gaim_connection_error(gc, _("Couldn't connect to host")); |
2086 | 944 return; |
945 } | |
7282 | 946 |
7283 | 947 gaim_connection_update_progress(gc, _("Connecting"), 0, OSCAR_CONNECT_STEPS); |
8341 | 948 ck[0] = 0x5a; |
5575 | 949 } |
950 | |
951 static void oscar_close(GaimConnection *gc) { | |
7283 | 952 OscarData *od = (OscarData *)gc->proto_data; |
4617 | 953 |
954 while (od->oscar_chats) { | |
955 struct chat_connection *n = od->oscar_chats->data; | |
2086 | 956 if (n->inpa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
957 gaim_input_remove(n->inpa); |
2086 | 958 g_free(n->name); |
959 g_free(n->show); | |
4617 | 960 od->oscar_chats = g_slist_remove(od->oscar_chats, n); |
2086 | 961 g_free(n); |
962 } | |
4617 | 963 while (od->direct_ims) { |
964 struct direct_im *n = od->direct_ims->data; | |
2086 | 965 if (n->watcher > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
966 gaim_input_remove(n->watcher); |
4617 | 967 od->direct_ims = g_slist_remove(od->direct_ims, n); |
2086 | 968 g_free(n); |
969 } | |
4617 | 970 /* BBB */ |
971 while (od->file_transfers) { | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
972 GaimXfer *xfer; |
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
973 xfer = (GaimXfer *)od->file_transfers->data; |
7805 | 974 gaim_xfer_cancel_local(xfer); |
3630 | 975 } |
4804 | 976 while (od->requesticon) { |
977 char *sn = od->requesticon->data; | |
978 od->requesticon = g_slist_remove(od->requesticon, sn); | |
979 free(sn); | |
980 } | |
4738 | 981 g_hash_table_destroy(od->buddyinfo); |
4617 | 982 while (od->create_rooms) { |
983 struct create_room *cr = od->create_rooms->data; | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
984 g_free(cr->name); |
4617 | 985 od->create_rooms = g_slist_remove(od->create_rooms, cr); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
986 g_free(cr); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
987 } |
4617 | 988 if (od->email) |
989 g_free(od->email); | |
990 if (od->newp) | |
991 g_free(od->newp); | |
992 if (od->oldp) | |
993 g_free(od->oldp); | |
2086 | 994 if (gc->inpa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
995 gaim_input_remove(gc->inpa); |
4617 | 996 if (od->cnpa > 0) |
997 gaim_input_remove(od->cnpa); | |
998 if (od->paspa > 0) | |
999 gaim_input_remove(od->paspa); | |
1000 if (od->emlpa > 0) | |
1001 gaim_input_remove(od->emlpa); | |
4804 | 1002 if (od->icopa > 0) |
1003 gaim_input_remove(od->icopa); | |
6907 | 1004 if (od->icontimer > 0) |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
1005 gaim_timeout_remove(od->icontimer); |
8341 | 1006 if (od->getblisttimer > 0) |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
1007 gaim_timeout_remove(od->getblisttimer); |
8341 | 1008 if (od->getinfotimer > 0) |
1009 gaim_timeout_remove(od->getinfotimer); | |
4617 | 1010 aim_session_kill(od->sess); |
1011 g_free(od->sess); | |
1012 od->sess = NULL; | |
2086 | 1013 g_free(gc->proto_data); |
1014 gc->proto_data = NULL; | |
8660 | 1015 gaim_debug_info("oscar", "Signed off.\n"); |
2086 | 1016 } |
1017 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1018 static void oscar_bos_connect(gpointer data, gint source, GaimInputCondition cond) { |
5575 | 1019 GaimConnection *gc = data; |
7283 | 1020 OscarData *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1021 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1022 aim_conn_t *bosconn; |
2086 | 1023 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1024 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 1025 close(source); |
1026 return; | |
1027 } | |
1028 | |
4617 | 1029 od = gc->proto_data; |
1030 sess = od->sess; | |
1031 bosconn = od->conn; | |
4366 | 1032 bosconn->fd = source; |
2086 | 1033 |
1034 if (source < 0) { | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1035 gaim_connection_error(gc, _("Could Not Connect")); |
2086 | 1036 return; |
1037 } | |
1038 | |
1039 aim_conn_completeconnect(sess, bosconn); | |
4617 | 1040 gc->inpa = gaim_input_add(bosconn->fd, GAIM_INPUT_READ, oscar_callback, bosconn); |
7283 | 1041 |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1042 gaim_connection_update_progress(gc, |
7283 | 1043 _("Connection established, cookie sent"), 4, OSCAR_CONNECT_STEPS); |
8341 | 1044 ck[4] = 0x61; |
2086 | 1045 } |
1046 | |
4617 | 1047 /* BBB */ |
4656 | 1048 /* |
1049 * This little area in oscar.c is the nexus of file transfer code, | |
1050 * so I wrote a little explanation of what happens. I am such a | |
1051 * ninja. | |
1052 * | |
1053 * The series of events for a file send is: | |
1054 * -Create xfer and call gaim_xfer_request (this happens in oscar_ask_sendfile) | |
1055 * -User chooses a file and oscar_xfer_init is called. It establishs a | |
1056 * listening socket, then asks the remote user to connect to us (and | |
1057 * gives them the file name, port, IP, etc.) | |
1058 * -They connect to us and we send them an AIM_CB_OFT_PROMPT (this happens | |
1059 * in oscar_sendfile_estblsh) | |
1060 * -They send us an AIM_CB_OFT_ACK and then we start sending data | |
1061 * -When we finish, they send us an AIM_CB_OFT_DONE and they close the | |
1062 * connection. | |
1063 * -We get drunk because file transfer kicks ass. | |
1064 * | |
1065 * The series of events for a file receive is: | |
1066 * -Create xfer and call gaim_xfer request (this happens in incomingim_chan2) | |
1067 * -Gaim user selects file to name and location to save file to and | |
1068 * oscar_xfer_init is called | |
1069 * -It connects to the remote user using the IP they gave us earlier | |
1070 * -After connecting, they send us an AIM_CB_OFT_PROMPT. In reply, we send | |
1071 * them an AIM_CB_OFT_ACK. | |
1072 * -They begin to send us lots of raw data. | |
1073 * -When they finish sending data we send an AIM_CB_OFT_DONE and then close | |
1074 * the connectionn. | |
1075 */ | |
1076 static void oscar_sendfile_connected(gpointer data, gint source, GaimInputCondition condition); | |
1077 | |
8446 | 1078 /* |
1079 * Miscellaneous xfer functions | |
1080 */ | |
1081 static GaimXfer *oscar_find_xfer_by_cookie(GSList *fts, const fu8_t *ck) | |
4656 | 1082 { |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
1083 GaimXfer *xfer; |
5146 | 1084 struct aim_oft_info *oft_info; |
4656 | 1085 |
1086 while (fts) { | |
1087 xfer = fts->data; | |
5146 | 1088 oft_info = xfer->data; |
1089 | |
8446 | 1090 if (oft_info && !memcmp(ck, oft_info->cookie, 8)) |
4656 | 1091 return xfer; |
1092 | |
1093 fts = g_slist_next(fts); | |
1094 } | |
1095 | |
1096 return NULL; | |
1097 } | |
1098 | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
1099 static GaimXfer *oscar_find_xfer_by_conn(GSList *fts, aim_conn_t *conn) |
4656 | 1100 { |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
1101 GaimXfer *xfer; |
5146 | 1102 struct aim_oft_info *oft_info; |
4656 | 1103 |
1104 while (fts) { | |
1105 xfer = fts->data; | |
5146 | 1106 oft_info = xfer->data; |
1107 | |
1108 if (oft_info && (conn == oft_info->conn)) | |
4656 | 1109 return xfer; |
1110 | |
1111 fts = g_slist_next(fts); | |
1112 } | |
1113 | |
1114 return NULL; | |
1115 } | |
1116 | |
8446 | 1117 static void oscar_xfer_end(GaimXfer *xfer) |
1118 { | |
1119 struct aim_oft_info *oft_info = xfer->data; | |
1120 GaimConnection *gc = oft_info->sess->aux_data; | |
1121 OscarData *od = gc->proto_data; | |
1122 | |
8660 | 1123 gaim_debug_info("oscar", "AAA - in oscar_xfer_end\n"); |
8446 | 1124 |
1125 if (gaim_xfer_get_type(xfer) == GAIM_XFER_RECEIVE) { | |
1126 oft_info->fh.nrecvd = gaim_xfer_get_bytes_sent(xfer); | |
1127 aim_oft_sendheader(oft_info->sess, AIM_CB_OFT_DONE, oft_info); | |
1128 } | |
1129 | |
1130 aim_conn_kill(oft_info->sess, &oft_info->conn); | |
1131 aim_oft_destroyinfo(oft_info); | |
1132 xfer->data = NULL; | |
1133 od->file_transfers = g_slist_remove(od->file_transfers, xfer); | |
1134 } | |
1135 | |
1136 /* | |
1137 * xfer functions used when receiving files | |
1138 */ | |
1139 | |
1140 static void oscar_xfer_init_recv(GaimXfer *xfer) | |
1141 { | |
1142 struct aim_oft_info *oft_info = xfer->data; | |
1143 GaimConnection *gc = oft_info->sess->aux_data; | |
1144 OscarData *od = gc->proto_data; | |
1145 | |
8660 | 1146 gaim_debug_info("oscar", "AAA - in oscar_xfer_recv_init\n"); |
8446 | 1147 |
1148 oft_info->conn = aim_newconn(od->sess, AIM_CONN_TYPE_RENDEZVOUS, NULL); | |
1149 if (oft_info->conn) { | |
1150 oft_info->conn->subtype = AIM_CONN_SUBTYPE_OFT_SENDFILE; | |
1151 aim_conn_addhandler(od->sess, oft_info->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_PROMPT, oscar_sendfile_prompt, 0); | |
1152 oft_info->conn->fd = xfer->fd = gaim_proxy_connect(gaim_connection_get_account(gc), | |
1153 xfer->remote_ip, xfer->remote_port, oscar_sendfile_connected, xfer); | |
1154 if (xfer->fd == -1) { | |
1155 gaim_xfer_error(GAIM_XFER_RECEIVE, xfer->who, | |
1156 _("Unable to establish file descriptor.")); | |
1157 gaim_xfer_cancel_local(xfer); | |
1158 } | |
1159 } else { | |
1160 gaim_xfer_error(GAIM_XFER_RECEIVE, xfer->who, | |
1161 _("Unable to create new connection.")); | |
1162 gaim_xfer_cancel_local(xfer); | |
1163 /* Try a different port? Ask them to connect to us? /join #gaim and whine? */ | |
1164 } | |
1165 | |
1166 } | |
1167 | |
1168 static void oscar_xfer_cancel_recv(GaimXfer *xfer) | |
1169 { | |
1170 struct aim_oft_info *oft_info = xfer->data; | |
1171 GaimConnection *gc = oft_info->sess->aux_data; | |
1172 OscarData *od = gc->proto_data; | |
1173 | |
8660 | 1174 gaim_debug_info("oscar", "AAA - in oscar_xfer_cancel_recv\n"); |
8446 | 1175 |
1176 aim_im_sendch2_sendfile_cancel(oft_info->sess, oft_info); | |
1177 | |
1178 aim_conn_kill(oft_info->sess, &oft_info->conn); | |
1179 aim_oft_destroyinfo(oft_info); | |
1180 xfer->data = NULL; | |
1181 od->file_transfers = g_slist_remove(od->file_transfers, xfer); | |
1182 } | |
1183 | |
1184 static void oscar_xfer_ack_recv(GaimXfer *xfer, const char *buffer, size_t size) | |
1185 { | |
1186 struct aim_oft_info *oft_info = xfer->data; | |
1187 | |
1188 /* Update our rolling checksum. Like Walmart, yo. */ | |
1189 oft_info->fh.recvcsum = aim_oft_checksum_chunk(buffer, size, oft_info->fh.recvcsum); | |
1190 } | |
1191 | |
1192 /* | |
1193 * xfer functions used when sending files | |
1194 */ | |
1195 | |
1196 static void oscar_xfer_init_send(GaimXfer *xfer) | |
1197 { | |
1198 struct aim_oft_info *oft_info = xfer->data; | |
1199 GaimConnection *gc = oft_info->sess->aux_data; | |
1200 OscarData *od = gc->proto_data; | |
1201 int listenfd; | |
1202 | |
8660 | 1203 gaim_debug_info("oscar", "AAA - in oscar_xfer_send_init\n"); |
8446 | 1204 |
1205 xfer->filename = g_path_get_basename(xfer->local_filename); | |
1206 strncpy(oft_info->fh.name, xfer->filename, 64); | |
1207 oft_info->fh.name[63] = '\0'; | |
1208 oft_info->fh.totsize = gaim_xfer_get_size(xfer); | |
1209 oft_info->fh.size = gaim_xfer_get_size(xfer); | |
1210 oft_info->fh.checksum = aim_oft_checksum_file(xfer->local_filename); | |
1211 | |
1212 /* Create a listening socket and an associated libfaim conn */ | |
1213 if ((listenfd = gaim_network_listen_range(5190, 5199)) < 0) { | |
1214 gaim_xfer_cancel_local(xfer); | |
1215 return; | |
1216 } | |
1217 xfer->local_port = gaim_network_get_port_from_fd(listenfd); | |
1218 oft_info->port = xfer->local_port; | |
1219 if (aim_sendfile_listen(od->sess, oft_info, listenfd) != 0) { | |
1220 gaim_xfer_cancel_local(xfer); | |
1221 return; | |
1222 } | |
8660 | 1223 gaim_debug_misc("oscar", |
8446 | 1224 "port is %hu, ip is %s\n", |
1225 xfer->local_port, oft_info->clientip); | |
1226 if (oft_info->conn) { | |
1227 xfer->watcher = gaim_input_add(oft_info->conn->fd, GAIM_INPUT_READ, oscar_callback, oft_info->conn); | |
1228 aim_im_sendch2_sendfile_ask(od->sess, oft_info); | |
1229 aim_conn_addhandler(od->sess, oft_info->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_ESTABLISHED, oscar_sendfile_estblsh, 0); | |
1230 } else { | |
1231 gaim_xfer_error(GAIM_XFER_SEND, xfer->who, | |
1232 _("Unable to establish listener socket.")); | |
1233 gaim_xfer_cancel_local(xfer); | |
1234 } | |
1235 } | |
1236 | |
1237 static void oscar_xfer_cancel_send(GaimXfer *xfer) | |
1238 { | |
1239 struct aim_oft_info *oft_info = xfer->data; | |
1240 GaimConnection *gc = oft_info->sess->aux_data; | |
1241 OscarData *od = gc->proto_data; | |
1242 | |
8660 | 1243 gaim_debug_info("oscar", "AAA - in oscar_xfer_cancel_send\n"); |
8446 | 1244 |
1245 aim_im_sendch2_sendfile_cancel(oft_info->sess, oft_info); | |
1246 | |
1247 aim_conn_kill(oft_info->sess, &oft_info->conn); | |
1248 aim_oft_destroyinfo(oft_info); | |
1249 xfer->data = NULL; | |
1250 od->file_transfers = g_slist_remove(od->file_transfers, xfer); | |
1251 } | |
1252 | |
1253 static void oscar_xfer_ack_send(GaimXfer *xfer, const char *buffer, size_t size) | |
1254 { | |
1255 struct aim_oft_info *oft_info = xfer->data; | |
1256 | |
1257 /* I'm not sure I like how we do this. --marv | |
1258 * I do. AIM file transfers aren't really meant to be thought | |
1259 * of as a transferring just a single file. The rendezvous | |
1260 * establishes a connection between two computers, and then | |
1261 * those computers can use the same connection for transferring | |
1262 * multiple files. So we don't want the Gaim core up and closing | |
1263 * the socket all willy-nilly. We want to do that in the oscar | |
1264 * prpl, whenever one side or the other says they're finished | |
1265 * using the connection. There might be a better way to intercept | |
1266 * the socket from the core, however... --KingAnt | |
1267 */ | |
1268 | |
1269 /* | |
1270 * If we're done sending, intercept the socket from the core ft code | |
1271 * and wait for the other guy to send the "done" OFT packet. | |
1272 */ | |
1273 if (gaim_xfer_get_bytes_remaining(xfer) <= 0) { | |
1274 gaim_input_remove(xfer->watcher); | |
1275 xfer->watcher = gaim_input_add(xfer->fd, GAIM_INPUT_READ, oscar_callback, oft_info->conn); | |
1276 xfer->fd = 0; | |
1277 gaim_xfer_set_completed(xfer, TRUE); | |
1278 } | |
1279 } | |
1280 | |
5575 | 1281 static void oscar_ask_sendfile(GaimConnection *gc, const char *destsn) { |
7283 | 1282 OscarData *od = (OscarData *)gc->proto_data; |
8231
f50c059b6384
[gaim-migrate @ 8954]
Christian Hammond <chipx86@chipx86.com>
parents:
8227
diff
changeset
|
1283 GaimAccount *account = gaim_connection_get_account(gc); |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
1284 GaimXfer *xfer; |
5146 | 1285 struct aim_oft_info *oft_info; |
8231
f50c059b6384
[gaim-migrate @ 8954]
Christian Hammond <chipx86@chipx86.com>
parents:
8227
diff
changeset
|
1286 const char *ip; |
3752 | 1287 |
4617 | 1288 /* You want to send a file to someone else, you're so generous */ |
1289 | |
1290 /* Build the file transfer handle */ | |
5575 | 1291 xfer = gaim_xfer_new(gaim_connection_get_account(gc), GAIM_XFER_SEND, destsn); |
4617 | 1292 |
5146 | 1293 /* Create the oscar-specific data */ |
8240 | 1294 ip = gaim_network_get_ip_for_account(account, od->conn ? od->conn->fd : -1); |
1295 oft_info = aim_oft_createinfo(od->sess, NULL, destsn, ip, 0, 0, 0, NULL); | |
5146 | 1296 xfer->data = oft_info; |
1297 | |
4617 | 1298 /* Setup our I/O op functions */ |
8446 | 1299 gaim_xfer_set_init_fnc(xfer, oscar_xfer_init_send); |
4617 | 1300 gaim_xfer_set_end_fnc(xfer, oscar_xfer_end); |
4675
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
1301 gaim_xfer_set_cancel_send_fnc(xfer, oscar_xfer_cancel_send); |
8446 | 1302 gaim_xfer_set_request_denied_fnc(xfer, oscar_xfer_cancel_send); |
1303 gaim_xfer_set_ack_fnc(xfer, oscar_xfer_ack_send); | |
4617 | 1304 |
1305 /* Keep track of this transfer for later */ | |
1306 od->file_transfers = g_slist_append(od->file_transfers, xfer); | |
1307 | |
1308 /* Now perform the request */ | |
1309 gaim_xfer_request(xfer); | |
3630 | 1310 } |
1311 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1312 static int gaim_parse_auth_resp(aim_session_t *sess, aim_frame_t *fr, ...) { |
6029 | 1313 GaimConnection *gc = sess->aux_data; |
7283 | 1314 OscarData *od = gc->proto_data; |
6029 | 1315 GaimAccount *account = gc->account; |
1316 aim_conn_t *bosconn; | |
1317 char *host; int port; | |
1318 int i, rc; | |
2086 | 1319 va_list ap; |
2704 | 1320 struct aim_authresp_info *info; |
6029 | 1321 |
5575 | 1322 port = gaim_account_get_int(account, "port", FAIM_LOGIN_PORT); |
2086 | 1323 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1324 va_start(ap, fr); |
2704 | 1325 info = va_arg(ap, struct aim_authresp_info *); |
2086 | 1326 va_end(ap); |
1327 | |
8660 | 1328 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1329 "inside auth_resp (Screen name: %s)\n", info->sn); |
2704 | 1330 |
4293 | 1331 if (info->errorcode || !info->bosip || !info->cookielen || !info->cookie) { |
4056 | 1332 char buf[256]; |
2704 | 1333 switch (info->errorcode) { |
2086 | 1334 case 0x05: |
1335 /* Incorrect nick/password */ | |
6498 | 1336 gc->wants_to_die = TRUE; |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1337 gaim_connection_error(gc, _("Incorrect nickname or password.")); |
2086 | 1338 break; |
1339 case 0x11: | |
1340 /* Suspended account */ | |
6498 | 1341 gc->wants_to_die = TRUE; |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1342 gaim_connection_error(gc, _("Your account is currently suspended.")); |
2086 | 1343 break; |
3498 | 1344 case 0x14: |
1345 /* service temporarily unavailable */ | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1346 gaim_connection_error(gc, _("The AOL Instant Messenger service is temporarily unavailable.")); |
3498 | 1347 break; |
2086 | 1348 case 0x18: |
1349 /* connecting too frequently */ | |
6498 | 1350 gc->wants_to_die = TRUE; |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1351 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 | 1352 break; |
1353 case 0x1c: | |
1354 /* client too old */ | |
6498 | 1355 gc->wants_to_die = TRUE; |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6350
diff
changeset
|
1356 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
|
1357 gaim_connection_error(gc, buf); |
2086 | 1358 break; |
1359 default: | |
6623 | 1360 gaim_connection_error(gc, _("Authentication failed")); |
2086 | 1361 break; |
1362 } | |
8660 | 1363 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1364 "Login Error Code 0x%04hx\n", info->errorcode); |
8660 | 1365 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1366 "Error URL: %s\n", info->errorurl); |
2086 | 1367 od->killme = TRUE; |
1368 return 1; | |
1369 } | |
1370 | |
1371 | |
8660 | 1372 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1373 "Reg status: %hu\n", info->regstatus); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1374 |
2704 | 1375 if (info->email) { |
8660 | 1376 gaim_debug_misc("oscar", "Email: %s\n", info->email); |
2086 | 1377 } else { |
8660 | 1378 gaim_debug_misc("oscar", "Email is NULL\n"); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1379 } |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1380 |
8660 | 1381 gaim_debug_misc("oscar", "BOSIP: %s\n", info->bosip); |
1382 gaim_debug_info("oscar", | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1383 "Closing auth connection...\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1384 aim_conn_kill(sess, &fr->conn); |
2086 | 1385 |
1386 bosconn = aim_newconn(sess, AIM_CONN_TYPE_BOS, NULL); | |
1387 if (bosconn == NULL) { | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1388 gaim_connection_error(gc, _("Internal Error")); |
2086 | 1389 od->killme = TRUE; |
1390 return 0; | |
1391 } | |
1392 | |
4649 | 1393 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 1394 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_bos, 0); |
2086 | 1395 aim_conn_addhandler(sess, bosconn, 0x0009, 0x0003, gaim_bosrights, 0); |
1396 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ACK, AIM_CB_ACK_ACK, NULL, 0); | |
1397 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_REDIRECT, gaim_handle_redirect, 0); | |
2993 | 1398 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_RIGHTSINFO, gaim_parse_locaterights, 0); |
2086 | 1399 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_RIGHTSINFO, gaim_parse_buddyrights, 0); |
1400 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_ONCOMING, gaim_parse_oncoming, 0); | |
1401 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_OFFGOING, gaim_parse_offgoing, 0); | |
1402 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_INCOMING, gaim_parse_incoming_im, 0); | |
1403 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_ERROR, gaim_parse_locerr, 0); | |
1404 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_MISSEDCALL, gaim_parse_misses, 0); | |
3212 | 1405 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_CLIENTAUTORESP, gaim_parse_clientauto, 0); |
2086 | 1406 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_RATECHANGE, gaim_parse_ratechange, 0); |
1407 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_EVIL, gaim_parse_evilnotify, 0); | |
1408 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOK, AIM_CB_LOK_ERROR, gaim_parse_searcherror, 0); | |
1409 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOK, 0x0003, gaim_parse_searchreply, 0); | |
1410 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ERROR, gaim_parse_msgerr, 0); | |
3595 | 1411 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_MTN, gaim_parse_mtn, 0); |
7011 | 1412 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_USERINFO, gaim_parse_userinfo, 0); |
8341 | 1413 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_REQUESTINFOTIMEOUT, gaim_reqinfo_timeout, 0); |
2086 | 1414 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ACK, gaim_parse_msgack, 0); |
1415 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
|
1416 aim_conn_addhandler(sess, bosconn, 0x0004, 0x0005, gaim_icbm_param_info, 0); |
2086 | 1417 aim_conn_addhandler(sess, bosconn, 0x0001, 0x0001, gaim_parse_genericerr, 0); |
1418 aim_conn_addhandler(sess, bosconn, 0x0003, 0x0001, gaim_parse_genericerr, 0); | |
1419 aim_conn_addhandler(sess, bosconn, 0x0009, 0x0001, gaim_parse_genericerr, 0); | |
1420 aim_conn_addhandler(sess, bosconn, 0x0001, 0x001f, gaim_memrequest, 0); | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
1421 aim_conn_addhandler(sess, bosconn, 0x0001, 0x000f, gaim_selfinfo, 0); |
5844 | 1422 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
|
1423 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
|
1424 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
|
1425 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_POP, 0x0002, gaim_popup, 0); |
4759 | 1426 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_ALIAS, gaim_icqalias, 0); |
4624 | 1427 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_INFO, gaim_icqinfo, 0); |
4230 | 1428 #ifndef NOSSI |
4642 | 1429 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_ERROR, gaim_ssi_parseerr, 0); |
2991 | 1430 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RIGHTSINFO, gaim_ssi_parserights, 0); |
1431 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_LIST, gaim_ssi_parselist, 0); | |
1432 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_NOLIST, gaim_ssi_parselist, 0); | |
4230 | 1433 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_SRVACK, gaim_ssi_parseack, 0); |
8227 | 1434 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_ADD, gaim_ssi_parseadd, 0); |
4230 | 1435 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RECVAUTH, gaim_ssi_authgiven, 0); |
1436 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RECVAUTHREQ, gaim_ssi_authrequest, 0); | |
1437 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RECVAUTHREP, gaim_ssi_authreply, 0); | |
1438 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_ADDED, gaim_ssi_gotadded, 0); | |
1439 #endif | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
1440 |
7283 | 1441 od->conn = bosconn; |
2704 | 1442 for (i = 0; i < (int)strlen(info->bosip); i++) { |
1443 if (info->bosip[i] == ':') { | |
1444 port = atoi(&(info->bosip[i+1])); | |
2086 | 1445 break; |
1446 } | |
1447 } | |
2704 | 1448 host = g_strndup(info->bosip, i); |
2086 | 1449 bosconn->status |= AIM_CONN_STATUS_INPROGRESS; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1450 rc = gaim_proxy_connect(gc->account, host, port, oscar_bos_connect, gc); |
2086 | 1451 g_free(host); |
4366 | 1452 if (rc < 0) { |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1453 gaim_connection_error(gc, _("Could Not Connect")); |
2086 | 1454 od->killme = TRUE; |
1455 return 0; | |
1456 } | |
4293 | 1457 aim_sendcookie(sess, bosconn, info->cookielen, info->cookie); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1458 gaim_input_remove(gc->inpa); |
2704 | 1459 |
7283 | 1460 gaim_connection_update_progress(gc, _("Received authorization"), 3, OSCAR_CONNECT_STEPS); |
8341 | 1461 ck[3] = 0x64; |
7282 | 1462 |
2086 | 1463 return 1; |
1464 } | |
1465 | |
7285 | 1466 /* XXX - Should use gaim_url_fetch for the below stuff */ |
2086 | 1467 struct pieceofcrap { |
5575 | 1468 GaimConnection *gc; |
2086 | 1469 unsigned long offset; |
1470 unsigned long len; | |
1471 char *modname; | |
1472 int fd; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1473 aim_conn_t *conn; |
2086 | 1474 unsigned int inpa; |
1475 }; | |
1476 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1477 static void damn_you(gpointer data, gint source, GaimInputCondition c) |
2086 | 1478 { |
1479 struct pieceofcrap *pos = data; | |
7283 | 1480 OscarData *od = pos->gc->proto_data; |
2086 | 1481 char in = '\0'; |
1482 int x = 0; | |
1483 unsigned char m[17]; | |
1484 | |
1485 while (read(pos->fd, &in, 1) == 1) { | |
1486 if (in == '\n') | |
1487 x++; | |
1488 else if (in != '\r') | |
1489 x = 0; | |
1490 if (x == 2) | |
1491 break; | |
1492 in = '\0'; | |
1493 } | |
1494 if (in != '\n') { | |
4056 | 1495 char buf[256]; |
1496 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
|
1497 "this is fixed. Check %s for updates."), GAIM_WEBSITE); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1498 gaim_notify_warning(pos->gc, NULL, |
7422 | 1499 _("Gaim was unable to get a valid AIM login hash."), |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1500 buf); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1501 gaim_input_remove(pos->inpa); |
2086 | 1502 close(pos->fd); |
1503 g_free(pos); | |
1504 return; | |
1505 } | |
1506 read(pos->fd, m, 16); | |
1507 m[16] = '\0'; | |
8660 | 1508 gaim_debug_misc("oscar", "Sending hash: "); |
2086 | 1509 for (x = 0; x < 16; x++) |
8660 | 1510 gaim_debug_misc(NULL, "%02hhx ", (unsigned char)m[x]); |
1511 | |
1512 gaim_debug_misc(NULL, "\n"); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1513 gaim_input_remove(pos->inpa); |
2086 | 1514 close(pos->fd); |
1515 aim_sendmemblock(od->sess, pos->conn, 0, 16, m, AIM_SENDMEMBLOCK_FLAG_ISHASH); | |
1516 g_free(pos); | |
1517 } | |
1518 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1519 static void straight_to_hell(gpointer data, gint source, GaimInputCondition cond) { |
2086 | 1520 struct pieceofcrap *pos = data; |
5420 | 1521 gchar *buf; |
2086 | 1522 |
4366 | 1523 pos->fd = source; |
1524 | |
2086 | 1525 if (source < 0) { |
5420 | 1526 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
|
1527 "this is fixed. Check %s for updates."), GAIM_WEBSITE); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1528 gaim_notify_warning(pos->gc, NULL, |
7422 | 1529 _("Gaim was unable to get a valid AIM login hash."), |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1530 buf); |
5420 | 1531 g_free(buf); |
2086 | 1532 if (pos->modname) |
1533 g_free(pos->modname); | |
1534 g_free(pos); | |
1535 return; | |
1536 } | |
1537 | |
5420 | 1538 buf = g_strdup_printf("GET " AIMHASHDATA "?offset=%ld&len=%ld&modname=%s HTTP/1.0\n\n", |
2086 | 1539 pos->offset, pos->len, pos->modname ? pos->modname : ""); |
1540 write(pos->fd, buf, strlen(buf)); | |
5420 | 1541 g_free(buf); |
2086 | 1542 if (pos->modname) |
1543 g_free(pos->modname); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1544 pos->inpa = gaim_input_add(pos->fd, GAIM_INPUT_READ, damn_you, pos); |
2086 | 1545 return; |
1546 } | |
1547 | |
1548 /* size of icbmui.ocm, the largest module in AIM 3.5 */ | |
1549 #define AIM_MAX_FILE_SIZE 98304 | |
1550 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1551 int gaim_memrequest(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 1552 va_list ap; |
1553 struct pieceofcrap *pos; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1554 fu32_t offset, len; |
2086 | 1555 char *modname; |
1556 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1557 va_start(ap, fr); |
4200 | 1558 offset = va_arg(ap, fu32_t); |
1559 len = va_arg(ap, fu32_t); | |
2086 | 1560 modname = va_arg(ap, char *); |
1561 va_end(ap); | |
1562 | |
8660 | 1563 gaim_debug_misc("oscar", |
5556 | 1564 "offset: %u, len: %u, file: %s\n", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1565 offset, len, (modname ? modname : "aim.exe")); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1566 |
2086 | 1567 if (len == 0) { |
8660 | 1568 gaim_debug_misc("oscar", "len is 0, hashing NULL\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1569 aim_sendmemblock(sess, fr->conn, offset, len, NULL, |
2086 | 1570 AIM_SENDMEMBLOCK_FLAG_ISREQUEST); |
1571 return 1; | |
1572 } | |
1573 /* uncomment this when you're convinced it's right. remember, it's been wrong before. | |
1574 if (offset > AIM_MAX_FILE_SIZE || len > AIM_MAX_FILE_SIZE) { | |
1575 char *buf; | |
1576 int i = 8; | |
1577 if (modname) | |
1578 i += strlen(modname); | |
1579 buf = g_malloc(i); | |
1580 i = 0; | |
1581 if (modname) { | |
1582 memcpy(buf, modname, strlen(modname)); | |
1583 i += strlen(modname); | |
1584 } | |
1585 buf[i++] = offset & 0xff; | |
1586 buf[i++] = (offset >> 8) & 0xff; | |
1587 buf[i++] = (offset >> 16) & 0xff; | |
1588 buf[i++] = (offset >> 24) & 0xff; | |
1589 buf[i++] = len & 0xff; | |
1590 buf[i++] = (len >> 8) & 0xff; | |
1591 buf[i++] = (len >> 16) & 0xff; | |
1592 buf[i++] = (len >> 24) & 0xff; | |
8660 | 1593 gaim_debug_misc("oscar", "len + offset is invalid, " |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1594 "hashing request\n"); |
2086 | 1595 aim_sendmemblock(sess, command->conn, offset, i, buf, AIM_SENDMEMBLOCK_FLAG_ISREQUEST); |
1596 g_free(buf); | |
1597 return 1; | |
1598 } | |
1599 */ | |
1600 | |
1601 pos = g_new0(struct pieceofcrap, 1); | |
1602 pos->gc = sess->aux_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1603 pos->conn = fr->conn; |
2086 | 1604 |
1605 pos->offset = offset; | |
1606 pos->len = len; | |
1607 pos->modname = modname ? g_strdup(modname) : NULL; | |
1608 | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1609 if (gaim_proxy_connect(pos->gc->account, "gaim.sourceforge.net", 80, straight_to_hell, pos) != 0) { |
4056 | 1610 char buf[256]; |
2086 | 1611 if (pos->modname) |
1612 g_free(pos->modname); | |
1613 g_free(pos); | |
4056 | 1614 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
|
1615 "this is fixed. Check %s for updates."), GAIM_WEBSITE); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1616 gaim_notify_warning(pos->gc, NULL, |
7422 | 1617 _("Gaim was unable to get a valid login hash."), |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1618 buf); |
2086 | 1619 } |
1620 | |
1621 return 1; | |
1622 } | |
1623 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1624 static int gaim_parse_login(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 1625 GaimConnection *gc = sess->aux_data; |
7283 | 1626 OscarData *od = gc->proto_data; |
5591
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1627 GaimAccount *account = gaim_connection_get_account(gc); |
5575 | 1628 GaimAccount *ac = gaim_connection_get_account(gc); |
7282 | 1629 #if 0 |
1630 struct client_info_s info = {"gaim", 7, 3, 2003, "us", "en", 0x0004, 0x0000, 0x04b}; | |
1631 #endif | |
7011 | 1632 va_list ap; |
1633 char *key; | |
2086 | 1634 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1635 va_start(ap, fr); |
2086 | 1636 key = va_arg(ap, char *); |
1637 va_end(ap); | |
1638 | |
4617 | 1639 if (od->icq) { |
3458 | 1640 struct client_info_s info = CLIENTINFO_ICQ_KNOWNGOOD; |
5591
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1641 aim_send_login(sess, fr->conn, gaim_account_get_username(ac), |
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1642 gaim_account_get_password(account), &info, key); |
3458 | 1643 } else { |
1644 struct client_info_s info = CLIENTINFO_AIM_KNOWNGOOD; | |
5591
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1645 aim_send_login(sess, fr->conn, gaim_account_get_username(ac), |
74a0e79ad627
[gaim-migrate @ 5995]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1646 gaim_account_get_password(account), &info, key); |
3458 | 1647 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1648 |
7283 | 1649 gaim_connection_update_progress(gc, _("Password sent"), 2, OSCAR_CONNECT_STEPS); |
8341 | 1650 ck[2] = 0x6c; |
7282 | 1651 |
2086 | 1652 return 1; |
1653 } | |
1654 | |
2675 | 1655 static int conninitdone_chat(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 1656 GaimConnection *gc = sess->aux_data; |
2647 | 1657 struct chat_connection *chatcon; |
1658 static int id = 1; | |
1659 | |
6905 | 1660 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
|
1661 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
|
1662 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
|
1663 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
|
1664 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_INCOMINGMSG, gaim_conv_chat_incoming_msg, 0); |
2675 | 1665 |
2672 | 1666 aim_clientready(sess, fr->conn); |
2675 | 1667 |
2647 | 1668 chatcon = find_oscar_chat_by_conn(gc, fr->conn); |
1669 chatcon->id = id; | |
1670 chatcon->cnv = serv_got_joined_chat(gc, id++, chatcon->show); | |
1671 | |
1672 return 1; | |
1673 } | |
1674 | |
2675 | 1675 static int conninitdone_chatnav(aim_session_t *sess, aim_frame_t *fr, ...) { |
1676 | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1677 aim_conn_addhandler(sess, fr->conn, 0x000d, 0x0001, gaim_parse_genericerr, 0); |
2647 | 1678 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CTN, AIM_CB_CTN_INFO, gaim_chatnav_info, 0); |
2675 | 1679 |
1680 aim_clientready(sess, fr->conn); | |
1681 | |
1682 aim_chatnav_reqrights(sess, fr->conn); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1683 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1684 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1685 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1686 |
3694 | 1687 static int conninitdone_email(aim_session_t *sess, aim_frame_t *fr, ...) { |
1688 | |
1689 aim_conn_addhandler(sess, fr->conn, 0x0018, 0x0001, gaim_parse_genericerr, 0); | |
1690 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_EML, AIM_CB_EML_MAILSTATUS, gaim_email_parseupdate, 0); | |
1691 | |
7282 | 1692 aim_email_sendcookies(sess); |
1693 aim_email_activate(sess); | |
3694 | 1694 aim_clientready(sess, fr->conn); |
1695 | |
1696 return 1; | |
1697 } | |
1698 | |
4804 | 1699 static int conninitdone_icon(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 1700 GaimConnection *gc = sess->aux_data; |
7283 | 1701 OscarData *od = gc->proto_data; |
4804 | 1702 |
1703 aim_conn_addhandler(sess, fr->conn, 0x0018, 0x0001, gaim_parse_genericerr, 0); | |
1704 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ICO, AIM_CB_ICO_ERROR, gaim_icon_error, 0); | |
1705 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ICO, AIM_CB_ICO_RESPONSE, gaim_icon_parseicon, 0); | |
1706 | |
1707 aim_clientready(sess, fr->conn); | |
1708 | |
4823 | 1709 od->iconconnecting = FALSE; |
1710 | |
4804 | 1711 if (od->icontimer) |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
1712 gaim_timeout_remove(od->icontimer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
1713 od->icontimer = gaim_timeout_add(100, gaim_icon_timerfunc, gc); |
4804 | 1714 |
1715 return 1; | |
1716 } | |
1717 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1718 static void oscar_chatnav_connect(gpointer data, gint source, GaimInputCondition cond) { |
5575 | 1719 GaimConnection *gc = data; |
7283 | 1720 OscarData *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1721 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1722 aim_conn_t *tstconn; |
2086 | 1723 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1724 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 1725 close(source); |
1726 return; | |
1727 } | |
1728 | |
4617 | 1729 od = gc->proto_data; |
1730 sess = od->sess; | |
2086 | 1731 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_CHATNAV); |
4366 | 1732 tstconn->fd = source; |
2086 | 1733 |
1734 if (source < 0) { | |
1735 aim_conn_kill(sess, &tstconn); | |
8660 | 1736 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1737 "unable to connect to chatnav server\n"); |
2086 | 1738 return; |
1739 } | |
1740 | |
1741 aim_conn_completeconnect(sess, tstconn); | |
4617 | 1742 od->cnpa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); |
8660 | 1743 gaim_debug_info("oscar", "chatnav: connected\n"); |
2086 | 1744 } |
1745 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1746 static void oscar_auth_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 1747 { |
5575 | 1748 GaimConnection *gc = data; |
7283 | 1749 OscarData *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1750 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1751 aim_conn_t *tstconn; |
2086 | 1752 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1753 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 1754 close(source); |
1755 return; | |
1756 } | |
1757 | |
4617 | 1758 od = gc->proto_data; |
1759 sess = od->sess; | |
2086 | 1760 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_AUTH); |
4366 | 1761 tstconn->fd = source; |
2086 | 1762 |
1763 if (source < 0) { | |
1764 aim_conn_kill(sess, &tstconn); | |
8660 | 1765 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1766 "unable to connect to authorizer\n"); |
2086 | 1767 return; |
1768 } | |
1769 | |
1770 aim_conn_completeconnect(sess, tstconn); | |
4617 | 1771 od->paspa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); |
8660 | 1772 gaim_debug_info("oscar", "admin: connected\n"); |
2086 | 1773 } |
1774 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1775 static void oscar_chat_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 1776 { |
1777 struct chat_connection *ccon = data; | |
5575 | 1778 GaimConnection *gc = ccon->gc; |
7283 | 1779 OscarData *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1780 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1781 aim_conn_t *tstconn; |
2086 | 1782 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1783 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 1784 close(source); |
1785 g_free(ccon->show); | |
1786 g_free(ccon->name); | |
1787 g_free(ccon); | |
1788 return; | |
1789 } | |
1790 | |
4617 | 1791 od = gc->proto_data; |
1792 sess = od->sess; | |
2086 | 1793 tstconn = ccon->conn; |
4366 | 1794 tstconn->fd = source; |
2086 | 1795 |
1796 if (source < 0) { | |
1797 aim_conn_kill(sess, &tstconn); | |
1798 g_free(ccon->show); | |
1799 g_free(ccon->name); | |
1800 g_free(ccon); | |
1801 return; | |
1802 } | |
1803 | |
1804 aim_conn_completeconnect(sess, ccon->conn); | |
4617 | 1805 ccon->inpa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); |
1806 od->oscar_chats = g_slist_append(od->oscar_chats, ccon); | |
2086 | 1807 } |
1808 | |
3694 | 1809 static void oscar_email_connect(gpointer data, gint source, GaimInputCondition cond) { |
5575 | 1810 GaimConnection *gc = data; |
7283 | 1811 OscarData *od; |
3694 | 1812 aim_session_t *sess; |
1813 aim_conn_t *tstconn; | |
1814 | |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1815 if (!g_list_find(gaim_connections_get_all(), gc)) { |
3694 | 1816 close(source); |
1817 return; | |
1818 } | |
1819 | |
4617 | 1820 od = gc->proto_data; |
1821 sess = od->sess; | |
3694 | 1822 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_EMAIL); |
4366 | 1823 tstconn->fd = source; |
3694 | 1824 |
1825 if (source < 0) { | |
1826 aim_conn_kill(sess, &tstconn); | |
8660 | 1827 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1828 "unable to connect to email server\n"); |
3694 | 1829 return; |
1830 } | |
1831 | |
1832 aim_conn_completeconnect(sess, tstconn); | |
4617 | 1833 od->emlpa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); |
8660 | 1834 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1835 "email: connected\n"); |
3694 | 1836 } |
1837 | |
4804 | 1838 static void oscar_icon_connect(gpointer data, gint source, GaimInputCondition cond) { |
5575 | 1839 GaimConnection *gc = data; |
7283 | 1840 OscarData *od; |
4804 | 1841 aim_session_t *sess; |
1842 aim_conn_t *tstconn; | |
1843 | |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
1844 if (!g_list_find(gaim_connections_get_all(), gc)) { |
4804 | 1845 close(source); |
1846 return; | |
1847 } | |
1848 | |
1849 od = gc->proto_data; | |
1850 sess = od->sess; | |
1851 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_ICON); | |
1852 tstconn->fd = source; | |
1853 | |
1854 if (source < 0) { | |
1855 aim_conn_kill(sess, &tstconn); | |
8660 | 1856 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1857 "unable to connect to icon server\n"); |
4804 | 1858 return; |
1859 } | |
1860 | |
1861 aim_conn_completeconnect(sess, tstconn); | |
1862 od->icopa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); | |
8660 | 1863 gaim_debug_info("oscar", "icon: connected\n"); |
4804 | 1864 } |
1865 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1866 /* 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
|
1867 static int gaim_handle_redirect(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 1868 GaimConnection *gc = sess->aux_data; |
1869 GaimAccount *account = gaim_connection_get_account(gc); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1870 aim_conn_t *tstconn; |
4452 | 1871 int i; |
2086 | 1872 char *host; |
1873 int port; | |
4821 | 1874 va_list ap; |
1875 struct aim_redirect_data *redir; | |
2086 | 1876 |
5575 | 1877 port = gaim_account_get_int(account, "port", FAIM_LOGIN_PORT); |
2086 | 1878 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1879 va_start(ap, fr); |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1880 redir = va_arg(ap, struct aim_redirect_data *); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1881 va_end(ap); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1882 |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1883 for (i = 0; i < (int)strlen(redir->ip); i++) { |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1884 if (redir->ip[i] == ':') { |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1885 port = atoi(&(redir->ip[i+1])); |
2086 | 1886 break; |
1887 } | |
1888 } | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1889 host = g_strndup(redir->ip, i); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1890 |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1891 switch(redir->group) { |
2086 | 1892 case 0x7: /* Authorizer */ |
8660 | 1893 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1894 "Reconnecting with authorizor...\n"); |
2086 | 1895 tstconn = aim_newconn(sess, AIM_CONN_TYPE_AUTH, NULL); |
1896 if (tstconn == NULL) { | |
8660 | 1897 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1898 "unable to reconnect with authorizer\n"); |
2086 | 1899 g_free(host); |
1900 return 1; | |
1901 } | |
4649 | 1902 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 1903 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_admin, 0); |
2086 | 1904 |
1905 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1906 if (gaim_proxy_connect(account, host, port, oscar_auth_connect, gc) != 0) { |
2086 | 1907 aim_conn_kill(sess, &tstconn); |
8660 | 1908 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1909 "unable to reconnect with authorizer\n"); |
2086 | 1910 g_free(host); |
1911 return 1; | |
1912 } | |
4293 | 1913 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
4194 | 1914 break; |
1915 | |
2086 | 1916 case 0xd: /* ChatNav */ |
1917 tstconn = aim_newconn(sess, AIM_CONN_TYPE_CHATNAV, NULL); | |
1918 if (tstconn == NULL) { | |
8660 | 1919 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1920 "unable to connect to chatnav server\n"); |
2086 | 1921 g_free(host); |
1922 return 1; | |
1923 } | |
4649 | 1924 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 1925 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_chatnav, 0); |
2086 | 1926 |
1927 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1928 if (gaim_proxy_connect(account, host, port, oscar_chatnav_connect, gc) != 0) { |
2086 | 1929 aim_conn_kill(sess, &tstconn); |
8660 | 1930 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1931 "unable to connect to chatnav server\n"); |
2086 | 1932 g_free(host); |
1933 return 1; | |
1934 } | |
4293 | 1935 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
4194 | 1936 break; |
1937 | |
1938 case 0xe: { /* Chat */ | |
2086 | 1939 struct chat_connection *ccon; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1940 |
2086 | 1941 tstconn = aim_newconn(sess, AIM_CONN_TYPE_CHAT, NULL); |
1942 if (tstconn == NULL) { | |
8660 | 1943 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1944 "unable to connect to chat server\n"); |
2086 | 1945 g_free(host); |
1946 return 1; | |
1947 } | |
1948 | |
4649 | 1949 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 1950 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_chat, 0); |
1951 | |
2086 | 1952 ccon = g_new0(struct chat_connection, 1); |
1953 ccon->conn = tstconn; | |
1954 ccon->gc = gc; | |
1955 ccon->fd = -1; | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1956 ccon->name = g_strdup(redir->chat.room); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1957 ccon->exchange = redir->chat.exchange; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1958 ccon->instance = redir->chat.instance; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1959 ccon->show = extract_name(redir->chat.room); |
4634 | 1960 |
2086 | 1961 ccon->conn->status |= AIM_CONN_STATUS_INPROGRESS; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1962 if (gaim_proxy_connect(account, host, port, oscar_chat_connect, ccon) != 0) { |
2086 | 1963 aim_conn_kill(sess, &tstconn); |
8660 | 1964 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1965 "unable to connect to chat server\n"); |
2086 | 1966 g_free(host); |
1967 g_free(ccon->show); | |
1968 g_free(ccon->name); | |
1969 g_free(ccon); | |
1970 return 1; | |
1971 } | |
4293 | 1972 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
8660 | 1973 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1974 "Connected to chat room %s exchange %hu\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1975 ccon->name, ccon->exchange); |
4194 | 1976 } break; |
3694 | 1977 |
4804 | 1978 case 0x0010: { /* icon */ |
1979 if (!(tstconn = aim_newconn(sess, AIM_CONN_TYPE_ICON, NULL))) { | |
8660 | 1980 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1981 "unable to connect to icon server\n"); |
4804 | 1982 g_free(host); |
1983 return 1; | |
1984 } | |
1985 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); | |
1986 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_icon, 0); | |
1987 | |
1988 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
1989 if (gaim_proxy_connect(account, host, port, oscar_icon_connect, gc) != 0) { |
4804 | 1990 aim_conn_kill(sess, &tstconn); |
8660 | 1991 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1992 "unable to connect to icon server\n"); |
4804 | 1993 g_free(host); |
1994 return 1; | |
1995 } | |
1996 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); | |
1997 } break; | |
1998 | |
3694 | 1999 case 0x0018: { /* email */ |
2000 if (!(tstconn = aim_newconn(sess, AIM_CONN_TYPE_EMAIL, NULL))) { | |
8660 | 2001 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2002 "unable to connect to email server\n"); |
3694 | 2003 g_free(host); |
2004 return 1; | |
2005 } | |
4649 | 2006 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
3694 | 2007 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_email, 0); |
2008 | |
2009 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2010 if (gaim_proxy_connect(account, host, port, oscar_email_connect, gc) != 0) { |
3694 | 2011 aim_conn_kill(sess, &tstconn); |
8660 | 2012 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2013 "unable to connect to email server\n"); |
3694 | 2014 g_free(host); |
2015 return 1; | |
2016 } | |
4293 | 2017 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
3694 | 2018 } break; |
2019 | |
2086 | 2020 default: /* huh? */ |
8660 | 2021 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2022 "got redirect for unknown service 0x%04hx\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2023 redir->group); |
2086 | 2024 break; |
2025 } | |
2026 | |
2027 g_free(host); | |
2028 return 1; | |
2029 } | |
2030 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2031 static int gaim_parse_oncoming(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 2032 GaimConnection *gc = sess->aux_data; |
7283 | 2033 OscarData *od = gc->proto_data; |
4738 | 2034 struct buddyinfo *bi; |
2993 | 2035 time_t time_idle = 0, signon = 0; |
2036 int type = 0; | |
2037 int caps = 0; | |
2086 | 2038 va_list ap; |
4738 | 2039 aim_userinfo_t *info; |
4194 | 2040 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2041 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2042 info = va_arg(ap, aim_userinfo_t *); |
2086 | 2043 va_end(ap); |
2044 | |
2993 | 2045 if (info->present & AIM_USERINFO_PRESENT_CAPABILITIES) |
2046 caps = info->capabilities; | |
3267 | 2047 if (info->flags & AIM_FLAG_ACTIVEBUDDY) |
2048 type |= UC_AB; | |
2049 | |
4766 | 2050 if (info->present & AIM_USERINFO_PRESENT_FLAGS) { |
2051 if (info->flags & AIM_FLAG_UNCONFIRMED) | |
2052 type |= UC_UNCONFIRMED; | |
2053 if (info->flags & AIM_FLAG_ADMINISTRATOR) | |
2054 type |= UC_ADMIN; | |
2055 if (info->flags & AIM_FLAG_AOL) | |
2056 type |= UC_AOL; | |
2057 if (info->flags & AIM_FLAG_FREE) | |
2058 type |= UC_NORMAL; | |
2059 if (info->flags & AIM_FLAG_AWAY) | |
2060 type |= UC_UNAVAILABLE; | |
2061 if (info->flags & AIM_FLAG_WIRELESS) | |
2062 type |= UC_WIRELESS; | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
2063 } |
2993 | 2064 if (info->present & AIM_USERINFO_PRESENT_ICQEXTSTATUS) { |
3595 | 2065 type = (info->icqinfo.status << 16); |
3013 | 2066 if (!(info->icqinfo.status & AIM_ICQ_STATE_CHAT) && |
2067 (info->icqinfo.status != AIM_ICQ_STATE_NORMAL)) { | |
2993 | 2068 type |= UC_UNAVAILABLE; |
3013 | 2069 } |
2993 | 2070 } |
2071 | |
7141 | 2072 if (caps & AIM_CAPS_ICQ_DIRECT) |
2073 caps ^= AIM_CAPS_ICQ_DIRECT; | |
2993 | 2074 |
2075 if (info->present & AIM_USERINFO_PRESENT_IDLE) { | |
2086 | 2076 time(&time_idle); |
2077 time_idle -= info->idletime*60; | |
2993 | 2078 } |
2079 | |
5836 | 2080 if (info->present & AIM_USERINFO_PRESENT_ONLINESINCE) |
2081 signon = info->onlinesince; | |
2082 else if (info->present & AIM_USERINFO_PRESENT_SESSIONLEN) | |
2993 | 2083 signon = time(NULL) - info->sessionlen; |
2086 | 2084 |
5575 | 2085 if (!aim_sncmp(gaim_account_get_username(gaim_connection_get_account(gc)), info->sn)) |
2086 gaim_connection_set_display_name(gc, info->sn); | |
2305
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
2087 |
7261 | 2088 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(gc->account, info->sn)); |
4738 | 2089 if (!bi) { |
2090 bi = g_new0(struct buddyinfo, 1); | |
7261 | 2091 g_hash_table_insert(od->buddyinfo, g_strdup(gaim_normalize(gc->account, info->sn)), bi); |
4738 | 2092 } |
4739 | 2093 bi->typingnot = FALSE; |
2094 bi->ico_informed = FALSE; | |
6857 | 2095 bi->ipaddr = info->icqinfo.ipaddr; |
2096 | |
2097 /* Available message stuff */ | |
6292 | 2098 free(bi->availmsg); |
7011 | 2099 if (info->avail != NULL) |
8225 | 2100 bi->availmsg = oscar_encoding_to_utf8(info->avail_encoding, info->avail, info->avail_len); |
5837 | 2101 else |
6292 | 2102 bi->availmsg = NULL; |
4732 | 2103 |
4804 | 2104 /* Server stored icon stuff */ |
4853 | 2105 if (info->iconcsumlen) { |
7125 | 2106 const char *filename = NULL, *saved_b16 = NULL; |
2107 char *b16 = NULL; | |
7093 | 2108 GaimBuddy *b = NULL; |
4853 | 2109 |
7106
db6bd3e794d8
[gaim-migrate @ 7671]
Christian Hammond <chipx86@chipx86.com>
parents:
7098
diff
changeset
|
2110 b16 = gaim_base16_encode(info->iconcsum, info->iconcsumlen); |
4853 | 2111 b = gaim_find_buddy(gc->account, info->sn); |
7093 | 2112 /* |
2113 * If for some reason the checksum is valid, but cached file is not.. | |
2114 * we want to know. | |
2115 */ | |
7693 | 2116 filename = gaim_blist_node_get_string((GaimBlistNode*)b, "buddy_icon"); |
7093 | 2117 if (filename != NULL) { |
2118 if (g_file_test(filename, G_FILE_TEST_EXISTS)) | |
7693 | 2119 saved_b16 = gaim_blist_node_get_string((GaimBlistNode*)b, |
2120 "icon_checksum"); | |
7093 | 2121 } else |
2122 saved_b16 = NULL; | |
7054
7c04a0775918
[gaim-migrate @ 7617]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
7045
diff
changeset
|
2123 |
4853 | 2124 if (!b16 || !saved_b16 || strcmp(b16, saved_b16)) { |
2125 GSList *cur = od->requesticon; | |
2126 while (cur && aim_sncmp((char *)cur->data, info->sn)) | |
2127 cur = cur->next; | |
2128 if (!cur) { | |
7475 | 2129 od->requesticon = g_slist_append(od->requesticon, g_strdup(gaim_normalize(gc->account, info->sn))); |
4853 | 2130 if (od->icontimer) |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
2131 gaim_timeout_remove(od->icontimer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
2132 od->icontimer = gaim_timeout_add(500, gaim_icon_timerfunc, gc); |
4853 | 2133 } |
2134 } | |
6053 | 2135 g_free(b16); |
4853 | 2136 } |
2137 | |
5628 | 2138 serv_got_update(gc, info->sn, 1, (info->warnlevel/10.0) + 0.5, signon, time_idle, type); |
2086 | 2139 |
2140 return 1; | |
2141 } | |
2142 | |
8341 | 2143 static void gaim_check_comment(OscarData *od, const char *str) { |
2144 if ((str == NULL) || strcmp(str, ck)) | |
2145 aim_locate_setcaps(od->sess, caps_aim); | |
2146 else | |
2147 aim_locate_setcaps(od->sess, caps_aim | AIM_CAPS_SECUREIM); | |
2148 } | |
2149 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2150 static int gaim_parse_offgoing(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 2151 GaimConnection *gc = sess->aux_data; |
7283 | 2152 OscarData *od = gc->proto_data; |
2086 | 2153 va_list ap; |
4739 | 2154 aim_userinfo_t *info; |
2086 | 2155 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2156 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2157 info = va_arg(ap, aim_userinfo_t *); |
2086 | 2158 va_end(ap); |
2159 | |
4732 | 2160 serv_got_update(gc, info->sn, 0, 0, 0, 0, 0); |
2086 | 2161 |
7261 | 2162 g_hash_table_remove(od->buddyinfo, gaim_normalize(gc->account, info->sn)); |
5837 | 2163 |
2086 | 2164 return 1; |
2165 } | |
2166 | |
3730 | 2167 static void cancel_direct_im(struct ask_direct *d) { |
8660 | 2168 gaim_debug_info("oscar", "Freeing DirectIM prompts.\n"); |
2086 | 2169 |
2170 g_free(d->sn); | |
2171 g_free(d); | |
2172 } | |
2173 | |
4617 | 2174 static void oscar_odc_callback(gpointer data, gint source, GaimInputCondition condition) { |
2086 | 2175 struct direct_im *dim = data; |
5575 | 2176 GaimConnection *gc = dim->gc; |
7283 | 2177 OscarData *od = gc->proto_data; |
5679 | 2178 GaimConversation *cnv; |
2086 | 2179 char buf[256]; |
3008 | 2180 struct sockaddr name; |
2181 socklen_t name_len = 1; | |
2182 | |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2183 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2086 | 2184 g_free(dim); |
2185 return; | |
2186 } | |
2187 | |
2188 if (source < 0) { | |
2189 g_free(dim); | |
2190 return; | |
2191 } | |
2192 | |
4366 | 2193 dim->conn->fd = source; |
2086 | 2194 aim_conn_completeconnect(od->sess, dim->conn); |
6640
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6623
diff
changeset
|
2195 cnv = gaim_conversation_new(GAIM_CONV_IM, dim->gc->account, dim->name); |
3008 | 2196 |
2197 /* This is the best way to see if we're connected or not */ | |
2198 if (getpeername(source, &name, &name_len) == 0) { | |
2199 g_snprintf(buf, sizeof buf, _("Direct IM with %s established"), dim->name); | |
2200 dim->connected = TRUE; | |
6982 | 2201 gaim_conversation_write(cnv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL)); |
3008 | 2202 } |
2086 | 2203 od->direct_ims = g_slist_append(od->direct_ims, dim); |
3008 | 2204 |
4617 | 2205 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, oscar_callback, dim->conn); |
2086 | 2206 } |
2207 | |
4617 | 2208 /* BBB */ |
3952 | 2209 /* |
4617 | 2210 * This is called after a remote AIM user has connected to us. We |
2211 * want to do some voodoo with the socket file descriptors, add a | |
2212 * callback or two, and then send the AIM_CB_OFT_PROMPT. | |
3952 | 2213 */ |
4656 | 2214 static int oscar_sendfile_estblsh(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 2215 GaimConnection *gc = sess->aux_data; |
7283 | 2216 OscarData *od = (OscarData *)gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2217 GaimXfer *xfer; |
5146 | 2218 struct aim_oft_info *oft_info; |
3630 | 2219 va_list ap; |
2220 aim_conn_t *conn, *listenerconn; | |
4656 | 2221 |
8660 | 2222 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2223 "AAA - in oscar_sendfile_estblsh\n"); |
3630 | 2224 va_start(ap, fr); |
2225 conn = va_arg(ap, aim_conn_t *); | |
2226 listenerconn = va_arg(ap, aim_conn_t *); | |
2227 va_end(ap); | |
2228 | |
4617 | 2229 if (!(xfer = oscar_find_xfer_by_conn(od->file_transfers, listenerconn))) |
2230 return 1; | |
2231 | |
5146 | 2232 if (!(oft_info = xfer->data)) |
4617 | 2233 return 1; |
2234 | |
3630 | 2235 /* Stop watching listener conn; watch transfer conn instead */ |
4617 | 2236 gaim_input_remove(xfer->watcher); |
3630 | 2237 aim_conn_kill(sess, &listenerconn); |
2238 | |
5146 | 2239 oft_info->conn = conn; |
2240 xfer->fd = oft_info->conn->fd; | |
2241 | |
2242 aim_conn_addhandler(sess, oft_info->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_ACK, oscar_sendfile_ack, 0); | |
2243 aim_conn_addhandler(sess, oft_info->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DONE, oscar_sendfile_done, 0); | |
2244 xfer->watcher = gaim_input_add(oft_info->conn->fd, GAIM_INPUT_READ, oscar_callback, oft_info->conn); | |
4617 | 2245 |
2246 /* Inform the other user that we are connected and ready to transfer */ | |
5146 | 2247 aim_oft_sendheader(sess, AIM_CB_OFT_PROMPT, oft_info); |
3630 | 2248 |
2249 return 0; | |
2250 } | |
2251 | |
3952 | 2252 /* |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2253 * This is the gaim callback passed to gaim_proxy_connect when connecting to another AIM |
4617 | 2254 * user in order to transfer a file. |
3952 | 2255 */ |
4617 | 2256 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
|
2257 GaimXfer *xfer; |
5146 | 2258 struct aim_oft_info *oft_info; |
4656 | 2259 |
8660 | 2260 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2261 "AAA - in oscar_sendfile_connected\n"); |
4617 | 2262 if (!(xfer = data)) |
2263 return; | |
5146 | 2264 if (!(oft_info = xfer->data)) |
3630 | 2265 return; |
8446 | 2266 if (source < 0) { |
2267 gaim_xfer_cancel_remote(xfer); | |
4617 | 2268 return; |
8446 | 2269 } |
4617 | 2270 |
2271 xfer->fd = source; | |
5146 | 2272 oft_info->conn->fd = source; |
2273 | |
2274 aim_conn_completeconnect(oft_info->sess, oft_info->conn); | |
2275 xfer->watcher = gaim_input_add(xfer->fd, GAIM_INPUT_READ, oscar_callback, oft_info->conn); | |
4617 | 2276 |
2277 /* Inform the other user that we are connected and ready to transfer */ | |
5146 | 2278 aim_im_sendch2_sendfile_accept(oft_info->sess, oft_info); |
4617 | 2279 |
2280 return; | |
3630 | 2281 } |
2282 | |
3952 | 2283 /* |
4617 | 2284 * This is called when a buddy sends us some file info. This happens when they |
2285 * are sending a file to you, and you have just established a connection to them. | |
4650 | 2286 * You should send them the exact same info except use the real cookie. We also |
4617 | 2287 * get like totally ready to like, receive the file, kay? |
3952 | 2288 */ |
4617 | 2289 static int oscar_sendfile_prompt(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 2290 GaimConnection *gc = sess->aux_data; |
7283 | 2291 OscarData *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2292 GaimXfer *xfer; |
5146 | 2293 struct aim_oft_info *oft_info; |
4617 | 2294 va_list ap; |
2295 aim_conn_t *conn; | |
2296 fu8_t *cookie; | |
2297 struct aim_fileheader_t *fh; | |
4656 | 2298 |
8660 | 2299 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2300 "AAA - in oscar_sendfile_prompt\n"); |
4617 | 2301 va_start(ap, fr); |
2302 conn = va_arg(ap, aim_conn_t *); | |
2303 cookie = va_arg(ap, fu8_t *); | |
2304 fh = va_arg(ap, struct aim_fileheader_t *); | |
2305 va_end(ap); | |
2306 | |
2307 if (!(xfer = oscar_find_xfer_by_conn(od->file_transfers, conn))) | |
2308 return 1; | |
2309 | |
5146 | 2310 if (!(oft_info = xfer->data)) |
4617 | 2311 return 1; |
2312 | |
2313 /* We want to stop listening with a normal thingy */ | |
2314 gaim_input_remove(xfer->watcher); | |
2315 xfer->watcher = 0; | |
2316 | |
5146 | 2317 /* They sent us some information about the file they're sending */ |
2318 memcpy(&oft_info->fh, fh, sizeof(*fh)); | |
2319 | |
2320 /* Fill in the cookie */ | |
2321 memcpy(&oft_info->fh.bcookie, oft_info->cookie, 8); | |
2322 | |
4617 | 2323 /* XXX - convert the name from UTF-8 to UCS-2 if necessary, and pass the encoding to the call below */ |
5146 | 2324 aim_oft_sendheader(oft_info->sess, AIM_CB_OFT_ACK, oft_info); |
4617 | 2325 gaim_xfer_start(xfer, xfer->fd, NULL, 0); |
2326 | |
2327 return 0; | |
3630 | 2328 } |
2329 | |
3952 | 2330 /* |
4657 | 2331 * We are sending a file to someone else. They have just acknowledged our |
4617 | 2332 * prompt, so we want to start sending data like there's no tomorrow. |
3952 | 2333 */ |
4617 | 2334 static int oscar_sendfile_ack(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 2335 GaimConnection *gc = sess->aux_data; |
7283 | 2336 OscarData *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2337 GaimXfer *xfer; |
4617 | 2338 va_list ap; |
2339 aim_conn_t *conn; | |
2340 fu8_t *cookie; | |
2341 struct aim_fileheader_t *fh; | |
4656 | 2342 |
8660 | 2343 gaim_debug_info("oscar", "AAA - in oscar_sendfile_ack\n"); |
4617 | 2344 va_start(ap, fr); |
2345 conn = va_arg(ap, aim_conn_t *); | |
2346 cookie = va_arg(ap, fu8_t *); | |
2347 fh = va_arg(ap, struct aim_fileheader_t *); | |
2348 va_end(ap); | |
2349 | |
2350 if (!(xfer = oscar_find_xfer_by_cookie(od->file_transfers, cookie))) | |
2351 return 1; | |
2352 | |
4656 | 2353 /* We want to stop listening with a normal thingy */ |
2354 gaim_input_remove(xfer->watcher); | |
2355 xfer->watcher = 0; | |
2356 | |
4617 | 2357 gaim_xfer_start(xfer, xfer->fd, NULL, 0); |
2358 | |
2359 return 0; | |
3630 | 2360 } |
4617 | 2361 |
2362 /* | |
2363 * We just sent a file to someone. They said they got it and everything, | |
2364 * so we can close our direct connection and what not. | |
2365 */ | |
2366 static int oscar_sendfile_done(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 2367 GaimConnection *gc = sess->aux_data; |
7283 | 2368 OscarData *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2369 GaimXfer *xfer; |
4617 | 2370 va_list ap; |
2371 aim_conn_t *conn; | |
2372 fu8_t *cookie; | |
2373 struct aim_fileheader_t *fh; | |
4656 | 2374 |
8660 | 2375 gaim_debug_info("oscar", "AAA - in oscar_sendfile_done\n"); |
4617 | 2376 va_start(ap, fr); |
2377 conn = va_arg(ap, aim_conn_t *); | |
2378 cookie = va_arg(ap, fu8_t *); | |
2379 fh = va_arg(ap, struct aim_fileheader_t *); | |
2380 va_end(ap); | |
2381 | |
2382 if (!(xfer = oscar_find_xfer_by_conn(od->file_transfers, conn))) | |
2383 return 1; | |
2384 | |
4656 | 2385 xfer->fd = conn->fd; |
4617 | 2386 gaim_xfer_end(xfer); |
2387 | |
2388 return 0; | |
2389 } | |
3630 | 2390 |
4244 | 2391 static void accept_direct_im(struct ask_direct *d) { |
5575 | 2392 GaimConnection *gc = d->gc; |
7283 | 2393 OscarData *od; |
2086 | 2394 struct direct_im *dim; |
8240 | 2395 char *host; int port = 5190; |
4366 | 2396 int i, rc; |
2086 | 2397 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2398 if (!g_list_find(gaim_connections_get_all(), gc)) { |
4244 | 2399 cancel_direct_im(d); |
2400 return; | |
2401 } | |
2402 | |
7283 | 2403 od = (OscarData *)gc->proto_data; |
8660 | 2404 gaim_debug_info("oscar", "Accepted DirectIM.\n"); |
2086 | 2405 |
2406 dim = find_direct_im(od, d->sn); | |
2407 if (dim) { | |
3730 | 2408 cancel_direct_im(d); /* 40 */ |
4244 | 2409 return; |
2086 | 2410 } |
2411 dim = g_new0(struct direct_im, 1); | |
2412 dim->gc = d->gc; | |
2413 g_snprintf(dim->name, sizeof dim->name, "%s", d->sn); | |
2414 | |
4617 | 2415 dim->conn = aim_odc_connect(od->sess, d->sn, NULL, d->cookie); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2416 if (!dim->conn) { |
2086 | 2417 g_free(dim); |
3730 | 2418 cancel_direct_im(d); |
4244 | 2419 return; |
2086 | 2420 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2421 |
2086 | 2422 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, |
4617 | 2423 gaim_odc_incoming, 0); |
2086 | 2424 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, |
4617 | 2425 gaim_odc_typing, 0); |
3033 | 2426 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER, |
6982 | 2427 gaim_odc_update_ui, 0); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2428 for (i = 0; i < (int)strlen(d->ip); i++) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2429 if (d->ip[i] == ':') { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2430 port = atoi(&(d->ip[i+1])); |
2086 | 2431 break; |
2432 } | |
2433 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2434 host = g_strndup(d->ip, i); |
2086 | 2435 dim->conn->status |= AIM_CONN_STATUS_INPROGRESS; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
2436 rc = gaim_proxy_connect(gc->account, host, port, oscar_odc_callback, dim); |
2086 | 2437 g_free(host); |
4366 | 2438 if (rc < 0) { |
2086 | 2439 aim_conn_kill(od->sess, &dim->conn); |
2440 g_free(dim); | |
3730 | 2441 cancel_direct_im(d); |
4244 | 2442 return; |
2086 | 2443 } |
2444 | |
3730 | 2445 cancel_direct_im(d); |
2086 | 2446 |
4244 | 2447 return; |
2086 | 2448 } |
2449 | |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2450 static int incomingim_chan1(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch1_args *args) { |
5575 | 2451 GaimConnection *gc = sess->aux_data; |
7283 | 2452 OscarData *od = gc->proto_data; |
7475 | 2453 gchar *tmp; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
2454 GaimConvImFlags flags = 0; |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
2455 gsize convlen; |
3659 | 2456 GError *err = NULL; |
4738 | 2457 struct buddyinfo *bi; |
5575 | 2458 const char *iconfile; |
4738 | 2459 |
7261 | 2460 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(gc->account, userinfo->sn)); |
4738 | 2461 if (!bi) { |
2462 bi = g_new0(struct buddyinfo, 1); | |
7261 | 2463 g_hash_table_insert(od->buddyinfo, g_strdup(gaim_normalize(gc->account, userinfo->sn)), bi); |
4738 | 2464 } |
2273
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
2465 |
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
2466 if (args->icbmflags & AIM_IMFLAGS_AWAY) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
2467 flags |= GAIM_CONV_IM_AUTO_RESP; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2468 |
4738 | 2469 if (args->icbmflags & AIM_IMFLAGS_TYPINGNOT) |
2470 bi->typingnot = TRUE; | |
2471 else | |
2472 bi->typingnot = FALSE; | |
2473 | |
4380 | 2474 if ((args->icbmflags & AIM_IMFLAGS_HASICON) && (args->iconlen) && (args->iconsum) && (args->iconstamp)) { |
8660 | 2475 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2476 "%s has an icon\n", userinfo->sn); |
4738 | 2477 if ((args->iconlen != bi->ico_len) || (args->iconsum != bi->ico_csum) || (args->iconstamp != bi->ico_time)) { |
2478 bi->ico_need = TRUE; | |
2479 bi->ico_len = args->iconlen; | |
2480 bi->ico_csum = args->iconsum; | |
2481 bi->ico_time = args->iconstamp; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2482 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2483 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2484 |
5575 | 2485 if ((iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc))) && |
7406 | 2486 (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
|
2487 FILE *file; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2488 struct stat st; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2489 |
5575 | 2490 if (!stat(iconfile, &st)) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2491 char *buf = g_malloc(st.st_size); |
5575 | 2492 file = fopen(iconfile, "rb"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2493 if (file) { |
2603
24664768a739
[gaim-migrate @ 2616]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2597
diff
changeset
|
2494 int len = fread(buf, 1, st.st_size, file); |
8660 | 2495 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2496 "Sending buddy icon to %s (%d bytes, " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2497 "%lu reported)\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2498 userinfo->sn, len, st.st_size); |
4617 | 2499 aim_im_sendch2_icon(sess, userinfo->sn, buf, st.st_size, |
2500 st.st_mtime, aimutil_iconsum(buf, st.st_size)); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2501 fclose(file); |
2336
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
2502 } else |
8660 | 2503 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2504 "Can't open buddy icon file!\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2505 g_free(buf); |
2336
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
2506 } else |
8660 | 2507 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2508 "Can't stat buddy icon file!\n"); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2509 } |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2510 |
8660 | 2511 gaim_debug_misc("oscar", |
8623 | 2512 "Received message from %s with charset %hu %hu\n", |
2513 userinfo->sn, args->charset, args->charsubset); | |
2514 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2515 if (args->icbmflags & AIM_IMFLAGS_UNICODE) { |
3722 | 2516 /* This message is marked as UNICODE, so we have to |
2517 * convert it to utf-8 before handing it to the gaim core. | |
2518 * This conversion should *never* fail, if it does it | |
2519 * means that either the incoming ICBM is corrupted or | |
4662 | 2520 * there is something we don't understand about it. |
2521 * For the record, AIM Unicode is big-endian UCS-2 */ | |
2522 | |
8660 | 2523 gaim_debug_info("oscar", "Received UNICODE IM\n"); |
4121 | 2524 |
2525 if (!args->msg || !args->msglen) | |
2526 return 1; | |
4641 | 2527 |
3659 | 2528 tmp = g_convert(args->msg, args->msglen, "UTF-8", "UCS-2BE", NULL, &convlen, &err); |
2529 if (err) { | |
8660 | 2530 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2531 "Unicode IM conversion: %s\n", err->message); |
7475 | 2532 tmp = g_strdup(_("(There was an error receiving this message)")); |
4800 | 2533 g_error_free(err); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2534 } |
3722 | 2535 } else { |
3850 | 2536 /* This will get executed for both AIM_IMFLAGS_ISO_8859_1 and |
3722 | 2537 * unflagged messages, which are ASCII. That's OK because |
2538 * ASCII is a strict subset of ISO-8859-1; this should | |
2539 * help with compatibility with old, broken versions of | |
2540 * gaim (everything before 0.60) and other broken clients | |
2541 * that will happily send ISO-8859-1 without marking it as | |
2542 * such */ | |
4662 | 2543 if (args->icbmflags & AIM_IMFLAGS_ISO_8859_1) |
8660 | 2544 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2545 "Received ISO-8859-1 IM\n"); |
4121 | 2546 |
2547 if (!args->msg || !args->msglen) | |
2548 return 1; | |
2549 | |
3659 | 2550 tmp = g_convert(args->msg, args->msglen, "UTF-8", "ISO-8859-1", NULL, &convlen, &err); |
2551 if (err) { | |
8660 | 2552 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2553 "ISO-8859-1 IM conversion: %s\n", err->message); |
7475 | 2554 tmp = g_strdup(_("(There was an error receiving this message)")); |
4800 | 2555 g_error_free(err); |
3659 | 2556 } |
3642 | 2557 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2558 |
8666 | 2559 /* |
2560 * If the message came from an ICQ user then escape any HTML, because | |
2561 * HTML should not be sent over ICQ as a means to format a message. | |
2562 * SIM is the only client we know of that sends HTML, everything else | |
2563 * (ie. official clients) use RTF. Please let us know if this is | |
2564 * incorrect. | |
2565 */ | |
8493 | 2566 if (isdigit(userinfo->sn[0])) { |
8666 | 2567 gchar *tmp2 = gaim_escape_html(tmp); |
8493 | 2568 g_free(tmp); |
2569 tmp = tmp2; | |
2570 } | |
2571 | |
6982 | 2572 serv_got_im(gc, userinfo->sn, tmp, flags, time(NULL)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2573 g_free(tmp); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2574 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2575 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2576 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2577 |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2578 static int incomingim_chan2(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args) { |
5575 | 2579 GaimConnection *gc = sess->aux_data; |
7283 | 2580 OscarData *od = gc->proto_data; |
5575 | 2581 const char *username = gaim_account_get_username(gaim_connection_get_account(gc)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2582 |
4121 | 2583 if (!args) |
2584 return 0; | |
4194 | 2585 |
8660 | 2586 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2587 "rendezvous with %s, status is %hu\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2588 userinfo->sn, args->status); |
2869 | 2589 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2590 if (args->reqclass & AIM_CAPS_CHAT) { |
4121 | 2591 char *name; |
5234 | 2592 GHashTable *components; |
2593 | |
4121 | 2594 if (!args->info.chat.roominfo.name || !args->info.chat.roominfo.exchange || !args->msg) |
2595 return 1; | |
5234 | 2596 components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, |
2597 g_free); | |
4121 | 2598 name = extract_name(args->info.chat.roominfo.name); |
5234 | 2599 g_hash_table_replace(components, g_strdup("room"), g_strdup(name ? name : args->info.chat.roominfo.name)); |
2600 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
|
2601 serv_got_chat_invite(gc, |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2602 name ? name : args->info.chat.roominfo.name, |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2603 userinfo->sn, |
6059 | 2604 args->msg, |
5234 | 2605 components); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2606 if (name) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2607 g_free(name); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2608 } else if (args->reqclass & AIM_CAPS_SENDFILE) { |
4617 | 2609 /* BBB */ |
2610 if (args->status == AIM_RENDEZVOUS_PROPOSE) { | |
2611 /* Someone wants to send a file (or files) to us */ | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2612 GaimXfer *xfer; |
5146 | 2613 struct aim_oft_info *oft_info; |
2614 | |
2615 if (!args->cookie || !args->port || !args->verifiedip || | |
2616 !args->info.sendfile.filename || !args->info.sendfile.totsize || | |
4656 | 2617 !args->info.sendfile.totfiles || !args->reqclass) { |
8660 | 2618 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2619 "%s tried to send you a file with incomplete " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2620 "information.\n", userinfo->sn); |
5146 | 2621 if (args->proxyip) |
8660 | 2622 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2623 "IP for a proxy server was given. Gaim " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2624 "does not support this yet.\n"); |
4617 | 2625 return 1; |
4656 | 2626 } |
4617 | 2627 |
2628 if (args->info.sendfile.subtype == AIM_OFT_SUBTYPE_SEND_DIR) { | |
2629 /* last char of the ft req is a star, they are sending us a | |
2630 * directory -- remove the star and trailing slash so we dont save | |
2631 * directories that look like 'dirname\*' -- arl */ | |
2632 char *tmp = strrchr(args->info.sendfile.filename, '\\'); | |
2633 if (tmp && (tmp[1] == '*')) { | |
2634 tmp[0] = '\0'; | |
2635 } | |
8660 | 2636 gaim_debug_warning("oscar", |
8446 | 2637 "We're receiving a whole directory! What fun! " |
2638 "Especially since we don't support that!\n"); | |
4617 | 2639 } |
2640 | |
2641 /* Build the file transfer handle */ | |
2642 xfer = gaim_xfer_new(gc->account, GAIM_XFER_RECEIVE, userinfo->sn); | |
5163 | 2643 xfer->remote_ip = g_strdup(args->verifiedip); |
5146 | 2644 xfer->remote_port = args->port; |
4617 | 2645 gaim_xfer_set_filename(xfer, args->info.sendfile.filename); |
2646 gaim_xfer_set_size(xfer, args->info.sendfile.totsize); | |
5146 | 2647 |
2648 /* Create the oscar-specific data */ | |
5163 | 2649 oft_info = aim_oft_createinfo(od->sess, args->cookie, userinfo->sn, args->clientip, xfer->remote_port, 0, 0, NULL); |
4898 | 2650 if (args->proxyip) |
5146 | 2651 oft_info->proxyip = g_strdup(args->proxyip); |
4898 | 2652 if (args->verifiedip) |
5146 | 2653 oft_info->verifiedip = g_strdup(args->verifiedip); |
2654 xfer->data = oft_info; | |
4617 | 2655 |
2656 /* Setup our I/O op functions */ | |
8446 | 2657 gaim_xfer_set_init_fnc(xfer, oscar_xfer_init_recv); |
4617 | 2658 gaim_xfer_set_end_fnc(xfer, oscar_xfer_end); |
8446 | 2659 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
|
2660 gaim_xfer_set_cancel_recv_fnc(xfer, oscar_xfer_cancel_recv); |
8446 | 2661 gaim_xfer_set_ack_fnc(xfer, oscar_xfer_ack_recv); |
4617 | 2662 |
2663 /* | |
2664 * XXX - Should do something with args->msg, args->encoding, and args->language | |
2665 * probably make it apply to all ch2 messages. | |
3752 | 2666 */ |
4617 | 2667 |
2668 /* Keep track of this transfer for later */ | |
2669 od->file_transfers = g_slist_append(od->file_transfers, xfer); | |
2670 | |
2671 /* Now perform the request */ | |
2672 gaim_xfer_request(xfer); | |
2673 } else if (args->status == AIM_RENDEZVOUS_CANCEL) { | |
2674 /* The other user wants to cancel a file transfer */ | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2675 GaimXfer *xfer; |
8660 | 2676 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2677 "AAA - File transfer canceled by remote user\n"); |
4617 | 2678 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
|
2679 gaim_xfer_cancel_remote(xfer); |
4617 | 2680 } else if (args->status == AIM_RENDEZVOUS_ACCEPT) { |
2681 /* | |
2682 * This gets sent by the receiver of a file | |
2683 * as they connect directly to us. If we don't | |
2684 * get this, then maybe a third party connected | |
2685 * to us, and we shouldn't send them anything. | |
2686 */ | |
2687 } else { | |
8660 | 2688 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2689 "unknown rendezvous status!\n"); |
3630 | 2690 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2691 } else if (args->reqclass & AIM_CAPS_GETFILE) { |
8092 | 2692 } else if (args->reqclass & AIM_CAPS_TALK) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2693 } else if (args->reqclass & AIM_CAPS_BUDDYICON) { |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
2694 gaim_buddy_icons_set_for_user(gaim_connection_get_account(gc), |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
2695 userinfo->sn, args->info.icon.icon, |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
2696 args->info.icon.length); |
6871 | 2697 } else if (args->reqclass & AIM_CAPS_DIRECTIM) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2698 struct ask_direct *d = g_new0(struct ask_direct, 1); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2699 char buf[256]; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2700 |
4212 | 2701 if (!args->verifiedip) { |
8660 | 2702 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2703 "directim kill blocked (%s)\n", userinfo->sn); |
4650 | 2704 return 1; |
4212 | 2705 } |
2706 | |
8660 | 2707 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2708 "%s received direct im request from %s (%s)\n", |
5575 | 2709 username, userinfo->sn, args->verifiedip); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2710 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2711 d->gc = gc; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2712 d->sn = g_strdup(userinfo->sn); |
8552 | 2713 snprintf(d->ip, sizeof(d->ip), "%s:%d", args->verifiedip, args->port); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2714 memcpy(d->cookie, args->cookie, 8); |
5575 | 2715 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
|
2716 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2717 gaim_request_action(gc, NULL, buf, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2718 _("This requires a direct connection between " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2719 "the two computers and is necessary for IM " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2720 "Images. Because your IP address will be " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2721 "revealed, this may be considered a privacy " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2722 "risk."), 0, d, 2, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2723 _("Connect"), G_CALLBACK(accept_direct_im), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2724 _("Cancel"), G_CALLBACK(cancel_direct_im)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2725 } else { |
8660 | 2726 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2727 "Unknown reqclass %hu\n", args->reqclass); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2728 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2729 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2730 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2731 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2732 |
3453 | 2733 /* |
4230 | 2734 * Authorization Functions |
2735 * Most of these are callbacks from dialogs. They're used by both | |
2736 * methods of authorization (SSI and old-school channel 4 ICBM) | |
3453 | 2737 */ |
4269 | 2738 /* When you ask other people for authorization */ |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2739 static void gaim_auth_request(struct name_data *data, char *msg) { |
5575 | 2740 GaimConnection *gc = data->gc; |
4244 | 2741 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2742 if (g_list_find(gaim_connections_get_all(), gc)) { |
7283 | 2743 OscarData *od = gc->proto_data; |
6695 | 2744 GaimBuddy *buddy = gaim_find_buddy(gc->account, data->name); |
2745 GaimGroup *group = gaim_find_buddys_group(buddy); | |
4244 | 2746 if (buddy && group) { |
8660 | 2747 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2748 "ssi: adding buddy %s to group %s\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2749 buddy->name, group->name); |
4889 | 2750 aim_ssi_sendauthrequest(od->sess, data->name, msg ? msg : _("Please authorize me so I can add you to my buddy list.")); |
4269 | 2751 if (!aim_ssi_itemlist_finditem(od->sess->ssi.local, group->name, buddy->name, AIM_SSI_TYPE_BUDDY)) |
4889 | 2752 aim_ssi_addbuddy(od->sess, buddy->name, group->name, gaim_get_buddy_alias_only(buddy), NULL, NULL, 1); |
4244 | 2753 } |
4230 | 2754 } |
4337 | 2755 } |
2756 | |
2757 static void gaim_auth_request_msgprompt(struct name_data *data) { | |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2758 gaim_request_input(data->gc, NULL, _("Authorization Request Message:"), |
8697 | 2759 NULL, _("Please authorize me!"), TRUE, FALSE, NULL, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2760 _("OK"), G_CALLBACK(gaim_auth_request), |
5836 | 2761 _("Cancel"), G_CALLBACK(oscar_free_name_data), |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2762 data); |
4230 | 2763 } |
2764 | |
2765 static void gaim_auth_dontrequest(struct name_data *data) { | |
5575 | 2766 GaimConnection *gc = data->gc; |
4244 | 2767 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2768 if (g_list_find(gaim_connections_get_all(), gc)) { |
8151 | 2769 /* Remove from local list */ |
2770 GaimBuddy *b = gaim_find_buddy(gaim_connection_get_account(gc), data->name); | |
2771 gaim_blist_remove_buddy(b); | |
4244 | 2772 } |
2773 | |
5836 | 2774 oscar_free_name_data(data); |
4230 | 2775 } |
2776 | |
5575 | 2777 static void gaim_auth_sendrequest(GaimConnection *gc, const char *name) { |
4269 | 2778 struct name_data *data = g_new(struct name_data, 1); |
6695 | 2779 GaimBuddy *buddy; |
4269 | 2780 gchar *dialog_msg, *nombre; |
2781 | |
4687 | 2782 buddy = gaim_find_buddy(gc->account, name); |
2783 if (buddy && (gaim_get_buddy_alias_only(buddy))) | |
2784 nombre = g_strdup_printf("%s (%s)", name, gaim_get_buddy_alias_only(buddy)); | |
4269 | 2785 else |
4830 | 2786 nombre = NULL; |
2787 | |
2788 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 | 2789 data->gc = gc; |
2790 data->name = g_strdup(name); | |
2791 data->nick = NULL; | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2792 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2793 gaim_request_action(gc, NULL, _("Request Authorization"), dialog_msg, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2794 0, data, 2, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2795 _("Request Authorization"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2796 G_CALLBACK(gaim_auth_request_msgprompt), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2797 _("Cancel"), G_CALLBACK(gaim_auth_dontrequest)); |
4269 | 2798 |
2799 g_free(dialog_msg); | |
2800 g_free(nombre); | |
2801 } | |
2802 | |
4230 | 2803 /* When other people ask you for authorization */ |
2804 static void gaim_auth_grant(struct name_data *data) { | |
5575 | 2805 GaimConnection *gc = data->gc; |
4244 | 2806 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2807 if (g_list_find(gaim_connections_get_all(), gc)) { |
7283 | 2808 OscarData *od = gc->proto_data; |
4236 | 2809 #ifdef NOSSI |
6695 | 2810 GaimBuddy *buddy; |
4244 | 2811 gchar message; |
2812 message = 0; | |
4687 | 2813 buddy = gaim_find_buddy(gc->account, data->name); |
4617 | 2814 aim_im_sendch4(od->sess, data->name, AIM_ICQMSG_AUTHGRANTED, &message); |
7015
dece74f05509
[gaim-migrate @ 7578]
Christian Hammond <chipx86@chipx86.com>
parents:
7011
diff
changeset
|
2815 gaim_account_notify_added(gc->account, NULL, data->name, (buddy ? gaim_get_buddy_alias_only(buddy) : NULL), NULL); |
4230 | 2816 #else |
4889 | 2817 aim_ssi_sendauthreply(od->sess, data->name, 0x01, NULL); |
4230 | 2818 #endif |
4244 | 2819 } |
2820 | |
5836 | 2821 oscar_free_name_data(data); |
3141 | 2822 } |
2823 | |
4230 | 2824 /* When other people ask you for authorization */ |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2825 static void gaim_auth_dontgrant(struct name_data *data, char *msg) { |
5575 | 2826 GaimConnection *gc = data->gc; |
4244 | 2827 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2828 if (g_list_find(gaim_connections_get_all(), gc)) { |
7283 | 2829 OscarData *od = gc->proto_data; |
4230 | 2830 #ifdef NOSSI |
4617 | 2831 aim_im_sendch4(od->sess, data->name, AIM_ICQMSG_AUTHDENIED, msg ? msg : _("No reason given.")); |
4230 | 2832 #else |
4889 | 2833 aim_ssi_sendauthreply(od->sess, data->name, 0x00, msg ? msg : _("No reason given.")); |
4230 | 2834 #endif |
4244 | 2835 } |
4337 | 2836 } |
2837 | |
2838 static void gaim_auth_dontgrant_msgprompt(struct name_data *data) { | |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2839 gaim_request_input(data->gc, NULL, _("Authorization Denied Message:"), |
8697 | 2840 NULL, _("No reason given."), TRUE, FALSE, NULL, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2841 _("OK"), G_CALLBACK(gaim_auth_dontgrant), |
5836 | 2842 _("Cancel"), G_CALLBACK(oscar_free_name_data), |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2843 data); |
3141 | 2844 } |
2845 | |
7023 | 2846 /* When someone sends you buddies */ |
2847 static void gaim_icq_buddyadd(struct name_data *data) { | |
5575 | 2848 GaimConnection *gc = data->gc; |
4244 | 2849 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2850 if (g_list_find(gaim_connections_get_all(), gc)) { |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7054
diff
changeset
|
2851 gaim_blist_request_add_buddy(gaim_connection_get_account(gc), data->name, NULL, data->nick); |
4244 | 2852 } |
2853 | |
5836 | 2854 oscar_free_name_data(data); |
3453 | 2855 } |
2856 | |
4075 | 2857 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 | 2858 GaimConnection *gc = sess->aux_data; |
4076 | 2859 gchar **msg1, **msg2; |
2860 GError *err = NULL; | |
6051 | 2861 int i, numtoks; |
4076 | 2862 |
4121 | 2863 if (!args->type || !args->msg || !args->uin) |
2864 return 1; | |
4194 | 2865 |
8660 | 2866 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2867 "Received a channel 4 message of type 0x%02hhx.\n", args->type); |
4076 | 2868 |
2869 /* Split up the message at the delimeter character, then convert each string to UTF-8 */ | |
4173 | 2870 msg1 = g_strsplit(args->msg, "\376", 0); |
6051 | 2871 for (numtoks=0; msg1[numtoks]; numtoks++); |
2872 msg2 = (gchar **)g_malloc((numtoks+1)*sizeof(gchar *)); | |
4076 | 2873 for (i=0; msg1[i]; i++) { |
7478
3c21f3084ff0
[gaim-migrate @ 8091]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
7475
diff
changeset
|
2874 gaim_str_strip_cr(msg1[i]); |
4076 | 2875 msg2[i] = g_convert(msg1[i], strlen(msg1[i]), "UTF-8", "ISO-8859-1", NULL, NULL, &err); |
4800 | 2876 if (err) { |
8660 | 2877 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2878 "Error converting a string from ISO-8859-1 to " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2879 "UTF-8 in oscar ICBM channel 4 parsing\n"); |
4800 | 2880 g_error_free(err); |
2881 } | |
4076 | 2882 } |
2883 msg2[i] = NULL; | |
2884 | |
3952 | 2885 switch (args->type) { |
4173 | 2886 case 0x01: { /* MacICQ message or basic offline message */ |
4076 | 2887 if (i >= 1) { |
5556 | 2888 gchar *uin = g_strdup_printf("%u", args->uin); |
8493 | 2889 gchar *tmp; |
2890 | |
2891 /* If the message came from an ICQ user then escape any HTML */ | |
8501 | 2892 tmp = gaim_escape_html(msg2[0]); |
8493 | 2893 |
4076 | 2894 if (t) { /* This is an offline message */ |
2895 /* I think this timestamp is in UTC, or something */ | |
8514 | 2896 serv_got_im(gc, uin, tmp, 0, t); |
4076 | 2897 } else { /* This is a message from MacICQ/Miranda */ |
8514 | 2898 serv_got_im(gc, uin, tmp, 0, time(NULL)); |
4076 | 2899 } |
2900 g_free(uin); | |
8493 | 2901 g_free(tmp); |
4075 | 2902 } |
3316 | 2903 } break; |
2904 | |
4173 | 2905 case 0x04: { /* Someone sent you a URL */ |
4076 | 2906 if (i >= 2) { |
7385 | 2907 if (msg2[1] != NULL) { |
2908 gchar *uin = g_strdup_printf("%u", args->uin); | |
2909 gchar *message = g_strdup_printf("<A HREF=\"%s\">%s</A>", | |
2910 msg2[1], | |
2911 (msg2[0] && msg2[0][0]) ? msg2[0] : msg2[1]); | |
2912 serv_got_im(gc, uin, message, 0, time(NULL)); | |
2913 g_free(uin); | |
2914 g_free(message); | |
2915 } | |
3453 | 2916 } |
2917 } break; | |
2918 | |
4173 | 2919 case 0x06: { /* Someone requested authorization */ |
4076 | 2920 if (i >= 6) { |
4230 | 2921 struct name_data *data = g_new(struct name_data, 1); |
5556 | 2922 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 | 2923 gaim_debug_info("oscar", |
5556 | 2924 "Received an authorization request from UIN %u\n", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2925 args->uin); |
4076 | 2926 data->gc = gc; |
5556 | 2927 data->name = g_strdup_printf("%u", args->uin); |
4230 | 2928 data->nick = NULL; |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2929 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2930 gaim_request_action(gc, NULL, _("Authorization Request"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2931 dialog_msg, 0, data, 2, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2932 _("Authorize"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2933 G_CALLBACK(gaim_auth_grant), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2934 _("Deny"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2935 G_CALLBACK(gaim_auth_dontgrant_msgprompt)); |
4076 | 2936 g_free(dialog_msg); |
2937 } | |
3141 | 2938 } break; |
2939 | |
4173 | 2940 case 0x07: { /* Someone has denied you authorization */ |
4076 | 2941 if (i >= 1) { |
7023 | 2942 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
|
2943 gaim_notify_info(gc, NULL, _("ICQ authorization denied."), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2944 dialog_msg); |
4076 | 2945 g_free(dialog_msg); |
2946 } | |
3141 | 2947 } break; |
2948 | |
4173 | 2949 case 0x08: { /* Someone has granted you authorization */ |
7023 | 2950 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
|
2951 gaim_notify_info(gc, NULL, "ICQ authorization accepted.", |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2952 dialog_msg); |
3141 | 2953 g_free(dialog_msg); |
2954 } break; | |
2955 | |
4333 | 2956 case 0x09: { /* Message from the Godly ICQ server itself, I think */ |
2957 if (i >= 5) { | |
2958 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
|
2959 gaim_notify_info(gc, NULL, "ICQ Server Message", dialog_msg); |
4333 | 2960 g_free(dialog_msg); |
2961 } | |
2962 } break; | |
2963 | |
4173 | 2964 case 0x0d: { /* Someone has sent you a pager message from http://www.icq.com/your_uin */ |
4076 | 2965 if (i >= 6) { |
4194 | 2966 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
|
2967 gaim_notify_info(gc, NULL, "ICQ Page", dialog_msg); |
4076 | 2968 g_free(dialog_msg); |
2969 } | |
4075 | 2970 } break; |
2971 | |
4173 | 2972 case 0x0e: { /* Someone has emailed you at your_uin@pager.icq.com */ |
4076 | 2973 if (i >= 6) { |
4308 | 2974 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
|
2975 gaim_notify_info(gc, NULL, "ICQ Email", dialog_msg); |
4076 | 2976 g_free(dialog_msg); |
2977 } | |
4075 | 2978 } break; |
2979 | |
4173 | 2980 case 0x12: { |
3141 | 2981 /* Ack for authorizing/denying someone. Or possibly an ack for sending any system notice */ |
7023 | 2982 /* Someone added you to their buddy list? */ |
3141 | 2983 } break; |
2984 | |
7023 | 2985 case 0x13: { /* Someone has sent you some ICQ buddies */ |
7631 | 2986 guint i, num; |
3453 | 2987 gchar **text; |
4173 | 2988 text = g_strsplit(args->msg, "\376", 0); |
3453 | 2989 if (text) { |
2990 num = 0; | |
2991 for (i=0; i<strlen(text[0]); i++) | |
2992 num = num*10 + text[0][i]-48; | |
2993 for (i=0; i<num; i++) { | |
4230 | 2994 struct name_data *data = g_new(struct name_data, 1); |
7023 | 2995 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 | 2996 data->gc = gc; |
4790 | 2997 data->name = g_strdup(text[i*2+1]); |
2998 data->nick = g_strdup(text[i*2+2]); | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2999 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3000 gaim_request_action(gc, NULL, message, |
7023 | 3001 _("Do you want to add this buddy " |
3002 "to your buddy list?"), | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3003 0, data, 2, |
7023 | 3004 _("Add"), G_CALLBACK(gaim_icq_buddyadd), |
5836 | 3005 _("Decline"), G_CALLBACK(oscar_free_name_data)); |
3453 | 3006 g_free(message); |
3007 } | |
3008 g_strfreev(text); | |
3009 } | |
3010 } break; | |
3011 | |
7023 | 3012 case 0x1a: { /* Someone has sent you a greeting card or requested buddies? */ |
3453 | 3013 /* This is boring and silly. */ |
3014 } break; | |
3015 | |
3141 | 3016 default: { |
8660 | 3017 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3018 "Received a channel 4 message of unknown type " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3019 "(type 0x%02hhx).\n", args->type); |
3141 | 3020 } break; |
3021 } | |
3022 | |
4076 | 3023 g_strfreev(msg1); |
3024 g_strfreev(msg2); | |
3025 | |
3141 | 3026 return 1; |
3027 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3028 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3029 static int gaim_parse_incoming_im(aim_session_t *sess, aim_frame_t *fr, ...) { |
4200 | 3030 fu16_t channel; |
3031 int ret = 0; | |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3032 aim_userinfo_t *userinfo; |
2086 | 3033 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3034 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3035 va_start(ap, fr); |
4200 | 3036 channel = (fu16_t)va_arg(ap, unsigned int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3037 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 3038 |
3141 | 3039 switch (channel) { |
3040 case 1: { /* standard message */ | |
3041 struct aim_incomingim_ch1_args *args; | |
3042 args = va_arg(ap, struct aim_incomingim_ch1_args *); | |
3043 ret = incomingim_chan1(sess, fr->conn, userinfo, args); | |
3044 } break; | |
3045 | |
3046 case 2: { /* rendevous */ | |
3047 struct aim_incomingim_ch2_args *args; | |
3048 args = va_arg(ap, struct aim_incomingim_ch2_args *); | |
3049 ret = incomingim_chan2(sess, fr->conn, userinfo, args); | |
3050 } break; | |
3051 | |
3052 case 4: { /* ICQ */ | |
3053 struct aim_incomingim_ch4_args *args; | |
3054 args = va_arg(ap, struct aim_incomingim_ch4_args *); | |
4075 | 3055 ret = incomingim_chan4(sess, fr->conn, userinfo, args, 0); |
3141 | 3056 } break; |
3057 | |
3058 default: { | |
8660 | 3059 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3060 "ICBM received on unsupported channel (channel " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3061 "0x%04hx).", channel); |
3141 | 3062 } break; |
2086 | 3063 } |
3064 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3065 va_end(ap); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3066 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3067 return ret; |
2086 | 3068 } |
3069 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3070 static int gaim_parse_misses(aim_session_t *sess, aim_frame_t *fr, ...) { |
5420 | 3071 char *buf; |
2086 | 3072 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3073 fu16_t chan, nummissed, reason; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3074 aim_userinfo_t *userinfo; |
2086 | 3075 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3076 va_start(ap, fr); |
4200 | 3077 chan = (fu16_t)va_arg(ap, unsigned int); |
3078 userinfo = va_arg(ap, aim_userinfo_t *); | |
3079 nummissed = (fu16_t)va_arg(ap, unsigned int); | |
3080 reason = (fu16_t)va_arg(ap, unsigned int); | |
2086 | 3081 va_end(ap); |
3082 | |
3083 switch(reason) { | |
5420 | 3084 case 0: /* Invalid (0) */ |
3085 buf = g_strdup_printf( | |
3086 ngettext( | |
4276 | 3087 "You missed %hu message from %s because it was invalid.", |
3088 "You missed %hu messages from %s because they were invalid.", | |
3089 nummissed), | |
4282 | 3090 nummissed, |
3091 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3092 break; |
5420 | 3093 case 1: /* Message too large */ |
3094 buf = g_strdup_printf( | |
3095 ngettext( | |
4276 | 3096 "You missed %hu message from %s because it was too large.", |
3097 "You missed %hu messages from %s because they were too large.", | |
3098 nummissed), | |
4282 | 3099 nummissed, |
3100 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3101 break; |
5420 | 3102 case 2: /* Rate exceeded */ |
3103 buf = g_strdup_printf( | |
3104 ngettext( | |
4276 | 3105 "You missed %hu message from %s because the rate limit has been exceeded.", |
3106 "You missed %hu messages from %s because the rate limit has been exceeded.", | |
3107 nummissed), | |
4282 | 3108 nummissed, |
3109 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3110 break; |
5420 | 3111 case 3: /* Evil Sender */ |
3112 buf = g_strdup_printf( | |
3113 ngettext( | |
4276 | 3114 "You missed %hu message from %s because he/she was too evil.", |
3115 "You missed %hu messages from %s because he/she was too evil.", | |
3116 nummissed), | |
4282 | 3117 nummissed, |
3118 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3119 break; |
5420 | 3120 case 4: /* Evil Receiver */ |
3121 buf = g_strdup_printf( | |
3122 ngettext( | |
4276 | 3123 "You missed %hu message from %s because you are too evil.", |
3124 "You missed %hu messages from %s because you are too evil.", | |
3125 nummissed), | |
4282 | 3126 nummissed, |
3127 userinfo->sn); | |
2086 | 3128 break; |
3129 default: | |
5420 | 3130 buf = g_strdup_printf( |
3131 ngettext( | |
4276 | 3132 "You missed %hu message from %s for an unknown reason.", |
3133 "You missed %hu messages from %s for an unknown reason.", | |
3134 nummissed), | |
4282 | 3135 nummissed, |
3136 userinfo->sn); | |
2086 | 3137 break; |
3138 } | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3139 gaim_notify_error(sess->aux_data, NULL, buf, NULL); |
5420 | 3140 g_free(buf); |
2086 | 3141 |
3142 return 1; | |
3143 } | |
3144 | |
4194 | 3145 static int gaim_parse_clientauto_ch2(aim_session_t *sess, const char *who, fu16_t reason, const char *cookie) { |
5575 | 3146 GaimConnection *gc = sess->aux_data; |
7283 | 3147 OscarData *od = gc->proto_data; |
4617 | 3148 |
3149 /* BBB */ | |
3630 | 3150 switch (reason) { |
4151 | 3151 case 3: { /* Decline sendfile. */ |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
3152 GaimXfer *xfer; |
8660 | 3153 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3154 "AAA - Other user declined file transfer\n"); |
4617 | 3155 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
|
3156 gaim_xfer_cancel_remote(xfer); |
4151 | 3157 } break; |
3158 | |
3159 default: { | |
8660 | 3160 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3161 "Received an unknown rendezvous client auto-response " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3162 "from %s. Type 0x%04hx\n", who, reason); |
4151 | 3163 } |
3630 | 3164 |
3165 } | |
3166 | |
3167 return 0; | |
3168 } | |
3169 | |
4194 | 3170 static int gaim_parse_clientauto_ch4(aim_session_t *sess, char *who, fu16_t reason, fu32_t state, char *msg) { |
5575 | 3171 GaimConnection *gc = sess->aux_data; |
4151 | 3172 |
3173 switch(reason) { | |
3174 case 0x0003: { /* Reply from an ICQ status message request */ | |
8701 | 3175 char *status_msg = oscar_icqstatus(state); |
4151 | 3176 char *dialog_msg, **splitmsg; |
3177 | |
3178 /* Split at (carriage return/newline)'s, then rejoin later with BRs between. */ | |
3179 splitmsg = g_strsplit(msg, "\r\n", 0); | |
3180 | |
7011 | 3181 dialog_msg = g_strdup_printf(_("<B>UIN:</B> %s<BR><B>Status:</B> %s<HR>%s"), who, status_msg, g_strjoinv("<BR>", splitmsg)); |
7032 | 3182 gaim_notify_formatted(gc, NULL, _("Buddy Information"), NULL, dialog_msg, NULL, NULL); |
4151 | 3183 |
3184 g_free(status_msg); | |
3185 g_free(dialog_msg); | |
3186 g_strfreev(splitmsg); | |
3187 } break; | |
3188 | |
3189 default: { | |
8660 | 3190 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3191 "Received an unknown client auto-response from %s. " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3192 "Type 0x%04hx\n", who, reason); |
4151 | 3193 } break; |
3194 } /* end of switch */ | |
3195 | |
3196 return 0; | |
3197 } | |
3198 | |
3212 | 3199 static int gaim_parse_clientauto(aim_session_t *sess, aim_frame_t *fr, ...) { |
3200 va_list ap; | |
3201 fu16_t chan, reason; | |
3202 char *who; | |
3203 | |
3204 va_start(ap, fr); | |
4200 | 3205 chan = (fu16_t)va_arg(ap, unsigned int); |
3212 | 3206 who = va_arg(ap, char *); |
4200 | 3207 reason = (fu16_t)va_arg(ap, unsigned int); |
3212 | 3208 |
3952 | 3209 if (chan == 0x0002) { /* File transfer declined */ |
3630 | 3210 char *cookie = va_arg(ap, char *); |
4151 | 3211 return gaim_parse_clientauto_ch2(sess, who, reason, cookie); |
3952 | 3212 } else if (chan == 0x0004) { /* ICQ message */ |
4200 | 3213 fu32_t state = 0; |
4151 | 3214 char *msg = NULL; |
3215 if (reason == 0x0003) { | |
4200 | 3216 state = va_arg(ap, fu32_t); |
4151 | 3217 msg = va_arg(ap, char *); |
3218 } | |
3219 return gaim_parse_clientauto_ch4(sess, who, reason, state, msg); | |
3220 } | |
3952 | 3221 |
3212 | 3222 va_end(ap); |
3223 | |
3224 return 1; | |
3225 } | |
3226 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3227 static int gaim_parse_genericerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3228 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3229 fu16_t reason; |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
3230 char *m; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3231 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3232 va_start(ap, fr); |
4199 | 3233 reason = (fu16_t) va_arg(ap, unsigned int); |
2086 | 3234 va_end(ap); |
3235 | |
8660 | 3236 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3237 "snac threw error (reason 0x%04hx: %s)\n", reason, |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3238 (reason < msgerrreasonlen) ? msgerrreason[reason] : "unknown"); |
2086 | 3239 |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
3240 m = g_strdup_printf(_("SNAC threw error: %s\n"), |
5411 | 3241 reason < msgerrreasonlen ? _(msgerrreason[reason]) : _("Unknown error")); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3242 gaim_notify_error(sess->aux_data, NULL, m, NULL); |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
3243 g_free(m); |
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
3244 |
2086 | 3245 return 1; |
3246 } | |
3247 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3248 static int gaim_parse_msgerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
4617 | 3249 #if 0 |
5575 | 3250 GaimConnection *gc = sess->aux_data; |
7283 | 3251 OscarData *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
3252 GaimXfer *xfer; |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
3253 #endif |
4617 | 3254 va_list ap; |
3255 fu16_t reason; | |
3256 char *data, *buf; | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
3257 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3258 va_start(ap, fr); |
4617 | 3259 reason = (fu16_t)va_arg(ap, unsigned int); |
3752 | 3260 data = va_arg(ap, char *); |
2086 | 3261 va_end(ap); |
3262 | |
8660 | 3263 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3264 "Message error with data %s and reason %hu\n", data, reason); |
4617 | 3265 |
3266 /* BBB */ | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
3267 #if 0 |
4617 | 3268 /* If this was a file transfer request, data is a cookie */ |
3269 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
|
3270 gaim_xfer_cancel_remote(xfer); |
3630 | 3271 return 1; |
3272 } | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
3273 #endif |
3630 | 3274 |
4617 | 3275 /* Data is assumed to be the destination sn */ |
3276 buf = g_strdup_printf(_("Your message to %s did not get sent:"), data); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3277 gaim_notify_error(sess->aux_data, NULL, buf, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3278 (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("No reason given.")); |
4617 | 3279 g_free(buf); |
2086 | 3280 |
3281 return 1; | |
3282 } | |
3283 | |
3595 | 3284 static int gaim_parse_mtn(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3285 GaimConnection *gc = sess->aux_data; |
3595 | 3286 va_list ap; |
3287 fu16_t type1, type2; | |
3288 char *sn; | |
3289 | |
3290 va_start(ap, fr); | |
4199 | 3291 type1 = (fu16_t) va_arg(ap, unsigned int); |
3595 | 3292 sn = va_arg(ap, char *); |
4199 | 3293 type2 = (fu16_t) va_arg(ap, unsigned int); |
3595 | 3294 va_end(ap); |
3295 | |
3296 switch (type2) { | |
3297 case 0x0000: { /* Text has been cleared */ | |
3298 serv_got_typing_stopped(gc, sn); | |
3299 } break; | |
3300 | |
3301 case 0x0001: { /* Paused typing */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
3302 serv_got_typing(gc, sn, 0, GAIM_TYPED); |
3595 | 3303 } break; |
3304 | |
3305 case 0x0002: { /* Typing */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
3306 serv_got_typing(gc, sn, 0, GAIM_TYPING); |
3595 | 3307 } break; |
3308 | |
3309 default: { | |
8660 | 3310 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 | 3311 } break; |
3312 } | |
3313 | |
3314 return 1; | |
3315 } | |
3316 | |
7141 | 3317 /* |
3318 * We get this error when there was an error in the locate family. This | |
7259 | 3319 * happens when you request info of someone who is offline. |
7141 | 3320 */ |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3321 static int gaim_parse_locerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
7259 | 3322 gchar *buf; |
2086 | 3323 va_list ap; |
5420 | 3324 fu16_t reason; |
2086 | 3325 char *destn; |
3326 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3327 va_start(ap, fr); |
4199 | 3328 reason = (fu16_t) va_arg(ap, unsigned int); |
2086 | 3329 destn = va_arg(ap, char *); |
3330 va_end(ap); | |
3331 | |
7781 | 3332 if (destn == NULL) |
7793 | 3333 return 1; |
3334 | |
3335 buf = g_strdup_printf(_("User information for %s unavailable:"), destn); | |
7781 | 3336 |
3337 gaim_notify_error(sess->aux_data, NULL, buf, | |
3338 (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("No reason given.")); | |
3339 g_free(buf); | |
2086 | 3340 |
3341 return 1; | |
3342 } | |
3343 | |
7011 | 3344 static int gaim_parse_userinfo(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3345 GaimConnection *gc = sess->aux_data; |
8700 | 3346 GaimAccount *account = gaim_connection_get_account(gc); |
3347 GString *str; | |
3348 gchar *tmp = NULL, *info_utf8 = NULL, *away_utf8 = NULL; | |
4791 | 3349 va_list ap; |
7011 | 3350 aim_userinfo_t *userinfo; |
2086 | 3351 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3352 va_start(ap, fr); |
7011 | 3353 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 3354 va_end(ap); |
3355 | |
8700 | 3356 str = g_string_new(""); |
3357 g_string_append_printf(str, "<b>%s:</b> %s", _("Screen Name"), userinfo->sn); | |
3358 g_string_append_printf(str, "\n<br><b>%s</b>: %d%%", _("Warning Level"), (int)((userinfo->warnlevel/10.0) + 0.5)); | |
7011 | 3359 |
3360 if (userinfo->present & AIM_USERINFO_PRESENT_ONLINESINCE) | |
8701 | 3361 oscar_string_append(str, "\n<br>", _("Online Since"), |
8700 | 3362 asctime(localtime((time_t *)&userinfo->onlinesince))); |
7011 | 3363 |
3364 if (userinfo->present & AIM_USERINFO_PRESENT_MEMBERSINCE) | |
8701 | 3365 oscar_string_append(str, "\n<br>", _("Member Since"), |
8700 | 3366 asctime(localtime((time_t *)&userinfo->membersince))); |
7011 | 3367 |
3368 if (userinfo->present & AIM_USERINFO_PRESENT_IDLE) { | |
8700 | 3369 tmp = gaim_str_seconds_to_string(userinfo->idletime*60); |
8701 | 3370 oscar_string_append(str, "\n<br>", _("Idle"), tmp); |
8700 | 3371 g_free(tmp); |
3372 } | |
3373 | |
8701 | 3374 oscar_string_append_info(gc, str, "\n<br>", NULL, userinfo); |
7011 | 3375 |
3376 if ((userinfo->flags & AIM_FLAG_AWAY) && (userinfo->away_len > 0) && (userinfo->away != NULL) && (userinfo->away_encoding != NULL)) { | |
8700 | 3377 tmp = oscar_encoding_extract(userinfo->away_encoding); |
3378 away_utf8 = oscar_encoding_to_utf8(tmp, userinfo->away, userinfo->away_len); | |
3379 g_free(tmp); | |
7011 | 3380 if (away_utf8 != NULL) { |
8700 | 3381 g_string_append_printf(str, "\n<hr>%s", away_utf8); |
7011 | 3382 g_free(away_utf8); |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3383 } |
7011 | 3384 } |
3385 | |
3386 if ((userinfo->info_len > 0) && (userinfo->info != NULL) && (userinfo->info_encoding != NULL)) { | |
8700 | 3387 tmp = oscar_encoding_extract(userinfo->info_encoding); |
3388 info_utf8 = oscar_encoding_to_utf8(tmp, userinfo->info, userinfo->info_len); | |
3389 g_free(tmp); | |
7011 | 3390 if (info_utf8 != NULL) { |
8700 | 3391 g_string_append_printf(str, "\n<hr>%s", info_utf8); |
7011 | 3392 g_free(info_utf8); |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3393 } |
7011 | 3394 } |
3395 | |
8701 | 3396 tmp = gaim_str_sub_away_formatters(str->str, gaim_account_get_username(account)); |
8700 | 3397 g_string_free(str, TRUE); |
3398 gaim_notify_formatted(gc, NULL, _("Buddy Information"), NULL, tmp, NULL, NULL); | |
3399 g_free(tmp); | |
4151 | 3400 |
2086 | 3401 return 1; |
3402 } | |
3403 | |
8341 | 3404 static gboolean gaim_reqinfo_timeout_cb(void *data) |
3405 { | |
3406 aim_session_t *sess = data; | |
3407 GaimConnection *gc = sess->aux_data; | |
3408 OscarData *od = (OscarData *)gc->proto_data; | |
3409 | |
3410 aim_locate_dorequest(data); | |
3411 od->getinfotimer = 0; | |
3412 | |
3413 return FALSE; | |
3414 } | |
3415 | |
3416 static int gaim_reqinfo_timeout(aim_session_t *sess, aim_frame_t *fr, ...) | |
3417 { | |
3418 GaimConnection *gc = sess->aux_data; | |
3419 OscarData *od = (OscarData *)gc->proto_data; | |
3420 | |
3421 /* | |
3422 * Wait a little while then call aim_locate_dorequest(sess). This keeps | |
3423 * us from hitting the rate limit due to request away messages and info | |
3424 * too quickly. | |
3425 */ | |
3426 if (od->getinfotimer == 0) | |
3427 od->getinfotimer = gaim_timeout_add(1200, gaim_reqinfo_timeout_cb, sess); | |
3428 | |
3429 return 1; | |
3430 } | |
3431 | |
3432 static int gaim_parse_motd(aim_session_t *sess, aim_frame_t *fr, ...) | |
3433 { | |
2086 | 3434 char *msg; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3435 fu16_t id; |
2086 | 3436 va_list ap; |
3437 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3438 va_start(ap, fr); |
4199 | 3439 id = (fu16_t) va_arg(ap, unsigned int); |
2086 | 3440 msg = va_arg(ap, char *); |
3441 va_end(ap); | |
3442 | |
8660 | 3443 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3444 "MOTD: %s (%hu)\n", msg ? msg : "Unknown", id); |
2092
59b0377d18aa
[gaim-migrate @ 2102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
3445 if (id < 4) |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3446 gaim_notify_warning(sess->aux_data, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3447 _("Your AIM connection may be lost."), NULL); |
2086 | 3448 |
3449 return 1; | |
3450 } | |
3451 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3452 static int gaim_chatnav_info(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3453 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3454 fu16_t type; |
5575 | 3455 GaimConnection *gc = sess->aux_data; |
7283 | 3456 OscarData *od = (OscarData *)gc->proto_data; |
2086 | 3457 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3458 va_start(ap, fr); |
4199 | 3459 type = (fu16_t) va_arg(ap, unsigned int); |
2086 | 3460 |
3461 switch(type) { | |
3462 case 0x0002: { | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3463 fu8_t maxrooms; |
2086 | 3464 struct aim_chat_exchangeinfo *exchanges; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3465 int exchangecount, i; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3466 |
4199 | 3467 maxrooms = (fu8_t) va_arg(ap, unsigned int); |
2086 | 3468 exchangecount = va_arg(ap, int); |
3469 exchanges = va_arg(ap, struct aim_chat_exchangeinfo *); | |
3470 | |
8660 | 3471 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3472 "chat info: Chat Rights:\n"); |
8660 | 3473 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3474 "chat info: \tMax Concurrent Rooms: %hhd\n", maxrooms); |
8660 | 3475 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3476 "chat info: \tExchange List: (%d total)\n", exchangecount); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3477 for (i = 0; i < exchangecount; i++) |
8660 | 3478 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3479 "chat info: \t\t%hu %s\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3480 exchanges[i].number, exchanges[i].name ? exchanges[i].name : ""); |
4617 | 3481 while (od->create_rooms) { |
3482 struct create_room *cr = od->create_rooms->data; | |
8660 | 3483 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3484 "creating room %s\n", cr->name); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
3485 aim_chatnav_createroom(sess, fr->conn, cr->name, cr->exchange); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
3486 g_free(cr->name); |
4617 | 3487 od->create_rooms = g_slist_remove(od->create_rooms, cr); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
3488 g_free(cr); |
2086 | 3489 } |
3490 } | |
3491 break; | |
3492 case 0x0008: { | |
3493 char *fqcn, *name, *ck; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3494 fu16_t instance, flags, maxmsglen, maxoccupancy, unknown, exchange; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3495 fu8_t createperms; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3496 fu32_t createtime; |
2086 | 3497 |
3498 fqcn = va_arg(ap, char *); | |
4200 | 3499 instance = (fu16_t)va_arg(ap, unsigned int); |
3500 exchange = (fu16_t)va_arg(ap, unsigned int); | |
3501 flags = (fu16_t)va_arg(ap, unsigned int); | |
3502 createtime = va_arg(ap, fu32_t); | |
3503 maxmsglen = (fu16_t)va_arg(ap, unsigned int); | |
3504 maxoccupancy = (fu16_t)va_arg(ap, unsigned int); | |
3505 createperms = (fu8_t)va_arg(ap, unsigned int); | |
3506 unknown = (fu16_t)va_arg(ap, unsigned int); | |
3507 name = va_arg(ap, char *); | |
3508 ck = va_arg(ap, char *); | |
4194 | 3509 |
8660 | 3510 gaim_debug_misc("oscar", |
5556 | 3511 "created room: %s %hu %hu %hu %u %hu %hu %hhu %hu %s %s\n", |
2086 | 3512 fqcn, |
3513 exchange, instance, flags, | |
3514 createtime, | |
3515 maxmsglen, maxoccupancy, createperms, unknown, | |
3516 name, ck); | |
4617 | 3517 aim_chat_join(od->sess, od->conn, exchange, ck, instance); |
2086 | 3518 } |
3519 break; | |
3520 default: | |
8660 | 3521 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3522 "chatnav info: unknown type (%04hx)\n", type); |
2086 | 3523 break; |
3524 } | |
4194 | 3525 |
3526 va_end(ap); | |
3527 | |
2086 | 3528 return 1; |
3529 } | |
3530 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
3531 static int gaim_conv_chat_join(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3532 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3533 int count, i; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3534 aim_userinfo_t *info; |
5575 | 3535 GaimConnection *g = sess->aux_data; |
2086 | 3536 |
3537 struct chat_connection *c = NULL; | |
3538 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3539 va_start(ap, fr); |
2086 | 3540 count = va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3541 info = va_arg(ap, aim_userinfo_t *); |
2086 | 3542 va_end(ap); |
3543 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3544 c = find_oscar_chat_by_conn(g, fr->conn); |
2086 | 3545 if (!c) |
3546 return 1; | |
3547 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3548 for (i = 0; i < count; i++) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
3549 gaim_conv_chat_add_user(GAIM_CONV_CHAT(c->cnv), info[i].sn, NULL); |
2086 | 3550 |
3551 return 1; | |
3552 } | |
3553 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
3554 static int gaim_conv_chat_leave(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3555 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3556 int count, i; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3557 aim_userinfo_t *info; |
5575 | 3558 GaimConnection *g = sess->aux_data; |
2086 | 3559 |
3560 struct chat_connection *c = NULL; | |
3561 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3562 va_start(ap, fr); |
2086 | 3563 count = va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3564 info = va_arg(ap, aim_userinfo_t *); |
2086 | 3565 va_end(ap); |
3566 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3567 c = find_oscar_chat_by_conn(g, fr->conn); |
2086 | 3568 if (!c) |
3569 return 1; | |
3570 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3571 for (i = 0; i < count; i++) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
3572 gaim_conv_chat_remove_user(GAIM_CONV_CHAT(c->cnv), info[i].sn, NULL); |
2086 | 3573 |
3574 return 1; | |
3575 } | |
3576 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
3577 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
|
3578 va_list ap; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3579 aim_userinfo_t *userinfo; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3580 struct aim_chat_roominfo *roominfo; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3581 char *roomname; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3582 int usercount; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3583 char *roomdesc; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3584 fu16_t unknown_c9, unknown_d2, unknown_d5, maxmsglen, maxvisiblemsglen; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3585 fu32_t creationtime; |
5575 | 3586 GaimConnection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3587 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
|
3588 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3589 va_start(ap, fr); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3590 roominfo = va_arg(ap, struct aim_chat_roominfo *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3591 roomname = va_arg(ap, char *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3592 usercount= va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3593 userinfo = va_arg(ap, aim_userinfo_t *); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3594 roomdesc = va_arg(ap, char *); |
4200 | 3595 unknown_c9 = (fu16_t)va_arg(ap, unsigned int); |
3596 creationtime = va_arg(ap, fu32_t); | |
3597 maxmsglen = (fu16_t)va_arg(ap, unsigned int); | |
3598 unknown_d2 = (fu16_t)va_arg(ap, unsigned int); | |
3599 unknown_d5 = (fu16_t)va_arg(ap, unsigned int); | |
3600 maxvisiblemsglen = (fu16_t)va_arg(ap, unsigned int); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3601 va_end(ap); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3602 |
8660 | 3603 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3604 "inside chat_info_update (maxmsglen = %hu, maxvislen = %hu)\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3605 maxmsglen, maxvisiblemsglen); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3606 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3607 ccon->maxlen = maxmsglen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3608 ccon->maxvis = maxvisiblemsglen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3609 |
2086 | 3610 return 1; |
3611 } | |
3612 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
3613 static int gaim_conv_chat_incoming_msg(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3614 GaimConnection *gc = sess->aux_data; |
8225 | 3615 struct chat_connection *ccon = find_oscar_chat_by_conn(gc, fr->conn); |
3616 gchar *utf8; | |
2086 | 3617 va_list ap; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3618 aim_userinfo_t *info; |
8225 | 3619 int len; |
2086 | 3620 char *msg; |
8219 | 3621 char *charset; |
2086 | 3622 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3623 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3624 info = va_arg(ap, aim_userinfo_t *); |
8219 | 3625 len = va_arg(ap, int); |
4194 | 3626 msg = va_arg(ap, char *); |
8219 | 3627 charset = va_arg(ap, char *); |
4194 | 3628 va_end(ap); |
2086 | 3629 |
8225 | 3630 utf8 = oscar_encoding_to_utf8(charset, msg, len); |
8667 | 3631 if (utf8 == NULL) |
3632 /* The conversion failed! */ | |
8668 | 3633 utf8 = g_strdup(_("[Unable to display a message from this user because it contained invalid characters.]")); |
8225 | 3634 serv_got_chat_in(gc, ccon->id, info->sn, 0, utf8, time((time_t)NULL)); |
3635 g_free(utf8); | |
2086 | 3636 |
3637 return 1; | |
3638 } | |
3639 | |
3694 | 3640 static int gaim_email_parseupdate(aim_session_t *sess, aim_frame_t *fr, ...) { |
3641 va_list ap; | |
5575 | 3642 GaimConnection *gc = sess->aux_data; |
3694 | 3643 struct aim_emailinfo *emailinfo; |
3725 | 3644 int havenewmail; |
7297 | 3645 char *alertitle, *alerturl; |
3694 | 3646 |
3647 va_start(ap, fr); | |
3648 emailinfo = va_arg(ap, struct aim_emailinfo *); | |
3725 | 3649 havenewmail = va_arg(ap, int); |
7301 | 3650 alertitle = va_arg(ap, char *); |
3651 alerturl = va_arg(ap, char *); | |
3694 | 3652 va_end(ap); |
3653 | |
5628 | 3654 if (emailinfo && gaim_account_get_check_mail(gc->account)) { |
5575 | 3655 gchar *to = g_strdup_printf("%s@%s", gaim_account_get_username(gaim_connection_get_account(gc)), emailinfo->domain); |
5542 | 3656 if (emailinfo->unread && havenewmail) |
3657 gaim_notify_emails(gc, emailinfo->nummsgs, FALSE, NULL, NULL, (const char **)&to, (const char **)&emailinfo->url, NULL, NULL); | |
5537 | 3658 g_free(to); |
3694 | 3659 } |
7297 | 3660 |
7301 | 3661 if (alertitle) |
8660 | 3662 gaim_debug_misc("oscar", "Got an alert '%s' %s\n", alertitle, alerturl ? alerturl : ""); |
3694 | 3663 |
3664 return 1; | |
3665 } | |
3666 | |
4804 | 3667 static int gaim_icon_error(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3668 GaimConnection *gc = sess->aux_data; |
7283 | 3669 OscarData *od = gc->proto_data; |
4804 | 3670 char *sn; |
3671 | |
3672 sn = od->requesticon->data; | |
8660 | 3673 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3674 "removing %s from hash table\n", sn); |
4804 | 3675 od->requesticon = g_slist_remove(od->requesticon, sn); |
3676 free(sn); | |
3677 | |
3678 if (od->icontimer) | |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
3679 gaim_timeout_remove(od->icontimer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
3680 od->icontimer = gaim_timeout_add(500, gaim_icon_timerfunc, gc); |
4804 | 3681 |
3682 return 1; | |
3683 } | |
3684 | |
3685 static int gaim_icon_parseicon(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 3686 GaimConnection *gc = sess->aux_data; |
7283 | 3687 OscarData *od = gc->proto_data; |
4804 | 3688 GSList *cur; |
3689 va_list ap; | |
3690 char *sn; | |
4853 | 3691 fu8_t *iconcsum, *icon; |
3692 fu16_t iconcsumlen, iconlen; | |
4804 | 3693 |
3694 va_start(ap, fr); | |
3695 sn = va_arg(ap, char *); | |
4853 | 3696 iconcsum = va_arg(ap, fu8_t *); |
3697 iconcsumlen = va_arg(ap, int); | |
4804 | 3698 icon = va_arg(ap, fu8_t *); |
3699 iconlen = va_arg(ap, int); | |
3700 va_end(ap); | |
3701 | |
4853 | 3702 if (iconlen > 0) { |
3703 char *b16; | |
6695 | 3704 GaimBuddy *b = gaim_find_buddy(gc->account, sn); |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
3705 gaim_buddy_icons_set_for_user(gaim_connection_get_account(gc), |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
3706 sn, icon, iconlen); |
7106
db6bd3e794d8
[gaim-migrate @ 7671]
Christian Hammond <chipx86@chipx86.com>
parents:
7098
diff
changeset
|
3707 b16 = gaim_base16_encode(iconcsum, iconcsumlen); |
5129 | 3708 if (b16) { |
7693 | 3709 gaim_blist_node_set_string((GaimBlistNode*)b, "icon_checksum", b16); |
5129 | 3710 gaim_blist_save(); |
7162 | 3711 g_free(b16); |
5129 | 3712 } |
4853 | 3713 } |
4804 | 3714 |
3715 cur = od->requesticon; | |
3716 while (cur) { | |
3717 char *cursn = cur->data; | |
3718 if (!aim_sncmp(cursn, sn)) { | |
3719 od->requesticon = g_slist_remove(od->requesticon, cursn); | |
3720 free(cursn); | |
3721 cur = od->requesticon; | |
3722 } else | |
3723 cur = cur->next; | |
3724 } | |
3725 | |
3726 if (od->icontimer) | |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
3727 gaim_timeout_remove(od->icontimer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
3728 od->icontimer = gaim_timeout_add(250, gaim_icon_timerfunc, gc); |
4804 | 3729 |
3730 return 1; | |
3731 } | |
3732 | |
3733 static gboolean gaim_icon_timerfunc(gpointer data) { | |
5575 | 3734 GaimConnection *gc = data; |
7283 | 3735 OscarData *od = gc->proto_data; |
7011 | 3736 aim_userinfo_t *userinfo; |
4804 | 3737 aim_conn_t *conn; |
3738 | |
3739 conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_ICON); | |
5892 | 3740 if (!conn) { |
3741 if (!od->iconconnecting) { | |
3742 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_ICON); | |
3743 od->iconconnecting = TRUE; | |
3744 } | |
4804 | 3745 return FALSE; |
3746 } | |
3747 | |
5842 | 3748 if (od->set_icon) { |
6039 | 3749 struct stat st; |
3750 const char *iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc)); | |
3751 if (iconfile == NULL) { | |
8363 | 3752 aim_ssi_delicon(od->sess); |
6039 | 3753 } else if (!stat(iconfile, &st)) { |
3754 char *buf = g_malloc(st.st_size); | |
3755 FILE *file = fopen(iconfile, "rb"); | |
3756 if (file) { | |
3757 fread(buf, 1, st.st_size, file); | |
3758 fclose(file); | |
8660 | 3759 gaim_debug_info("oscar", |
6039 | 3760 "Uploading icon to icon server\n"); |
6879 | 3761 aim_bart_upload(od->sess, buf, st.st_size); |
5842 | 3762 } else |
8660 | 3763 gaim_debug_error("oscar", |
6039 | 3764 "Can't open buddy icon file!\n"); |
3765 g_free(buf); | |
3766 } else { | |
8660 | 3767 gaim_debug_error("oscar", |
6039 | 3768 "Can't stat buddy icon file!\n"); |
5842 | 3769 } |
3770 od->set_icon = FALSE; | |
3771 } | |
3772 | |
3773 if (!od->requesticon) { | |
8660 | 3774 gaim_debug_misc("oscar", |
5842 | 3775 "no more icons to request\n"); |
3776 return FALSE; | |
3777 } | |
3778 | |
7045 | 3779 userinfo = aim_locate_finduserinfo(od->sess, (char *)od->requesticon->data); |
7011 | 3780 if ((userinfo != NULL) && (userinfo->iconcsumlen > 0)) { |
3781 aim_bart_request(od->sess, od->requesticon->data, userinfo->iconcsum, userinfo->iconcsumlen); | |
4804 | 3782 return FALSE; |
3783 } else { | |
3784 char *sn = od->requesticon->data; | |
3785 od->requesticon = g_slist_remove(od->requesticon, sn); | |
3786 free(sn); | |
3787 } | |
3788 | |
3789 return TRUE; | |
3790 } | |
3791 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3792 /* |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3793 * 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
|
3794 */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3795 static int gaim_parse_msgack(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3796 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3797 fu16_t type; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3798 char *sn; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3799 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3800 va_start(ap, fr); |
4199 | 3801 type = (fu16_t) va_arg(ap, unsigned int); |
2086 | 3802 sn = va_arg(ap, char *); |
3803 va_end(ap); | |
3804 | |
8660 | 3805 gaim_debug_info("oscar", "Sent message to %s.\n", sn); |
2086 | 3806 |
3807 return 1; | |
3808 } | |
3809 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3810 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
|
3811 static const char *codes[5] = { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3812 "invalid", |
4194 | 3813 "change", |
3814 "warning", | |
3815 "limit", | |
3816 "limit cleared", | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3817 }; |
2086 | 3818 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3819 fu16_t code, rateclass; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3820 fu32_t windowsize, clear, alert, limit, disconnect, currentavg, maxavg; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3821 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3822 va_start(ap, fr); |
4200 | 3823 code = (fu16_t)va_arg(ap, unsigned int); |
3824 rateclass= (fu16_t)va_arg(ap, unsigned int); | |
3825 windowsize = va_arg(ap, fu32_t); | |
3826 clear = va_arg(ap, fu32_t); | |
3827 alert = va_arg(ap, fu32_t); | |
3828 limit = va_arg(ap, fu32_t); | |
3829 disconnect = va_arg(ap, fu32_t); | |
3830 currentavg = va_arg(ap, fu32_t); | |
3831 maxavg = va_arg(ap, fu32_t); | |
2086 | 3832 va_end(ap); |
3833 | |
8660 | 3834 gaim_debug_misc("oscar", |
5556 | 3835 "rate %s (param ID 0x%04hx): curavg = %u, maxavg = %u, alert at %u, " |
3836 "clear warning at %u, limit at %u, disconnect at %u (window size = %u)\n", | |
2086 | 3837 (code < 5) ? codes[code] : codes[0], |
3838 rateclass, | |
3839 currentavg, maxavg, | |
3840 alert, clear, | |
3841 limit, disconnect, | |
3842 windowsize); | |
3843 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3844 /* XXX fix these values */ |
2086 | 3845 if (code == AIM_RATE_CODE_CHANGE) { |
3846 if (currentavg >= clear) | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3847 aim_conn_setlatency(fr->conn, 0); |
2086 | 3848 } else if (code == AIM_RATE_CODE_WARNING) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3849 aim_conn_setlatency(fr->conn, windowsize/4); |
2909
48ec70928d7f
[gaim-migrate @ 2922]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2906
diff
changeset
|
3850 } else if (code == AIM_RATE_CODE_LIMIT) { |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3851 gaim_notify_error(sess->aux_data, NULL, _("Rate limiting error."), |
6040 | 3852 _("The last action you attempted could not be " |
3853 "performed because you are over the rate limit. " | |
3854 "Please wait 10 seconds and try again.")); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3855 aim_conn_setlatency(fr->conn, windowsize/2); |
2086 | 3856 } else if (code == AIM_RATE_CODE_CLEARLIMIT) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3857 aim_conn_setlatency(fr->conn, 0); |
2086 | 3858 } |
3859 | |
3860 return 1; | |
3861 } | |
3862 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3863 static int gaim_parse_evilnotify(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3864 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3865 fu16_t newevil; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3866 aim_userinfo_t *userinfo; |
5575 | 3867 GaimConnection *gc = sess->aux_data; |
2086 | 3868 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3869 va_start(ap, fr); |
4199 | 3870 newevil = (fu16_t) va_arg(ap, unsigned int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3871 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 3872 va_end(ap); |
3873 | |
7111 | 3874 serv_got_eviled(gc, (userinfo && userinfo->sn) ? userinfo->sn : NULL, (newevil/10.0) + 0.5); |
2086 | 3875 |
3876 return 1; | |
3877 } | |
3878 | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3879 static int gaim_selfinfo(aim_session_t *sess, aim_frame_t *fr, ...) { |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3880 va_list ap; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3881 aim_userinfo_t *info; |
5575 | 3882 GaimConnection *gc = sess->aux_data; |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3883 |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3884 va_start(ap, fr); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3885 info = va_arg(ap, aim_userinfo_t *); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3886 va_end(ap); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3887 |
5628 | 3888 gc->evil = (info->warnlevel/10.0) + 0.5; |
4841 | 3889 |
7872 | 3890 if (info->present & AIM_USERINFO_PRESENT_ONLINESINCE) |
4841 | 3891 gc->login_time_official = info->onlinesince; |
7872 | 3892 else if (info->present & AIM_USERINFO_PRESENT_SESSIONLEN) |
3893 gc->login_time_official = time(NULL) - info->sessionlen; | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3894 |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3895 return 1; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3896 } |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3897 |
4649 | 3898 static int gaim_connerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3899 GaimConnection *gc = sess->aux_data; |
7283 | 3900 OscarData *od = gc->proto_data; |
4649 | 3901 va_list ap; |
3902 fu16_t code; | |
3903 char *msg; | |
3904 | |
3905 va_start(ap, fr); | |
3906 code = (fu16_t)va_arg(ap, int); | |
3907 msg = va_arg(ap, char *); | |
3908 va_end(ap); | |
3909 | |
8660 | 3910 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3911 "Disconnected. Code is 0x%04x and msg is %s\n", code, msg); |
4649 | 3912 if ((fr) && (fr->conn) && (fr->conn->type == AIM_CONN_TYPE_BOS)) { |
4651 | 3913 if (code == 0x0001) { |
6113 | 3914 gc->wants_to_die = TRUE; |
5579 | 3915 gaim_connection_error(gc, _("You have been disconnected because you have signed on with this screen name at another location.")); |
4651 | 3916 } else { |
5579 | 3917 gaim_connection_error(gc, _("You have been signed off for an unknown reason.")); |
4651 | 3918 } |
4666 | 3919 od->killme = TRUE; |
4649 | 3920 } |
3921 | |
3922 return 1; | |
3923 } | |
3924 | |
2675 | 3925 static int conninitdone_bos(aim_session_t *sess, aim_frame_t *fr, ...) { |
7283 | 3926 GaimConnection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3927 |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3928 aim_reqpersonalinfo(sess, fr->conn); |
4230 | 3929 |
3930 #ifndef NOSSI | |
8660 | 3931 gaim_debug_info("oscar", "ssi: requesting rights and list\n"); |
4889 | 3932 aim_ssi_reqrights(sess); |
6350 | 3933 aim_ssi_reqdata(sess); |
4230 | 3934 #endif |
3935 | |
7011 | 3936 aim_locate_reqrights(sess); |
7285 | 3937 aim_buddylist_reqrights(sess, fr->conn); |
4617 | 3938 aim_im_reqparams(sess); |
7334 | 3939 aim_bos_reqrights(sess, fr->conn); /* XXX - Don't call this with ssi */ |
4230 | 3940 |
3941 #ifdef NOSSI | |
8660 | 3942 gaim_debug_info("oscar", "bos: requesting rights\n"); |
7334 | 3943 aim_bos_reqrights(sess, fr->conn); |
4230 | 3944 aim_bos_setgroupperm(sess, fr->conn, AIM_FLAG_ALLUSERS); |
3945 aim_bos_setprivacyflags(sess, fr->conn, AIM_PRIVFLAGS_ALLOWIDLE | AIM_PRIVFLAGS_ALLOWMEMBERSINCE); | |
3946 #endif | |
2086 | 3947 |
7283 | 3948 gaim_connection_update_progress(gc, _("Finalizing connection"), 5, OSCAR_CONNECT_STEPS); |
3949 | |
2086 | 3950 return 1; |
3951 } | |
3952 | |
2675 | 3953 static int conninitdone_admin(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3954 GaimConnection *gc = sess->aux_data; |
7283 | 3955 OscarData *od = gc->proto_data; |
2647 | 3956 |
6905 | 3957 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ADM, 0x0003, gaim_info_change, 0); |
3958 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ADM, 0x0005, gaim_info_change, 0); | |
3959 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ADM, 0x0007, gaim_account_confirm, 0); | |
3960 | |
2672 | 3961 aim_clientready(sess, fr->conn); |
8660 | 3962 gaim_debug_info("oscar", "connected to admin\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3963 |
2647 | 3964 if (od->chpass) { |
8660 | 3965 gaim_debug_info("oscar", "changing password\n"); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3966 aim_admin_changepasswd(sess, fr->conn, od->newp, od->oldp); |
2647 | 3967 g_free(od->oldp); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3968 od->oldp = NULL; |
2647 | 3969 g_free(od->newp); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3970 od->newp = NULL; |
2647 | 3971 od->chpass = FALSE; |
3972 } | |
2979 | 3973 if (od->setnick) { |
8660 | 3974 gaim_debug_info("oscar", "formatting screen name\n"); |
2979 | 3975 aim_admin_setnick(sess, fr->conn, od->newsn); |
3976 g_free(od->newsn); | |
3977 od->newsn = NULL; | |
3978 od->setnick = FALSE; | |
3979 } | |
2647 | 3980 if (od->conf) { |
8660 | 3981 gaim_debug_info("oscar", "confirming account\n"); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3982 aim_admin_reqconfirm(sess, fr->conn); |
2647 | 3983 od->conf = FALSE; |
3984 } | |
3985 if (od->reqemail) { | |
8660 | 3986 gaim_debug_info("oscar", "requesting email\n"); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3987 aim_admin_getinfo(sess, fr->conn, 0x0011); |
2647 | 3988 od->reqemail = FALSE; |
3989 } | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3990 if (od->setemail) { |
8660 | 3991 gaim_debug_info("oscar", "setting email\n"); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3992 aim_admin_setemail(sess, fr->conn, od->email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3993 g_free(od->email); |
5497 | 3994 od->email = NULL; |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3995 od->setemail = FALSE; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3996 } |
2647 | 3997 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3998 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3999 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4000 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4001 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
|
4002 struct aim_icbmparameters *params; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4003 va_list ap; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4004 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4005 va_start(ap, fr); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4006 params = va_arg(ap, struct aim_icbmparameters *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4007 va_end(ap); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4008 |
4194 | 4009 /* XXX - evidently this crashes on solaris. i have no clue why |
8660 | 4010 gaim_debug_misc("oscar", "ICBM Parameters: maxchannel = %hu, default flags = 0x%08lx, max msg len = %hu, " |
5556 | 4011 "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
|
4012 params->maxchan, params->flags, params->maxmsglen, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4013 ((float)params->maxsenderwarn)/10.0, ((float)params->maxrecverwarn)/10.0, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4014 params->minmsginterval); |
2427
5bc3b39fc0a5
[gaim-migrate @ 2440]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2421
diff
changeset
|
4015 */ |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4016 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4017 /* Maybe senderwarn and recverwarn should be user preferences... */ |
3595 | 4018 params->flags = 0x0000000b; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4019 params->maxmsglen = 8000; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4020 params->minmsginterval = 0; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4021 |
4617 | 4022 aim_im_setparams(sess, params); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4023 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4024 return 1; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4025 } |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4026 |
2993 | 4027 static int gaim_parse_locaterights(aim_session_t *sess, aim_frame_t *fr, ...) |
4028 { | |
5575 | 4029 GaimConnection *gc = sess->aux_data; |
7283 | 4030 OscarData *od = (OscarData *)gc->proto_data; |
5306 | 4031 va_list ap; |
4032 fu16_t maxsiglen; | |
2993 | 4033 |
4034 va_start(ap, fr); | |
4199 | 4035 maxsiglen = (fu16_t) va_arg(ap, int); |
2993 | 4036 va_end(ap); |
4037 | |
8660 | 4038 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4039 "locate rights: max sig len = %d\n", maxsiglen); |
2993 | 4040 |
4617 | 4041 od->rights.maxsiglen = od->rights.maxawaymsglen = (guint)maxsiglen; |
4042 | |
4043 if (od->icq) | |
7334 | 4044 aim_locate_setcaps(od->sess, caps_icq); |
5301 | 4045 else |
7334 | 4046 aim_locate_setcaps(od->sess, caps_aim); |
4047 oscar_set_info(gc, gc->account->user_info); | |
2993 | 4048 |
4049 return 1; | |
4050 } | |
4051 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4052 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
|
4053 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4054 fu16_t maxbuddies, maxwatchers; |
5575 | 4055 GaimConnection *gc = sess->aux_data; |
7283 | 4056 OscarData *od = (OscarData *)gc->proto_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4057 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4058 va_start(ap, fr); |
4199 | 4059 maxbuddies = (fu16_t) va_arg(ap, unsigned int); |
4060 maxwatchers = (fu16_t) va_arg(ap, unsigned int); | |
2086 | 4061 va_end(ap); |
4062 | |
8660 | 4063 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4064 "buddy list rights: Max buddies = %hu / Max watchers = %hu\n", maxbuddies, maxwatchers); |
2086 | 4065 |
4617 | 4066 od->rights.maxbuddies = (guint)maxbuddies; |
4067 od->rights.maxwatchers = (guint)maxwatchers; | |
2993 | 4068 |
2086 | 4069 return 1; |
4070 } | |
4071 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4072 static int gaim_bosrights(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4073 GaimConnection *gc = sess->aux_data; |
7283 | 4074 OscarData *od = (OscarData *)gc->proto_data; |
7334 | 4075 va_list ap; |
4076 fu16_t maxpermits, maxdenies; | |
2086 | 4077 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4078 va_start(ap, fr); |
4199 | 4079 maxpermits = (fu16_t) va_arg(ap, unsigned int); |
4080 maxdenies = (fu16_t) va_arg(ap, unsigned int); | |
2086 | 4081 va_end(ap); |
4082 | |
8660 | 4083 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4084 "BOS rights: Max permit = %hu / Max deny = %hu\n", maxpermits, maxdenies); |
2086 | 4085 |
4617 | 4086 od->rights.maxpermits = (guint)maxpermits; |
4087 od->rights.maxdenies = (guint)maxdenies; | |
2993 | 4088 |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
4089 gaim_connection_set_state(gc, GAIM_CONNECTED); |
2993 | 4090 serv_finish_login(gc); |
4091 | |
8660 | 4092 gaim_debug_info("oscar", "buddy list loaded\n"); |
2993 | 4093 |
2672 | 4094 aim_clientready(sess, fr->conn); |
5948 | 4095 aim_srv_setavailmsg(sess, NULL); |
7474 | 4096 aim_srv_setidle(sess, 0); |
4617 | 4097 |
4664 | 4098 if (od->icq) { |
4099 aim_icq_reqofflinemsgs(sess); | |
4100 aim_icq_hideip(sess); | |
4101 } | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4102 |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4103 aim_reqservice(sess, fr->conn, AIM_CONN_TYPE_CHATNAV); |
4102 | 4104 if (sess->authinfo->email) |
4105 aim_reqservice(sess, fr->conn, AIM_CONN_TYPE_EMAIL); | |
2086 | 4106 |
4107 return 1; | |
4108 } | |
4109 | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4110 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
|
4111 va_list ap; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4112 struct aim_icq_offlinemsg *msg; |
4075 | 4113 struct aim_incomingim_ch4_args args; |
4114 time_t t; | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4115 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4116 va_start(ap, fr); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4117 msg = va_arg(ap, struct aim_icq_offlinemsg *); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4118 va_end(ap); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4119 |
8660 | 4120 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4121 "Received offline message. Converting to channel 4 ICBM...\n"); |
4075 | 4122 args.uin = msg->sender; |
4123 args.type = msg->type; | |
4173 | 4124 args.flags = msg->flags; |
4076 | 4125 args.msglen = msg->msglen; |
4075 | 4126 args.msg = msg->msg; |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4127 t = gaim_time_build(msg->year, msg->month, msg->day, msg->hour, msg->minute, 0); |
4075 | 4128 incomingim_chan4(sess, fr->conn, NULL, &args, t); |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4129 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4130 return 1; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4131 } |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4132 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4133 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
|
4134 { |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4135 aim_icq_ackofflinemsgs(sess); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4136 return 1; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4137 } |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4138 |
7388 | 4139 #if 0 |
4140 /* | |
7465 | 4141 * Update, 2003-11-09: |
4142 * Joseph S. Myers, a gcc dude, fixed this for gcc 3.4! Rock on! | |
4143 * | |
7388 | 4144 * It may not be my place to do this, but... |
4145 * I feel pretty strongly that the "last 2 digits" warning is ridiculously | |
4146 * stupid, and should not exist for % switches (%x in our case) that request | |
4147 * a year in the preferred representation for the current locale. For that | |
4148 * reason I've chosen to not use this workaround (n., see kluge). | |
4149 * | |
4150 * I have a date. I want to show it to the user in the "preferred" way. | |
4151 * Whether that displays a 2 digit year is perfectly fine--after all, it's | |
4152 * what the locale wanted. | |
4153 * | |
4154 * If I have a necessity for a full representation of the year in the current | |
4155 * locale, then I'll use a switch that returns a full representation of the | |
4156 * year. | |
4157 * | |
4158 * If you think the preferred locale should show 4 digits instead of 2 digits | |
4159 * (because you're anal, or whatever), then change the f***ing locale. | |
4160 * | |
4161 * I guess the bottom line is--I'm trying to show a date to the user how they | |
4162 * prefer to see it, why the hell does gcc want me to change that? | |
7389 | 4163 * |
4164 * See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=3190 | |
4165 * See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=8714 | |
7388 | 4166 */ |
4167 | |
4168 /* | |
4169 * This function was recommended by the STRFTIME(3) man page to remove the | |
7386 | 4170 * "last 2 digits" warning. |
4171 */ | |
4172 static size_t my_strftime(char *s, size_t max, const char *fmt, | |
4173 const struct tm *tm) | |
4174 { | |
4175 return strftime(s, max, fmt, tm); | |
4176 } | |
7388 | 4177 #endif |
7386 | 4178 |
4624 | 4179 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
|
4180 { |
5575 | 4181 GaimConnection *gc = sess->aux_data; |
8670 | 4182 OscarData *od = (OscarData *)gc->proto_data; |
4183 GaimBuddy *buddy; | |
4184 struct buddyinfo *bi; | |
4624 | 4185 gchar who[16]; |
8670 | 4186 GString *str; |
4187 gchar *primary, *utf8; | |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4188 va_list ap; |
4151 | 4189 struct aim_icq_info *info; |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4190 |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4191 va_start(ap, fr); |
4151 | 4192 info = va_arg(ap, struct aim_icq_info *); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4193 va_end(ap); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4194 |
4664 | 4195 if (!info->uin) |
4196 return 0; | |
4197 | |
8670 | 4198 str = g_string_sized_new(100); |
5556 | 4199 g_snprintf(who, sizeof(who), "%u", info->uin); |
8670 | 4200 buddy = gaim_find_buddy(gaim_connection_get_account(gc), who); |
4201 if (buddy != NULL) | |
4202 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(buddy->account, buddy->name)); | |
4203 | |
4204 g_string_append_printf(str, "<b>%s:</b> %s", _("UIN"), who); | |
8701 | 4205 oscar_string_append(str, "\n<br>", _("Nick"), info->nick); |
8670 | 4206 if ((bi != NULL) && (bi->ipaddr != 0)) { |
4207 char *tstr = g_strdup_printf("%hhu.%hhu.%hhu.%hhu", | |
4208 (bi->ipaddr & 0xff000000) >> 24, | |
4209 (bi->ipaddr & 0x00ff0000) >> 16, | |
4210 (bi->ipaddr & 0x0000ff00) >> 8, | |
4211 (bi->ipaddr & 0x000000ff)); | |
8701 | 4212 oscar_string_append(str, "\n<br>", _("IP Address"), tstr); |
8670 | 4213 g_free(tstr); |
4214 } | |
8701 | 4215 oscar_string_append(str, "\n<br>", _("First Name"), info->first); |
4216 oscar_string_append(str, "\n<br>", _("Last Name"), info->last); | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4217 if (info->email && info->email[0] && (utf8 = gaim_utf8_try_convert(info->email))) { |
8670 | 4218 g_string_append_printf(str, "\n<br><b>%s:</b> <a href=\"mailto:%s\">%s</a>", _("Email Address"), utf8, utf8); |
4219 g_free(utf8); | |
4625 | 4220 } |
4221 if (info->numaddresses && info->email2) { | |
4222 int i; | |
4223 for (i = 0; i < info->numaddresses; i++) { | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4224 if (info->email2[i] && info->email2[i][0] && (utf8 = gaim_utf8_try_convert(info->email2[i]))) { |
8670 | 4225 g_string_append_printf(str, "\n<br><b>%s:</b> <a href=\"mailto%s\">%s</a>", _("Email Address"), utf8, utf8); |
4226 g_free(utf8); | |
4643 | 4227 } |
4625 | 4228 } |
4624 | 4229 } |
8701 | 4230 oscar_string_append(str, "\n<br>", _("Mobile Phone"), info->mobile); |
4231 oscar_string_append(str, "\n<br>", _("Gender"), info->gender==1 ? _("Female") : _("Male")); | |
4624 | 4232 if (info->birthyear || info->birthmonth || info->birthday) { |
4627 | 4233 char date[30]; |
4234 struct tm tm; | |
4235 tm.tm_mday = (int)info->birthday; | |
4236 tm.tm_mon = (int)info->birthmonth-1; | |
4237 tm.tm_year = (int)info->birthyear-1900; | |
7388 | 4238 strftime(date, sizeof(date), "%x", &tm); |
8701 | 4239 oscar_string_append(str, "\n<br>", _("Birthday"), date); |
4151 | 4240 } |
4624 | 4241 if (info->age) { |
4242 char age[5]; | |
4243 snprintf(age, sizeof(age), "%hhd", info->age); | |
8701 | 4244 oscar_string_append(str, "\n<br>", _("Age"), age); |
4819 | 4245 } |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4246 if (info->personalwebpage && info->personalwebpage[0] && (utf8 = gaim_utf8_try_convert(info->personalwebpage))) { |
8670 | 4247 g_string_append_printf(str, "\n<br><b>%s:</b> <a href=\"%s\">%s</a>", _("Personal Web Page"), utf8, utf8); |
4248 g_free(utf8); | |
4819 | 4249 } |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4250 if (info->info && info->info[0] && (utf8 = gaim_utf8_try_convert(info->info))) { |
8670 | 4251 g_string_append_printf(str, "<hr><b>%s:</b><br>%s", _("Additional Information"), utf8); |
4252 g_free(utf8); | |
4253 } | |
4254 g_string_append_printf(str, "<hr>\n"); | |
4641 | 4255 if ((info->homeaddr && (info->homeaddr[0])) || (info->homecity && info->homecity[0]) || (info->homestate && info->homestate[0]) || (info->homezip && info->homezip[0])) { |
8670 | 4256 g_string_append_printf(str, "<b>%s:</b>", _("Home Address")); |
8701 | 4257 oscar_string_append(str, "\n<br>", _("Address"), info->homeaddr); |
4258 oscar_string_append(str, "\n<br>", _("City"), info->homecity); | |
4259 oscar_string_append(str, "\n<br>", _("State"), info->homestate); | |
4260 oscar_string_append(str, "\n<br>", _("Zip Code"), info->homezip); | |
8670 | 4261 g_string_append_printf(str, "\n<hr>\n"); |
4151 | 4262 } |
4641 | 4263 if ((info->workaddr && info->workaddr[0]) || (info->workcity && info->workcity[0]) || (info->workstate && info->workstate[0]) || (info->workzip && info->workzip[0])) { |
8670 | 4264 g_string_append_printf(str, "<b>%s:</b>", _("Work Address")); |
8701 | 4265 oscar_string_append(str, "\n<br>", _("Address"), info->workaddr); |
4266 oscar_string_append(str, "\n<br>", _("City"), info->workcity); | |
4267 oscar_string_append(str, "\n<br>", _("State"), info->workstate); | |
4268 oscar_string_append(str, "\n<br>", _("Zip Code"), info->workzip); | |
8670 | 4269 g_string_append_printf(str, "\n<hr>\n"); |
4624 | 4270 } |
4641 | 4271 if ((info->workcompany && info->workcompany[0]) || (info->workdivision && info->workdivision[0]) || (info->workposition && info->workposition[0]) || (info->workwebpage && info->workwebpage[0])) { |
8670 | 4272 g_string_append_printf(str, "<b>%s:</b>", _("Work Information")); |
8701 | 4273 oscar_string_append(str, "\n<br>", _("Company"), info->workcompany); |
4274 oscar_string_append(str, "\n<br>", _("Division"), info->workdivision); | |
4275 oscar_string_append(str, "\n<br>", _("Position"), info->workposition); | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4276 if (info->workwebpage && info->workwebpage[0] && (utf8 = gaim_utf8_try_convert(info->workwebpage))) { |
8670 | 4277 g_string_append_printf(str, "\n<br><b>%s:</b> <a href=\"%s\">%s</a>", _("Web Page"), utf8, utf8); |
4278 g_free(utf8); | |
4624 | 4279 } |
8670 | 4280 g_string_append_printf(str, "\n<hr>\n"); |
4281 } | |
4282 | |
6873 | 4283 primary = g_strdup_printf(_("ICQ Info for %s"), gaim_get_buddy_alias(buddy)); |
8670 | 4284 gaim_notify_formatted(gc, NULL, primary, NULL, str->str, NULL, NULL); |
6873 | 4285 g_free(primary); |
8670 | 4286 g_string_free(str, TRUE); |
4151 | 4287 |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4288 return 1; |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4289 } |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4290 |
4759 | 4291 static int gaim_icqalias(aim_session_t *sess, aim_frame_t *fr, ...) |
4292 { | |
5575 | 4293 GaimConnection *gc = sess->aux_data; |
4820 | 4294 gchar who[16], *utf8; |
6695 | 4295 GaimBuddy *b; |
4759 | 4296 va_list ap; |
4297 struct aim_icq_info *info; | |
4298 | |
4299 va_start(ap, fr); | |
4300 info = va_arg(ap, struct aim_icq_info *); | |
4301 va_end(ap); | |
4302 | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4303 if (info->uin && info->nick && info->nick[0] && (utf8 = gaim_utf8_try_convert(info->nick))) { |
5556 | 4304 g_snprintf(who, sizeof(who), "%u", info->uin); |
4820 | 4305 serv_got_alias(gc, who, utf8); |
4759 | 4306 if ((b = gaim_find_buddy(gc->account, who))) { |
7693 | 4307 gaim_blist_node_set_string((GaimBlistNode*)b, "servernick", utf8); |
4759 | 4308 gaim_blist_save(); |
4309 } | |
4820 | 4310 g_free(utf8); |
4759 | 4311 } |
4312 | |
4313 return 1; | |
4314 } | |
4315 | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4316 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
|
4317 { |
7032 | 4318 GaimConnection *gc = sess->aux_data; |
4319 gchar *text; | |
4320 va_list ap; | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4321 char *msg, *url; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4322 fu16_t wid, hei, delay; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4323 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4324 va_start(ap, fr); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4325 msg = va_arg(ap, char *); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4326 url = va_arg(ap, char *); |
4199 | 4327 wid = (fu16_t) va_arg(ap, int); |
4328 hei = (fu16_t) va_arg(ap, int); | |
4329 delay = (fu16_t) va_arg(ap, int); | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4330 va_end(ap); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4331 |
7032 | 4332 text = g_strdup_printf("%s<br><a href=\"%s\">%s</a>", msg, url, url); |
4333 gaim_notify_formatted(gc, NULL, _("Pop-Up Message"), NULL, text, NULL, NULL); | |
4334 g_free(text); | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4335 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4336 return 1; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4337 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4338 |
7032 | 4339 static int gaim_parse_searchreply(aim_session_t *sess, aim_frame_t *fr, ...) |
4340 { | |
6873 | 4341 GaimConnection *gc = sess->aux_data; |
4342 gchar *secondary; | |
4343 GString *text; | |
4344 int i, num; | |
2086 | 4345 va_list ap; |
6873 | 4346 char *email, *SNs; |
2086 | 4347 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4348 va_start(ap, fr); |
6873 | 4349 email = va_arg(ap, char *); |
2086 | 4350 num = va_arg(ap, int); |
4351 SNs = va_arg(ap, char *); | |
4352 va_end(ap); | |
4353 | |
8152 | 4354 secondary = g_strdup_printf(_("The following screen names are associated with %s"), email); |
6873 | 4355 text = g_string_new(""); |
2086 | 4356 for (i = 0; i < num; i++) |
6873 | 4357 g_string_append_printf(text, "%s<br>", &SNs[i * (MAXSNLEN + 1)]); |
4358 gaim_notify_formatted(gc, NULL, _("Search Results"), secondary, text->str, NULL, NULL); | |
4359 | |
4360 g_free(secondary); | |
4361 g_string_free(text, TRUE); | |
2086 | 4362 |
4363 return 1; | |
4364 } | |
4365 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4366 static int gaim_parse_searcherror(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 4367 va_list ap; |
6873 | 4368 char *email; |
5420 | 4369 char *buf; |
2086 | 4370 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4371 va_start(ap, fr); |
6873 | 4372 email = va_arg(ap, char *); |
2086 | 4373 va_end(ap); |
4374 | |
6873 | 4375 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
|
4376 gaim_notify_error(sess->aux_data, NULL, buf, NULL); |
5420 | 4377 g_free(buf); |
2086 | 4378 |
4379 return 1; | |
4380 } | |
4381 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4382 static int gaim_account_confirm(aim_session_t *sess, aim_frame_t *fr, ...) { |
6873 | 4383 GaimConnection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4384 fu16_t status; |
2086 | 4385 va_list ap; |
4386 char msg[256]; | |
4387 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4388 va_start(ap, fr); |
4199 | 4389 status = (fu16_t) va_arg(ap, unsigned int); /* status code of confirmation request */ |
2086 | 4390 va_end(ap); |
4391 | |
8660 | 4392 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4393 "account confirmation returned status 0x%04x (%s)\n", status, |
3912 | 4394 status ? "unknown" : "email sent"); |
4395 if (!status) { | |
5302 | 4396 g_snprintf(msg, sizeof(msg), _("You should receive an email asking to confirm %s."), |
5575 | 4397 gaim_account_get_username(gaim_connection_get_account(gc))); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4398 gaim_notify_info(gc, NULL, _("Account Confirmation Requested"), msg); |
2086 | 4399 } |
4400 | |
4401 return 1; | |
4402 } | |
4403 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4404 static int gaim_info_change(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4405 GaimConnection *gc = sess->aux_data; |
2086 | 4406 va_list ap; |
3912 | 4407 fu16_t perms, err; |
4408 char *url, *sn, *email; | |
4409 int change; | |
2086 | 4410 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4411 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4412 change = va_arg(ap, int); |
4199 | 4413 perms = (fu16_t) va_arg(ap, unsigned int); |
4414 err = (fu16_t) va_arg(ap, unsigned int); | |
3912 | 4415 url = va_arg(ap, char *); |
4416 sn = va_arg(ap, char *); | |
4417 email = va_arg(ap, char *); | |
2086 | 4418 va_end(ap); |
4419 | |
8660 | 4420 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4421 "account info: because of %s, perms=0x%04x, err=0x%04x, url=%s, sn=%s, email=%s\n", |
3912 | 4422 change ? "change" : "request", perms, err, url, sn, email); |
4423 | |
4424 if (err && url) { | |
4425 char *dialog_msg; | |
4426 char *dialog_top = g_strdup_printf(_("Error Changing Account Info")); | |
4427 switch (err) { | |
4428 case 0x0001: { | |
4429 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name differs from the original."), err); | |
4430 } break; | |
4431 case 0x0006: { | |
4432 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name ends in a space."), err); | |
4433 } break; | |
4434 case 0x000b: { | |
4435 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name is too long."), err); | |
4436 } break; | |
4437 case 0x001d: { | |
4438 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); | |
4439 } break; | |
4440 case 0x0021: { | |
4441 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); | |
4442 } break; | |
4443 case 0x0023: { | |
4444 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to change email address because the given address is invalid."), err); | |
4445 } break; | |
4446 default: { | |
4447 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unknown error."), err); | |
4448 } break; | |
4449 } | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4450 gaim_notify_error(gc, NULL, dialog_top, dialog_msg); |
3912 | 4451 g_free(dialog_top); |
4452 g_free(dialog_msg); | |
4453 return 1; | |
4454 } | |
4455 | |
4456 if (sn) { | |
4585 | 4457 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
|
4458 gaim_notify_info(gc, NULL, _("Account Info"), dialog_msg); |
3912 | 4459 g_free(dialog_msg); |
4460 } | |
4461 | |
4462 if (email) { | |
5575 | 4463 char *dialog_msg = g_strdup_printf(_("The email address for %s is %s"), |
4464 gaim_account_get_username(gaim_connection_get_account(gc)), email); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4465 gaim_notify_info(gc, NULL, _("Account Info"), dialog_msg); |
3912 | 4466 g_free(dialog_msg); |
2086 | 4467 } |
4468 | |
4469 return 1; | |
4470 } | |
4471 | |
5575 | 4472 static void oscar_keepalive(GaimConnection *gc) { |
7283 | 4473 OscarData *od = (OscarData *)gc->proto_data; |
4617 | 4474 aim_flap_nop(od->sess, od->conn); |
2086 | 4475 } |
4476 | |
6059 | 4477 static int oscar_send_typing(GaimConnection *gc, const char *name, int typing) { |
7283 | 4478 OscarData *od = (OscarData *)gc->proto_data; |
4617 | 4479 struct direct_im *dim = find_direct_im(od, name); |
3595 | 4480 if (dim) |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
4481 if (typing == GAIM_TYPING) |
4870 | 4482 aim_odc_send_typing(od->sess, dim->conn, 0x0002); |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
4483 else if (typing == GAIM_TYPED) |
4870 | 4484 aim_odc_send_typing(od->sess, dim->conn, 0x0001); |
4485 else | |
4486 aim_odc_send_typing(od->sess, dim->conn, 0x0000); | |
3595 | 4487 else { |
5300 | 4488 /* Don't send if this turkey is in our deny list */ |
4489 GSList *list; | |
4490 for (list=gc->account->deny; (list && aim_sncmp(name, list->data)); list=list->next); | |
4491 if (!list) { | |
7261 | 4492 struct buddyinfo *bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(gc->account, name)); |
5300 | 4493 if (bi && bi->typingnot) { |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
4494 if (typing == GAIM_TYPING) |
5300 | 4495 aim_im_sendmtn(od->sess, 0x0001, name, 0x0002); |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
4496 else if (typing == GAIM_TYPED) |
5300 | 4497 aim_im_sendmtn(od->sess, 0x0001, name, 0x0001); |
4498 else | |
4499 aim_im_sendmtn(od->sess, 0x0001, name, 0x0000); | |
4500 } | |
3595 | 4501 } |
4502 } | |
2993 | 4503 return 0; |
4504 } | |
5575 | 4505 static void oscar_ask_direct_im(GaimConnection *gc, const char *name); |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
4506 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
|
4507 |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
4508 static int oscar_send_im(GaimConnection *gc, const char *name, const char *message, GaimConvImFlags imflags) { |
7283 | 4509 OscarData *od = (OscarData *)gc->proto_data; |
4617 | 4510 struct direct_im *dim = find_direct_im(od, name); |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
4511 int ret = 0; |
3659 | 4512 GError *err = NULL; |
5575 | 4513 const char *iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc)); |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6350
diff
changeset
|
4514 char *tmpmsg = NULL; |
3458 | 4515 |
4838 | 4516 if (dim && dim->connected) { |
4517 /* If we're directly connected, send a direct IM */ | |
6982 | 4518 ret = gaim_odc_send_im(od->sess, dim->conn, message, imflags); |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
4519 } else if (imflags & GAIM_CONV_IM_IMAGES) { |
3044 | 4520 /* Trying to send an IM image outside of a direct connection. */ |
4521 oscar_ask_direct_im(gc, name); | |
4838 | 4522 ret = -ENOTCONN; |
2086 | 4523 } else { |
4738 | 4524 struct buddyinfo *bi; |
3008 | 4525 struct aim_sendimext_args args; |
4526 struct stat st; | |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
4527 gsize len; |
4269 | 4528 |
7261 | 4529 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(gc->account, name)); |
4738 | 4530 if (!bi) { |
4531 bi = g_new0(struct buddyinfo, 1); | |
7261 | 4532 g_hash_table_insert(od->buddyinfo, g_strdup(gaim_normalize(gc->account, name)), bi); |
4738 | 4533 } |
4534 | |
3008 | 4535 args.flags = AIM_IMFLAGS_ACK | AIM_IMFLAGS_CUSTOMFEATURES; |
4665 | 4536 if (od->icq) { |
4537 args.features = features_icq; | |
4538 args.featureslen = sizeof(features_icq); | |
3008 | 4539 args.flags |= AIM_IMFLAGS_OFFLINE; |
4665 | 4540 } else { |
4541 args.features = features_aim; | |
4542 args.featureslen = sizeof(features_aim); | |
4972 | 4543 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
4544 if (imflags & GAIM_CONV_IM_AUTO_RESP) |
4972 | 4545 args.flags |= AIM_IMFLAGS_AWAY; |
4665 | 4546 } |
4269 | 4547 |
4738 | 4548 if (bi->ico_need) { |
8660 | 4549 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4550 "Sending buddy icon request with message\n"); |
3008 | 4551 args.flags |= AIM_IMFLAGS_BUDDYREQ; |
4738 | 4552 bi->ico_need = FALSE; |
3008 | 4553 } |
4269 | 4554 |
5575 | 4555 if (iconfile && !stat(iconfile, &st)) { |
8361 | 4556 FILE *file = fopen(iconfile, "rb"); |
3008 | 4557 if (file) { |
4558 char *buf = g_malloc(st.st_size); | |
4559 fread(buf, 1, st.st_size, file); | |
6039 | 4560 fclose(file); |
4269 | 4561 |
3008 | 4562 args.iconlen = st.st_size; |
4617 | 4563 args.iconsum = aimutil_iconsum(buf, st.st_size); |
3008 | 4564 args.iconstamp = st.st_mtime; |
4565 | |
7406 | 4566 if ((args.iconlen != bi->ico_me_len) || (args.iconsum != bi->ico_me_csum) || (args.iconstamp != bi->ico_me_time)) { |
4738 | 4567 bi->ico_informed = FALSE; |
7406 | 4568 bi->ico_sent = FALSE; |
4569 } | |
4738 | 4570 |
4571 if (!bi->ico_informed) { | |
8660 | 4572 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4573 "Claiming to have a buddy icon\n"); |
4738 | 4574 args.flags |= AIM_IMFLAGS_HASICON; |
4575 bi->ico_me_len = args.iconlen; | |
4576 bi->ico_me_csum = args.iconsum; | |
4577 bi->ico_me_time = args.iconstamp; | |
4578 bi->ico_informed = TRUE; | |
4579 } | |
4580 | |
3008 | 4581 g_free(buf); |
2086 | 4582 } |
4583 } | |
4269 | 4584 |
3008 | 4585 args.destsn = name; |
4269 | 4586 |
6310 | 4587 /* For ICQ send newlines as CR/LF, for AIM send newlines as <BR> */ |
4588 if (isdigit(name[0])) | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4589 tmpmsg = gaim_str_add_cr(message); |
6310 | 4590 else |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4591 tmpmsg = gaim_strdup_withhtml(message); |
6310 | 4592 len = strlen(tmpmsg); |
4593 | |
4594 args.flags |= oscar_encoding_check(tmpmsg); | |
3642 | 4595 if (args.flags & AIM_IMFLAGS_UNICODE) { |
8660 | 4596 gaim_debug_info("oscar", "Sending Unicode IM\n"); |
4662 | 4597 args.charset = 0x0002; |
4665 | 4598 args.charsubset = 0x0000; |
6310 | 4599 args.msg = g_convert(tmpmsg, len, "UCS-2BE", "UTF-8", NULL, &len, &err); |
3659 | 4600 if (err) { |
8660 | 4601 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4602 "Error converting a unicode message: %s\n", err->message); |
8660 | 4603 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4604 "This really shouldn't happen!\n"); |
3659 | 4605 /* We really shouldn't try to send the |
4606 * IM now, but I'm not sure what to do */ | |
4800 | 4607 g_error_free(err); |
3659 | 4608 } |
3850 | 4609 } else if (args.flags & AIM_IMFLAGS_ISO_8859_1) { |
8660 | 4610 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4611 "Sending ISO-8859-1 IM\n"); |
4662 | 4612 args.charset = 0x0003; |
4665 | 4613 args.charsubset = 0x0000; |
6310 | 4614 args.msg = g_convert(tmpmsg, len, "ISO-8859-1", "UTF-8", NULL, &len, &err); |
3659 | 4615 if (err) { |
8660 | 4616 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4617 "conversion error: %s\n", err->message); |
8660 | 4618 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4619 "Someone tell Ethan his 8859-1 detection is wrong\n"); |
3642 | 4620 args.flags ^= AIM_IMFLAGS_ISO_8859_1 | AIM_IMFLAGS_UNICODE; |
6310 | 4621 len = strlen(tmpmsg); |
4800 | 4622 g_error_free(err); |
6310 | 4623 args.msg = g_convert(tmpmsg, len, "UCS-2BE", "UTF8", NULL, &len, &err); |
3659 | 4624 if (err) { |
8660 | 4625 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4626 "Error in unicode fallback: %s\n", err->message); |
4800 | 4627 g_error_free(err); |
3659 | 4628 } |
3642 | 4629 } |
4630 } else { | |
4662 | 4631 args.charset = 0x0000; |
4632 args.charsubset = 0x0000; | |
6310 | 4633 args.msg = tmpmsg; |
3642 | 4634 } |
4635 args.msglen = len; | |
4269 | 4636 |
4617 | 4637 ret = aim_im_sendch1_ext(od->sess, &args); |
2086 | 4638 } |
4838 | 4639 |
6310 | 4640 g_free(tmpmsg); |
4641 | |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
4642 if (ret >= 0) |
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
4643 return 1; |
6310 | 4644 |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
4645 return ret; |
2086 | 4646 } |
4647 | |
7011 | 4648 static void oscar_get_info(GaimConnection *gc, const char *name) { |
7283 | 4649 OscarData *od = (OscarData *)gc->proto_data; |
7011 | 4650 |
7173 | 4651 if (od->icq && isdigit(name[0])) |
4624 | 4652 aim_icq_getallinfo(od->sess, name); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4653 else |
7235 | 4654 aim_locate_getinfoshort(od->sess, name, 0x00000003); |
7011 | 4655 } |
4656 | |
4657 static void oscar_set_dir(GaimConnection *gc, const char *first, const char *middle, const char *last, | |
3466 | 4658 const char *maiden, const char *city, const char *state, const char *country, int web) { |
4617 | 4659 /* XXX - some of these things are wrong, but i'm lazy */ |
7283 | 4660 OscarData *od = (OscarData *)gc->proto_data; |
7011 | 4661 aim_locate_setdirinfo(od->sess, first, middle, last, |
2086 | 4662 maiden, NULL, NULL, city, state, NULL, 0, web); |
4663 } | |
4664 | |
5575 | 4665 static void oscar_set_idle(GaimConnection *gc, int time) { |
7283 | 4666 OscarData *od = (OscarData *)gc->proto_data; |
7474 | 4667 aim_srv_setidle(od->sess, time); |
2086 | 4668 } |
4669 | |
5954 | 4670 static void oscar_set_info(GaimConnection *gc, const char *text) { |
7283 | 4671 OscarData *od = (OscarData *)gc->proto_data; |
5129 | 4672 fu32_t flags = 0; |
6019 | 4673 char *text_html = NULL; |
5129 | 4674 char *msg = NULL; |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
4675 gsize msglen = 0; |
2993 | 4676 |
4617 | 4677 if (od->rights.maxsiglen == 0) |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4678 gaim_notify_warning(gc, NULL, _("Unable to set AIM profile."), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4679 _("You have probably requested to set your " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4680 "profile before the login procedure completed. " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4681 "Your profile remains unset; try setting it " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4682 "again when you are fully connected.")); |
4617 | 4683 |
7334 | 4684 if (!text) { |
4685 aim_locate_setprofile(od->sess, NULL, "", 0, NULL, NULL, 0); | |
4686 return; | |
4687 } | |
6019 | 4688 |
7334 | 4689 text_html = gaim_strdup_withhtml(text); |
4690 flags = oscar_encoding_check(text_html); | |
4691 if (flags & AIM_IMFLAGS_UNICODE) { | |
4692 msg = g_convert(text_html, strlen(text_html), "UCS-2BE", "UTF-8", NULL, &msglen, NULL); | |
4693 aim_locate_setprofile(od->sess, "unicode-2-0", msg, (msglen > od->rights.maxsiglen ? od->rights.maxsiglen : msglen), NULL, NULL, 0); | |
4694 g_free(msg); | |
4695 } else if (flags & AIM_IMFLAGS_ISO_8859_1) { | |
4696 msg = g_convert(text_html, strlen(text_html), "ISO-8859-1", "UTF-8", NULL, &msglen, NULL); | |
4697 aim_locate_setprofile(od->sess, "iso-8859-1", msg, (msglen > od->rights.maxsiglen ? od->rights.maxsiglen : msglen), NULL, NULL, 0); | |
4698 g_free(msg); | |
4699 } else { | |
4700 msglen = strlen(text_html); | |
4701 aim_locate_setprofile(od->sess, "us-ascii", text_html, (msglen > od->rights.maxsiglen ? od->rights.maxsiglen : msglen), NULL, NULL, 0); | |
4702 } | |
4703 | |
4704 if (msglen > od->rights.maxsiglen) { | |
4705 gchar *errstr; | |
4706 errstr = g_strdup_printf(ngettext("The maximum profile length of %d byte " | |
4707 "has been exceeded. Gaim has truncated it for you.", | |
4708 "The maximum profile length of %d bytes " | |
4709 "has been exceeded. Gaim has truncated it for you.", | |
4710 od->rights.maxsiglen), od->rights.maxsiglen); | |
4711 gaim_notify_warning(gc, NULL, _("Profile too long."), errstr); | |
4712 g_free(errstr); | |
4713 } | |
4714 | |
4715 g_free(text_html); | |
2993 | 4716 |
4717 return; | |
2086 | 4718 } |
4719 | |
8257 | 4720 static void oscar_set_away_aim(GaimConnection *gc, OscarData *od, const char *state, const char *text) |
2993 | 4721 { |
5129 | 4722 fu32_t flags = 0; |
6019 | 4723 gchar *text_html = NULL; |
5129 | 4724 char *msg = NULL; |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
4725 gsize msglen = 0; |
2993 | 4726 |
8257 | 4727 if (!strcmp(state, _("Visible"))) { |
4728 aim_setextstatus(od->sess, AIM_ICQ_STATE_NORMAL); | |
4729 return; | |
4730 } else if (!strcmp(state, _("Invisible"))) { | |
4731 aim_setextstatus(od->sess, AIM_ICQ_STATE_INVISIBLE); | |
4732 return; | |
4733 } /* else... */ | |
4734 | |
8476 | 4735 if (!strcmp(state, _("Back"))) { |
4736 /* If this is our only online account then globally set Gaim not-away */ | |
4737 GList *gcs = gaim_connections_get_all(); | |
4738 if (gcs->next == NULL) | |
4739 do_im_back(NULL, NULL); | |
4740 } | |
4741 | |
8257 | 4742 aim_setextstatus(od->sess, AIM_ICQ_STATE_NORMAL); |
4743 | |
2993 | 4744 if (od->rights.maxawaymsglen == 0) |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4745 gaim_notify_warning(gc, NULL, _("Unable to set AIM away message."), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4746 _("You have probably requested to set your " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4747 "away message before the login procedure " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4748 "completed. You remain in a \"present\" " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4749 "state; try setting it again when you are " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4750 "fully connected.")); |
5129 | 4751 |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4752 if (gc->away) { |
2993 | 4753 g_free(gc->away); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4754 gc->away = NULL; |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4755 } |
2993 | 4756 |
5129 | 4757 if (!text) { |
7334 | 4758 aim_locate_setprofile(od->sess, NULL, NULL, 0, NULL, "", 0); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4759 return; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4760 } |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4761 |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4762 text_html = gaim_strdup_withhtml(text); |
6019 | 4763 flags = oscar_encoding_check(text_html); |
5129 | 4764 if (flags & AIM_IMFLAGS_UNICODE) { |
6019 | 4765 msg = g_convert(text_html, strlen(text_html), "UCS-2BE", "UTF-8", NULL, &msglen, NULL); |
7011 | 4766 aim_locate_setprofile(od->sess, NULL, NULL, 0, "unicode-2-0", msg, |
7334 | 4767 (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen)); |
5129 | 4768 g_free(msg); |
4769 gc->away = g_strndup(text, od->rights.maxawaymsglen/2); | |
4770 } else if (flags & AIM_IMFLAGS_ISO_8859_1) { | |
6019 | 4771 msg = g_convert(text_html, strlen(text_html), "ISO-8859-1", "UTF-8", NULL, &msglen, NULL); |
7011 | 4772 aim_locate_setprofile(od->sess, NULL, NULL, 0, "iso-8859-1", msg, |
7334 | 4773 (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen)); |
5129 | 4774 g_free(msg); |
6019 | 4775 gc->away = g_strndup(text_html, od->rights.maxawaymsglen); |
5129 | 4776 } else { |
6019 | 4777 msglen = strlen(text_html); |
7011 | 4778 aim_locate_setprofile(od->sess, NULL, NULL, 0, "us-ascii", text_html, |
7334 | 4779 (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen)); |
6019 | 4780 gc->away = g_strndup(text_html, od->rights.maxawaymsglen); |
5129 | 4781 } |
4782 | |
4783 if (msglen > od->rights.maxawaymsglen) { | |
2993 | 4784 gchar *errstr; |
4785 | |
6308 | 4786 errstr = g_strdup_printf(ngettext("The maximum away message length of %d byte " |
4787 "has been exceeded. Gaim has truncated it for you.", | |
4788 "The maximum away message length of %d bytes " | |
4789 "has been exceeded. Gaim has truncated it for you.", | |
4790 od->rights.maxawaymsglen), od->rights.maxawaymsglen); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4791 gaim_notify_warning(gc, NULL, _("Away message too long."), errstr); |
2993 | 4792 g_free(errstr); |
4793 } | |
6019 | 4794 |
4795 g_free(text_html); | |
8257 | 4796 |
2993 | 4797 return; |
4798 } | |
4799 | |
7283 | 4800 static void oscar_set_away_icq(GaimConnection *gc, OscarData *od, const char *state, const char *message) |
2993 | 4801 { |
5575 | 4802 GaimAccount *account = gaim_connection_get_account(gc); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4803 if (gc->away) { |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4804 g_free(gc->away); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4805 gc->away = NULL; |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4806 } |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4807 |
8265 | 4808 if (strcmp(state, _("Invisible"))) |
5575 | 4809 account->perm_deny = 4; |
8265 | 4810 else |
5575 | 4811 account->perm_deny = 3; |
8265 | 4812 if ((od->sess->ssi.received_data) && (aim_ssi_getpermdeny(od->sess->ssi.local) != account->perm_deny)) |
4813 aim_ssi_setpermdeny(od->sess, account->perm_deny, 0xffffffff); | |
4342 | 4814 |
4815 if (!strcmp(state, _("Online"))) | |
4901 | 4816 aim_setextstatus(od->sess, AIM_ICQ_STATE_NORMAL); |
4342 | 4817 else if (!strcmp(state, _("Away"))) { |
4901 | 4818 aim_setextstatus(od->sess, AIM_ICQ_STATE_AWAY); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4819 gc->away = g_strdup(""); |
4342 | 4820 } else if (!strcmp(state, _("Do Not Disturb"))) { |
4901 | 4821 aim_setextstatus(od->sess, AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_DND | AIM_ICQ_STATE_BUSY); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4822 gc->away = g_strdup(""); |
4342 | 4823 } else if (!strcmp(state, _("Not Available"))) { |
4901 | 4824 aim_setextstatus(od->sess, AIM_ICQ_STATE_OUT | AIM_ICQ_STATE_AWAY); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4825 gc->away = g_strdup(""); |
4342 | 4826 } else if (!strcmp(state, _("Occupied"))) { |
4901 | 4827 aim_setextstatus(od->sess, AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_BUSY); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4828 gc->away = g_strdup(""); |
4342 | 4829 } else if (!strcmp(state, _("Free For Chat"))) { |
4901 | 4830 aim_setextstatus(od->sess, AIM_ICQ_STATE_CHAT); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4831 gc->away = g_strdup(""); |
4342 | 4832 } else if (!strcmp(state, _("Invisible"))) { |
4901 | 4833 aim_setextstatus(od->sess, AIM_ICQ_STATE_INVISIBLE); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4834 gc->away = g_strdup(""); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4835 } else if (!strcmp(state, GAIM_AWAY_CUSTOM)) { |
2998 | 4836 if (message) { |
4901 | 4837 aim_setextstatus(od->sess, AIM_ICQ_STATE_OUT | AIM_ICQ_STATE_AWAY); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4838 gc->away = g_strdup(""); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4839 } else { |
4901 | 4840 aim_setextstatus(od->sess, AIM_ICQ_STATE_NORMAL); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4841 } |
2086 | 4842 } |
2993 | 4843 |
4844 return; | |
4845 } | |
4846 | |
6059 | 4847 static void oscar_set_away(GaimConnection *gc, const char *state, const char *message) |
2993 | 4848 { |
7283 | 4849 OscarData *od = (OscarData *)gc->proto_data; |
2993 | 4850 |
4851 if (od->icq) | |
4852 oscar_set_away_icq(gc, od, state, message); | |
4853 else | |
8257 | 4854 oscar_set_away_aim(gc, od, state, message); |
2993 | 4855 |
4856 return; | |
2086 | 4857 } |
4858 | |
6059 | 4859 static void oscar_warn(GaimConnection *gc, const char *name, int anon) { |
7283 | 4860 OscarData *od = (OscarData *)gc->proto_data; |
4617 | 4861 aim_im_warn(od->sess, od->conn, name, anon ? AIM_WARN_ANON : 0); |
2086 | 4862 } |
4863 | |
5575 | 4864 static void oscar_dir_search(GaimConnection *gc, const char *first, const char *middle, const char *last, |
3466 | 4865 const char *maiden, const char *city, const char *state, const char *country, const char *email) { |
7283 | 4866 OscarData *od = (OscarData *)gc->proto_data; |
2086 | 4867 if (strlen(email)) |
6879 | 4868 aim_search_address(od->sess, od->conn, email); |
2086 | 4869 } |
4870 | |
6787
faa491042c66
[gaim-migrate @ 7326]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
4871 static void oscar_add_buddy(GaimConnection *gc, const char *name, GaimGroup *g) { |
7283 | 4872 OscarData *od = (OscarData *)gc->proto_data; |
8150 | 4873 GaimBuddy *b; |
4874 | |
4875 if (g == NULL) { | |
4876 /* If we were called from oscar_add_buddies... */ | |
4877 b = gaim_find_buddy(gaim_connection_get_account(gc), name); | |
4878 g = gaim_find_buddys_group(b); | |
4879 } else | |
4880 b = gaim_find_buddy_in_group(gaim_connection_get_account(gc), name, g); | |
8092 | 4881 |
4882 if (!aim_snvalid(name)) { | |
4883 gchar *buf; | |
8150 | 4884 buf = g_strdup_printf(_("Could not add the buddy %s because the screen name is invalid. Screen names must either start with a letter and contain only letters, numbers and spaces, or contain only numbers."), name); |
8092 | 4885 gaim_notify_error(gc, NULL, _("Unable To Add"), buf); |
4886 g_free(buf); | |
8150 | 4887 |
4888 /* Remove from local list */ | |
4889 gaim_blist_remove_buddy(b); | |
4890 | |
8092 | 4891 return; |
4892 } | |
4893 | |
4230 | 4894 #ifdef NOSSI |
8143 | 4895 aim_buddylist_addbuddy(od->sess, od->conn, name); |
4230 | 4896 #else |
4897 if ((od->sess->ssi.received_data) && !(aim_ssi_itemlist_exists(od->sess->ssi.local, name))) { | |
8150 | 4898 if (b && g) { |
8660 | 4899 gaim_debug_info("oscar", |
8150 | 4900 "ssi: adding buddy %s to group %s\n", name, g->name); |
4901 aim_ssi_addbuddy(od->sess, b->name, g->name, gaim_get_buddy_alias_only(b), NULL, NULL, 0); | |
4230 | 4902 } |
4903 } | |
4904 #endif | |
8150 | 4905 |
4759 | 4906 if (od->icq) |
4907 aim_icq_getalias(od->sess, name); | |
4230 | 4908 } |
4909 | |
5575 | 4910 static void oscar_add_buddies(GaimConnection *gc, GList *buddies) { |
7283 | 4911 OscarData *od = (OscarData *)gc->proto_data; |
4230 | 4912 #ifdef NOSSI |
4913 char buf[MSG_LEN]; | |
4914 int n=0; | |
4915 while (buddies) { | |
4916 if (n > MSG_LEN - 18) { | |
7285 | 4917 aim_buddylist_set(od->sess, od->conn, buf); |
4230 | 4918 n = 0; |
3092 | 4919 } |
8150 | 4920 n += g_snprintf(buf + n, sizeof(buf) - n, "%s&", (const char *)buddies->data); |
4230 | 4921 buddies = buddies->next; |
4922 } | |
7285 | 4923 aim_buddylist_set(od->sess, od->conn, buf); |
4230 | 4924 #else |
4925 if (od->sess->ssi.received_data) { | |
4926 while (buddies) { | |
8092 | 4927 oscar_add_buddy(gc, buddies->data, NULL); |
4230 | 4928 buddies = buddies->next; |
4929 } | |
4930 } | |
4931 #endif | |
4932 } | |
4933 | |
6059 | 4934 static void oscar_remove_buddy(GaimConnection *gc, const char *name, const char *group) { |
7283 | 4935 OscarData *od = (OscarData *)gc->proto_data; |
4230 | 4936 #ifdef NOSSI |
8143 | 4937 aim_buddylist_removebuddy(od->sess, od->conn, name); |
4230 | 4938 #else |
4939 if (od->sess->ssi.received_data) { | |
8660 | 4940 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4941 "ssi: deleting buddy %s from group %s\n", name, group); |
4889 | 4942 aim_ssi_delbuddy(od->sess, name, group); |
4230 | 4943 } |
4944 #endif | |
4945 } | |
4946 | |
5575 | 4947 static void oscar_remove_buddies(GaimConnection *gc, GList *buddies, const char *group) { |
7283 | 4948 OscarData *od = (OscarData *)gc->proto_data; |
4230 | 4949 #ifdef NOSSI |
4950 GList *cur; | |
4951 for (cur=buddies; cur; cur=cur->next) | |
8143 | 4952 aim_buddylist_removebuddy(od->sess, od->conn, cur->data); |
4230 | 4953 #else |
4954 if (od->sess->ssi.received_data) { | |
3092 | 4955 while (buddies) { |
8150 | 4956 oscar_remove_buddy(gc, buddies->data, group); |
3092 | 4957 buddies = buddies->next; |
4958 } | |
4230 | 4959 } |
4960 #endif | |
4961 } | |
4962 | |
4963 #ifndef NOSSI | |
5575 | 4964 static void oscar_move_buddy(GaimConnection *gc, const char *name, const char *old_group, const char *new_group) { |
7283 | 4965 OscarData *od = (OscarData *)gc->proto_data; |
4303 | 4966 if (od->sess->ssi.received_data && strcmp(old_group, new_group)) { |
8660 | 4967 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4968 "ssi: moving buddy %s from group %s to group %s\n", name, old_group, new_group); |
4889 | 4969 aim_ssi_movebuddy(od->sess, old_group, new_group, name); |
4269 | 4970 } |
4971 } | |
4972 | |
5575 | 4973 static void oscar_alias_buddy(GaimConnection *gc, const char *name, const char *alias) { |
7283 | 4974 OscarData *od = (OscarData *)gc->proto_data; |
4269 | 4975 if (od->sess->ssi.received_data) { |
4976 char *gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, name); | |
4977 if (gname) { | |
8660 | 4978 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4979 "ssi: changing the alias for buddy %s to %s\n", name, alias); |
4889 | 4980 aim_ssi_aliasbuddy(od->sess, gname, name, alias); |
4269 | 4981 } |
4982 } | |
4983 } | |
4984 | |
8341 | 4985 static void oscar_rename_group(GaimConnection *gc, const char *old_group, const char *new_group, GList *members) { |
4986 OscarData *od = (OscarData *)gc->proto_data; | |
4230 | 4987 |
4988 if (od->sess->ssi.received_data) { | |
4989 if (aim_ssi_itemlist_finditem(od->sess->ssi.local, new_group, NULL, AIM_SSI_TYPE_GROUP)) { | |
8341 | 4990 oscar_remove_buddies(gc, members, old_group); |
4991 oscar_add_buddies(gc, members); | |
8660 | 4992 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4993 "ssi: moved all buddies from group %s to %s\n", old_group, new_group); |
4230 | 4994 } else { |
4889 | 4995 aim_ssi_rename_group(od->sess, old_group, new_group); |
8660 | 4996 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4997 "ssi: renamed group %s to %s\n", old_group, new_group); |
2995 | 4998 } |
4999 } | |
5000 } | |
5001 | |
5968 | 5002 static gboolean gaim_ssi_rerequestdata(gpointer data) { |
5003 aim_session_t *sess = data; | |
6350 | 5004 aim_ssi_reqdata(sess); |
5968 | 5005 return FALSE; |
5006 } | |
5007 | |
4642 | 5008 static int gaim_ssi_parseerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 5009 GaimConnection *gc = sess->aux_data; |
7283 | 5010 OscarData *od = gc->proto_data; |
4642 | 5011 va_list ap; |
5012 fu16_t reason; | |
5013 | |
5014 va_start(ap, fr); | |
5015 reason = (fu16_t)va_arg(ap, unsigned int); | |
5016 va_end(ap); | |
5017 | |
8660 | 5018 gaim_debug_error("oscar", "ssi: SNAC error %hu\n", reason); |
4642 | 5019 |
5020 if (reason == 0x0005) { | |
5892 | 5021 gaim_notify_error(gc, NULL, _("Unable To Retrieve Buddy List"), |
5828 | 5022 _("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
|
5023 od->getblisttimer = gaim_timeout_add(300000, gaim_ssi_rerequestdata, od->sess); |
4642 | 5024 } |
5025 | |
5026 /* Activate SSI */ | |
5027 /* Sending the enable causes other people to be able to see you, and you to see them */ | |
5028 /* Make sure your privacy setting/invisibility is set how you want it before this! */ | |
8660 | 5029 gaim_debug_info("oscar", "ssi: activating server-stored buddy list\n"); |
4642 | 5030 aim_ssi_enable(od->sess); |
5031 | |
5032 return 1; | |
5033 } | |
5034 | |
2991 | 5035 static int gaim_ssi_parserights(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 5036 GaimConnection *gc = sess->aux_data; |
7283 | 5037 OscarData *od = (OscarData *)gc->proto_data; |
4230 | 5038 int numtypes, i; |
5039 fu16_t *maxitems; | |
2991 | 5040 va_list ap; |
5041 | |
5042 va_start(ap, fr); | |
4230 | 5043 numtypes = va_arg(ap, int); |
5044 maxitems = va_arg(ap, fu16_t *); | |
2991 | 5045 va_end(ap); |
5046 | |
8660 | 5047 gaim_debug_misc("oscar", "ssi rights:"); |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
5048 |
4230 | 5049 for (i=0; i<numtypes; i++) |
8660 | 5050 gaim_debug_misc(NULL, " max type 0x%04x=%hd,", |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
5051 i, maxitems[i]); |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
5052 |
8660 | 5053 gaim_debug_misc(NULL, "\n"); |
4230 | 5054 |
5055 if (numtypes >= 0) | |
5056 od->rights.maxbuddies = maxitems[0]; | |
5057 if (numtypes >= 1) | |
5058 od->rights.maxgroups = maxitems[1]; | |
5059 if (numtypes >= 2) | |
5060 od->rights.maxpermits = maxitems[2]; | |
5061 if (numtypes >= 3) | |
5062 od->rights.maxdenies = maxitems[3]; | |
2991 | 5063 |
5064 return 1; | |
5065 } | |
5066 | |
5067 static int gaim_ssi_parselist(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 5068 GaimConnection *gc = sess->aux_data; |
5069 GaimAccount *account = gaim_connection_get_account(gc); | |
7283 | 5070 OscarData *od = (OscarData *)gc->proto_data; |
8150 | 5071 GaimGroup *g; |
5072 GaimBuddy *b; | |
2995 | 5073 struct aim_ssi_item *curitem; |
2991 | 5074 int tmp; |
4230 | 5075 va_list ap; |
8219 | 5076 fu16_t fmtver, numitems; |
5077 struct aim_ssi_item *items; | |
5078 fu32_t timestamp; | |
4230 | 5079 |
5080 va_start(ap, fr); | |
5081 fmtver = (fu16_t)va_arg(ap, int); | |
5082 numitems = (fu16_t)va_arg(ap, int); | |
8219 | 5083 items = va_arg(ap, struct aim_ssi_item *); |
4230 | 5084 timestamp = va_arg(ap, fu32_t); |
8219 | 5085 va_end(ap); |
2991 | 5086 |
8660 | 5087 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5088 "ssi: syncing local list and server list\n"); |
2991 | 5089 |
8219 | 5090 if ((timestamp == 0) || (numitems == 0)) { |
8660 | 5091 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 | 5092 return 1; |
5093 } | |
5094 | |
2991 | 5095 /* Clean the buddy list */ |
4889 | 5096 aim_ssi_cleanlist(sess); |
2991 | 5097 |
8150 | 5098 { /* If not in server list then prune from local list */ |
5099 GaimBlistNode *gnode, *cnode, *bnode; | |
5100 GaimBuddyList *blist; | |
5101 GSList *cur; | |
5102 | |
5103 /* Buddies */ | |
5104 cur = NULL; | |
5105 if ((blist = gaim_get_blist()) != NULL) { | |
5106 for (gnode = blist->root; gnode; gnode = gnode->next) { | |
5107 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
5108 continue; | |
5109 g = (GaimGroup *)gnode; | |
5110 for (cnode = gnode->child; cnode; cnode = cnode->next) { | |
5111 if(!GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
5112 continue; | |
5113 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
5114 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
5115 continue; | |
5116 b = (GaimBuddy *)bnode; | |
5117 if (b->account == gc->account) { | |
5118 if (aim_ssi_itemlist_exists(sess->ssi.local, b->name)) { | |
5119 /* If the buddy is an ICQ user then load his nickname */ | |
5120 const char *servernick = gaim_blist_node_get_string((GaimBlistNode*)b, "servernick"); | |
8214 | 5121 char *alias; |
8150 | 5122 if (servernick) |
5123 serv_got_alias(gc, b->name, servernick); | |
5124 | |
5125 /* Store local alias on server */ | |
8214 | 5126 alias = aim_ssi_getalias(sess->ssi.local, g->name, b->name); |
8150 | 5127 if (!alias && b->alias && strlen(b->alias)) |
5128 aim_ssi_aliasbuddy(sess, g->name, b->name, b->alias); | |
5129 free(alias); | |
5130 } else { | |
8660 | 5131 gaim_debug_info("oscar", |
8150 | 5132 "ssi: removing buddy %s from local list\n", b->name); |
5133 /* We can't actually remove now because it will screw up our looping */ | |
5134 cur = g_slist_prepend(cur, b); | |
5135 } | |
5136 } | |
5137 } | |
5138 } | |
5139 } | |
5140 } | |
8175 | 5141 |
8150 | 5142 while (cur != NULL) { |
5143 b = cur->data; | |
5144 cur = g_slist_remove(cur, b); | |
5145 gaim_blist_remove_buddy(b); | |
5146 } | |
5147 | |
5148 /* Permit list */ | |
5149 if (gc->account->permit) { | |
5150 for (cur=gc->account->permit; cur; cur=cur->next) | |
5151 if (!aim_ssi_itemlist_finditem(sess->ssi.local, NULL, cur->data, AIM_SSI_TYPE_PERMIT)) { | |
8660 | 5152 gaim_debug_info("oscar", |
8150 | 5153 "ssi: removing permit %s from local list\n", (const char *)cur->data); |
5154 gaim_privacy_permit_remove(account, cur->data, TRUE); | |
5155 cur = gc->account->permit; | |
5156 } | |
5157 } | |
5158 | |
5159 /* Deny list */ | |
5160 if (gc->account->deny) { | |
5161 for (cur=gc->account->deny; cur; cur=cur->next) | |
5162 if (!aim_ssi_itemlist_finditem(sess->ssi.local, NULL, cur->data, AIM_SSI_TYPE_DENY)) { | |
8660 | 5163 gaim_debug_info("oscar", |
8150 | 5164 "ssi: removing deny %s from local list\n", (const char *)cur->data); |
5165 gaim_privacy_deny_remove(account, cur->data, TRUE); | |
5166 cur = gc->account->deny; | |
5167 } | |
5168 } | |
5169 /* Presence settings (idle time visibility) */ | |
5170 if ((tmp = aim_ssi_getpresence(sess->ssi.local)) != 0xFFFFFFFF) | |
5171 if (!(tmp & 0x400)) | |
5172 aim_ssi_setpresence(sess, tmp | 0x400); | |
5173 } /* end pruning buddies from local list */ | |
5174 | |
2991 | 5175 /* Add from server list to local list */ |
4230 | 5176 for (curitem=sess->ssi.local; curitem; curitem=curitem->next) { |
7328 | 5177 if ((curitem->name == NULL) || (g_utf8_validate(curitem->name, -1, NULL))) |
2991 | 5178 switch (curitem->type) { |
4230 | 5179 case 0x0000: { /* Buddy */ |
4251 | 5180 if (curitem->name) { |
4292 | 5181 char *gname = aim_ssi_itemlist_findparentname(sess->ssi.local, curitem->name); |
7166 | 5182 char *gname_utf8 = gname ? gaim_utf8_try_convert(gname) : NULL; |
4282 | 5183 char *alias = aim_ssi_getalias(sess->ssi.local, gname, curitem->name); |
7166 | 5184 char *alias_utf8 = alias ? gaim_utf8_try_convert(alias) : NULL; |
8150 | 5185 b = gaim_find_buddy(gc->account, curitem->name); |
4458 | 5186 /* Should gname be freed here? -- elb */ |
4754 | 5187 /* Not with the current code, but that might be cleaner -- med */ |
4458 | 5188 free(alias); |
8150 | 5189 if (b) { |
4292 | 5190 /* Get server stored alias */ |
4705 | 5191 if (alias_utf8) { |
8150 | 5192 g_free(b->alias); |
5193 b->alias = g_strdup(alias_utf8); | |
4705 | 5194 } |
4282 | 5195 } else { |
8150 | 5196 b = gaim_buddy_new(gc->account, curitem->name, alias_utf8); |
5146 | 5197 |
4754 | 5198 if (!(g = gaim_find_group(gname_utf8 ? gname_utf8 : _("Orphans")))) { |
4687 | 5199 g = gaim_group_new(gname_utf8 ? gname_utf8 : _("Orphans")); |
4754 | 5200 gaim_blist_add_group(g, NULL); |
5201 } | |
5146 | 5202 |
8660 | 5203 gaim_debug_info("oscar", |
8150 | 5204 "ssi: adding b %s to group %s to local list\n", curitem->name, gname_utf8 ? gname_utf8 : _("Orphans")); |
5205 gaim_blist_add_buddy(b, NULL, g, NULL); | |
4251 | 5206 } |
8341 | 5207 if (!aim_sncmp(curitem->name, account->username)) { |
5208 char *comment = aim_ssi_getcomment(sess->ssi.local, gname, curitem->name); | |
5209 gaim_check_comment(od, comment); | |
5210 free(comment); | |
5211 } | |
7162 | 5212 g_free(gname_utf8); |
5213 g_free(alias_utf8); | |
2991 | 5214 } |
4230 | 5215 } break; |
5216 | |
5217 case 0x0001: { /* Group */ | |
4282 | 5218 /* Shouldn't add empty groups */ |
4230 | 5219 } break; |
5220 | |
5221 case 0x0002: { /* Permit buddy */ | |
2991 | 5222 if (curitem->name) { |
4230 | 5223 /* if (!find_permdeny_by_name(gc->permit, curitem->name)) { AAA */ |
2991 | 5224 GSList *list; |
5575 | 5225 for (list=account->permit; (list && aim_sncmp(curitem->name, list->data)); list=list->next); |
2991 | 5226 if (!list) { |
8660 | 5227 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5228 "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
|
5229 gaim_privacy_permit_add(account, curitem->name, TRUE); |
2991 | 5230 } |
5231 } | |
4230 | 5232 } break; |
5233 | |
5234 case 0x0003: { /* Deny buddy */ | |
2991 | 5235 if (curitem->name) { |
5236 GSList *list; | |
5575 | 5237 for (list=account->deny; (list && aim_sncmp(curitem->name, list->data)); list=list->next); |
2991 | 5238 if (!list) { |
8660 | 5239 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5240 "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
|
5241 gaim_privacy_deny_add(account, curitem->name, TRUE); |
2991 | 5242 } |
5243 } | |
4230 | 5244 } break; |
5245 | |
5246 case 0x0004: { /* Permit/deny setting */ | |
2991 | 5247 if (curitem->data) { |
5248 fu8_t permdeny; | |
5575 | 5249 if ((permdeny = aim_ssi_getpermdeny(sess->ssi.local)) && (permdeny != account->perm_deny)) { |
8660 | 5250 gaim_debug_info("oscar", |
5575 | 5251 "ssi: changing permdeny from %d to %hhu\n", account->perm_deny, permdeny); |
5252 account->perm_deny = permdeny; | |
5253 if (od->icq && account->perm_deny == 0x03) { | |
4342 | 5254 serv_set_away(gc, "Invisible", ""); |
5255 } | |
2991 | 5256 } |
5257 } | |
4230 | 5258 } break; |
5259 | |
5260 case 0x0005: { /* Presence setting */ | |
3109 | 5261 /* We don't want to change Gaim's setting because it applies to all accounts */ |
4230 | 5262 } break; |
2991 | 5263 } /* End of switch on curitem->type */ |
5264 } /* End of for loop */ | |
4230 | 5265 |
4901 | 5266 /* Set our ICQ status */ |
8257 | 5267 if (!gc->away) { |
4901 | 5268 aim_setextstatus(sess, AIM_ICQ_STATE_NORMAL); |
5269 } | |
5270 | |
4342 | 5271 /* Activate SSI */ |
5272 /* Sending the enable causes other people to be able to see you, and you to see them */ | |
5273 /* Make sure your privacy setting/invisibility is set how you want it before this! */ | |
8660 | 5274 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5275 "ssi: activating server-stored buddy list\n"); |
4642 | 5276 aim_ssi_enable(sess); |
4342 | 5277 |
2991 | 5278 return 1; |
2086 | 5279 } |
4230 | 5280 |
5281 static int gaim_ssi_parseack(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 5282 GaimConnection *gc = sess->aux_data; |
4230 | 5283 va_list ap; |
5284 struct aim_ssi_tmp *retval; | |
5285 | |
5286 va_start(ap, fr); | |
5287 retval = va_arg(ap, struct aim_ssi_tmp *); | |
5288 va_end(ap); | |
5289 | |
5290 while (retval) { | |
8660 | 5291 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5292 "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 | 5293 |
5294 if (retval->ack != 0xffff) | |
5295 switch (retval->ack) { | |
5296 case 0x0000: { /* added successfully */ | |
5297 } break; | |
5298 | |
4829 | 5299 case 0x000c: { /* you are over the limit, the cheat is to the limit, come on fhqwhgads */ |
5300 gchar *buf; | |
5301 buf = g_strdup_printf(_("Could not add the buddy %s because you have too many buddies in your buddy list. Please remove one and try again."), (retval->name ? retval->name : _("(no name)"))); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5302 gaim_notify_error(gc, NULL, _("Unable To Add"), buf); |
4829 | 5303 g_free(buf); |
5304 } | |
5305 | |
7023 | 5306 case 0x000e: { /* buddy requires authorization */ |
4828 | 5307 if ((retval->action == AIM_CB_SSI_ADD) && (retval->name)) |
4269 | 5308 gaim_auth_sendrequest(gc, retval->name); |
4230 | 5309 } break; |
5310 | |
5311 default: { /* La la la */ | |
5197 | 5312 gchar *buf; |
8660 | 5313 gaim_debug_error("oscar", "ssi: Action 0x%04hx was unsuccessful with error 0x%04hx\n", retval->action, retval->ack); |
5402 | 5314 buf = g_strdup_printf(_("Could not add the buddy %s for an unknown reason. The most common reason for this is that you have the maximum number of allowed buddies in your buddy list."), (retval->name ? retval->name : _("(no name)"))); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5315 gaim_notify_error(gc, NULL, _("Unable To Add"), buf); |
5197 | 5316 g_free(buf); |
4230 | 5317 } break; |
5318 } | |
5319 | |
5320 retval = retval->next; | |
5321 } | |
5322 | |
5323 return 1; | |
5324 } | |
5325 | |
8227 | 5326 static int gaim_ssi_parseadd(aim_session_t *sess, aim_frame_t *fr, ...) { |
5327 GaimConnection *gc = sess->aux_data; | |
5328 char *gname, *gname_utf8, *alias, *alias_utf8; | |
5329 GaimBuddy *b; | |
5330 GaimGroup *g; | |
5331 va_list ap; | |
5332 fu16_t type; | |
5333 const char *name; | |
5334 | |
5335 va_start(ap, fr); | |
5336 type = (fu16_t)va_arg(ap, int); | |
5337 name = va_arg(ap, char *); | |
5338 va_end(ap); | |
5339 | |
5340 if ((type != 0x0000) || (name == NULL)) | |
5341 return 1; | |
5342 | |
5343 gname = aim_ssi_itemlist_findparentname(sess->ssi.local, name); | |
5344 gname_utf8 = gname ? gaim_utf8_try_convert(gname) : NULL; | |
5345 alias = aim_ssi_getalias(sess->ssi.local, gname, name); | |
5346 alias_utf8 = alias ? gaim_utf8_try_convert(alias) : NULL; | |
5347 b = gaim_find_buddy(gc->account, name); | |
5348 free(alias); | |
5349 | |
5350 if (b) { | |
5351 /* Get server stored alias */ | |
5352 if (alias_utf8) { | |
5353 g_free(b->alias); | |
5354 b->alias = g_strdup(alias_utf8); | |
5355 } | |
5356 } else { | |
5357 b = gaim_buddy_new(gc->account, name, alias_utf8); | |
5358 | |
5359 if (!(g = gaim_find_group(gname_utf8 ? gname_utf8 : _("Orphans")))) { | |
5360 g = gaim_group_new(gname_utf8 ? gname_utf8 : _("Orphans")); | |
5361 gaim_blist_add_group(g, NULL); | |
5362 } | |
5363 | |
8660 | 5364 gaim_debug_info("oscar", |
8227 | 5365 "ssi: adding b %s to group %s to local list\n", name, gname_utf8 ? gname_utf8 : _("Orphans")); |
5366 gaim_blist_add_buddy(b, NULL, g, NULL); | |
5367 } | |
5368 g_free(gname_utf8); | |
5369 g_free(alias_utf8); | |
5370 | |
5371 return 1; | |
5372 } | |
5373 | |
4230 | 5374 static int gaim_ssi_authgiven(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 5375 GaimConnection *gc = sess->aux_data; |
4230 | 5376 va_list ap; |
5377 char *sn, *msg; | |
4236 | 5378 gchar *dialog_msg, *nombre; |
4230 | 5379 struct name_data *data; |
6695 | 5380 GaimBuddy *buddy; |
4230 | 5381 |
5382 va_start(ap, fr); | |
5383 sn = va_arg(ap, char *); | |
5384 msg = va_arg(ap, char *); | |
5385 va_end(ap); | |
5386 | |
8660 | 5387 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5388 "ssi: %s has given you permission to add him to your buddy list\n", sn); |
4230 | 5389 |
4687 | 5390 buddy = gaim_find_buddy(gc->account, sn); |
5391 if (buddy && (gaim_get_buddy_alias_only(buddy))) | |
5392 nombre = g_strdup_printf("%s (%s)", sn, gaim_get_buddy_alias_only(buddy)); | |
4236 | 5393 else |
5394 nombre = g_strdup(sn); | |
5395 | |
5396 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 | 5397 data = g_new(struct name_data, 1); |
5398 data->gc = gc; | |
5399 data->name = g_strdup(sn); | |
5400 data->nick = NULL; | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5401 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5402 gaim_request_yes_no(gc, NULL, _("Authorization Given"), dialog_msg, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5403 0, data, |
7023 | 5404 G_CALLBACK(gaim_icq_buddyadd), |
5836 | 5405 G_CALLBACK(oscar_free_name_data)); |
4236 | 5406 |
4230 | 5407 g_free(dialog_msg); |
4236 | 5408 g_free(nombre); |
4230 | 5409 |
5410 return 1; | |
5411 } | |
5412 | |
5413 static int gaim_ssi_authrequest(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 5414 GaimConnection *gc = sess->aux_data; |
4230 | 5415 va_list ap; |
5416 char *sn, *msg; | |
4236 | 5417 gchar *dialog_msg, *nombre; |
4230 | 5418 struct name_data *data; |
6695 | 5419 GaimBuddy *buddy; |
4230 | 5420 |
5421 va_start(ap, fr); | |
5422 sn = va_arg(ap, char *); | |
5423 msg = va_arg(ap, char *); | |
5424 va_end(ap); | |
5425 | |
8660 | 5426 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5427 "ssi: received authorization request from %s\n", sn); |
4230 | 5428 |
4687 | 5429 buddy = gaim_find_buddy(gc->account, sn); |
5430 if (buddy && (gaim_get_buddy_alias_only(buddy))) | |
5431 nombre = g_strdup_printf("%s (%s)", sn, gaim_get_buddy_alias_only(buddy)); | |
4236 | 5432 else |
5433 nombre = g_strdup(sn); | |
5434 | |
4337 | 5435 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 | 5436 data = g_new(struct name_data, 1); |
5437 data->gc = gc; | |
5438 data->name = g_strdup(sn); | |
5439 data->nick = NULL; | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5440 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5441 gaim_request_action(gc, NULL, _("Authorization Request"), dialog_msg, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5442 0, data, 2, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5443 _("Authorize"), G_CALLBACK(gaim_auth_grant), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5444 _("Deny"), G_CALLBACK(gaim_auth_dontgrant_msgprompt)); |
4236 | 5445 |
4230 | 5446 g_free(dialog_msg); |
4236 | 5447 g_free(nombre); |
4230 | 5448 |
5449 return 1; | |
5450 } | |
5451 | |
5452 static int gaim_ssi_authreply(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 5453 GaimConnection *gc = sess->aux_data; |
4230 | 5454 va_list ap; |
5455 char *sn, *msg; | |
4236 | 5456 gchar *dialog_msg, *nombre; |
4230 | 5457 fu8_t reply; |
6695 | 5458 GaimBuddy *buddy; |
4230 | 5459 |
5460 va_start(ap, fr); | |
5461 sn = va_arg(ap, char *); | |
5462 reply = (fu8_t)va_arg(ap, int); | |
5463 msg = va_arg(ap, char *); | |
5464 va_end(ap); | |
5465 | |
8660 | 5466 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5467 "ssi: received authorization reply from %s. Reply is 0x%04hhx\n", sn, reply); |
4236 | 5468 |
4687 | 5469 buddy = gaim_find_buddy(gc->account, sn); |
5470 if (buddy && (gaim_get_buddy_alias_only(buddy))) | |
5471 nombre = g_strdup_printf("%s (%s)", sn, gaim_get_buddy_alias_only(buddy)); | |
4236 | 5472 else |
5473 nombre = g_strdup(sn); | |
5474 | |
4230 | 5475 if (reply) { |
5476 /* Granted */ | |
7023 | 5477 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
|
5478 gaim_notify_info(gc, NULL, _("Authorization Granted"), dialog_msg); |
4230 | 5479 } else { |
5480 /* Denied */ | |
7023 | 5481 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
|
5482 gaim_notify_info(gc, NULL, _("Authorization Denied"), dialog_msg); |
4230 | 5483 } |
5484 g_free(dialog_msg); | |
4236 | 5485 g_free(nombre); |
4230 | 5486 |
5487 return 1; | |
5488 } | |
5489 | |
5490 static int gaim_ssi_gotadded(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 5491 GaimConnection *gc = sess->aux_data; |
4230 | 5492 va_list ap; |
5493 char *sn; | |
6695 | 5494 GaimBuddy *buddy; |
4230 | 5495 |
5496 va_start(ap, fr); | |
5497 sn = va_arg(ap, char *); | |
5498 va_end(ap); | |
5499 | |
4687 | 5500 buddy = gaim_find_buddy(gc->account, sn); |
8660 | 5501 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5502 "ssi: %s added you to their buddy list\n", sn); |
7015
dece74f05509
[gaim-migrate @ 7578]
Christian Hammond <chipx86@chipx86.com>
parents:
7011
diff
changeset
|
5503 gaim_account_notify_added(gc->account, NULL, sn, (buddy ? gaim_get_buddy_alias_only(buddy) : NULL), NULL); |
4230 | 5504 |
5505 return 1; | |
5506 } | |
4269 | 5507 #endif |
2086 | 5508 |
5575 | 5509 static GList *oscar_chat_info(GaimConnection *gc) { |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5510 GList *m = NULL; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5511 struct proto_chat_entry *pce; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5512 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5513 pce = g_new0(struct proto_chat_entry, 1); |
7841 | 5514 pce->label = _("_Group:"); |
5234 | 5515 pce->identifier = "room"; |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5516 m = g_list_append(m, pce); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5517 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5518 pce = g_new0(struct proto_chat_entry, 1); |
7841 | 5519 pce->label = _("_Exchange:"); |
5234 | 5520 pce->identifier = "exchange"; |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5521 pce->is_int = TRUE; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5522 pce->min = 4; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5523 pce->max = 20; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5524 m = g_list_append(m, pce); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5525 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5526 return m; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5527 } |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5528 |
8308 | 5529 static void oscar_join_chat(GaimConnection *gc, GHashTable *data) { |
5530 OscarData *od = (OscarData *)gc->proto_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5531 aim_conn_t *cur; |
5234 | 5532 char *name, *exchange; |
5533 | |
5534 name = g_hash_table_lookup(data, "room"); | |
5535 exchange = g_hash_table_lookup(data, "exchange"); | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5536 |
8660 | 5537 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5538 "Attempting to join chat room %s.\n", name); |
8308 | 5539 |
5540 if ((name == NULL) || (*name == '\0')) { | |
5541 gaim_notify_error(gc, NULL, _("Invalid chat name specified."), NULL); | |
5542 return; | |
5543 } | |
5544 | |
4617 | 5545 if ((cur = aim_getconn_type(od->sess, AIM_CONN_TYPE_CHATNAV))) { |
8660 | 5546 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5547 "chatnav exists, creating room\n"); |
5234 | 5548 aim_chatnav_createroom(od->sess, cur, name, atoi(exchange)); |
2086 | 5549 } else { |
5550 /* this gets tricky */ | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
5551 struct create_room *cr = g_new0(struct create_room, 1); |
8660 | 5552 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5553 "chatnav does not exist, opening chatnav\n"); |
5234 | 5554 cr->exchange = atoi(exchange); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
5555 cr->name = g_strdup(name); |
4617 | 5556 od->create_rooms = g_slist_append(od->create_rooms, cr); |
5557 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_CHATNAV); | |
2086 | 5558 } |
5559 } | |
5560 | |
8308 | 5561 static void oscar_chat_invite(GaimConnection *gc, int id, const char *message, const char *name) { |
5562 OscarData *od = (OscarData *)gc->proto_data; | |
5563 struct chat_connection *ccon = find_oscar_chat(gc, id); | |
2086 | 5564 |
5565 if (!ccon) | |
5566 return; | |
5567 | |
8225 | 5568 aim_im_sendch2_chatinvite(od->sess, name, message ? message : "", |
2086 | 5569 ccon->exchange, ccon->name, 0x0); |
5570 } | |
5571 | |
8308 | 5572 static void oscar_chat_leave(GaimConnection *gc, int id) { |
5573 OscarData *od = gc ? (OscarData *)gc->proto_data : NULL; | |
5574 GSList *bcs = gc->buddy_chats; | |
5679 | 5575 GaimConversation *b = NULL; |
2086 | 5576 struct chat_connection *c = NULL; |
5577 int count = 0; | |
5578 | |
5579 while (bcs) { | |
5580 count++; | |
5679 | 5581 b = (GaimConversation *)bcs->data; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
5582 if (id == gaim_conv_chat_get_id(GAIM_CONV_CHAT(b))) |
2086 | 5583 break; |
5584 bcs = bcs->next; | |
5585 b = NULL; | |
5586 } | |
5587 | |
5588 if (!b) | |
5589 return; | |
5590 | |
8660 | 5591 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5592 "Attempting to leave room %s (currently in %d rooms)\n", b->name, count); |
2086 | 5593 |
8308 | 5594 c = find_oscar_chat(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(b))); |
2086 | 5595 if (c != NULL) { |
4617 | 5596 if (od) |
5597 od->oscar_chats = g_slist_remove(od->oscar_chats, c); | |
2086 | 5598 if (c->inpa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
5599 gaim_input_remove(c->inpa); |
8308 | 5600 if (gc && od->sess) |
4617 | 5601 aim_conn_kill(od->sess, &c->conn); |
2086 | 5602 g_free(c->name); |
5603 g_free(c->show); | |
5604 g_free(c); | |
5605 } | |
5606 /* we do this because with Oscar it doesn't tell us we left */ | |
8308 | 5607 serv_got_chat_left(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(b))); |
2086 | 5608 } |
5609 | |
8219 | 5610 static int oscar_send_chat(GaimConnection *gc, int id, const char *message) { |
5611 OscarData *od = (OscarData *)gc->proto_data; | |
5612 GError *err = NULL; | |
5613 GaimConversation *conv = NULL; | |
2086 | 5614 struct chat_connection *c = NULL; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5615 char *buf, *buf2; |
8219 | 5616 char *charset = NULL; |
5617 int encoding; | |
5618 int len; | |
5619 | |
5620 if (!(conv = gaim_find_chat(gc, id))) | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5621 return -EINVAL; |
2086 | 5622 |
8219 | 5623 if (!(c = find_oscar_chat_by_conv(gc, conv))) |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5624 return -EINVAL; |
2086 | 5625 |
8219 | 5626 buf = gaim_strdup_withhtml(message); |
5627 len = strlen(buf); | |
5628 | |
5629 encoding = oscar_encoding_check(buf); | |
8233 | 5630 if (encoding & AIM_IMFLAGS_UNICODE) { |
8660 | 5631 gaim_debug_info("oscar", "Sending Unicode chat\n"); |
8219 | 5632 charset = "unicode-2-0"; |
5633 buf2 = g_convert(buf, len, "UCS-2BE", "UTF-8", NULL, &len, &err); | |
5634 if (err) { | |
8660 | 5635 gaim_debug_error("oscar", |
8359 | 5636 "Error converting to unicode-2-0: %s\n", err->message); |
5637 g_error_free(err); | |
5638 } | |
8219 | 5639 } else if (encoding & AIM_IMFLAGS_ISO_8859_1) { |
8660 | 5640 gaim_debug_info("oscar", "Sending ISO-8859-1 chat\n"); |
8219 | 5641 charset = "iso-8859-1"; |
5642 buf2 = g_convert(buf, len, "ISO-8859-1", "UTF-8", NULL, &len, &err); | |
5643 if (err) { | |
8660 | 5644 gaim_debug_error("oscar", |
8359 | 5645 "Error converting to iso-8859-1: %s\n", err->message); |
8219 | 5646 g_error_free(err); |
8359 | 5647 err = NULL; |
5648 | |
8660 | 5649 gaim_debug_info("oscar", "Falling back to Unicode\n"); |
8359 | 5650 charset = "unicode-2-0"; |
5651 buf2 = g_convert(buf, len, "UCS-2BE", "UTF-8", NULL, &len, &err); | |
8219 | 5652 if (err) { |
8660 | 5653 gaim_debug_error("oscar", |
8359 | 5654 "Error converting to unicode-2-0: %s\n", |
5655 err->message); | |
8219 | 5656 g_error_free(err); |
5657 } | |
2086 | 5658 } |
8219 | 5659 } else { |
5660 charset = "us-ascii"; | |
5661 buf2 = g_strdup(buf); | |
5662 } | |
8359 | 5663 g_free(buf); |
5664 | |
5665 if ((len > c->maxlen) || (len > c->maxvis)) { | |
5666 g_free(buf2); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5667 return -E2BIG; |
8359 | 5668 } |
5669 | |
5670 aim_chat_send_im(od->sess, c->conn, 0, buf2, len, charset, "en"); | |
8219 | 5671 g_free(buf2); |
8359 | 5672 |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5673 return 0; |
2086 | 5674 } |
5675 | |
6695 | 5676 static const char *oscar_list_icon(GaimAccount *a, GaimBuddy *b) { |
4766 | 5677 if (!b || (b && b->name && b->name[0] == '+')) { |
5646
48c63ee49961
[gaim-migrate @ 6060]
Christian Hammond <chipx86@chipx86.com>
parents:
5638
diff
changeset
|
5678 if (a != NULL && isdigit(*gaim_account_get_username(a))) |
4687 | 5679 return "icq"; |
5680 else | |
5681 return "aim"; | |
5682 } | |
5646
48c63ee49961
[gaim-migrate @ 6060]
Christian Hammond <chipx86@chipx86.com>
parents:
5638
diff
changeset
|
5683 |
48c63ee49961
[gaim-migrate @ 6060]
Christian Hammond <chipx86@chipx86.com>
parents:
5638
diff
changeset
|
5684 if (b != NULL && isdigit(b->name[0])) |
4687 | 5685 return "icq"; |
5686 return "aim"; | |
5687 } | |
5688 | |
6695 | 5689 static void oscar_list_emblems(GaimBuddy *b, char **se, char **sw, char **nw, char **ne) |
4687 | 5690 { |
7334 | 5691 GaimAccount *account = NULL; |
5692 GaimConnection *gc = NULL; | |
5693 OscarData *od = NULL; | |
4687 | 5694 char *emblems[4] = {NULL,NULL,NULL,NULL}; |
5695 int i = 0; | |
7334 | 5696 aim_userinfo_t *userinfo = NULL; |
5697 | |
5698 if (b != NULL) | |
5699 account = b->account; | |
5700 if (account != NULL) | |
5701 gc = account->gc; | |
5702 if (gc != NULL) | |
5703 od = gc->proto_data; | |
7945 | 5704 if (od != NULL) |
5705 userinfo = aim_locate_finduserinfo(od->sess, b->name); | |
4687 | 5706 |
5131 | 5707 if (!GAIM_BUDDY_IS_ONLINE(b)) { |
5708 char *gname; | |
7334 | 5709 if ((b->name) && (od) && (od->sess->ssi.received_data) && |
5131 | 5710 (gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, b->name)) && |
5711 (aim_ssi_waitingforauth(od->sess->ssi.local, gname, b->name))) { | |
5712 emblems[i++] = "notauthorized"; | |
5713 } else { | |
5714 emblems[i++] = "offline"; | |
5715 } | |
5716 } | |
4916 | 5717 |
4766 | 5718 if (b->name && (b->uc & 0xffff0000) && isdigit(b->name[0])) { |
4960 | 5719 int uc = b->uc >> 16; |
4766 | 5720 if (uc & AIM_ICQ_STATE_INVISIBLE) |
4960 | 5721 emblems[i++] = "invisible"; |
4766 | 5722 else if (uc & AIM_ICQ_STATE_CHAT) |
4960 | 5723 emblems[i++] = "freeforchat"; |
4766 | 5724 else if (uc & AIM_ICQ_STATE_DND) |
4960 | 5725 emblems[i++] = "dnd"; |
4766 | 5726 else if (uc & AIM_ICQ_STATE_OUT) |
4960 | 5727 emblems[i++] = "na"; |
4766 | 5728 else if (uc & AIM_ICQ_STATE_BUSY) |
4960 | 5729 emblems[i++] = "occupied"; |
4766 | 5730 else if (uc & AIM_ICQ_STATE_AWAY) |
5731 emblems[i++] = "away"; | |
5732 } else { | |
5733 if (b->uc & UC_UNAVAILABLE) | |
5734 emblems[i++] = "away"; | |
5735 } | |
4687 | 5736 if (b->uc & UC_WIRELESS) |
5737 emblems[i++] = "wireless"; | |
5738 if (b->uc & UC_AOL) | |
5739 emblems[i++] = "aol"; | |
5740 if (b->uc & UC_ADMIN) | |
5741 emblems[i++] = "admin"; | |
5742 if (b->uc & UC_AB && i < 4) | |
5743 emblems[i++] = "activebuddy"; | |
4766 | 5744 /* if (b->uc & UC_UNCONFIRMED && i < 4) |
5745 emblems[i++] = "unconfirmed"; */ | |
7334 | 5746 |
7945 | 5747 if ((i < 4) && (userinfo != NULL) && (userinfo->capabilities & AIM_CAPS_HIPTOP)) |
5748 emblems[i++] = "hiptop"; | |
5749 | |
5750 if ((i < 4) && (userinfo != NULL) && (userinfo->capabilities & AIM_CAPS_SECUREIM)) | |
7334 | 5751 emblems[i++] = "secure"; |
5752 | |
4687 | 5753 *se = emblems[0]; |
5754 *sw = emblems[1]; | |
5755 *nw = emblems[2]; | |
5756 *ne = emblems[3]; | |
5757 } | |
5758 | |
6695 | 5759 static char *oscar_tooltip_text(GaimBuddy *b) { |
5575 | 5760 GaimConnection *gc = b->account->gc; |
7283 | 5761 OscarData *od = gc->proto_data; |
7045 | 5762 aim_userinfo_t *userinfo = aim_locate_finduserinfo(od->sess, b->name); |
8701 | 5763 GString *str = g_string_new(""); |
5131 | 5764 |
5765 if (GAIM_BUDDY_IS_ONLINE(b)) { | |
8701 | 5766 oscar_string_append_info(gc, str, "\n", b, userinfo); |
7011 | 5767 |
5768 if ((userinfo != NULL) && (userinfo->flags & AIM_FLAG_AWAY) && (userinfo->away_len > 0) && (userinfo->away != NULL) && (userinfo->away_encoding != NULL)) { | |
8225 | 5769 gchar *charset = oscar_encoding_extract(userinfo->away_encoding); |
8392 | 5770 gchar *away_utf8 = oscar_encoding_to_utf8(charset, userinfo->away, userinfo->away_len); |
8225 | 5771 g_free(charset); |
7011 | 5772 if (away_utf8 != NULL) { |
7091 | 5773 gchar *tmp1, *tmp2; |
8341 | 5774 tmp1 = gaim_strcasereplace(away_utf8, "<BR>", "\n"); |
5775 g_free(away_utf8); | |
7095
c8bf2da398e3
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7093
diff
changeset
|
5776 tmp2 = gaim_markup_strip_html(tmp1); |
7091 | 5777 g_free(tmp1); |
8571 | 5778 tmp1 = gaim_escape_html(tmp2); |
7091 | 5779 g_free(tmp2); |
8700 | 5780 tmp2 = gaim_str_sub_away_formatters(tmp1, gaim_account_get_username(gaim_connection_get_account(gc))); |
8461 | 5781 g_free(tmp1); |
8701 | 5782 g_string_append_printf(str, "\n<b>%s:</b> %s", _("Away Message"), tmp2); |
8700 | 5783 g_free(tmp2); |
5836 | 5784 } |
5131 | 5785 } |
8701 | 5786 } |
5787 | |
5788 return g_string_free(str, FALSE); | |
5131 | 5789 } |
5790 | |
6695 | 5791 static char *oscar_status_text(GaimBuddy *b) { |
5575 | 5792 GaimConnection *gc = b->account->gc; |
7283 | 5793 OscarData *od = gc->proto_data; |
5167 | 5794 gchar *ret = NULL; |
5795 | |
5796 if ((b->uc & UC_UNAVAILABLE) || (((b->uc & 0xffff0000) >> 16) & AIM_ICQ_STATE_CHAT)) { | |
5797 if (isdigit(b->name[0])) | |
8701 | 5798 ret = oscar_icqstatus((b->uc & 0xffff0000) >> 16); |
7038 | 5799 else |
5800 ret = g_strdup(_("Away")); | |
5836 | 5801 } else if (GAIM_BUDDY_IS_ONLINE(b)) { |
7261 | 5802 struct buddyinfo *bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(b->account, b->name)); |
6292 | 5803 if (bi->availmsg) |
5804 ret = g_markup_escape_text(bi->availmsg, strlen(bi->availmsg)); | |
5836 | 5805 } else { |
5167 | 5806 char *gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, b->name); |
5807 if (aim_ssi_waitingforauth(od->sess->ssi.local, gname, b->name)) | |
5808 ret = g_strdup(_("Not Authorized")); | |
5809 else | |
5810 ret = g_strdup(_("Offline")); | |
5811 } | |
5812 | |
5813 return ret; | |
5814 } | |
5815 | |
5842 | 5816 |
5844 | 5817 static int oscar_icon_req(aim_session_t *sess, aim_frame_t *fr, ...) { |
5842 | 5818 GaimConnection *gc = sess->aux_data; |
7283 | 5819 OscarData *od = gc->proto_data; |
5892 | 5820 va_list ap; |
5842 | 5821 fu16_t type; |
5892 | 5822 fu8_t flags = 0, length = 0; |
5823 char *md5 = NULL; | |
5824 | |
7334 | 5825 |
5842 | 5826 va_start(ap, fr); |
5827 type = va_arg(ap, int); | |
5892 | 5828 |
5829 switch(type) { | |
5830 case 0x0000: | |
5831 case 0x0001: { | |
5832 flags = va_arg(ap, int); | |
5833 length = va_arg(ap, int); | |
5834 md5 = va_arg(ap, char *); | |
5835 | |
5836 if (flags == 0x41) { | |
5837 if (!aim_getconn_type(od->sess, AIM_CONN_TYPE_ICON) && !od->iconconnecting) { | |
5838 od->iconconnecting = TRUE; | |
5839 od->set_icon = TRUE; | |
5840 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_ICON); | |
5841 } else { | |
6039 | 5842 struct stat st; |
5843 const char *iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc)); | |
5844 if (iconfile == NULL) { | |
8363 | 5845 aim_ssi_delicon(od->sess); |
6039 | 5846 } else if (!stat(iconfile, &st)) { |
5847 char *buf = g_malloc(st.st_size); | |
5848 FILE *file = fopen(iconfile, "rb"); | |
5849 if (file) { | |
5850 fread(buf, 1, st.st_size, file); | |
5851 fclose(file); | |
8660 | 5852 gaim_debug_info("oscar", |
6039 | 5853 "Uploading icon to icon server\n"); |
6879 | 5854 aim_bart_upload(od->sess, buf, st.st_size); |
5892 | 5855 } else |
8660 | 5856 gaim_debug_error("oscar", |
6039 | 5857 "Can't open buddy icon file!\n"); |
5858 g_free(buf); | |
5859 } else { | |
8660 | 5860 gaim_debug_error("oscar", |
6039 | 5861 "Can't stat buddy icon file!\n"); |
5892 | 5862 } |
5863 } | |
8363 | 5864 } else if (flags == 0x81) { |
5865 const char *iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc)); | |
5866 if (iconfile == NULL) | |
5867 aim_ssi_delicon(od->sess); | |
5868 else | |
5869 aim_ssi_seticon(od->sess, md5, length); | |
5870 } | |
5892 | 5871 } break; |
5872 | |
5873 case 0x0002: { /* We just set an "available" message? */ | |
5874 } break; | |
5875 } | |
5876 | |
5842 | 5877 va_end(ap); |
5844 | 5878 |
5879 return 0; | |
5842 | 5880 } |
5892 | 5881 |
3952 | 5882 /* |
4617 | 5883 * We have just established a socket with the other dude, so set up some handlers. |
3952 | 5884 */ |
4617 | 5885 static int gaim_odc_initiate(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 5886 GaimConnection *gc = sess->aux_data; |
7283 | 5887 OscarData *od = (OscarData *)gc->proto_data; |
5679 | 5888 GaimConversation *cnv; |
2086 | 5889 struct direct_im *dim; |
5890 char buf[256]; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5891 char *sn; |
4617 | 5892 va_list ap; |
5893 aim_conn_t *newconn, *listenerconn; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5894 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5895 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5896 newconn = va_arg(ap, aim_conn_t *); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5897 listenerconn = va_arg(ap, aim_conn_t *); |
2086 | 5898 va_end(ap); |
5899 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5900 aim_conn_close(listenerconn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5901 aim_conn_kill(sess, &listenerconn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5902 |
4617 | 5903 sn = g_strdup(aim_odc_getsn(newconn)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5904 |
8660 | 5905 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5906 "DirectIM: initiate success to %s\n", sn); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5907 dim = find_direct_im(od, sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5908 |
6640
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6623
diff
changeset
|
5909 cnv = gaim_conversation_new(GAIM_CONV_IM, dim->gc->account, sn); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
5910 gaim_input_remove(dim->watcher); |
2086 | 5911 dim->conn = newconn; |
4617 | 5912 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, oscar_callback, dim->conn); |
3008 | 5913 dim->connected = TRUE; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5914 g_snprintf(buf, sizeof buf, _("Direct IM with %s established"), sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5915 g_free(sn); |
6982 | 5916 gaim_conversation_write(cnv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL)); |
2086 | 5917 |
4617 | 5918 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, gaim_odc_incoming, 0); |
5919 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, gaim_odc_typing, 0); | |
6982 | 5920 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER, gaim_odc_update_ui, 0); |
4617 | 5921 |
2993 | 5922 return 1; |
5923 } | |
5924 | |
6982 | 5925 /* |
5926 * This is called when each chunk of an image is received. It can be used to | |
5927 * update a progress bar, or to eat lots of dry cat food. Wet cat food is | |
5928 * nasty, you sicko. | |
5929 */ | |
5930 static int gaim_odc_update_ui(aim_session_t *sess, aim_frame_t *fr, ...) { | |
2993 | 5931 va_list ap; |
5932 char *sn; | |
5933 double percent; | |
5575 | 5934 GaimConnection *gc = sess->aux_data; |
7283 | 5935 OscarData *od = (OscarData *)gc->proto_data; |
5679 | 5936 GaimConversation *c; |
2993 | 5937 struct direct_im *dim; |
5938 | |
5939 va_start(ap, fr); | |
5940 sn = va_arg(ap, char *); | |
5941 percent = va_arg(ap, double); | |
5942 va_end(ap); | |
6873 | 5943 |
2994 | 5944 if (!(dim = find_direct_im(od, sn))) |
5945 return 1; | |
3059 | 5946 if (dim->watcher) { |
5947 gaim_input_remove(dim->watcher); /* Otherwise, the callback will callback */ | |
5948 dim->watcher = 0; | |
5949 } | |
6640
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6623
diff
changeset
|
5950 |
6982 | 5951 c = gaim_find_conversation_with_account(sn, gaim_connection_get_account(gc)); |
6873 | 5952 if (c != NULL) |
5953 gaim_conversation_update_progress(c, percent); | |
2993 | 5954 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, |
5955 oscar_callback, dim->conn); | |
2086 | 5956 |
5957 return 1; | |
5958 } | |
5959 | |
6982 | 5960 /* |
5961 * This is called after a direct IM has been received in its entirety. This | |
5962 * function is passed a long chunk of data which contains the IM with any | |
5963 * data chunks (images) appended to it. | |
5964 * | |
5965 * This function rips out all the data chunks and creates an imgstore for | |
5966 * each one. In order to do this, it first goes through the IM and takes | |
5967 * out all the IMG tags. When doing so, it rewrites the original IMG tag | |
5968 * with one compatable with the imgstore Gaim core code. For each one, we | |
5969 * then read in chunks of data from the end of the message and actually | |
5970 * create the img store using the given data. | |
5971 * | |
5972 * For somewhat easy reference, here's a sample message | |
5973 * (without the whitespace and asterisks): | |
5974 * | |
5975 * <HTML><BODY BGCOLOR="#ffffff"> | |
5976 * <FONT LANG="0"> | |
5977 * This is a really stupid picture:<BR> | |
5978 * <IMG SRC="Sample.jpg" ID="1" WIDTH="283" HEIGHT="212" DATASIZE="9894"><BR> | |
5979 * Yeah it is<BR> | |
5980 * Here is another one:<BR> | |
5981 * <IMG SRC="Soap Bubbles.bmp" ID="2" WIDTH="256" HEIGHT="256" DATASIZE="65978"> | |
5982 * </FONT> | |
5983 * </BODY></HTML> | |
5984 * <BINARY> | |
5985 * <DATA ID="1" SIZE="9894">datadatadatadata</DATA> | |
5986 * <DATA ID="2" SIZE="65978">datadatadatadata</DATA> | |
5987 * </BINARY> | |
5988 */ | |
4617 | 5989 static int gaim_odc_incoming(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 5990 GaimConnection *gc = sess->aux_data; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
5991 GaimConvImFlags imflags = 0; |
8233 | 5992 gchar *utf8; |
6982 | 5993 GString *newmsg = g_string_new(""); |
5994 GSList *images = NULL; | |
2086 | 5995 va_list ap; |
6982 | 5996 const char *sn, *msg, *msgend, *binary; |
5997 size_t len; | |
5998 int encoding, isawaymsg; | |
2086 | 5999 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6000 va_start(ap, fr); |
6982 | 6001 sn = va_arg(ap, const char *); |
6002 msg = va_arg(ap, const char *); | |
6003 len = va_arg(ap, size_t); | |
3952 | 6004 encoding = va_arg(ap, int); |
4870 | 6005 isawaymsg = va_arg(ap, int); |
2086 | 6006 va_end(ap); |
6982 | 6007 msgend = msg + len; |
2086 | 6008 |
8660 | 6009 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6010 "Got DirectIM message from %s\n", sn); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6011 |
4870 | 6012 if (isawaymsg) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
6013 imflags |= GAIM_CONV_IM_AUTO_RESP; |
4870 | 6014 |
6982 | 6015 /* message has a binary trailer */ |
6016 if ((binary = gaim_strcasestr(msg, "<binary>"))) { | |
6017 GData *attribs; | |
6018 const char *tmp, *start, *end, *last = NULL; | |
6019 | |
6020 tmp = msg; | |
6021 | |
6022 /* for each valid image tag... */ | |
6023 while (gaim_markup_find_tag("img", tmp, &start, &end, &attribs)) { | |
6024 const char *id, *src, *datasize; | |
6025 const char *tag = NULL, *data = NULL; | |
6026 size_t size; | |
6027 int imgid = 0; | |
6028 | |
6029 /* update the location of the last img tag */ | |
6030 last = end; | |
6031 | |
6032 /* grab attributes */ | |
6033 id = g_datalist_get_data(&attribs, "id"); | |
6034 src = g_datalist_get_data(&attribs, "src"); | |
6035 datasize = g_datalist_get_data(&attribs, "datasize"); | |
6036 | |
6037 /* if we have id & datasize, build the data tag */ | |
6038 if (id && datasize) | |
6039 tag = g_strdup_printf("<data id=\"%s\" size=\"%s\">", id, datasize); | |
6040 | |
6041 /* if we have a tag, find the start of the data */ | |
6042 if (tag && (data = gaim_strcasestr(binary, tag))) | |
6043 data += strlen(tag); | |
6044 | |
6045 /* check the data is here and store it */ | |
6046 if (data + (size = atoi(datasize)) <= msgend) | |
6047 imgid = gaim_imgstore_add(data, size, src); | |
6048 | |
8233 | 6049 /* |
6050 * XXX - The code below contains some calls to oscar_encoding_to_utf8 | |
6051 * The hardcoded "us-ascii" value REALLY needs to be removed. | |
6052 */ | |
6982 | 6053 /* if we have a stored image... */ |
6054 if (imgid) { | |
6055 /* append the message up to the tag */ | |
8233 | 6056 utf8 = oscar_encoding_to_utf8("us-ascii", tmp, start - tmp); |
6057 if (utf8 != NULL) { | |
6058 newmsg = g_string_append(newmsg, utf8); | |
6059 g_free(utf8); | |
6060 } | |
6982 | 6061 |
6062 /* write the new image tag */ | |
6063 g_string_append_printf(newmsg, "<IMG ID=\"%d\">", imgid); | |
6064 | |
6065 /* and record the image number */ | |
6066 images = g_slist_append(images, GINT_TO_POINTER(imgid)); | |
6067 } else { | |
6068 /* otherwise, copy up to the end of the tag */ | |
8233 | 6069 utf8 = oscar_encoding_to_utf8("us-ascii", tmp, (end + 1) - tmp); |
6070 if (utf8 != NULL) { | |
6071 newmsg = g_string_append(newmsg, utf8); | |
6072 g_free(utf8); | |
6073 } | |
6982 | 6074 } |
6075 | |
6076 /* clear the attribute list */ | |
6077 g_datalist_clear(&attribs); | |
6078 | |
6079 /* continue from the end of the tag */ | |
6080 tmp = end + 1; | |
6081 } | |
6082 | |
6083 /* append any remaining message data (without the > :-) */ | |
6084 if (last++ && (last < binary)) | |
6085 newmsg = g_string_append_len(newmsg, last, binary - last); | |
6086 | |
6087 /* set the flag if we caught any images */ | |
6088 if (images) | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
6089 imflags |= GAIM_CONV_IM_IMAGES; |
6982 | 6090 } else { |
6091 g_string_append_len(newmsg, msg, len); | |
6092 } | |
6093 | |
4617 | 6094 /* XXX - I imagine Paco-Paco will want to do some voodoo with the encoding here */ |
6982 | 6095 serv_got_im(gc, sn, newmsg->str, imflags, time(NULL)); |
6096 | |
6097 /* free up the message */ | |
6098 g_string_free(newmsg, TRUE); | |
6099 | |
6100 /* unref any images we allocated */ | |
6101 if (images) { | |
6102 GSList *tmp; | |
6103 int id; | |
6104 | |
6105 for (tmp = images; tmp != NULL; tmp = tmp->next) { | |
6106 id = GPOINTER_TO_INT(tmp->data); | |
6107 gaim_imgstore_unref(id); | |
6108 } | |
6109 | |
6110 g_slist_free(images); | |
6111 } | |
2086 | 6112 |
6113 return 1; | |
6114 } | |
6115 | |
4617 | 6116 static int gaim_odc_typing(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 6117 va_list ap; |
6118 char *sn; | |
2993 | 6119 int typing; |
5575 | 6120 GaimConnection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6121 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6122 va_start(ap, fr); |
2086 | 6123 sn = va_arg(ap, char *); |
2993 | 6124 typing = va_arg(ap, int); |
2086 | 6125 va_end(ap); |
6126 | |
4870 | 6127 if (typing == 0x0002) { |
2993 | 6128 /* I had to leave this. It's just too funny. It reminds me of my sister. */ |
8660 | 6129 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6130 "ohmigod! %s has started typing (DirectIM). He's going to send you a message! *squeal*\n", sn); |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
6131 serv_got_typing(gc, sn, 0, GAIM_TYPING); |
4870 | 6132 } else if (typing == 0x0001) |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
6133 serv_got_typing(gc, sn, 0, GAIM_TYPED); |
4870 | 6134 else |
4342 | 6135 serv_got_typing_stopped(gc, sn); |
2086 | 6136 return 1; |
6137 } | |
6138 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
6139 static int gaim_odc_send_im(aim_session_t *sess, aim_conn_t *conn, const char *message, GaimConvImFlags imflags) { |
6982 | 6140 char *buf; |
6141 size_t len; | |
6142 int ret; | |
6143 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
6144 if (imflags & GAIM_CONV_IM_IMAGES) { |
6982 | 6145 GString *msg = g_string_new(""); |
6146 GString *data = g_string_new("<BINARY>"); | |
6147 GData *attribs; | |
6148 const char *tmp, *start, *end, *last = NULL; | |
6149 int oscar_id = 0; | |
6150 | |
6151 tmp = message; | |
6152 | |
6153 /* for each valid IMG tag... */ | |
6154 while (gaim_markup_find_tag("img", tmp, &start, &end, &attribs)) { | |
6155 GaimStoredImage *image = NULL; | |
6156 const char *id; | |
6157 | |
6158 last = end; | |
6159 id = g_datalist_get_data(&attribs, "id"); | |
6160 | |
6161 /* ... if it refers to a valid gaim image ... */ | |
6162 if (id && (image = gaim_imgstore_get(atoi(id)))) { | |
6163 /* ... append the message from start to the tag ... */ | |
6164 msg = g_string_append_len(msg, tmp, start - tmp); | |
6165 oscar_id++; | |
6166 | |
6167 /* ... insert a new img tag with the oscar id ... */ | |
6168 if (image->filename) | |
6169 g_string_append_printf(msg, | |
6170 "<IMG SRC=\"file://%s\" ID=\"%d\" DATASIZE=\"%d\">", | |
7386 | 6171 image->filename, oscar_id, (int)image->size); |
6982 | 6172 else |
6173 g_string_append_printf(msg, | |
6174 "<IMG ID=\"%d\" DATASIZE=\"%d\">", | |
7386 | 6175 oscar_id, (int)image->size); |
6982 | 6176 |
6177 /* ... and append the data to the binary section ... */ | |
6178 g_string_append_printf(data, "<DATA ID=\"%d\" SIZE=\"%d\">", | |
7386 | 6179 oscar_id, (int)image->size); |
6982 | 6180 data = g_string_append_len(data, image->data, image->size); |
6181 data = g_string_append(data, "</DATA>"); | |
6182 } else { | |
6183 /* ... otherwise, allow the possibly invalid img tag through. */ | |
6184 /* should we do something else? */ | |
6185 msg = g_string_append_len(msg, tmp, (end + 1) - tmp); | |
6186 } | |
6187 | |
6188 g_datalist_clear(&attribs); | |
6189 | |
6190 /* continue from the end of the tag */ | |
6191 tmp = end + 1; | |
6192 } | |
6193 | |
6194 /* append any remaining message data (without the > :-) */ | |
6195 if (last++ && *last) | |
6196 msg = g_string_append(msg, last); | |
6197 | |
6198 /* if we inserted any images in the binary section, append it */ | |
6199 if (oscar_id) { | |
6200 msg = g_string_append_len(msg, data->str, data->len); | |
6201 msg = g_string_append(msg, "</BINARY>"); | |
6202 } | |
6203 | |
6204 len = msg->len; | |
6205 buf = msg->str; | |
6206 g_string_free(msg, FALSE); | |
6207 g_string_free(data, TRUE); | |
6208 } else { | |
6209 len = strlen(message); | |
6210 buf = g_memdup(message, len+1); | |
6211 } | |
6212 | |
6213 /* XXX - The last parameter below is the encoding. Let Paco-Paco do something with it. */ | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
6214 if (imflags & GAIM_CONV_IM_AUTO_RESP) |
6982 | 6215 ret = aim_odc_send_im(sess, conn, buf, len, 0, 1); |
6216 else | |
6217 ret = aim_odc_send_im(sess, conn, buf, len, 0, 0); | |
6218 | |
6219 g_free(buf); | |
6220 | |
6221 return ret; | |
6222 } | |
6223 | |
2086 | 6224 struct ask_do_dir_im { |
6225 char *who; | |
5575 | 6226 GaimConnection *gc; |
2086 | 6227 }; |
6228 | |
3730 | 6229 static void oscar_cancel_direct_im(struct ask_do_dir_im *data) { |
5136 | 6230 g_free(data->who); |
2086 | 6231 g_free(data); |
6232 } | |
6233 | |
3730 | 6234 static void oscar_direct_im(struct ask_do_dir_im *data) { |
5575 | 6235 GaimConnection *gc = data->gc; |
7283 | 6236 OscarData *od; |
2086 | 6237 struct direct_im *dim; |
8240 | 6238 int listenfd; |
2086 | 6239 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
6240 if (!g_list_find(gaim_connections_get_all(), gc)) { |
5136 | 6241 g_free(data->who); |
4244 | 6242 g_free(data); |
6243 return; | |
6244 } | |
6245 | |
7283 | 6246 od = (OscarData *)gc->proto_data; |
4244 | 6247 |
2086 | 6248 dim = find_direct_im(od, data->who); |
6249 if (dim) { | |
3008 | 6250 if (!(dim->connected)) { /* We'll free the old, unconnected dim, and start over */ |
6251 od->direct_ims = g_slist_remove(od->direct_ims, dim); | |
6252 gaim_input_remove(dim->watcher); | |
6253 g_free(dim); | |
8660 | 6254 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6255 "Gave up on old direct IM, trying again\n"); |
3008 | 6256 } else { |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
6257 gaim_notify_error(gc, NULL, "DirectIM already open.", NULL); |
5136 | 6258 g_free(data->who); |
4244 | 6259 g_free(data); |
3008 | 6260 return; |
6261 } | |
2086 | 6262 } |
6263 dim = g_new0(struct direct_im, 1); | |
6264 dim->gc = gc; | |
6265 g_snprintf(dim->name, sizeof dim->name, "%s", data->who); | |
6266 | |
8246 | 6267 listenfd = gaim_network_listen_range(5190, 5199); |
8240 | 6268 dim->conn = aim_odc_initiate(od->sess, data->who, listenfd, gaim_network_get_port_from_fd(listenfd)); |
2086 | 6269 if (dim->conn != NULL) { |
6270 od->direct_ims = g_slist_append(od->direct_ims, dim); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
6271 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, |
2086 | 6272 oscar_callback, dim->conn); |
4617 | 6273 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIM_ESTABLISHED, |
6274 gaim_odc_initiate, 0); | |
2086 | 6275 } else { |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
6276 gaim_notify_error(gc, NULL, _("Unable to open Direct IM"), NULL); |
2086 | 6277 g_free(dim); |
6278 } | |
4244 | 6279 |
5136 | 6280 g_free(data->who); |
4244 | 6281 g_free(data); |
2086 | 6282 } |
6283 | |
5575 | 6284 static void oscar_ask_direct_im(GaimConnection *gc, const char *who) { |
5420 | 6285 gchar *buf; |
2086 | 6286 struct ask_do_dir_im *data = g_new0(struct ask_do_dir_im, 1); |
5136 | 6287 data->who = g_strdup(who); |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
6288 data->gc = gc; |
5420 | 6289 buf = g_strdup_printf(_("You have selected to open a Direct IM connection with %s."), who); |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6290 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6291 gaim_request_action(gc, NULL, buf, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6292 _("Because this reveals your IP address, it " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6293 "may be considered a privacy risk. Do you " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6294 "wish to continue?"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6295 0, data, 2, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6296 _("Connect"), G_CALLBACK(oscar_direct_im), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6297 _("Cancel"), G_CALLBACK(oscar_cancel_direct_im)); |
5420 | 6298 g_free(buf); |
2086 | 6299 } |
6300 | |
5575 | 6301 static void oscar_set_permit_deny(GaimConnection *gc) { |
6302 GaimAccount *account = gaim_connection_get_account(gc); | |
7283 | 6303 OscarData *od = (OscarData *)gc->proto_data; |
4230 | 6304 #ifdef NOSSI |
8143 | 6305 GSList *list; |
4230 | 6306 char buf[MAXMSGLEN]; |
6307 int at; | |
6308 | |
5575 | 6309 switch(account->perm_deny) { |
8175 | 6310 case GAIM_PRIVACY_ALLOW_ALL: |
5575 | 6311 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_DENYADD, gaim_account_get_username(account)); |
4230 | 6312 break; |
8175 | 6313 case GAIM_PRIVACY_DENY_ALL: |
5575 | 6314 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_PERMITADD, gaim_account_get_username(account)); |
4230 | 6315 break; |
8175 | 6316 case GAIM_PRIVACY_ALLOW_USERS: |
5575 | 6317 list = account->permit; |
4230 | 6318 at = 0; |
6319 while (list) { | |
6320 at += g_snprintf(buf + at, sizeof(buf) - at, "%s&", (char *)list->data); | |
6321 list = list->next; | |
6322 } | |
6323 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_PERMITADD, buf); | |
6324 break; | |
8175 | 6325 case GAIM_PRIVACY_DENY_USERS: |
5575 | 6326 list = account->deny; |
4230 | 6327 at = 0; |
6328 while (list) { | |
6329 at += g_snprintf(buf + at, sizeof(buf) - at, "%s&", (char *)list->data); | |
6330 list = list->next; | |
6331 } | |
6332 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_DENYADD, buf); | |
6333 break; | |
6334 default: | |
6335 break; | |
2086 | 6336 } |
4230 | 6337 #else |
8175 | 6338 if (od->sess->ssi.received_data) { |
6339 switch (account->perm_deny) { | |
6340 case GAIM_PRIVACY_ALLOW_ALL: | |
6341 aim_ssi_setpermdeny(od->sess, 0x01, 0xffffffff); | |
6342 break; | |
6343 case GAIM_PRIVACY_ALLOW_BUDDYLIST: | |
6344 aim_ssi_setpermdeny(od->sess, 0x05, 0xffffffff); | |
6345 break; | |
6346 case GAIM_PRIVACY_ALLOW_USERS: | |
6347 aim_ssi_setpermdeny(od->sess, 0x03, 0xffffffff); | |
6348 break; | |
6349 case GAIM_PRIVACY_DENY_ALL: | |
6350 aim_ssi_setpermdeny(od->sess, 0x02, 0xffffffff); | |
6351 break; | |
6352 case GAIM_PRIVACY_DENY_USERS: | |
6353 aim_ssi_setpermdeny(od->sess, 0x04, 0xffffffff); | |
6354 break; | |
6355 default: | |
6356 aim_ssi_setpermdeny(od->sess, 0x01, 0xffffffff); | |
6357 break; | |
6358 } | |
6359 } | |
4230 | 6360 #endif |
2086 | 6361 } |
6362 | |
5575 | 6363 static void oscar_add_permit(GaimConnection *gc, const char *who) { |
4269 | 6364 #ifdef NOSSI |
8143 | 6365 if (gc->account->perm_deny == 3) |
4269 | 6366 oscar_set_permit_deny(gc); |
6367 #else | |
7283 | 6368 OscarData *od = (OscarData *)gc->proto_data; |
8660 | 6369 gaim_debug_info("oscar", "ssi: About to add a permit\n"); |
4230 | 6370 if (od->sess->ssi.received_data) |
4889 | 6371 aim_ssi_addpermit(od->sess, who); |
4230 | 6372 #endif |
2086 | 6373 } |
6374 | |
5575 | 6375 static void oscar_add_deny(GaimConnection *gc, const char *who) { |
4269 | 6376 #ifdef NOSSI |
8143 | 6377 if (gc->account->perm_deny == 4) |
4269 | 6378 oscar_set_permit_deny(gc); |
6379 #else | |
7283 | 6380 OscarData *od = (OscarData *)gc->proto_data; |
8660 | 6381 gaim_debug_info("oscar", "ssi: About to add a deny\n"); |
4230 | 6382 if (od->sess->ssi.received_data) |
4889 | 6383 aim_ssi_adddeny(od->sess, who); |
4230 | 6384 #endif |
2086 | 6385 } |
6386 | |
5575 | 6387 static void oscar_rem_permit(GaimConnection *gc, const char *who) { |
4269 | 6388 #ifdef NOSSI |
8143 | 6389 if (gc->account->perm_deny == 3) |
4269 | 6390 oscar_set_permit_deny(gc); |
6391 #else | |
7283 | 6392 OscarData *od = (OscarData *)gc->proto_data; |
8660 | 6393 gaim_debug_info("oscar", "ssi: About to delete a permit\n"); |
4230 | 6394 if (od->sess->ssi.received_data) |
4889 | 6395 aim_ssi_delpermit(od->sess, who); |
4230 | 6396 #endif |
2086 | 6397 } |
6398 | |
5575 | 6399 static void oscar_rem_deny(GaimConnection *gc, const char *who) { |
4269 | 6400 #ifdef NOSSI |
8143 | 6401 if (gc->account->perm_deny == 4) |
4269 | 6402 oscar_set_permit_deny(gc); |
6403 #else | |
7283 | 6404 OscarData *od = (OscarData *)gc->proto_data; |
8660 | 6405 gaim_debug_info("oscar", "ssi: About to delete a deny\n"); |
4230 | 6406 if (od->sess->ssi.received_data) |
4889 | 6407 aim_ssi_deldeny(od->sess, who); |
4230 | 6408 #endif |
2086 | 6409 } |
6410 | |
5575 | 6411 static GList *oscar_away_states(GaimConnection *gc) |
2086 | 6412 { |
7283 | 6413 OscarData *od = gc->proto_data; |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
6414 GList *m = NULL; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
6415 |
8257 | 6416 if (od->icq) { |
6417 m = g_list_append(m, _("Online")); | |
6418 m = g_list_append(m, _("Away")); | |
6419 m = g_list_append(m, _("Do Not Disturb")); | |
6420 m = g_list_append(m, _("Not Available")); | |
6421 m = g_list_append(m, _("Occupied")); | |
6422 m = g_list_append(m, _("Free For Chat")); | |
6423 m = g_list_append(m, _("Invisible")); | |
6424 } else { | |
6425 m = g_list_append(m, GAIM_AWAY_CUSTOM); | |
8476 | 6426 m = g_list_append(m, _("Back")); |
8257 | 6427 m = g_list_append(m, _("Visible")); |
6428 m = g_list_append(m, _("Invisible")); | |
6429 } | |
4333 | 6430 |
6431 return m; | |
6432 } | |
6433 | |
7172 | 6434 static void oscar_ssi_editcomment(struct name_data *data, const char *text) { |
8341 | 6435 GaimConnection *gc = data->gc; |
6436 OscarData *od = gc->proto_data; | |
7172 | 6437 GaimBuddy *b; |
6438 GaimGroup *g; | |
6439 | |
6440 if (!(b = gaim_find_buddy(gaim_connection_get_account(data->gc), data->name))) { | |
6441 oscar_free_name_data(data); | |
6442 return; | |
6443 } | |
6444 | |
6445 if (!(g = gaim_find_buddys_group(b))) { | |
6446 oscar_free_name_data(data); | |
6447 return; | |
6448 } | |
6449 | |
6450 aim_ssi_editcomment(od->sess, g->name, data->name, text); | |
8341 | 6451 |
6452 if (!aim_sncmp(data->name, gc->account->username)) | |
6453 gaim_check_comment(od, text); | |
6454 | |
7172 | 6455 oscar_free_name_data(data); |
6456 } | |
6457 | |
6458 static void oscar_buddycb_edit_comment(GaimConnection *gc, const char *name) { | |
7283 | 6459 OscarData *od = gc->proto_data; |
7172 | 6460 struct name_data *data = g_new(struct name_data, 1); |
6461 GaimBuddy *b; | |
6462 GaimGroup *g; | |
6463 char *comment; | |
6464 gchar *comment_utf8; | |
6465 | |
6466 if (!(b = gaim_find_buddy(gaim_connection_get_account(gc), name))) | |
6467 return; | |
6468 if (!(g = gaim_find_buddys_group(b))) | |
6469 return; | |
6470 comment = aim_ssi_getcomment(od->sess->ssi.local, g->name, name); | |
6471 comment_utf8 = comment ? gaim_utf8_try_convert(comment) : NULL; | |
6472 | |
6473 data->gc = gc; | |
6474 data->name = g_strdup(name); | |
6475 data->nick = NULL; | |
6476 | |
6477 gaim_request_input(gc, NULL, _("Buddy Comment:"), NULL, | |
8697 | 6478 comment_utf8, TRUE, FALSE, NULL, |
7172 | 6479 _("OK"), G_CALLBACK(oscar_ssi_editcomment), |
6480 _("Cancel"), G_CALLBACK(oscar_free_name_data), | |
6481 data); | |
6482 | |
6483 free(comment); | |
6484 g_free(comment_utf8); | |
6485 } | |
6486 | |
5575 | 6487 static GList *oscar_buddy_menu(GaimConnection *gc, const char *who) { |
7283 | 6488 OscarData *od = gc->proto_data; |
4333 | 6489 GList *m = NULL; |
6490 struct proto_buddy_menu *pbm; | |
6491 | |
7172 | 6492 pbm = g_new0(struct proto_buddy_menu, 1); |
6493 pbm->label = _("Edit Buddy Comment"); | |
6494 pbm->callback = oscar_buddycb_edit_comment; | |
6495 pbm->gc = gc; | |
6496 m = g_list_append(m, pbm); | |
6497 | |
4333 | 6498 if (od->icq) { |
4624 | 6499 #if 0 |
4333 | 6500 pbm = g_new0(struct proto_buddy_menu, 1); |
6501 pbm->label = _("Get Status Msg"); | |
4969 | 6502 pbm->callback = oscar_get_icqstatusmsg; |
4333 | 6503 pbm->gc = gc; |
6504 m = g_list_append(m, pbm); | |
4624 | 6505 #endif |
4333 | 6506 } else { |
6695 | 6507 GaimBuddy *b = gaim_find_buddy(gc->account, who); |
7011 | 6508 aim_userinfo_t *userinfo; |
5975 | 6509 |
6510 if (b) | |
7045 | 6511 userinfo = aim_locate_finduserinfo(od->sess, b->name); |
7011 | 6512 |
6513 if (b && userinfo && aim_sncmp(gaim_account_get_username(gaim_connection_get_account(gc)), who) && GAIM_BUDDY_IS_ONLINE(b)) { | |
6514 if (userinfo->capabilities & AIM_CAPS_DIRECTIM) { | |
5917 | 6515 pbm = g_new0(struct proto_buddy_menu, 1); |
6516 pbm->label = _("Direct IM"); | |
6517 pbm->callback = oscar_ask_direct_im; | |
6518 pbm->gc = gc; | |
6519 m = g_list_append(m, pbm); | |
6520 } | |
7650 | 6521 |
6522 if (userinfo->capabilities & AIM_CAPS_SENDFILE) { | |
6523 pbm = g_new0(struct proto_buddy_menu, 1); | |
6524 pbm->label = _("Send File"); | |
6525 pbm->callback = oscar_ask_sendfile; | |
6526 pbm->gc = gc; | |
6527 m = g_list_append(m, pbm); | |
6528 } | |
4826 | 6529 #if 0 |
7011 | 6530 if (userinfo->capabilities & AIM_CAPS_GETFILE) { |
5917 | 6531 pbm = g_new0(struct proto_buddy_menu, 1); |
6532 pbm->label = _("Get File"); | |
6533 pbm->callback = oscar_ask_getfile; | |
6534 pbm->gc = gc; | |
6535 m = g_list_append(m, pbm); | |
6536 } | |
4826 | 6537 #endif |
4333 | 6538 } |
5131 | 6539 } |
5197 | 6540 |
5131 | 6541 if (od->sess->ssi.received_data) { |
6542 char *gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, who); | |
6543 if (gname && aim_ssi_waitingforauth(od->sess->ssi.local, gname, who)) { | |
6544 pbm = g_new0(struct proto_buddy_menu, 1); | |
6873 | 6545 pbm->label = _("Re-request Authorization"); |
5131 | 6546 pbm->callback = gaim_auth_sendrequest; |
6547 pbm->gc = gc; | |
6548 m = g_list_append(m, pbm); | |
4333 | 6549 } |
4916 | 6550 } |
6551 | |
4333 | 6552 return m; |
6553 } | |
6554 | |
5575 | 6555 static void oscar_format_screenname(GaimConnection *gc, const char *nick) { |
7283 | 6556 OscarData *od = gc->proto_data; |
5575 | 6557 if (!aim_sncmp(gaim_account_get_username(gaim_connection_get_account(gc)), nick)) { |
4333 | 6558 if (!aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH)) { |
6559 od->setnick = TRUE; | |
6560 od->newsn = g_strdup(nick); | |
6561 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
6562 } else { | |
6563 aim_admin_setnick(od->sess, aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH), nick); | |
6564 } | |
6565 } else { | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
6566 gaim_notify_error(gc, NULL, _("The new formatting is invalid."), |
8152 | 6567 _("Screen name formatting can change only capitalization and whitespace.")); |
4333 | 6568 } |
6569 } | |
6570 | |
5575 | 6571 static void oscar_show_format_screenname(GaimConnection *gc) |
4333 | 6572 { |
8152 | 6573 gaim_request_input(gc, NULL, _("New screen name formatting:"), NULL, |
8697 | 6574 gaim_connection_get_display_name(gc), FALSE, FALSE, NULL, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
6575 _("OK"), G_CALLBACK(oscar_format_screenname), |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
6576 _("Cancel"), NULL, |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
6577 gc); |
4333 | 6578 } |
6579 | |
5575 | 6580 static void oscar_confirm_account(GaimConnection *gc) |
4333 | 6581 { |
7283 | 6582 OscarData *od = gc->proto_data; |
4333 | 6583 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); |
6584 | |
6585 if (conn) { | |
6586 aim_admin_reqconfirm(od->sess, conn); | |
6587 } else { | |
6588 od->conf = TRUE; | |
6589 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
6590 } | |
6591 } | |
6592 | |
5575 | 6593 static void oscar_show_email(GaimConnection *gc) |
4333 | 6594 { |
7283 | 6595 OscarData *od = gc->proto_data; |
4333 | 6596 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); |
6597 | |
6598 if (conn) { | |
6599 aim_admin_getinfo(od->sess, conn, 0x11); | |
6600 } else { | |
6601 od->reqemail = TRUE; | |
6602 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
6603 } | |
6604 } | |
6605 | |
5575 | 6606 static void oscar_change_email(GaimConnection *gc, const char *email) |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6607 { |
7283 | 6608 OscarData *od = gc->proto_data; |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6609 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
|
6610 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6611 if (conn) { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6612 aim_admin_setemail(od->sess, conn, email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6613 } else { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6614 od->setemail = TRUE; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6615 od->email = g_strdup(email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6616 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6617 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6618 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6619 |
5575 | 6620 static void oscar_show_change_email(GaimConnection *gc) |
4333 | 6621 { |
6035
8c44020a958e
[gaim-migrate @ 6485]
Christian Hammond <chipx86@chipx86.com>
parents:
6029
diff
changeset
|
6622 gaim_request_input(gc, NULL, _("Change Address To:"), NULL, NULL, |
8697 | 6623 FALSE, FALSE, NULL, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
6624 _("OK"), G_CALLBACK(oscar_change_email), |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
6625 _("Cancel"), NULL, |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
6626 gc); |
4333 | 6627 } |
6628 | |
5575 | 6629 static void oscar_show_awaitingauth(GaimConnection *gc) |
4333 | 6630 { |
7283 | 6631 OscarData *od = gc->proto_data; |
4333 | 6632 gchar *nombre, *text, *tmp; |
6695 | 6633 GaimBlistNode *gnode, *cnode, *bnode; |
4333 | 6634 int num=0; |
6635 | |
6873 | 6636 text = g_strdup(""); |
4333 | 6637 |
4785 | 6638 for (gnode = gaim_get_blist()->root; gnode; gnode = gnode->next) { |
6695 | 6639 GaimGroup *group = (GaimGroup *)gnode; |
4785 | 6640 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) |
6641 continue; | |
6695 | 6642 for (cnode = gnode->child; cnode; cnode = cnode->next) { |
6643 if(!GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
4785 | 6644 continue; |
6695 | 6645 for (bnode = cnode->child; bnode; bnode = bnode->next) { |
6646 GaimBuddy *buddy = (GaimBuddy *)bnode; | |
6647 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
6648 continue; | |
6649 if (buddy->account == gc->account && aim_ssi_waitingforauth(od->sess->ssi.local, group->name, buddy->name)) { | |
6650 if (gaim_get_buddy_alias_only(buddy)) | |
6651 nombre = g_strdup_printf(" %s (%s)", buddy->name, gaim_get_buddy_alias_only(buddy)); | |
6652 else | |
6653 nombre = g_strdup_printf(" %s", buddy->name); | |
6873 | 6654 tmp = g_strdup_printf("%s%s<br>", text, nombre); |
6695 | 6655 g_free(text); |
6656 text = tmp; | |
6657 g_free(nombre); | |
6658 num++; | |
6659 } | |
4333 | 6660 } |
2979 | 6661 } |
4333 | 6662 } |
6663 | |
6664 if (!num) { | |
6665 g_free(text); | |
6873 | 6666 text = g_strdup(_("<i>you are not waiting for authorization</i>")); |
6667 } | |
6668 | |
6669 gaim_notify_formatted(gc, NULL, _("You are awaiting authorization from " | |
6670 "the following buddies"), _("You can re-request " | |
6671 "authorization from these buddies by " | |
6672 "right-clicking on them and selecting " | |
6673 "\"Re-request Authorization.\""), text, NULL, NULL); | |
4333 | 6674 g_free(text); |
2979 | 6675 } |
6676 | |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6677 static void search_by_email_cb(GaimConnection *gc, const char *email) |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6678 { |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6679 serv_dir_search(gc, "", "", "", "", "", "", "", email); |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6680 } |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6681 |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6682 static void oscar_show_find_email(GaimConnection *gc) |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6683 { |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6684 gaim_request_input(gc, _("Find Buddy by E-mail"), |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6685 _("Search for a buddy by e-mail address"), |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6686 _("Type the e-mail address of the buddy you are " |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6687 "searching for."), |
8697 | 6688 NULL, FALSE, FALSE, NULL, |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6689 _("Search"), G_CALLBACK(search_by_email_cb), |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6690 _("Cancel"), NULL, gc); |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6691 } |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6692 |
7366 | 6693 #if 0 |
5917 | 6694 static void oscar_setavailmsg(GaimConnection *gc, char *text) { |
7283 | 6695 OscarData *od = (OscarData *)gc->proto_data; |
5917 | 6696 |
7334 | 6697 aim_locate_setprofile(od->sess, NULL, NULL, 0, NULL, "", 0); |
5917 | 6698 aim_srv_setavailmsg(od->sess, text); |
6699 } | |
6700 | |
6701 static void oscar_show_setavailmsg(GaimConnection *gc) | |
6702 { | |
7313 | 6703 gaim_request_input(gc, NULL, _("Available Message:"), NULL, |
6704 _("I'm doing work and hoping for a distraction--IM me!"), | |
8697 | 6705 TRUE, FALSE, NULL, |
5917 | 6706 _("OK"), G_CALLBACK(oscar_setavailmsg), |
6707 _("Cancel"), NULL, | |
6708 gc); | |
6709 } | |
7366 | 6710 #endif |
5917 | 6711 |
7067
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
6712 static void oscar_show_set_info(GaimConnection *gc) |
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
6713 { |
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
6714 gaim_account_request_change_user_info(gaim_connection_get_account(gc)); |
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
6715 } |
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
6716 |
8576 | 6717 static void oscar_show_set_info_icqurl(GaimConnection *gc) |
6718 { | |
6719 gaim_notify_uri(gc, "http://web.icq.com/whitepages/login/1,,,00.html"); | |
6720 } | |
6721 | |
7063
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
6722 static void oscar_change_pass(GaimConnection *gc) |
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
6723 { |
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
6724 gaim_account_request_change_password(gaim_connection_get_account(gc)); |
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
6725 } |
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
6726 |
5575 | 6727 static void oscar_show_chpassurl(GaimConnection *gc) |
4333 | 6728 { |
7283 | 6729 OscarData *od = gc->proto_data; |
5575 | 6730 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
|
6731 gaim_notify_uri(gc, substituted); |
5517 | 6732 g_free(substituted); |
4333 | 6733 } |
6734 | |
7026 | 6735 static void oscar_show_imforwardingurl(GaimConnection *gc) |
6736 { | |
6737 gaim_notify_uri(gc, "http://mymobile.aol.com/dbreg/register?action=imf&clientID=1"); | |
6738 } | |
6739 | |
5842 | 6740 static void oscar_set_icon(GaimConnection *gc, const char *iconfile) |
6741 { | |
7283 | 6742 OscarData *od = gc->proto_data; |
5844 | 6743 aim_session_t *sess = od->sess; |
5842 | 6744 FILE *file; |
6745 struct stat st; | |
5844 | 6746 |
6039 | 6747 if (iconfile == NULL) { |
8363 | 6748 aim_ssi_delicon(od->sess); |
6039 | 6749 } else if (!stat(iconfile, &st)) { |
5842 | 6750 char *buf = g_malloc(st.st_size); |
6751 file = fopen(iconfile, "rb"); | |
6752 if (file) { | |
6052 | 6753 md5_state_t *state; |
6039 | 6754 char md5[16]; |
5842 | 6755 int len = fread(buf, 1, st.st_size, file); |
6039 | 6756 fclose(file); |
6052 | 6757 state = g_malloc(sizeof(md5_state_t)); |
5842 | 6758 md5_init(state); |
6759 md5_append(state, buf, len); | |
6760 md5_finish(state, md5); | |
6761 g_free(state); | |
6762 aim_ssi_seticon(sess, md5, 16); | |
6763 } else | |
8660 | 6764 gaim_debug_error("oscar", |
5842 | 6765 "Can't open buddy icon file!\n"); |
6766 g_free(buf); | |
6767 } else | |
8660 | 6768 gaim_debug_error("oscar", |
5842 | 6769 "Can't stat buddy icon file!\n"); |
6770 } | |
6771 | |
6772 | |
5575 | 6773 static GList *oscar_actions(GaimConnection *gc) |
2086 | 6774 { |
7283 | 6775 OscarData *od = gc->proto_data; |
4333 | 6776 struct proto_actions_menu *pam; |
6777 GList *m = NULL; | |
6778 | |
6779 pam = g_new0(struct proto_actions_menu, 1); | |
7853 | 6780 pam->label = _("Set User Info..."); |
7067
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
6781 pam->callback = oscar_show_set_info; |
4333 | 6782 pam->gc = gc; |
6783 m = g_list_append(m, pam); | |
6784 | |
8576 | 6785 if (od->icq) { |
6786 pam = g_new0(struct proto_actions_menu, 1); | |
6787 pam->label = _("Set User Info (URL)..."); | |
6788 pam->callback = oscar_show_set_info_icqurl; | |
6789 pam->gc = gc; | |
6790 m = g_list_append(m, pam); | |
6791 } | |
6792 | |
7366 | 6793 #if 0 |
5917 | 6794 pam = g_new0(struct proto_actions_menu, 1); |
7853 | 6795 pam->label = _("Set Available Message..."); |
5917 | 6796 pam->callback = oscar_show_setavailmsg; |
6797 pam->gc = gc; | |
6798 m = g_list_append(m, pam); | |
7366 | 6799 #endif |
5917 | 6800 |
5238 | 6801 pam = g_new0(struct proto_actions_menu, 1); |
7853 | 6802 pam->label = _("Change Password..."); |
7063
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
6803 pam->callback = oscar_change_pass; |
5238 | 6804 pam->gc = gc; |
6805 m = g_list_append(m, pam); | |
4617 | 6806 |
6807 if (od->sess->authinfo->chpassurl) { | |
6808 pam = g_new0(struct proto_actions_menu, 1); | |
6809 pam->label = _("Change Password (URL)"); | |
6810 pam->callback = oscar_show_chpassurl; | |
6811 pam->gc = gc; | |
6812 m = g_list_append(m, pam); | |
6813 } | |
6814 | |
7026 | 6815 if (od->sess->authinfo->chpassurl) { |
6816 pam = g_new0(struct proto_actions_menu, 1); | |
6817 pam->label = _("Configure IM Forwarding (URL)"); | |
6818 pam->callback = oscar_show_imforwardingurl; | |
6819 pam->gc = gc; | |
6820 m = g_list_append(m, pam); | |
6821 } | |
6822 | |
5238 | 6823 if (!od->icq) { |
4617 | 6824 /* AIM actions */ |
6825 m = g_list_append(m, NULL); | |
4333 | 6826 |
5917 | 6827 pam = g_new0(struct proto_actions_menu, 1); |
8152 | 6828 pam->label = _("Format Screen Name..."); |
5844 | 6829 pam->callback = oscar_show_format_screenname; |
4333 | 6830 pam->gc = gc; |
6831 m = g_list_append(m, pam); | |
6832 | |
6833 pam = g_new0(struct proto_actions_menu, 1); | |
6834 pam->label = _("Confirm Account"); | |
6835 pam->callback = oscar_confirm_account; | |
6836 pam->gc = gc; | |
6837 m = g_list_append(m, pam); | |
6838 | |
6839 pam = g_new0(struct proto_actions_menu, 1); | |
7880 | 6840 pam->label = _("Display Currently Registered Address"); |
4333 | 6841 pam->callback = oscar_show_email; |
6842 pam->gc = gc; | |
6843 m = g_list_append(m, pam); | |
6844 | |
6845 pam = g_new0(struct proto_actions_menu, 1); | |
7880 | 6846 pam->label = _("Change Currently Registered Address..."); |
4333 | 6847 pam->callback = oscar_show_change_email; |
6848 pam->gc = gc; | |
6849 m = g_list_append(m, pam); | |
2086 | 6850 } |
4333 | 6851 |
6852 m = g_list_append(m, NULL); | |
6853 | |
6854 pam = g_new0(struct proto_actions_menu, 1); | |
6855 pam->label = _("Show Buddies Awaiting Authorization"); | |
6856 pam->callback = oscar_show_awaitingauth; | |
6857 pam->gc = gc; | |
6858 m = g_list_append(m, pam); | |
6859 | |
2086 | 6860 m = g_list_append(m, NULL); |
4333 | 6861 |
6862 pam = g_new0(struct proto_actions_menu, 1); | |
7853 | 6863 pam->label = _("Search for Buddy by Email..."); |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6864 pam->callback = oscar_show_find_email; |
4333 | 6865 pam->gc = gc; |
6866 m = g_list_append(m, pam); | |
6867 | |
8591 | 6868 #if 0 |
6869 pam = g_new0(struct proto_actions_menu, 1); | |
4333 | 6870 pam->label = _("Search for Buddy by Information"); |
6871 pam->callback = show_find_info; | |
6872 pam->gc = gc; | |
8591 | 6873 m = g_list_append(m, pam); |
6874 #endif | |
2086 | 6875 |
6876 return m; | |
6877 } | |
6878 | |
5575 | 6879 static void oscar_change_passwd(GaimConnection *gc, const char *old, const char *new) |
2086 | 6880 { |
7283 | 6881 OscarData *od = gc->proto_data; |
4617 | 6882 |
6883 if (od->icq) { | |
6884 aim_icq_changepasswd(od->sess, new); | |
2086 | 6885 } else { |
4617 | 6886 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); |
6887 if (conn) { | |
6888 aim_admin_changepasswd(od->sess, conn, new, old); | |
6889 } else { | |
6890 od->chpass = TRUE; | |
6891 od->oldp = g_strdup(old); | |
6892 od->newp = g_strdup(new); | |
6893 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
6894 } | |
2086 | 6895 } |
6896 } | |
6897 | |
6059 | 6898 static void oscar_convo_closed(GaimConnection *gc, const char *who) |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6899 { |
7283 | 6900 OscarData *od = gc->proto_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6901 struct direct_im *dim = find_direct_im(od, who); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6902 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6903 if (!dim) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6904 return; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6905 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6906 od->direct_ims = g_slist_remove(od->direct_ims, dim); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6907 gaim_input_remove(dim->watcher); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6908 aim_conn_kill(od->sess, &dim->conn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6909 g_free(dim); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6910 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6911 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6912 static GaimPluginProtocolInfo prpl_info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6913 { |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6914 OPT_PROTO_MAIL_CHECK | OPT_PROTO_BUDDY_ICON | OPT_PROTO_IM_IMAGE, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6915 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6916 NULL, |
8170 | 6917 NULL, |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6918 oscar_list_icon, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6919 oscar_list_emblems, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6920 oscar_status_text, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6921 oscar_tooltip_text, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6922 oscar_away_states, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6923 oscar_actions, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6924 oscar_buddy_menu, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6925 oscar_chat_info, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6926 oscar_login, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6927 oscar_close, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6928 oscar_send_im, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6929 oscar_set_info, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6930 oscar_send_typing, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6931 oscar_get_info, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6932 oscar_set_away, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6933 oscar_set_dir, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6934 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6935 oscar_dir_search, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6936 oscar_set_idle, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6937 oscar_change_passwd, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6938 oscar_add_buddy, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6939 oscar_add_buddies, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6940 oscar_remove_buddy, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6941 oscar_remove_buddies, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6942 oscar_add_permit, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6943 oscar_add_deny, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6944 oscar_rem_permit, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6945 oscar_rem_deny, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6946 oscar_set_permit_deny, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6947 oscar_warn, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6948 oscar_join_chat, |
8562 | 6949 NULL, /* reject chat invite */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6950 oscar_chat_invite, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6951 oscar_chat_leave, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6952 NULL, |
8219 | 6953 oscar_send_chat, |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6954 oscar_keepalive, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6955 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6956 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6957 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6958 #ifndef NOSSI |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6959 oscar_alias_buddy, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6960 oscar_move_buddy, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6961 oscar_rename_group, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6962 #else |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6963 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6964 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6965 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6966 #endif |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6967 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6968 oscar_convo_closed, |
5842 | 6969 NULL, |
8586 | 6970 oscar_set_icon, |
8589 | 6971 NULL, |
6972 NULL, | |
6973 NULL, | |
6974 NULL, | |
6975 NULL, | |
6976 NULL, | |
6977 NULL, | |
6978 NULL | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6979 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6980 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6981 static GaimPluginInfo info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6982 { |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6983 2, /**< api_version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6984 GAIM_PLUGIN_PROTOCOL, /**< type */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6985 NULL, /**< ui_requirement */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6986 0, /**< flags */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6987 NULL, /**< dependencies */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6988 GAIM_PRIORITY_DEFAULT, /**< priority */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6989 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6990 "prpl-oscar", /**< id */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6991 "AIM/ICQ", /**< name */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6992 VERSION, /**< version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6993 /** summary */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6994 N_("AIM/ICQ Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6995 /** description */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6996 N_("AIM/ICQ Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6997 NULL, /**< author */ |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6350
diff
changeset
|
6998 GAIM_WEBSITE, /**< homepage */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6999 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7000 NULL, /**< load */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7001 NULL, /**< unload */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7002 NULL, /**< destroy */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7003 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7004 NULL, /**< ui_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7005 &prpl_info /**< extra_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7006 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7007 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7008 static void |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5917
diff
changeset
|
7009 init_plugin(GaimPlugin *plugin) |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7010 { |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
7011 GaimAccountOption *option; |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
7012 |
5685
43ea75092684
[gaim-migrate @ 6106]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
7013 option = gaim_account_option_string_new(_("Auth host"), "server", |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
7014 "login.oscar.aol.com"); |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
7015 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
7016 option); |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
7017 |
5685
43ea75092684
[gaim-migrate @ 6106]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
7018 option = gaim_account_option_int_new(_("Auth port"), "port", 5190); |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
7019 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
7020 option); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7021 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7022 my_protocol = plugin; |
2086 | 7023 } |
7024 | |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5917
diff
changeset
|
7025 GAIM_INIT_PLUGIN(oscar, init_plugin, info); |