Mercurial > pidgin.yaz
annotate src/protocols/oscar/oscar.c @ 8713:7024b595b6ae
[gaim-migrate @ 9467]
" Expansion from my original protocol prefs to plugin prefs.
Things are handled a bit different in this iteration of
it, but I have already modified msn and jabber to use
it, and included an example plugin to show how to use
it. It will also generate pages with doxygen. The
example plugin doesn't not contain any translatable
strings seeing as we're in the string freeze. And it's
an example, whats the point of translating it..?
Also, I tweaked the documentation for 2 functions in
gtkprefs, gaim_gtk_prefs_dropdown and
gaim_gtk_prefs_dropdown_from_list. Nothing major in
that, just made it say that the list should be a list
of pairs label/value.
Also there's 5 new files that will need to be added to cvs:
src/pluginpref.h
src/pluginpref.c
src/gtkpluginpref.h
src/gtkpluginpref.c
plugins/pluginpref_example.c
the tarball already has them structured correctly and
contains the diff" --Gary Kramlich - amc_grim
and the german translator pointed out that sean missed the novell file for POTFILES.in
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Mon, 19 Apr 2004 21:12:45 +0000 |
parents | f71c0a3fcb3d |
children | 18cfabf507d5 |
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; |
8708 | 2453 GaimAccount *account = gaim_connection_get_account(gc); |
7475 | 2454 gchar *tmp; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
2455 GaimConvImFlags flags = 0; |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
2456 gsize convlen; |
3659 | 2457 GError *err = NULL; |
4738 | 2458 struct buddyinfo *bi; |
5575 | 2459 const char *iconfile; |
4738 | 2460 |
8708 | 2461 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(account, userinfo->sn)); |
4738 | 2462 if (!bi) { |
2463 bi = g_new0(struct buddyinfo, 1); | |
8708 | 2464 g_hash_table_insert(od->buddyinfo, g_strdup(gaim_normalize(account, userinfo->sn)), bi); |
4738 | 2465 } |
2273
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
2466 |
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
2467 if (args->icbmflags & AIM_IMFLAGS_AWAY) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
2468 flags |= GAIM_CONV_IM_AUTO_RESP; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2469 |
4738 | 2470 if (args->icbmflags & AIM_IMFLAGS_TYPINGNOT) |
2471 bi->typingnot = TRUE; | |
2472 else | |
2473 bi->typingnot = FALSE; | |
2474 | |
4380 | 2475 if ((args->icbmflags & AIM_IMFLAGS_HASICON) && (args->iconlen) && (args->iconsum) && (args->iconstamp)) { |
8660 | 2476 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2477 "%s has an icon\n", userinfo->sn); |
4738 | 2478 if ((args->iconlen != bi->ico_len) || (args->iconsum != bi->ico_csum) || (args->iconstamp != bi->ico_time)) { |
2479 bi->ico_need = TRUE; | |
2480 bi->ico_len = args->iconlen; | |
2481 bi->ico_csum = args->iconsum; | |
2482 bi->ico_time = args->iconstamp; | |
2246
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 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2485 |
8708 | 2486 if ((iconfile = gaim_account_get_buddy_icon(account)) && |
7406 | 2487 (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
|
2488 FILE *file; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2489 struct stat st; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2490 |
5575 | 2491 if (!stat(iconfile, &st)) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2492 char *buf = g_malloc(st.st_size); |
5575 | 2493 file = fopen(iconfile, "rb"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2494 if (file) { |
2603
24664768a739
[gaim-migrate @ 2616]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2597
diff
changeset
|
2495 int len = fread(buf, 1, st.st_size, file); |
8660 | 2496 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2497 "Sending buddy icon to %s (%d bytes, " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2498 "%lu reported)\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2499 userinfo->sn, len, st.st_size); |
4617 | 2500 aim_im_sendch2_icon(sess, userinfo->sn, buf, st.st_size, |
2501 st.st_mtime, aimutil_iconsum(buf, st.st_size)); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2502 fclose(file); |
2336
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
2503 } else |
8660 | 2504 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2505 "Can't open buddy icon file!\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2506 g_free(buf); |
2336
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
2507 } else |
8660 | 2508 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2509 "Can't stat buddy icon file!\n"); |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2510 } |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2511 |
8660 | 2512 gaim_debug_misc("oscar", |
8623 | 2513 "Received message from %s with charset %hu %hu\n", |
2514 userinfo->sn, args->charset, args->charsubset); | |
2515 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2516 if (args->icbmflags & AIM_IMFLAGS_UNICODE) { |
3722 | 2517 /* This message is marked as UNICODE, so we have to |
2518 * convert it to utf-8 before handing it to the gaim core. | |
2519 * This conversion should *never* fail, if it does it | |
2520 * means that either the incoming ICBM is corrupted or | |
4662 | 2521 * there is something we don't understand about it. |
2522 * For the record, AIM Unicode is big-endian UCS-2 */ | |
2523 | |
8660 | 2524 gaim_debug_info("oscar", "Received UNICODE IM\n"); |
4121 | 2525 |
2526 if (!args->msg || !args->msglen) | |
2527 return 1; | |
4641 | 2528 |
3659 | 2529 tmp = g_convert(args->msg, args->msglen, "UTF-8", "UCS-2BE", NULL, &convlen, &err); |
2530 if (err) { | |
8660 | 2531 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2532 "Unicode IM conversion: %s\n", err->message); |
7475 | 2533 tmp = g_strdup(_("(There was an error receiving this message)")); |
4800 | 2534 g_error_free(err); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2535 } |
3722 | 2536 } else { |
3850 | 2537 /* This will get executed for both AIM_IMFLAGS_ISO_8859_1 and |
3722 | 2538 * unflagged messages, which are ASCII. That's OK because |
2539 * ASCII is a strict subset of ISO-8859-1; this should | |
2540 * help with compatibility with old, broken versions of | |
2541 * gaim (everything before 0.60) and other broken clients | |
2542 * that will happily send ISO-8859-1 without marking it as | |
2543 * such */ | |
4662 | 2544 if (args->icbmflags & AIM_IMFLAGS_ISO_8859_1) |
8660 | 2545 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2546 "Received ISO-8859-1 IM\n"); |
4121 | 2547 |
2548 if (!args->msg || !args->msglen) | |
2549 return 1; | |
2550 | |
3659 | 2551 tmp = g_convert(args->msg, args->msglen, "UTF-8", "ISO-8859-1", NULL, &convlen, &err); |
2552 if (err) { | |
8660 | 2553 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2554 "ISO-8859-1 IM conversion: %s\n", err->message); |
7475 | 2555 tmp = g_strdup(_("(There was an error receiving this message)")); |
4800 | 2556 g_error_free(err); |
3659 | 2557 } |
3642 | 2558 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2559 |
8666 | 2560 /* |
8708 | 2561 * If the message is being sent to an ICQ user then escape any HTML, |
2562 * because HTML should not be sent over ICQ as a means to format a message. | |
8666 | 2563 * SIM is the only client we know of that sends HTML, everything else |
2564 * (ie. official clients) use RTF. Please let us know if this is | |
2565 * incorrect. | |
2566 */ | |
8708 | 2567 if (isdigit(gaim_account_get_username(account)[0])) { |
8666 | 2568 gchar *tmp2 = gaim_escape_html(tmp); |
8493 | 2569 g_free(tmp); |
2570 tmp = tmp2; | |
2571 } | |
2572 | |
6982 | 2573 serv_got_im(gc, userinfo->sn, tmp, flags, time(NULL)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2574 g_free(tmp); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2575 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2576 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2577 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2578 |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2579 static int incomingim_chan2(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args) { |
5575 | 2580 GaimConnection *gc = sess->aux_data; |
7283 | 2581 OscarData *od = gc->proto_data; |
5575 | 2582 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
|
2583 |
4121 | 2584 if (!args) |
2585 return 0; | |
4194 | 2586 |
8660 | 2587 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2588 "rendezvous with %s, status is %hu\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2589 userinfo->sn, args->status); |
2869 | 2590 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2591 if (args->reqclass & AIM_CAPS_CHAT) { |
4121 | 2592 char *name; |
5234 | 2593 GHashTable *components; |
2594 | |
4121 | 2595 if (!args->info.chat.roominfo.name || !args->info.chat.roominfo.exchange || !args->msg) |
2596 return 1; | |
5234 | 2597 components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, |
2598 g_free); | |
4121 | 2599 name = extract_name(args->info.chat.roominfo.name); |
5234 | 2600 g_hash_table_replace(components, g_strdup("room"), g_strdup(name ? name : args->info.chat.roominfo.name)); |
2601 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
|
2602 serv_got_chat_invite(gc, |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2603 name ? name : args->info.chat.roominfo.name, |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2604 userinfo->sn, |
6059 | 2605 args->msg, |
5234 | 2606 components); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2607 if (name) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2608 g_free(name); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2609 } else if (args->reqclass & AIM_CAPS_SENDFILE) { |
4617 | 2610 /* BBB */ |
2611 if (args->status == AIM_RENDEZVOUS_PROPOSE) { | |
2612 /* Someone wants to send a file (or files) to us */ | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2613 GaimXfer *xfer; |
5146 | 2614 struct aim_oft_info *oft_info; |
2615 | |
2616 if (!args->cookie || !args->port || !args->verifiedip || | |
2617 !args->info.sendfile.filename || !args->info.sendfile.totsize || | |
4656 | 2618 !args->info.sendfile.totfiles || !args->reqclass) { |
8660 | 2619 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2620 "%s tried to send you a file with incomplete " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2621 "information.\n", userinfo->sn); |
5146 | 2622 if (args->proxyip) |
8660 | 2623 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2624 "IP for a proxy server was given. Gaim " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2625 "does not support this yet.\n"); |
4617 | 2626 return 1; |
4656 | 2627 } |
4617 | 2628 |
2629 if (args->info.sendfile.subtype == AIM_OFT_SUBTYPE_SEND_DIR) { | |
2630 /* last char of the ft req is a star, they are sending us a | |
2631 * directory -- remove the star and trailing slash so we dont save | |
2632 * directories that look like 'dirname\*' -- arl */ | |
2633 char *tmp = strrchr(args->info.sendfile.filename, '\\'); | |
2634 if (tmp && (tmp[1] == '*')) { | |
2635 tmp[0] = '\0'; | |
2636 } | |
8660 | 2637 gaim_debug_warning("oscar", |
8446 | 2638 "We're receiving a whole directory! What fun! " |
2639 "Especially since we don't support that!\n"); | |
4617 | 2640 } |
2641 | |
2642 /* Build the file transfer handle */ | |
2643 xfer = gaim_xfer_new(gc->account, GAIM_XFER_RECEIVE, userinfo->sn); | |
5163 | 2644 xfer->remote_ip = g_strdup(args->verifiedip); |
5146 | 2645 xfer->remote_port = args->port; |
4617 | 2646 gaim_xfer_set_filename(xfer, args->info.sendfile.filename); |
2647 gaim_xfer_set_size(xfer, args->info.sendfile.totsize); | |
5146 | 2648 |
2649 /* Create the oscar-specific data */ | |
5163 | 2650 oft_info = aim_oft_createinfo(od->sess, args->cookie, userinfo->sn, args->clientip, xfer->remote_port, 0, 0, NULL); |
4898 | 2651 if (args->proxyip) |
5146 | 2652 oft_info->proxyip = g_strdup(args->proxyip); |
4898 | 2653 if (args->verifiedip) |
5146 | 2654 oft_info->verifiedip = g_strdup(args->verifiedip); |
2655 xfer->data = oft_info; | |
4617 | 2656 |
2657 /* Setup our I/O op functions */ | |
8446 | 2658 gaim_xfer_set_init_fnc(xfer, oscar_xfer_init_recv); |
4617 | 2659 gaim_xfer_set_end_fnc(xfer, oscar_xfer_end); |
8446 | 2660 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
|
2661 gaim_xfer_set_cancel_recv_fnc(xfer, oscar_xfer_cancel_recv); |
8446 | 2662 gaim_xfer_set_ack_fnc(xfer, oscar_xfer_ack_recv); |
4617 | 2663 |
2664 /* | |
2665 * XXX - Should do something with args->msg, args->encoding, and args->language | |
2666 * probably make it apply to all ch2 messages. | |
3752 | 2667 */ |
4617 | 2668 |
2669 /* Keep track of this transfer for later */ | |
2670 od->file_transfers = g_slist_append(od->file_transfers, xfer); | |
2671 | |
2672 /* Now perform the request */ | |
2673 gaim_xfer_request(xfer); | |
2674 } else if (args->status == AIM_RENDEZVOUS_CANCEL) { | |
2675 /* The other user wants to cancel a file transfer */ | |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2676 GaimXfer *xfer; |
8660 | 2677 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2678 "AAA - File transfer canceled by remote user\n"); |
4617 | 2679 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
|
2680 gaim_xfer_cancel_remote(xfer); |
4617 | 2681 } else if (args->status == AIM_RENDEZVOUS_ACCEPT) { |
2682 /* | |
2683 * This gets sent by the receiver of a file | |
2684 * as they connect directly to us. If we don't | |
2685 * get this, then maybe a third party connected | |
2686 * to us, and we shouldn't send them anything. | |
2687 */ | |
2688 } else { | |
8660 | 2689 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2690 "unknown rendezvous status!\n"); |
3630 | 2691 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2692 } else if (args->reqclass & AIM_CAPS_GETFILE) { |
8092 | 2693 } else if (args->reqclass & AIM_CAPS_TALK) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2694 } else if (args->reqclass & AIM_CAPS_BUDDYICON) { |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
2695 gaim_buddy_icons_set_for_user(gaim_connection_get_account(gc), |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
2696 userinfo->sn, args->info.icon.icon, |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
2697 args->info.icon.length); |
6871 | 2698 } else if (args->reqclass & AIM_CAPS_DIRECTIM) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2699 struct ask_direct *d = g_new0(struct ask_direct, 1); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2700 char buf[256]; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2701 |
4212 | 2702 if (!args->verifiedip) { |
8660 | 2703 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2704 "directim kill blocked (%s)\n", userinfo->sn); |
4650 | 2705 return 1; |
4212 | 2706 } |
2707 | |
8660 | 2708 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2709 "%s received direct im request from %s (%s)\n", |
5575 | 2710 username, userinfo->sn, args->verifiedip); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2711 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2712 d->gc = gc; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2713 d->sn = g_strdup(userinfo->sn); |
8552 | 2714 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
|
2715 memcpy(d->cookie, args->cookie, 8); |
5575 | 2716 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
|
2717 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2718 gaim_request_action(gc, NULL, buf, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2719 _("This requires a direct connection between " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2720 "the two computers and is necessary for IM " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2721 "Images. Because your IP address will be " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2722 "revealed, this may be considered a privacy " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2723 "risk."), 0, d, 2, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2724 _("Connect"), G_CALLBACK(accept_direct_im), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2725 _("Cancel"), G_CALLBACK(cancel_direct_im)); |
8708 | 2726 } else if (args->reqclass & AIM_CAPS_ICQSERVERRELAY) { |
2727 gaim_debug_error("oscar", "Got an ICQ Server Relay message of type %d\n", args->info.rtfmsg.msgtype); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2728 } else { |
8660 | 2729 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2730 "Unknown reqclass %hu\n", args->reqclass); |
2246
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 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2733 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2734 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2735 |
3453 | 2736 /* |
4230 | 2737 * Authorization Functions |
2738 * Most of these are callbacks from dialogs. They're used by both | |
2739 * methods of authorization (SSI and old-school channel 4 ICBM) | |
3453 | 2740 */ |
4269 | 2741 /* When you ask other people for authorization */ |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2742 static void gaim_auth_request(struct name_data *data, char *msg) { |
5575 | 2743 GaimConnection *gc = data->gc; |
4244 | 2744 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2745 if (g_list_find(gaim_connections_get_all(), gc)) { |
7283 | 2746 OscarData *od = gc->proto_data; |
6695 | 2747 GaimBuddy *buddy = gaim_find_buddy(gc->account, data->name); |
2748 GaimGroup *group = gaim_find_buddys_group(buddy); | |
4244 | 2749 if (buddy && group) { |
8660 | 2750 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2751 "ssi: adding buddy %s to group %s\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2752 buddy->name, group->name); |
4889 | 2753 aim_ssi_sendauthrequest(od->sess, data->name, msg ? msg : _("Please authorize me so I can add you to my buddy list.")); |
4269 | 2754 if (!aim_ssi_itemlist_finditem(od->sess->ssi.local, group->name, buddy->name, AIM_SSI_TYPE_BUDDY)) |
4889 | 2755 aim_ssi_addbuddy(od->sess, buddy->name, group->name, gaim_get_buddy_alias_only(buddy), NULL, NULL, 1); |
4244 | 2756 } |
4230 | 2757 } |
4337 | 2758 } |
2759 | |
2760 static void gaim_auth_request_msgprompt(struct name_data *data) { | |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2761 gaim_request_input(data->gc, NULL, _("Authorization Request Message:"), |
8697 | 2762 NULL, _("Please authorize me!"), TRUE, FALSE, NULL, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2763 _("OK"), G_CALLBACK(gaim_auth_request), |
5836 | 2764 _("Cancel"), G_CALLBACK(oscar_free_name_data), |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2765 data); |
4230 | 2766 } |
2767 | |
2768 static void gaim_auth_dontrequest(struct name_data *data) { | |
5575 | 2769 GaimConnection *gc = data->gc; |
4244 | 2770 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2771 if (g_list_find(gaim_connections_get_all(), gc)) { |
8151 | 2772 /* Remove from local list */ |
2773 GaimBuddy *b = gaim_find_buddy(gaim_connection_get_account(gc), data->name); | |
2774 gaim_blist_remove_buddy(b); | |
4244 | 2775 } |
2776 | |
5836 | 2777 oscar_free_name_data(data); |
4230 | 2778 } |
2779 | |
5575 | 2780 static void gaim_auth_sendrequest(GaimConnection *gc, const char *name) { |
4269 | 2781 struct name_data *data = g_new(struct name_data, 1); |
6695 | 2782 GaimBuddy *buddy; |
4269 | 2783 gchar *dialog_msg, *nombre; |
2784 | |
4687 | 2785 buddy = gaim_find_buddy(gc->account, name); |
2786 if (buddy && (gaim_get_buddy_alias_only(buddy))) | |
2787 nombre = g_strdup_printf("%s (%s)", name, gaim_get_buddy_alias_only(buddy)); | |
4269 | 2788 else |
4830 | 2789 nombre = NULL; |
2790 | |
2791 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 | 2792 data->gc = gc; |
2793 data->name = g_strdup(name); | |
2794 data->nick = NULL; | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2795 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2796 gaim_request_action(gc, NULL, _("Request Authorization"), dialog_msg, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2797 0, data, 2, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2798 _("Request Authorization"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2799 G_CALLBACK(gaim_auth_request_msgprompt), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2800 _("Cancel"), G_CALLBACK(gaim_auth_dontrequest)); |
4269 | 2801 |
2802 g_free(dialog_msg); | |
2803 g_free(nombre); | |
2804 } | |
2805 | |
4230 | 2806 /* When other people ask you for authorization */ |
2807 static void gaim_auth_grant(struct name_data *data) { | |
5575 | 2808 GaimConnection *gc = data->gc; |
4244 | 2809 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2810 if (g_list_find(gaim_connections_get_all(), gc)) { |
7283 | 2811 OscarData *od = gc->proto_data; |
4236 | 2812 #ifdef NOSSI |
6695 | 2813 GaimBuddy *buddy; |
4244 | 2814 gchar message; |
2815 message = 0; | |
4687 | 2816 buddy = gaim_find_buddy(gc->account, data->name); |
4617 | 2817 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
|
2818 gaim_account_notify_added(gc->account, NULL, data->name, (buddy ? gaim_get_buddy_alias_only(buddy) : NULL), NULL); |
4230 | 2819 #else |
4889 | 2820 aim_ssi_sendauthreply(od->sess, data->name, 0x01, NULL); |
4230 | 2821 #endif |
4244 | 2822 } |
2823 | |
5836 | 2824 oscar_free_name_data(data); |
3141 | 2825 } |
2826 | |
4230 | 2827 /* When other people ask you for authorization */ |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2828 static void gaim_auth_dontgrant(struct name_data *data, char *msg) { |
5575 | 2829 GaimConnection *gc = data->gc; |
4244 | 2830 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2831 if (g_list_find(gaim_connections_get_all(), gc)) { |
7283 | 2832 OscarData *od = gc->proto_data; |
4230 | 2833 #ifdef NOSSI |
4617 | 2834 aim_im_sendch4(od->sess, data->name, AIM_ICQMSG_AUTHDENIED, msg ? msg : _("No reason given.")); |
4230 | 2835 #else |
4889 | 2836 aim_ssi_sendauthreply(od->sess, data->name, 0x00, msg ? msg : _("No reason given.")); |
4230 | 2837 #endif |
4244 | 2838 } |
4337 | 2839 } |
2840 | |
2841 static void gaim_auth_dontgrant_msgprompt(struct name_data *data) { | |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2842 gaim_request_input(data->gc, NULL, _("Authorization Denied Message:"), |
8697 | 2843 NULL, _("No reason given."), TRUE, FALSE, NULL, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2844 _("OK"), G_CALLBACK(gaim_auth_dontgrant), |
5836 | 2845 _("Cancel"), G_CALLBACK(oscar_free_name_data), |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2846 data); |
3141 | 2847 } |
2848 | |
7023 | 2849 /* When someone sends you buddies */ |
2850 static void gaim_icq_buddyadd(struct name_data *data) { | |
5575 | 2851 GaimConnection *gc = data->gc; |
4244 | 2852 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2853 if (g_list_find(gaim_connections_get_all(), gc)) { |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7054
diff
changeset
|
2854 gaim_blist_request_add_buddy(gaim_connection_get_account(gc), data->name, NULL, data->nick); |
4244 | 2855 } |
2856 | |
5836 | 2857 oscar_free_name_data(data); |
3453 | 2858 } |
2859 | |
4075 | 2860 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 | 2861 GaimConnection *gc = sess->aux_data; |
4076 | 2862 gchar **msg1, **msg2; |
2863 GError *err = NULL; | |
6051 | 2864 int i, numtoks; |
4076 | 2865 |
4121 | 2866 if (!args->type || !args->msg || !args->uin) |
2867 return 1; | |
4194 | 2868 |
8660 | 2869 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2870 "Received a channel 4 message of type 0x%02hhx.\n", args->type); |
4076 | 2871 |
2872 /* Split up the message at the delimeter character, then convert each string to UTF-8 */ | |
4173 | 2873 msg1 = g_strsplit(args->msg, "\376", 0); |
6051 | 2874 for (numtoks=0; msg1[numtoks]; numtoks++); |
2875 msg2 = (gchar **)g_malloc((numtoks+1)*sizeof(gchar *)); | |
4076 | 2876 for (i=0; msg1[i]; i++) { |
7478
3c21f3084ff0
[gaim-migrate @ 8091]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
7475
diff
changeset
|
2877 gaim_str_strip_cr(msg1[i]); |
4076 | 2878 msg2[i] = g_convert(msg1[i], strlen(msg1[i]), "UTF-8", "ISO-8859-1", NULL, NULL, &err); |
4800 | 2879 if (err) { |
8660 | 2880 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2881 "Error converting a string from ISO-8859-1 to " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2882 "UTF-8 in oscar ICBM channel 4 parsing\n"); |
4800 | 2883 g_error_free(err); |
2884 } | |
4076 | 2885 } |
2886 msg2[i] = NULL; | |
2887 | |
3952 | 2888 switch (args->type) { |
4173 | 2889 case 0x01: { /* MacICQ message or basic offline message */ |
4076 | 2890 if (i >= 1) { |
5556 | 2891 gchar *uin = g_strdup_printf("%u", args->uin); |
8493 | 2892 gchar *tmp; |
2893 | |
2894 /* If the message came from an ICQ user then escape any HTML */ | |
8501 | 2895 tmp = gaim_escape_html(msg2[0]); |
8493 | 2896 |
4076 | 2897 if (t) { /* This is an offline message */ |
2898 /* I think this timestamp is in UTC, or something */ | |
8514 | 2899 serv_got_im(gc, uin, tmp, 0, t); |
4076 | 2900 } else { /* This is a message from MacICQ/Miranda */ |
8514 | 2901 serv_got_im(gc, uin, tmp, 0, time(NULL)); |
4076 | 2902 } |
2903 g_free(uin); | |
8493 | 2904 g_free(tmp); |
4075 | 2905 } |
3316 | 2906 } break; |
2907 | |
4173 | 2908 case 0x04: { /* Someone sent you a URL */ |
4076 | 2909 if (i >= 2) { |
7385 | 2910 if (msg2[1] != NULL) { |
2911 gchar *uin = g_strdup_printf("%u", args->uin); | |
2912 gchar *message = g_strdup_printf("<A HREF=\"%s\">%s</A>", | |
2913 msg2[1], | |
2914 (msg2[0] && msg2[0][0]) ? msg2[0] : msg2[1]); | |
2915 serv_got_im(gc, uin, message, 0, time(NULL)); | |
2916 g_free(uin); | |
2917 g_free(message); | |
2918 } | |
3453 | 2919 } |
2920 } break; | |
2921 | |
4173 | 2922 case 0x06: { /* Someone requested authorization */ |
4076 | 2923 if (i >= 6) { |
4230 | 2924 struct name_data *data = g_new(struct name_data, 1); |
5556 | 2925 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 | 2926 gaim_debug_info("oscar", |
5556 | 2927 "Received an authorization request from UIN %u\n", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2928 args->uin); |
4076 | 2929 data->gc = gc; |
5556 | 2930 data->name = g_strdup_printf("%u", args->uin); |
4230 | 2931 data->nick = NULL; |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2932 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2933 gaim_request_action(gc, NULL, _("Authorization Request"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2934 dialog_msg, 0, data, 2, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2935 _("Authorize"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2936 G_CALLBACK(gaim_auth_grant), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2937 _("Deny"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2938 G_CALLBACK(gaim_auth_dontgrant_msgprompt)); |
4076 | 2939 g_free(dialog_msg); |
2940 } | |
3141 | 2941 } break; |
2942 | |
4173 | 2943 case 0x07: { /* Someone has denied you authorization */ |
4076 | 2944 if (i >= 1) { |
7023 | 2945 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
|
2946 gaim_notify_info(gc, NULL, _("ICQ authorization denied."), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2947 dialog_msg); |
4076 | 2948 g_free(dialog_msg); |
2949 } | |
3141 | 2950 } break; |
2951 | |
4173 | 2952 case 0x08: { /* Someone has granted you authorization */ |
7023 | 2953 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
|
2954 gaim_notify_info(gc, NULL, "ICQ authorization accepted.", |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2955 dialog_msg); |
3141 | 2956 g_free(dialog_msg); |
2957 } break; | |
2958 | |
4333 | 2959 case 0x09: { /* Message from the Godly ICQ server itself, I think */ |
2960 if (i >= 5) { | |
2961 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
|
2962 gaim_notify_info(gc, NULL, "ICQ Server Message", dialog_msg); |
4333 | 2963 g_free(dialog_msg); |
2964 } | |
2965 } break; | |
2966 | |
4173 | 2967 case 0x0d: { /* Someone has sent you a pager message from http://www.icq.com/your_uin */ |
4076 | 2968 if (i >= 6) { |
4194 | 2969 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
|
2970 gaim_notify_info(gc, NULL, "ICQ Page", dialog_msg); |
4076 | 2971 g_free(dialog_msg); |
2972 } | |
4075 | 2973 } break; |
2974 | |
4173 | 2975 case 0x0e: { /* Someone has emailed you at your_uin@pager.icq.com */ |
4076 | 2976 if (i >= 6) { |
4308 | 2977 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
|
2978 gaim_notify_info(gc, NULL, "ICQ Email", dialog_msg); |
4076 | 2979 g_free(dialog_msg); |
2980 } | |
4075 | 2981 } break; |
2982 | |
4173 | 2983 case 0x12: { |
3141 | 2984 /* Ack for authorizing/denying someone. Or possibly an ack for sending any system notice */ |
7023 | 2985 /* Someone added you to their buddy list? */ |
3141 | 2986 } break; |
2987 | |
7023 | 2988 case 0x13: { /* Someone has sent you some ICQ buddies */ |
7631 | 2989 guint i, num; |
3453 | 2990 gchar **text; |
4173 | 2991 text = g_strsplit(args->msg, "\376", 0); |
3453 | 2992 if (text) { |
2993 num = 0; | |
2994 for (i=0; i<strlen(text[0]); i++) | |
2995 num = num*10 + text[0][i]-48; | |
2996 for (i=0; i<num; i++) { | |
4230 | 2997 struct name_data *data = g_new(struct name_data, 1); |
7023 | 2998 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 | 2999 data->gc = gc; |
4790 | 3000 data->name = g_strdup(text[i*2+1]); |
3001 data->nick = g_strdup(text[i*2+2]); | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3002 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3003 gaim_request_action(gc, NULL, message, |
7023 | 3004 _("Do you want to add this buddy " |
3005 "to your buddy list?"), | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
3006 0, data, 2, |
7023 | 3007 _("Add"), G_CALLBACK(gaim_icq_buddyadd), |
5836 | 3008 _("Decline"), G_CALLBACK(oscar_free_name_data)); |
3453 | 3009 g_free(message); |
3010 } | |
3011 g_strfreev(text); | |
3012 } | |
3013 } break; | |
3014 | |
7023 | 3015 case 0x1a: { /* Someone has sent you a greeting card or requested buddies? */ |
3453 | 3016 /* This is boring and silly. */ |
3017 } break; | |
3018 | |
3141 | 3019 default: { |
8660 | 3020 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3021 "Received a channel 4 message of unknown type " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3022 "(type 0x%02hhx).\n", args->type); |
3141 | 3023 } break; |
3024 } | |
3025 | |
4076 | 3026 g_strfreev(msg1); |
3027 g_strfreev(msg2); | |
3028 | |
3141 | 3029 return 1; |
3030 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3031 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3032 static int gaim_parse_incoming_im(aim_session_t *sess, aim_frame_t *fr, ...) { |
4200 | 3033 fu16_t channel; |
3034 int ret = 0; | |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3035 aim_userinfo_t *userinfo; |
2086 | 3036 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3037 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3038 va_start(ap, fr); |
4200 | 3039 channel = (fu16_t)va_arg(ap, unsigned int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3040 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 3041 |
3141 | 3042 switch (channel) { |
3043 case 1: { /* standard message */ | |
3044 struct aim_incomingim_ch1_args *args; | |
3045 args = va_arg(ap, struct aim_incomingim_ch1_args *); | |
3046 ret = incomingim_chan1(sess, fr->conn, userinfo, args); | |
3047 } break; | |
3048 | |
3049 case 2: { /* rendevous */ | |
3050 struct aim_incomingim_ch2_args *args; | |
3051 args = va_arg(ap, struct aim_incomingim_ch2_args *); | |
3052 ret = incomingim_chan2(sess, fr->conn, userinfo, args); | |
3053 } break; | |
3054 | |
3055 case 4: { /* ICQ */ | |
3056 struct aim_incomingim_ch4_args *args; | |
3057 args = va_arg(ap, struct aim_incomingim_ch4_args *); | |
4075 | 3058 ret = incomingim_chan4(sess, fr->conn, userinfo, args, 0); |
3141 | 3059 } break; |
3060 | |
3061 default: { | |
8660 | 3062 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3063 "ICBM received on unsupported channel (channel " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3064 "0x%04hx).", channel); |
3141 | 3065 } break; |
2086 | 3066 } |
3067 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3068 va_end(ap); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3069 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3070 return ret; |
2086 | 3071 } |
3072 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3073 static int gaim_parse_misses(aim_session_t *sess, aim_frame_t *fr, ...) { |
5420 | 3074 char *buf; |
2086 | 3075 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3076 fu16_t chan, nummissed, reason; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3077 aim_userinfo_t *userinfo; |
2086 | 3078 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3079 va_start(ap, fr); |
4200 | 3080 chan = (fu16_t)va_arg(ap, unsigned int); |
3081 userinfo = va_arg(ap, aim_userinfo_t *); | |
3082 nummissed = (fu16_t)va_arg(ap, unsigned int); | |
3083 reason = (fu16_t)va_arg(ap, unsigned int); | |
2086 | 3084 va_end(ap); |
3085 | |
3086 switch(reason) { | |
5420 | 3087 case 0: /* Invalid (0) */ |
3088 buf = g_strdup_printf( | |
3089 ngettext( | |
4276 | 3090 "You missed %hu message from %s because it was invalid.", |
3091 "You missed %hu messages from %s because they were invalid.", | |
3092 nummissed), | |
4282 | 3093 nummissed, |
3094 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3095 break; |
5420 | 3096 case 1: /* Message too large */ |
3097 buf = g_strdup_printf( | |
3098 ngettext( | |
4276 | 3099 "You missed %hu message from %s because it was too large.", |
3100 "You missed %hu messages from %s because they were too large.", | |
3101 nummissed), | |
4282 | 3102 nummissed, |
3103 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3104 break; |
5420 | 3105 case 2: /* Rate exceeded */ |
3106 buf = g_strdup_printf( | |
3107 ngettext( | |
4276 | 3108 "You missed %hu message from %s because the rate limit has been exceeded.", |
3109 "You missed %hu messages from %s because the rate limit has been exceeded.", | |
3110 nummissed), | |
4282 | 3111 nummissed, |
3112 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3113 break; |
5420 | 3114 case 3: /* Evil Sender */ |
3115 buf = g_strdup_printf( | |
3116 ngettext( | |
4276 | 3117 "You missed %hu message from %s because he/she was too evil.", |
3118 "You missed %hu messages from %s because he/she was too evil.", | |
3119 nummissed), | |
4282 | 3120 nummissed, |
3121 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3122 break; |
5420 | 3123 case 4: /* Evil Receiver */ |
3124 buf = g_strdup_printf( | |
3125 ngettext( | |
4276 | 3126 "You missed %hu message from %s because you are too evil.", |
3127 "You missed %hu messages from %s because you are too evil.", | |
3128 nummissed), | |
4282 | 3129 nummissed, |
3130 userinfo->sn); | |
2086 | 3131 break; |
3132 default: | |
5420 | 3133 buf = g_strdup_printf( |
3134 ngettext( | |
4276 | 3135 "You missed %hu message from %s for an unknown reason.", |
3136 "You missed %hu messages from %s for an unknown reason.", | |
3137 nummissed), | |
4282 | 3138 nummissed, |
3139 userinfo->sn); | |
2086 | 3140 break; |
3141 } | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3142 gaim_notify_error(sess->aux_data, NULL, buf, NULL); |
5420 | 3143 g_free(buf); |
2086 | 3144 |
3145 return 1; | |
3146 } | |
3147 | |
4194 | 3148 static int gaim_parse_clientauto_ch2(aim_session_t *sess, const char *who, fu16_t reason, const char *cookie) { |
5575 | 3149 GaimConnection *gc = sess->aux_data; |
7283 | 3150 OscarData *od = gc->proto_data; |
4617 | 3151 |
3152 /* BBB */ | |
3630 | 3153 switch (reason) { |
4151 | 3154 case 3: { /* Decline sendfile. */ |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
3155 GaimXfer *xfer; |
8660 | 3156 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3157 "AAA - Other user declined file transfer\n"); |
4617 | 3158 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
|
3159 gaim_xfer_cancel_remote(xfer); |
4151 | 3160 } break; |
3161 | |
3162 default: { | |
8660 | 3163 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3164 "Received an unknown rendezvous client auto-response " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3165 "from %s. Type 0x%04hx\n", who, reason); |
4151 | 3166 } |
3630 | 3167 |
3168 } | |
3169 | |
3170 return 0; | |
3171 } | |
3172 | |
4194 | 3173 static int gaim_parse_clientauto_ch4(aim_session_t *sess, char *who, fu16_t reason, fu32_t state, char *msg) { |
5575 | 3174 GaimConnection *gc = sess->aux_data; |
4151 | 3175 |
3176 switch(reason) { | |
3177 case 0x0003: { /* Reply from an ICQ status message request */ | |
8701 | 3178 char *status_msg = oscar_icqstatus(state); |
4151 | 3179 char *dialog_msg, **splitmsg; |
3180 | |
3181 /* Split at (carriage return/newline)'s, then rejoin later with BRs between. */ | |
3182 splitmsg = g_strsplit(msg, "\r\n", 0); | |
3183 | |
7011 | 3184 dialog_msg = g_strdup_printf(_("<B>UIN:</B> %s<BR><B>Status:</B> %s<HR>%s"), who, status_msg, g_strjoinv("<BR>", splitmsg)); |
7032 | 3185 gaim_notify_formatted(gc, NULL, _("Buddy Information"), NULL, dialog_msg, NULL, NULL); |
4151 | 3186 |
3187 g_free(status_msg); | |
3188 g_free(dialog_msg); | |
3189 g_strfreev(splitmsg); | |
3190 } break; | |
3191 | |
3192 default: { | |
8660 | 3193 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3194 "Received an unknown client auto-response from %s. " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3195 "Type 0x%04hx\n", who, reason); |
4151 | 3196 } break; |
3197 } /* end of switch */ | |
3198 | |
3199 return 0; | |
3200 } | |
3201 | |
3212 | 3202 static int gaim_parse_clientauto(aim_session_t *sess, aim_frame_t *fr, ...) { |
3203 va_list ap; | |
3204 fu16_t chan, reason; | |
3205 char *who; | |
3206 | |
3207 va_start(ap, fr); | |
4200 | 3208 chan = (fu16_t)va_arg(ap, unsigned int); |
3212 | 3209 who = va_arg(ap, char *); |
4200 | 3210 reason = (fu16_t)va_arg(ap, unsigned int); |
3212 | 3211 |
3952 | 3212 if (chan == 0x0002) { /* File transfer declined */ |
3630 | 3213 char *cookie = va_arg(ap, char *); |
4151 | 3214 return gaim_parse_clientauto_ch2(sess, who, reason, cookie); |
3952 | 3215 } else if (chan == 0x0004) { /* ICQ message */ |
4200 | 3216 fu32_t state = 0; |
4151 | 3217 char *msg = NULL; |
3218 if (reason == 0x0003) { | |
4200 | 3219 state = va_arg(ap, fu32_t); |
4151 | 3220 msg = va_arg(ap, char *); |
3221 } | |
3222 return gaim_parse_clientauto_ch4(sess, who, reason, state, msg); | |
3223 } | |
3952 | 3224 |
3212 | 3225 va_end(ap); |
3226 | |
3227 return 1; | |
3228 } | |
3229 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3230 static int gaim_parse_genericerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3231 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3232 fu16_t reason; |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
3233 char *m; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3234 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3235 va_start(ap, fr); |
4199 | 3236 reason = (fu16_t) va_arg(ap, unsigned int); |
2086 | 3237 va_end(ap); |
3238 | |
8660 | 3239 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3240 "snac threw error (reason 0x%04hx: %s)\n", reason, |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3241 (reason < msgerrreasonlen) ? msgerrreason[reason] : "unknown"); |
2086 | 3242 |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
3243 m = g_strdup_printf(_("SNAC threw error: %s\n"), |
5411 | 3244 reason < msgerrreasonlen ? _(msgerrreason[reason]) : _("Unknown error")); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3245 gaim_notify_error(sess->aux_data, NULL, m, NULL); |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
3246 g_free(m); |
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
3247 |
2086 | 3248 return 1; |
3249 } | |
3250 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3251 static int gaim_parse_msgerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
4617 | 3252 #if 0 |
5575 | 3253 GaimConnection *gc = sess->aux_data; |
7283 | 3254 OscarData *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
3255 GaimXfer *xfer; |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
3256 #endif |
4617 | 3257 va_list ap; |
3258 fu16_t reason; | |
3259 char *data, *buf; | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
3260 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3261 va_start(ap, fr); |
4617 | 3262 reason = (fu16_t)va_arg(ap, unsigned int); |
3752 | 3263 data = va_arg(ap, char *); |
2086 | 3264 va_end(ap); |
3265 | |
8660 | 3266 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3267 "Message error with data %s and reason %hu\n", data, reason); |
4617 | 3268 |
3269 /* BBB */ | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
3270 #if 0 |
4617 | 3271 /* If this was a file transfer request, data is a cookie */ |
3272 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
|
3273 gaim_xfer_cancel_remote(xfer); |
3630 | 3274 return 1; |
3275 } | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
3276 #endif |
3630 | 3277 |
4617 | 3278 /* Data is assumed to be the destination sn */ |
3279 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
|
3280 gaim_notify_error(sess->aux_data, NULL, buf, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3281 (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("No reason given.")); |
4617 | 3282 g_free(buf); |
2086 | 3283 |
3284 return 1; | |
3285 } | |
3286 | |
3595 | 3287 static int gaim_parse_mtn(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3288 GaimConnection *gc = sess->aux_data; |
3595 | 3289 va_list ap; |
3290 fu16_t type1, type2; | |
3291 char *sn; | |
3292 | |
3293 va_start(ap, fr); | |
4199 | 3294 type1 = (fu16_t) va_arg(ap, unsigned int); |
3595 | 3295 sn = va_arg(ap, char *); |
4199 | 3296 type2 = (fu16_t) va_arg(ap, unsigned int); |
3595 | 3297 va_end(ap); |
3298 | |
3299 switch (type2) { | |
3300 case 0x0000: { /* Text has been cleared */ | |
3301 serv_got_typing_stopped(gc, sn); | |
3302 } break; | |
3303 | |
3304 case 0x0001: { /* Paused typing */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
3305 serv_got_typing(gc, sn, 0, GAIM_TYPED); |
3595 | 3306 } break; |
3307 | |
3308 case 0x0002: { /* Typing */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
3309 serv_got_typing(gc, sn, 0, GAIM_TYPING); |
3595 | 3310 } break; |
3311 | |
3312 default: { | |
8660 | 3313 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 | 3314 } break; |
3315 } | |
3316 | |
3317 return 1; | |
3318 } | |
3319 | |
7141 | 3320 /* |
3321 * We get this error when there was an error in the locate family. This | |
7259 | 3322 * happens when you request info of someone who is offline. |
7141 | 3323 */ |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3324 static int gaim_parse_locerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
7259 | 3325 gchar *buf; |
2086 | 3326 va_list ap; |
5420 | 3327 fu16_t reason; |
2086 | 3328 char *destn; |
3329 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3330 va_start(ap, fr); |
4199 | 3331 reason = (fu16_t) va_arg(ap, unsigned int); |
2086 | 3332 destn = va_arg(ap, char *); |
3333 va_end(ap); | |
3334 | |
7781 | 3335 if (destn == NULL) |
7793 | 3336 return 1; |
3337 | |
3338 buf = g_strdup_printf(_("User information for %s unavailable:"), destn); | |
7781 | 3339 |
3340 gaim_notify_error(sess->aux_data, NULL, buf, | |
3341 (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("No reason given.")); | |
3342 g_free(buf); | |
2086 | 3343 |
3344 return 1; | |
3345 } | |
3346 | |
7011 | 3347 static int gaim_parse_userinfo(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3348 GaimConnection *gc = sess->aux_data; |
8700 | 3349 GaimAccount *account = gaim_connection_get_account(gc); |
3350 GString *str; | |
3351 gchar *tmp = NULL, *info_utf8 = NULL, *away_utf8 = NULL; | |
4791 | 3352 va_list ap; |
7011 | 3353 aim_userinfo_t *userinfo; |
2086 | 3354 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3355 va_start(ap, fr); |
7011 | 3356 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 3357 va_end(ap); |
3358 | |
8700 | 3359 str = g_string_new(""); |
3360 g_string_append_printf(str, "<b>%s:</b> %s", _("Screen Name"), userinfo->sn); | |
3361 g_string_append_printf(str, "\n<br><b>%s</b>: %d%%", _("Warning Level"), (int)((userinfo->warnlevel/10.0) + 0.5)); | |
7011 | 3362 |
3363 if (userinfo->present & AIM_USERINFO_PRESENT_ONLINESINCE) | |
8701 | 3364 oscar_string_append(str, "\n<br>", _("Online Since"), |
8700 | 3365 asctime(localtime((time_t *)&userinfo->onlinesince))); |
7011 | 3366 |
3367 if (userinfo->present & AIM_USERINFO_PRESENT_MEMBERSINCE) | |
8701 | 3368 oscar_string_append(str, "\n<br>", _("Member Since"), |
8700 | 3369 asctime(localtime((time_t *)&userinfo->membersince))); |
7011 | 3370 |
3371 if (userinfo->present & AIM_USERINFO_PRESENT_IDLE) { | |
8700 | 3372 tmp = gaim_str_seconds_to_string(userinfo->idletime*60); |
8701 | 3373 oscar_string_append(str, "\n<br>", _("Idle"), tmp); |
8700 | 3374 g_free(tmp); |
3375 } | |
3376 | |
8701 | 3377 oscar_string_append_info(gc, str, "\n<br>", NULL, userinfo); |
7011 | 3378 |
3379 if ((userinfo->flags & AIM_FLAG_AWAY) && (userinfo->away_len > 0) && (userinfo->away != NULL) && (userinfo->away_encoding != NULL)) { | |
8700 | 3380 tmp = oscar_encoding_extract(userinfo->away_encoding); |
3381 away_utf8 = oscar_encoding_to_utf8(tmp, userinfo->away, userinfo->away_len); | |
3382 g_free(tmp); | |
7011 | 3383 if (away_utf8 != NULL) { |
8700 | 3384 g_string_append_printf(str, "\n<hr>%s", away_utf8); |
7011 | 3385 g_free(away_utf8); |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3386 } |
7011 | 3387 } |
3388 | |
3389 if ((userinfo->info_len > 0) && (userinfo->info != NULL) && (userinfo->info_encoding != NULL)) { | |
8700 | 3390 tmp = oscar_encoding_extract(userinfo->info_encoding); |
3391 info_utf8 = oscar_encoding_to_utf8(tmp, userinfo->info, userinfo->info_len); | |
3392 g_free(tmp); | |
7011 | 3393 if (info_utf8 != NULL) { |
8700 | 3394 g_string_append_printf(str, "\n<hr>%s", info_utf8); |
7011 | 3395 g_free(info_utf8); |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3396 } |
7011 | 3397 } |
3398 | |
8701 | 3399 tmp = gaim_str_sub_away_formatters(str->str, gaim_account_get_username(account)); |
8700 | 3400 g_string_free(str, TRUE); |
3401 gaim_notify_formatted(gc, NULL, _("Buddy Information"), NULL, tmp, NULL, NULL); | |
3402 g_free(tmp); | |
4151 | 3403 |
2086 | 3404 return 1; |
3405 } | |
3406 | |
8341 | 3407 static gboolean gaim_reqinfo_timeout_cb(void *data) |
3408 { | |
3409 aim_session_t *sess = data; | |
3410 GaimConnection *gc = sess->aux_data; | |
3411 OscarData *od = (OscarData *)gc->proto_data; | |
3412 | |
3413 aim_locate_dorequest(data); | |
3414 od->getinfotimer = 0; | |
3415 | |
3416 return FALSE; | |
3417 } | |
3418 | |
3419 static int gaim_reqinfo_timeout(aim_session_t *sess, aim_frame_t *fr, ...) | |
3420 { | |
3421 GaimConnection *gc = sess->aux_data; | |
3422 OscarData *od = (OscarData *)gc->proto_data; | |
3423 | |
3424 /* | |
3425 * Wait a little while then call aim_locate_dorequest(sess). This keeps | |
3426 * us from hitting the rate limit due to request away messages and info | |
3427 * too quickly. | |
3428 */ | |
3429 if (od->getinfotimer == 0) | |
3430 od->getinfotimer = gaim_timeout_add(1200, gaim_reqinfo_timeout_cb, sess); | |
3431 | |
3432 return 1; | |
3433 } | |
3434 | |
3435 static int gaim_parse_motd(aim_session_t *sess, aim_frame_t *fr, ...) | |
3436 { | |
2086 | 3437 char *msg; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3438 fu16_t id; |
2086 | 3439 va_list ap; |
3440 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3441 va_start(ap, fr); |
4199 | 3442 id = (fu16_t) va_arg(ap, unsigned int); |
2086 | 3443 msg = va_arg(ap, char *); |
3444 va_end(ap); | |
3445 | |
8660 | 3446 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3447 "MOTD: %s (%hu)\n", msg ? msg : "Unknown", id); |
2092
59b0377d18aa
[gaim-migrate @ 2102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
3448 if (id < 4) |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3449 gaim_notify_warning(sess->aux_data, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3450 _("Your AIM connection may be lost."), NULL); |
2086 | 3451 |
3452 return 1; | |
3453 } | |
3454 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3455 static int gaim_chatnav_info(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3456 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3457 fu16_t type; |
5575 | 3458 GaimConnection *gc = sess->aux_data; |
7283 | 3459 OscarData *od = (OscarData *)gc->proto_data; |
2086 | 3460 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3461 va_start(ap, fr); |
4199 | 3462 type = (fu16_t) va_arg(ap, unsigned int); |
2086 | 3463 |
3464 switch(type) { | |
3465 case 0x0002: { | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3466 fu8_t maxrooms; |
2086 | 3467 struct aim_chat_exchangeinfo *exchanges; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3468 int exchangecount, i; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3469 |
4199 | 3470 maxrooms = (fu8_t) va_arg(ap, unsigned int); |
2086 | 3471 exchangecount = va_arg(ap, int); |
3472 exchanges = va_arg(ap, struct aim_chat_exchangeinfo *); | |
3473 | |
8660 | 3474 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3475 "chat info: Chat Rights:\n"); |
8660 | 3476 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3477 "chat info: \tMax Concurrent Rooms: %hhd\n", maxrooms); |
8660 | 3478 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3479 "chat info: \tExchange List: (%d total)\n", exchangecount); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3480 for (i = 0; i < exchangecount; i++) |
8660 | 3481 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3482 "chat info: \t\t%hu %s\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3483 exchanges[i].number, exchanges[i].name ? exchanges[i].name : ""); |
4617 | 3484 while (od->create_rooms) { |
3485 struct create_room *cr = od->create_rooms->data; | |
8660 | 3486 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3487 "creating room %s\n", cr->name); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
3488 aim_chatnav_createroom(sess, fr->conn, cr->name, cr->exchange); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
3489 g_free(cr->name); |
4617 | 3490 od->create_rooms = g_slist_remove(od->create_rooms, cr); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
3491 g_free(cr); |
2086 | 3492 } |
3493 } | |
3494 break; | |
3495 case 0x0008: { | |
3496 char *fqcn, *name, *ck; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3497 fu16_t instance, flags, maxmsglen, maxoccupancy, unknown, exchange; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3498 fu8_t createperms; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3499 fu32_t createtime; |
2086 | 3500 |
3501 fqcn = va_arg(ap, char *); | |
4200 | 3502 instance = (fu16_t)va_arg(ap, unsigned int); |
3503 exchange = (fu16_t)va_arg(ap, unsigned int); | |
3504 flags = (fu16_t)va_arg(ap, unsigned int); | |
3505 createtime = va_arg(ap, fu32_t); | |
3506 maxmsglen = (fu16_t)va_arg(ap, unsigned int); | |
3507 maxoccupancy = (fu16_t)va_arg(ap, unsigned int); | |
3508 createperms = (fu8_t)va_arg(ap, unsigned int); | |
3509 unknown = (fu16_t)va_arg(ap, unsigned int); | |
3510 name = va_arg(ap, char *); | |
3511 ck = va_arg(ap, char *); | |
4194 | 3512 |
8660 | 3513 gaim_debug_misc("oscar", |
5556 | 3514 "created room: %s %hu %hu %hu %u %hu %hu %hhu %hu %s %s\n", |
2086 | 3515 fqcn, |
3516 exchange, instance, flags, | |
3517 createtime, | |
3518 maxmsglen, maxoccupancy, createperms, unknown, | |
3519 name, ck); | |
4617 | 3520 aim_chat_join(od->sess, od->conn, exchange, ck, instance); |
2086 | 3521 } |
3522 break; | |
3523 default: | |
8660 | 3524 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3525 "chatnav info: unknown type (%04hx)\n", type); |
2086 | 3526 break; |
3527 } | |
4194 | 3528 |
3529 va_end(ap); | |
3530 | |
2086 | 3531 return 1; |
3532 } | |
3533 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
3534 static int gaim_conv_chat_join(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3535 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3536 int count, i; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3537 aim_userinfo_t *info; |
5575 | 3538 GaimConnection *g = sess->aux_data; |
2086 | 3539 |
3540 struct chat_connection *c = NULL; | |
3541 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3542 va_start(ap, fr); |
2086 | 3543 count = va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3544 info = va_arg(ap, aim_userinfo_t *); |
2086 | 3545 va_end(ap); |
3546 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3547 c = find_oscar_chat_by_conn(g, fr->conn); |
2086 | 3548 if (!c) |
3549 return 1; | |
3550 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3551 for (i = 0; i < count; i++) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
3552 gaim_conv_chat_add_user(GAIM_CONV_CHAT(c->cnv), info[i].sn, NULL); |
2086 | 3553 |
3554 return 1; | |
3555 } | |
3556 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
3557 static int gaim_conv_chat_leave(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3558 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3559 int count, i; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3560 aim_userinfo_t *info; |
5575 | 3561 GaimConnection *g = sess->aux_data; |
2086 | 3562 |
3563 struct chat_connection *c = NULL; | |
3564 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3565 va_start(ap, fr); |
2086 | 3566 count = va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3567 info = va_arg(ap, aim_userinfo_t *); |
2086 | 3568 va_end(ap); |
3569 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3570 c = find_oscar_chat_by_conn(g, fr->conn); |
2086 | 3571 if (!c) |
3572 return 1; | |
3573 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3574 for (i = 0; i < count; i++) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
3575 gaim_conv_chat_remove_user(GAIM_CONV_CHAT(c->cnv), info[i].sn, NULL); |
2086 | 3576 |
3577 return 1; | |
3578 } | |
3579 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
3580 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
|
3581 va_list ap; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3582 aim_userinfo_t *userinfo; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3583 struct aim_chat_roominfo *roominfo; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3584 char *roomname; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3585 int usercount; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3586 char *roomdesc; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3587 fu16_t unknown_c9, unknown_d2, unknown_d5, maxmsglen, maxvisiblemsglen; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3588 fu32_t creationtime; |
5575 | 3589 GaimConnection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3590 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
|
3591 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3592 va_start(ap, fr); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3593 roominfo = va_arg(ap, struct aim_chat_roominfo *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3594 roomname = va_arg(ap, char *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3595 usercount= va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3596 userinfo = va_arg(ap, aim_userinfo_t *); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3597 roomdesc = va_arg(ap, char *); |
4200 | 3598 unknown_c9 = (fu16_t)va_arg(ap, unsigned int); |
3599 creationtime = va_arg(ap, fu32_t); | |
3600 maxmsglen = (fu16_t)va_arg(ap, unsigned int); | |
3601 unknown_d2 = (fu16_t)va_arg(ap, unsigned int); | |
3602 unknown_d5 = (fu16_t)va_arg(ap, unsigned int); | |
3603 maxvisiblemsglen = (fu16_t)va_arg(ap, unsigned int); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3604 va_end(ap); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3605 |
8660 | 3606 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3607 "inside chat_info_update (maxmsglen = %hu, maxvislen = %hu)\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3608 maxmsglen, maxvisiblemsglen); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3609 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3610 ccon->maxlen = maxmsglen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3611 ccon->maxvis = maxvisiblemsglen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3612 |
2086 | 3613 return 1; |
3614 } | |
3615 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
3616 static int gaim_conv_chat_incoming_msg(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3617 GaimConnection *gc = sess->aux_data; |
8225 | 3618 struct chat_connection *ccon = find_oscar_chat_by_conn(gc, fr->conn); |
3619 gchar *utf8; | |
2086 | 3620 va_list ap; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3621 aim_userinfo_t *info; |
8225 | 3622 int len; |
2086 | 3623 char *msg; |
8219 | 3624 char *charset; |
2086 | 3625 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3626 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3627 info = va_arg(ap, aim_userinfo_t *); |
8219 | 3628 len = va_arg(ap, int); |
4194 | 3629 msg = va_arg(ap, char *); |
8219 | 3630 charset = va_arg(ap, char *); |
4194 | 3631 va_end(ap); |
2086 | 3632 |
8225 | 3633 utf8 = oscar_encoding_to_utf8(charset, msg, len); |
8667 | 3634 if (utf8 == NULL) |
3635 /* The conversion failed! */ | |
8668 | 3636 utf8 = g_strdup(_("[Unable to display a message from this user because it contained invalid characters.]")); |
8225 | 3637 serv_got_chat_in(gc, ccon->id, info->sn, 0, utf8, time((time_t)NULL)); |
3638 g_free(utf8); | |
2086 | 3639 |
3640 return 1; | |
3641 } | |
3642 | |
3694 | 3643 static int gaim_email_parseupdate(aim_session_t *sess, aim_frame_t *fr, ...) { |
3644 va_list ap; | |
5575 | 3645 GaimConnection *gc = sess->aux_data; |
3694 | 3646 struct aim_emailinfo *emailinfo; |
3725 | 3647 int havenewmail; |
7297 | 3648 char *alertitle, *alerturl; |
3694 | 3649 |
3650 va_start(ap, fr); | |
3651 emailinfo = va_arg(ap, struct aim_emailinfo *); | |
3725 | 3652 havenewmail = va_arg(ap, int); |
7301 | 3653 alertitle = va_arg(ap, char *); |
3654 alerturl = va_arg(ap, char *); | |
3694 | 3655 va_end(ap); |
3656 | |
5628 | 3657 if (emailinfo && gaim_account_get_check_mail(gc->account)) { |
5575 | 3658 gchar *to = g_strdup_printf("%s@%s", gaim_account_get_username(gaim_connection_get_account(gc)), emailinfo->domain); |
5542 | 3659 if (emailinfo->unread && havenewmail) |
3660 gaim_notify_emails(gc, emailinfo->nummsgs, FALSE, NULL, NULL, (const char **)&to, (const char **)&emailinfo->url, NULL, NULL); | |
5537 | 3661 g_free(to); |
3694 | 3662 } |
7297 | 3663 |
7301 | 3664 if (alertitle) |
8660 | 3665 gaim_debug_misc("oscar", "Got an alert '%s' %s\n", alertitle, alerturl ? alerturl : ""); |
3694 | 3666 |
3667 return 1; | |
3668 } | |
3669 | |
4804 | 3670 static int gaim_icon_error(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3671 GaimConnection *gc = sess->aux_data; |
7283 | 3672 OscarData *od = gc->proto_data; |
4804 | 3673 char *sn; |
3674 | |
3675 sn = od->requesticon->data; | |
8660 | 3676 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3677 "removing %s from hash table\n", sn); |
4804 | 3678 od->requesticon = g_slist_remove(od->requesticon, sn); |
3679 free(sn); | |
3680 | |
3681 if (od->icontimer) | |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
3682 gaim_timeout_remove(od->icontimer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
3683 od->icontimer = gaim_timeout_add(500, gaim_icon_timerfunc, gc); |
4804 | 3684 |
3685 return 1; | |
3686 } | |
3687 | |
3688 static int gaim_icon_parseicon(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 3689 GaimConnection *gc = sess->aux_data; |
7283 | 3690 OscarData *od = gc->proto_data; |
4804 | 3691 GSList *cur; |
3692 va_list ap; | |
3693 char *sn; | |
4853 | 3694 fu8_t *iconcsum, *icon; |
3695 fu16_t iconcsumlen, iconlen; | |
4804 | 3696 |
3697 va_start(ap, fr); | |
3698 sn = va_arg(ap, char *); | |
4853 | 3699 iconcsum = va_arg(ap, fu8_t *); |
3700 iconcsumlen = va_arg(ap, int); | |
4804 | 3701 icon = va_arg(ap, fu8_t *); |
3702 iconlen = va_arg(ap, int); | |
3703 va_end(ap); | |
3704 | |
4853 | 3705 if (iconlen > 0) { |
3706 char *b16; | |
6695 | 3707 GaimBuddy *b = gaim_find_buddy(gc->account, sn); |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
3708 gaim_buddy_icons_set_for_user(gaim_connection_get_account(gc), |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
3709 sn, icon, iconlen); |
7106
db6bd3e794d8
[gaim-migrate @ 7671]
Christian Hammond <chipx86@chipx86.com>
parents:
7098
diff
changeset
|
3710 b16 = gaim_base16_encode(iconcsum, iconcsumlen); |
5129 | 3711 if (b16) { |
7693 | 3712 gaim_blist_node_set_string((GaimBlistNode*)b, "icon_checksum", b16); |
5129 | 3713 gaim_blist_save(); |
7162 | 3714 g_free(b16); |
5129 | 3715 } |
4853 | 3716 } |
4804 | 3717 |
3718 cur = od->requesticon; | |
3719 while (cur) { | |
3720 char *cursn = cur->data; | |
3721 if (!aim_sncmp(cursn, sn)) { | |
3722 od->requesticon = g_slist_remove(od->requesticon, cursn); | |
3723 free(cursn); | |
3724 cur = od->requesticon; | |
3725 } else | |
3726 cur = cur->next; | |
3727 } | |
3728 | |
3729 if (od->icontimer) | |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
3730 gaim_timeout_remove(od->icontimer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
3731 od->icontimer = gaim_timeout_add(250, gaim_icon_timerfunc, gc); |
4804 | 3732 |
3733 return 1; | |
3734 } | |
3735 | |
3736 static gboolean gaim_icon_timerfunc(gpointer data) { | |
5575 | 3737 GaimConnection *gc = data; |
7283 | 3738 OscarData *od = gc->proto_data; |
7011 | 3739 aim_userinfo_t *userinfo; |
4804 | 3740 aim_conn_t *conn; |
3741 | |
3742 conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_ICON); | |
5892 | 3743 if (!conn) { |
3744 if (!od->iconconnecting) { | |
3745 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_ICON); | |
3746 od->iconconnecting = TRUE; | |
3747 } | |
4804 | 3748 return FALSE; |
3749 } | |
3750 | |
5842 | 3751 if (od->set_icon) { |
6039 | 3752 struct stat st; |
3753 const char *iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc)); | |
3754 if (iconfile == NULL) { | |
8363 | 3755 aim_ssi_delicon(od->sess); |
6039 | 3756 } else if (!stat(iconfile, &st)) { |
3757 char *buf = g_malloc(st.st_size); | |
3758 FILE *file = fopen(iconfile, "rb"); | |
3759 if (file) { | |
3760 fread(buf, 1, st.st_size, file); | |
3761 fclose(file); | |
8660 | 3762 gaim_debug_info("oscar", |
6039 | 3763 "Uploading icon to icon server\n"); |
6879 | 3764 aim_bart_upload(od->sess, buf, st.st_size); |
5842 | 3765 } else |
8660 | 3766 gaim_debug_error("oscar", |
6039 | 3767 "Can't open buddy icon file!\n"); |
3768 g_free(buf); | |
3769 } else { | |
8660 | 3770 gaim_debug_error("oscar", |
6039 | 3771 "Can't stat buddy icon file!\n"); |
5842 | 3772 } |
3773 od->set_icon = FALSE; | |
3774 } | |
3775 | |
3776 if (!od->requesticon) { | |
8660 | 3777 gaim_debug_misc("oscar", |
5842 | 3778 "no more icons to request\n"); |
3779 return FALSE; | |
3780 } | |
3781 | |
7045 | 3782 userinfo = aim_locate_finduserinfo(od->sess, (char *)od->requesticon->data); |
7011 | 3783 if ((userinfo != NULL) && (userinfo->iconcsumlen > 0)) { |
3784 aim_bart_request(od->sess, od->requesticon->data, userinfo->iconcsum, userinfo->iconcsumlen); | |
4804 | 3785 return FALSE; |
3786 } else { | |
3787 char *sn = od->requesticon->data; | |
3788 od->requesticon = g_slist_remove(od->requesticon, sn); | |
3789 free(sn); | |
3790 } | |
3791 | |
3792 return TRUE; | |
3793 } | |
3794 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3795 /* |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3796 * 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
|
3797 */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3798 static int gaim_parse_msgack(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3799 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3800 fu16_t type; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3801 char *sn; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3802 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3803 va_start(ap, fr); |
4199 | 3804 type = (fu16_t) va_arg(ap, unsigned int); |
2086 | 3805 sn = va_arg(ap, char *); |
3806 va_end(ap); | |
3807 | |
8660 | 3808 gaim_debug_info("oscar", "Sent message to %s.\n", sn); |
2086 | 3809 |
3810 return 1; | |
3811 } | |
3812 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3813 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
|
3814 static const char *codes[5] = { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3815 "invalid", |
4194 | 3816 "change", |
3817 "warning", | |
3818 "limit", | |
3819 "limit cleared", | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3820 }; |
2086 | 3821 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3822 fu16_t code, rateclass; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3823 fu32_t windowsize, clear, alert, limit, disconnect, currentavg, maxavg; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3824 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3825 va_start(ap, fr); |
4200 | 3826 code = (fu16_t)va_arg(ap, unsigned int); |
3827 rateclass= (fu16_t)va_arg(ap, unsigned int); | |
3828 windowsize = va_arg(ap, fu32_t); | |
3829 clear = va_arg(ap, fu32_t); | |
3830 alert = va_arg(ap, fu32_t); | |
3831 limit = va_arg(ap, fu32_t); | |
3832 disconnect = va_arg(ap, fu32_t); | |
3833 currentavg = va_arg(ap, fu32_t); | |
3834 maxavg = va_arg(ap, fu32_t); | |
2086 | 3835 va_end(ap); |
3836 | |
8660 | 3837 gaim_debug_misc("oscar", |
5556 | 3838 "rate %s (param ID 0x%04hx): curavg = %u, maxavg = %u, alert at %u, " |
3839 "clear warning at %u, limit at %u, disconnect at %u (window size = %u)\n", | |
2086 | 3840 (code < 5) ? codes[code] : codes[0], |
3841 rateclass, | |
3842 currentavg, maxavg, | |
3843 alert, clear, | |
3844 limit, disconnect, | |
3845 windowsize); | |
3846 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3847 /* XXX fix these values */ |
2086 | 3848 if (code == AIM_RATE_CODE_CHANGE) { |
3849 if (currentavg >= clear) | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3850 aim_conn_setlatency(fr->conn, 0); |
2086 | 3851 } else if (code == AIM_RATE_CODE_WARNING) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3852 aim_conn_setlatency(fr->conn, windowsize/4); |
2909
48ec70928d7f
[gaim-migrate @ 2922]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2906
diff
changeset
|
3853 } else if (code == AIM_RATE_CODE_LIMIT) { |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3854 gaim_notify_error(sess->aux_data, NULL, _("Rate limiting error."), |
6040 | 3855 _("The last action you attempted could not be " |
3856 "performed because you are over the rate limit. " | |
3857 "Please wait 10 seconds and try again.")); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3858 aim_conn_setlatency(fr->conn, windowsize/2); |
2086 | 3859 } else if (code == AIM_RATE_CODE_CLEARLIMIT) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3860 aim_conn_setlatency(fr->conn, 0); |
2086 | 3861 } |
3862 | |
3863 return 1; | |
3864 } | |
3865 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3866 static int gaim_parse_evilnotify(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3867 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3868 fu16_t newevil; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3869 aim_userinfo_t *userinfo; |
5575 | 3870 GaimConnection *gc = sess->aux_data; |
2086 | 3871 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3872 va_start(ap, fr); |
4199 | 3873 newevil = (fu16_t) va_arg(ap, unsigned int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3874 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 3875 va_end(ap); |
3876 | |
7111 | 3877 serv_got_eviled(gc, (userinfo && userinfo->sn) ? userinfo->sn : NULL, (newevil/10.0) + 0.5); |
2086 | 3878 |
3879 return 1; | |
3880 } | |
3881 | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3882 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
|
3883 va_list ap; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3884 aim_userinfo_t *info; |
5575 | 3885 GaimConnection *gc = sess->aux_data; |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3886 |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3887 va_start(ap, fr); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3888 info = va_arg(ap, aim_userinfo_t *); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3889 va_end(ap); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3890 |
5628 | 3891 gc->evil = (info->warnlevel/10.0) + 0.5; |
4841 | 3892 |
7872 | 3893 if (info->present & AIM_USERINFO_PRESENT_ONLINESINCE) |
4841 | 3894 gc->login_time_official = info->onlinesince; |
7872 | 3895 else if (info->present & AIM_USERINFO_PRESENT_SESSIONLEN) |
3896 gc->login_time_official = time(NULL) - info->sessionlen; | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3897 |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3898 return 1; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3899 } |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3900 |
4649 | 3901 static int gaim_connerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3902 GaimConnection *gc = sess->aux_data; |
7283 | 3903 OscarData *od = gc->proto_data; |
4649 | 3904 va_list ap; |
3905 fu16_t code; | |
3906 char *msg; | |
3907 | |
3908 va_start(ap, fr); | |
3909 code = (fu16_t)va_arg(ap, int); | |
3910 msg = va_arg(ap, char *); | |
3911 va_end(ap); | |
3912 | |
8660 | 3913 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3914 "Disconnected. Code is 0x%04x and msg is %s\n", code, msg); |
4649 | 3915 if ((fr) && (fr->conn) && (fr->conn->type == AIM_CONN_TYPE_BOS)) { |
4651 | 3916 if (code == 0x0001) { |
6113 | 3917 gc->wants_to_die = TRUE; |
5579 | 3918 gaim_connection_error(gc, _("You have been disconnected because you have signed on with this screen name at another location.")); |
4651 | 3919 } else { |
5579 | 3920 gaim_connection_error(gc, _("You have been signed off for an unknown reason.")); |
4651 | 3921 } |
4666 | 3922 od->killme = TRUE; |
4649 | 3923 } |
3924 | |
3925 return 1; | |
3926 } | |
3927 | |
2675 | 3928 static int conninitdone_bos(aim_session_t *sess, aim_frame_t *fr, ...) { |
7283 | 3929 GaimConnection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3930 |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3931 aim_reqpersonalinfo(sess, fr->conn); |
4230 | 3932 |
3933 #ifndef NOSSI | |
8660 | 3934 gaim_debug_info("oscar", "ssi: requesting rights and list\n"); |
4889 | 3935 aim_ssi_reqrights(sess); |
6350 | 3936 aim_ssi_reqdata(sess); |
4230 | 3937 #endif |
3938 | |
7011 | 3939 aim_locate_reqrights(sess); |
7285 | 3940 aim_buddylist_reqrights(sess, fr->conn); |
4617 | 3941 aim_im_reqparams(sess); |
7334 | 3942 aim_bos_reqrights(sess, fr->conn); /* XXX - Don't call this with ssi */ |
4230 | 3943 |
3944 #ifdef NOSSI | |
8660 | 3945 gaim_debug_info("oscar", "bos: requesting rights\n"); |
7334 | 3946 aim_bos_reqrights(sess, fr->conn); |
4230 | 3947 aim_bos_setgroupperm(sess, fr->conn, AIM_FLAG_ALLUSERS); |
3948 aim_bos_setprivacyflags(sess, fr->conn, AIM_PRIVFLAGS_ALLOWIDLE | AIM_PRIVFLAGS_ALLOWMEMBERSINCE); | |
3949 #endif | |
2086 | 3950 |
7283 | 3951 gaim_connection_update_progress(gc, _("Finalizing connection"), 5, OSCAR_CONNECT_STEPS); |
3952 | |
2086 | 3953 return 1; |
3954 } | |
3955 | |
2675 | 3956 static int conninitdone_admin(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 3957 GaimConnection *gc = sess->aux_data; |
7283 | 3958 OscarData *od = gc->proto_data; |
2647 | 3959 |
6905 | 3960 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ADM, 0x0003, gaim_info_change, 0); |
3961 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ADM, 0x0005, gaim_info_change, 0); | |
3962 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ADM, 0x0007, gaim_account_confirm, 0); | |
3963 | |
2672 | 3964 aim_clientready(sess, fr->conn); |
8660 | 3965 gaim_debug_info("oscar", "connected to admin\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3966 |
2647 | 3967 if (od->chpass) { |
8660 | 3968 gaim_debug_info("oscar", "changing password\n"); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3969 aim_admin_changepasswd(sess, fr->conn, od->newp, od->oldp); |
2647 | 3970 g_free(od->oldp); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3971 od->oldp = NULL; |
2647 | 3972 g_free(od->newp); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3973 od->newp = NULL; |
2647 | 3974 od->chpass = FALSE; |
3975 } | |
2979 | 3976 if (od->setnick) { |
8660 | 3977 gaim_debug_info("oscar", "formatting screen name\n"); |
2979 | 3978 aim_admin_setnick(sess, fr->conn, od->newsn); |
3979 g_free(od->newsn); | |
3980 od->newsn = NULL; | |
3981 od->setnick = FALSE; | |
3982 } | |
2647 | 3983 if (od->conf) { |
8660 | 3984 gaim_debug_info("oscar", "confirming account\n"); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3985 aim_admin_reqconfirm(sess, fr->conn); |
2647 | 3986 od->conf = FALSE; |
3987 } | |
3988 if (od->reqemail) { | |
8660 | 3989 gaim_debug_info("oscar", "requesting email\n"); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3990 aim_admin_getinfo(sess, fr->conn, 0x0011); |
2647 | 3991 od->reqemail = FALSE; |
3992 } | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3993 if (od->setemail) { |
8660 | 3994 gaim_debug_info("oscar", "setting email\n"); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3995 aim_admin_setemail(sess, fr->conn, od->email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3996 g_free(od->email); |
5497 | 3997 od->email = NULL; |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3998 od->setemail = FALSE; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3999 } |
2647 | 4000 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4001 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4002 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4003 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4004 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
|
4005 struct aim_icbmparameters *params; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4006 va_list ap; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4007 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4008 va_start(ap, fr); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4009 params = va_arg(ap, struct aim_icbmparameters *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4010 va_end(ap); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4011 |
4194 | 4012 /* XXX - evidently this crashes on solaris. i have no clue why |
8660 | 4013 gaim_debug_misc("oscar", "ICBM Parameters: maxchannel = %hu, default flags = 0x%08lx, max msg len = %hu, " |
5556 | 4014 "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
|
4015 params->maxchan, params->flags, params->maxmsglen, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4016 ((float)params->maxsenderwarn)/10.0, ((float)params->maxrecverwarn)/10.0, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4017 params->minmsginterval); |
2427
5bc3b39fc0a5
[gaim-migrate @ 2440]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2421
diff
changeset
|
4018 */ |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4019 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4020 /* Maybe senderwarn and recverwarn should be user preferences... */ |
3595 | 4021 params->flags = 0x0000000b; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4022 params->maxmsglen = 8000; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4023 params->minmsginterval = 0; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4024 |
4617 | 4025 aim_im_setparams(sess, params); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4026 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4027 return 1; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4028 } |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4029 |
2993 | 4030 static int gaim_parse_locaterights(aim_session_t *sess, aim_frame_t *fr, ...) |
4031 { | |
5575 | 4032 GaimConnection *gc = sess->aux_data; |
7283 | 4033 OscarData *od = (OscarData *)gc->proto_data; |
5306 | 4034 va_list ap; |
4035 fu16_t maxsiglen; | |
2993 | 4036 |
4037 va_start(ap, fr); | |
4199 | 4038 maxsiglen = (fu16_t) va_arg(ap, int); |
2993 | 4039 va_end(ap); |
4040 | |
8660 | 4041 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4042 "locate rights: max sig len = %d\n", maxsiglen); |
2993 | 4043 |
4617 | 4044 od->rights.maxsiglen = od->rights.maxawaymsglen = (guint)maxsiglen; |
4045 | |
4046 if (od->icq) | |
7334 | 4047 aim_locate_setcaps(od->sess, caps_icq); |
5301 | 4048 else |
7334 | 4049 aim_locate_setcaps(od->sess, caps_aim); |
4050 oscar_set_info(gc, gc->account->user_info); | |
2993 | 4051 |
4052 return 1; | |
4053 } | |
4054 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4055 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
|
4056 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4057 fu16_t maxbuddies, maxwatchers; |
5575 | 4058 GaimConnection *gc = sess->aux_data; |
7283 | 4059 OscarData *od = (OscarData *)gc->proto_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4060 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4061 va_start(ap, fr); |
4199 | 4062 maxbuddies = (fu16_t) va_arg(ap, unsigned int); |
4063 maxwatchers = (fu16_t) va_arg(ap, unsigned int); | |
2086 | 4064 va_end(ap); |
4065 | |
8660 | 4066 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4067 "buddy list rights: Max buddies = %hu / Max watchers = %hu\n", maxbuddies, maxwatchers); |
2086 | 4068 |
4617 | 4069 od->rights.maxbuddies = (guint)maxbuddies; |
4070 od->rights.maxwatchers = (guint)maxwatchers; | |
2993 | 4071 |
2086 | 4072 return 1; |
4073 } | |
4074 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4075 static int gaim_bosrights(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4076 GaimConnection *gc = sess->aux_data; |
7283 | 4077 OscarData *od = (OscarData *)gc->proto_data; |
7334 | 4078 va_list ap; |
4079 fu16_t maxpermits, maxdenies; | |
2086 | 4080 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4081 va_start(ap, fr); |
4199 | 4082 maxpermits = (fu16_t) va_arg(ap, unsigned int); |
4083 maxdenies = (fu16_t) va_arg(ap, unsigned int); | |
2086 | 4084 va_end(ap); |
4085 | |
8660 | 4086 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4087 "BOS rights: Max permit = %hu / Max deny = %hu\n", maxpermits, maxdenies); |
2086 | 4088 |
4617 | 4089 od->rights.maxpermits = (guint)maxpermits; |
4090 od->rights.maxdenies = (guint)maxdenies; | |
2993 | 4091 |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
4092 gaim_connection_set_state(gc, GAIM_CONNECTED); |
2993 | 4093 serv_finish_login(gc); |
4094 | |
8660 | 4095 gaim_debug_info("oscar", "buddy list loaded\n"); |
2993 | 4096 |
2672 | 4097 aim_clientready(sess, fr->conn); |
5948 | 4098 aim_srv_setavailmsg(sess, NULL); |
7474 | 4099 aim_srv_setidle(sess, 0); |
4617 | 4100 |
4664 | 4101 if (od->icq) { |
4102 aim_icq_reqofflinemsgs(sess); | |
4103 aim_icq_hideip(sess); | |
4104 } | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4105 |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4106 aim_reqservice(sess, fr->conn, AIM_CONN_TYPE_CHATNAV); |
4102 | 4107 if (sess->authinfo->email) |
4108 aim_reqservice(sess, fr->conn, AIM_CONN_TYPE_EMAIL); | |
2086 | 4109 |
4110 return 1; | |
4111 } | |
4112 | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4113 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
|
4114 va_list ap; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4115 struct aim_icq_offlinemsg *msg; |
4075 | 4116 struct aim_incomingim_ch4_args args; |
4117 time_t t; | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4118 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4119 va_start(ap, fr); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4120 msg = va_arg(ap, struct aim_icq_offlinemsg *); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4121 va_end(ap); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4122 |
8660 | 4123 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4124 "Received offline message. Converting to channel 4 ICBM...\n"); |
4075 | 4125 args.uin = msg->sender; |
4126 args.type = msg->type; | |
4173 | 4127 args.flags = msg->flags; |
4076 | 4128 args.msglen = msg->msglen; |
4075 | 4129 args.msg = msg->msg; |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4130 t = gaim_time_build(msg->year, msg->month, msg->day, msg->hour, msg->minute, 0); |
4075 | 4131 incomingim_chan4(sess, fr->conn, NULL, &args, t); |
2706
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 return 1; |
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 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4136 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
|
4137 { |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4138 aim_icq_ackofflinemsgs(sess); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4139 return 1; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4140 } |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
4141 |
7388 | 4142 #if 0 |
4143 /* | |
7465 | 4144 * Update, 2003-11-09: |
4145 * Joseph S. Myers, a gcc dude, fixed this for gcc 3.4! Rock on! | |
4146 * | |
7388 | 4147 * It may not be my place to do this, but... |
4148 * I feel pretty strongly that the "last 2 digits" warning is ridiculously | |
4149 * stupid, and should not exist for % switches (%x in our case) that request | |
4150 * a year in the preferred representation for the current locale. For that | |
4151 * reason I've chosen to not use this workaround (n., see kluge). | |
4152 * | |
4153 * I have a date. I want to show it to the user in the "preferred" way. | |
4154 * Whether that displays a 2 digit year is perfectly fine--after all, it's | |
4155 * what the locale wanted. | |
4156 * | |
4157 * If I have a necessity for a full representation of the year in the current | |
4158 * locale, then I'll use a switch that returns a full representation of the | |
4159 * year. | |
4160 * | |
4161 * If you think the preferred locale should show 4 digits instead of 2 digits | |
4162 * (because you're anal, or whatever), then change the f***ing locale. | |
4163 * | |
4164 * I guess the bottom line is--I'm trying to show a date to the user how they | |
4165 * prefer to see it, why the hell does gcc want me to change that? | |
7389 | 4166 * |
4167 * See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=3190 | |
4168 * See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=8714 | |
7388 | 4169 */ |
4170 | |
4171 /* | |
4172 * This function was recommended by the STRFTIME(3) man page to remove the | |
7386 | 4173 * "last 2 digits" warning. |
4174 */ | |
4175 static size_t my_strftime(char *s, size_t max, const char *fmt, | |
4176 const struct tm *tm) | |
4177 { | |
4178 return strftime(s, max, fmt, tm); | |
4179 } | |
7388 | 4180 #endif |
7386 | 4181 |
4624 | 4182 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
|
4183 { |
5575 | 4184 GaimConnection *gc = sess->aux_data; |
8670 | 4185 OscarData *od = (OscarData *)gc->proto_data; |
4186 GaimBuddy *buddy; | |
4187 struct buddyinfo *bi; | |
4624 | 4188 gchar who[16]; |
8670 | 4189 GString *str; |
4190 gchar *primary, *utf8; | |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4191 va_list ap; |
4151 | 4192 struct aim_icq_info *info; |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4193 |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4194 va_start(ap, fr); |
4151 | 4195 info = va_arg(ap, struct aim_icq_info *); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4196 va_end(ap); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4197 |
4664 | 4198 if (!info->uin) |
4199 return 0; | |
4200 | |
8670 | 4201 str = g_string_sized_new(100); |
5556 | 4202 g_snprintf(who, sizeof(who), "%u", info->uin); |
8670 | 4203 buddy = gaim_find_buddy(gaim_connection_get_account(gc), who); |
4204 if (buddy != NULL) | |
4205 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(buddy->account, buddy->name)); | |
4206 | |
4207 g_string_append_printf(str, "<b>%s:</b> %s", _("UIN"), who); | |
8701 | 4208 oscar_string_append(str, "\n<br>", _("Nick"), info->nick); |
8670 | 4209 if ((bi != NULL) && (bi->ipaddr != 0)) { |
4210 char *tstr = g_strdup_printf("%hhu.%hhu.%hhu.%hhu", | |
4211 (bi->ipaddr & 0xff000000) >> 24, | |
4212 (bi->ipaddr & 0x00ff0000) >> 16, | |
4213 (bi->ipaddr & 0x0000ff00) >> 8, | |
4214 (bi->ipaddr & 0x000000ff)); | |
8701 | 4215 oscar_string_append(str, "\n<br>", _("IP Address"), tstr); |
8670 | 4216 g_free(tstr); |
4217 } | |
8701 | 4218 oscar_string_append(str, "\n<br>", _("First Name"), info->first); |
4219 oscar_string_append(str, "\n<br>", _("Last Name"), info->last); | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4220 if (info->email && info->email[0] && (utf8 = gaim_utf8_try_convert(info->email))) { |
8670 | 4221 g_string_append_printf(str, "\n<br><b>%s:</b> <a href=\"mailto:%s\">%s</a>", _("Email Address"), utf8, utf8); |
4222 g_free(utf8); | |
4625 | 4223 } |
4224 if (info->numaddresses && info->email2) { | |
4225 int i; | |
4226 for (i = 0; i < info->numaddresses; i++) { | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4227 if (info->email2[i] && info->email2[i][0] && (utf8 = gaim_utf8_try_convert(info->email2[i]))) { |
8670 | 4228 g_string_append_printf(str, "\n<br><b>%s:</b> <a href=\"mailto%s\">%s</a>", _("Email Address"), utf8, utf8); |
4229 g_free(utf8); | |
4643 | 4230 } |
4625 | 4231 } |
4624 | 4232 } |
8701 | 4233 oscar_string_append(str, "\n<br>", _("Mobile Phone"), info->mobile); |
4234 oscar_string_append(str, "\n<br>", _("Gender"), info->gender==1 ? _("Female") : _("Male")); | |
4624 | 4235 if (info->birthyear || info->birthmonth || info->birthday) { |
4627 | 4236 char date[30]; |
4237 struct tm tm; | |
4238 tm.tm_mday = (int)info->birthday; | |
4239 tm.tm_mon = (int)info->birthmonth-1; | |
4240 tm.tm_year = (int)info->birthyear-1900; | |
7388 | 4241 strftime(date, sizeof(date), "%x", &tm); |
8701 | 4242 oscar_string_append(str, "\n<br>", _("Birthday"), date); |
4151 | 4243 } |
4624 | 4244 if (info->age) { |
4245 char age[5]; | |
4246 snprintf(age, sizeof(age), "%hhd", info->age); | |
8701 | 4247 oscar_string_append(str, "\n<br>", _("Age"), age); |
4819 | 4248 } |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4249 if (info->personalwebpage && info->personalwebpage[0] && (utf8 = gaim_utf8_try_convert(info->personalwebpage))) { |
8670 | 4250 g_string_append_printf(str, "\n<br><b>%s:</b> <a href=\"%s\">%s</a>", _("Personal Web Page"), utf8, utf8); |
4251 g_free(utf8); | |
4819 | 4252 } |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4253 if (info->info && info->info[0] && (utf8 = gaim_utf8_try_convert(info->info))) { |
8670 | 4254 g_string_append_printf(str, "<hr><b>%s:</b><br>%s", _("Additional Information"), utf8); |
4255 g_free(utf8); | |
4256 } | |
4257 g_string_append_printf(str, "<hr>\n"); | |
4641 | 4258 if ((info->homeaddr && (info->homeaddr[0])) || (info->homecity && info->homecity[0]) || (info->homestate && info->homestate[0]) || (info->homezip && info->homezip[0])) { |
8670 | 4259 g_string_append_printf(str, "<b>%s:</b>", _("Home Address")); |
8701 | 4260 oscar_string_append(str, "\n<br>", _("Address"), info->homeaddr); |
4261 oscar_string_append(str, "\n<br>", _("City"), info->homecity); | |
4262 oscar_string_append(str, "\n<br>", _("State"), info->homestate); | |
4263 oscar_string_append(str, "\n<br>", _("Zip Code"), info->homezip); | |
8670 | 4264 g_string_append_printf(str, "\n<hr>\n"); |
4151 | 4265 } |
4641 | 4266 if ((info->workaddr && info->workaddr[0]) || (info->workcity && info->workcity[0]) || (info->workstate && info->workstate[0]) || (info->workzip && info->workzip[0])) { |
8670 | 4267 g_string_append_printf(str, "<b>%s:</b>", _("Work Address")); |
8701 | 4268 oscar_string_append(str, "\n<br>", _("Address"), info->workaddr); |
4269 oscar_string_append(str, "\n<br>", _("City"), info->workcity); | |
4270 oscar_string_append(str, "\n<br>", _("State"), info->workstate); | |
4271 oscar_string_append(str, "\n<br>", _("Zip Code"), info->workzip); | |
8670 | 4272 g_string_append_printf(str, "\n<hr>\n"); |
4624 | 4273 } |
4641 | 4274 if ((info->workcompany && info->workcompany[0]) || (info->workdivision && info->workdivision[0]) || (info->workposition && info->workposition[0]) || (info->workwebpage && info->workwebpage[0])) { |
8670 | 4275 g_string_append_printf(str, "<b>%s:</b>", _("Work Information")); |
8701 | 4276 oscar_string_append(str, "\n<br>", _("Company"), info->workcompany); |
4277 oscar_string_append(str, "\n<br>", _("Division"), info->workdivision); | |
4278 oscar_string_append(str, "\n<br>", _("Position"), info->workposition); | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4279 if (info->workwebpage && info->workwebpage[0] && (utf8 = gaim_utf8_try_convert(info->workwebpage))) { |
8670 | 4280 g_string_append_printf(str, "\n<br><b>%s:</b> <a href=\"%s\">%s</a>", _("Web Page"), utf8, utf8); |
4281 g_free(utf8); | |
4624 | 4282 } |
8670 | 4283 g_string_append_printf(str, "\n<hr>\n"); |
4284 } | |
4285 | |
6873 | 4286 primary = g_strdup_printf(_("ICQ Info for %s"), gaim_get_buddy_alias(buddy)); |
8670 | 4287 gaim_notify_formatted(gc, NULL, primary, NULL, str->str, NULL, NULL); |
6873 | 4288 g_free(primary); |
8670 | 4289 g_string_free(str, TRUE); |
4151 | 4290 |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4291 return 1; |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4292 } |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4293 |
4759 | 4294 static int gaim_icqalias(aim_session_t *sess, aim_frame_t *fr, ...) |
4295 { | |
5575 | 4296 GaimConnection *gc = sess->aux_data; |
4820 | 4297 gchar who[16], *utf8; |
6695 | 4298 GaimBuddy *b; |
4759 | 4299 va_list ap; |
4300 struct aim_icq_info *info; | |
4301 | |
4302 va_start(ap, fr); | |
4303 info = va_arg(ap, struct aim_icq_info *); | |
4304 va_end(ap); | |
4305 | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4306 if (info->uin && info->nick && info->nick[0] && (utf8 = gaim_utf8_try_convert(info->nick))) { |
5556 | 4307 g_snprintf(who, sizeof(who), "%u", info->uin); |
4820 | 4308 serv_got_alias(gc, who, utf8); |
4759 | 4309 if ((b = gaim_find_buddy(gc->account, who))) { |
7693 | 4310 gaim_blist_node_set_string((GaimBlistNode*)b, "servernick", utf8); |
4759 | 4311 gaim_blist_save(); |
4312 } | |
4820 | 4313 g_free(utf8); |
4759 | 4314 } |
4315 | |
4316 return 1; | |
4317 } | |
4318 | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4319 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
|
4320 { |
7032 | 4321 GaimConnection *gc = sess->aux_data; |
4322 gchar *text; | |
4323 va_list ap; | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4324 char *msg, *url; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4325 fu16_t wid, hei, delay; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4326 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4327 va_start(ap, fr); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4328 msg = va_arg(ap, char *); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4329 url = va_arg(ap, char *); |
4199 | 4330 wid = (fu16_t) va_arg(ap, int); |
4331 hei = (fu16_t) va_arg(ap, int); | |
4332 delay = (fu16_t) va_arg(ap, int); | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4333 va_end(ap); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4334 |
7032 | 4335 text = g_strdup_printf("%s<br><a href=\"%s\">%s</a>", msg, url, url); |
4336 gaim_notify_formatted(gc, NULL, _("Pop-Up Message"), NULL, text, NULL, NULL); | |
4337 g_free(text); | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4338 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4339 return 1; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4340 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4341 |
7032 | 4342 static int gaim_parse_searchreply(aim_session_t *sess, aim_frame_t *fr, ...) |
4343 { | |
6873 | 4344 GaimConnection *gc = sess->aux_data; |
4345 gchar *secondary; | |
4346 GString *text; | |
4347 int i, num; | |
2086 | 4348 va_list ap; |
6873 | 4349 char *email, *SNs; |
2086 | 4350 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4351 va_start(ap, fr); |
6873 | 4352 email = va_arg(ap, char *); |
2086 | 4353 num = va_arg(ap, int); |
4354 SNs = va_arg(ap, char *); | |
4355 va_end(ap); | |
4356 | |
8152 | 4357 secondary = g_strdup_printf(_("The following screen names are associated with %s"), email); |
6873 | 4358 text = g_string_new(""); |
2086 | 4359 for (i = 0; i < num; i++) |
6873 | 4360 g_string_append_printf(text, "%s<br>", &SNs[i * (MAXSNLEN + 1)]); |
4361 gaim_notify_formatted(gc, NULL, _("Search Results"), secondary, text->str, NULL, NULL); | |
4362 | |
4363 g_free(secondary); | |
4364 g_string_free(text, TRUE); | |
2086 | 4365 |
4366 return 1; | |
4367 } | |
4368 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4369 static int gaim_parse_searcherror(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 4370 va_list ap; |
6873 | 4371 char *email; |
5420 | 4372 char *buf; |
2086 | 4373 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4374 va_start(ap, fr); |
6873 | 4375 email = va_arg(ap, char *); |
2086 | 4376 va_end(ap); |
4377 | |
6873 | 4378 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
|
4379 gaim_notify_error(sess->aux_data, NULL, buf, NULL); |
5420 | 4380 g_free(buf); |
2086 | 4381 |
4382 return 1; | |
4383 } | |
4384 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4385 static int gaim_account_confirm(aim_session_t *sess, aim_frame_t *fr, ...) { |
6873 | 4386 GaimConnection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4387 fu16_t status; |
2086 | 4388 va_list ap; |
4389 char msg[256]; | |
4390 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4391 va_start(ap, fr); |
4199 | 4392 status = (fu16_t) va_arg(ap, unsigned int); /* status code of confirmation request */ |
2086 | 4393 va_end(ap); |
4394 | |
8660 | 4395 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4396 "account confirmation returned status 0x%04x (%s)\n", status, |
3912 | 4397 status ? "unknown" : "email sent"); |
4398 if (!status) { | |
5302 | 4399 g_snprintf(msg, sizeof(msg), _("You should receive an email asking to confirm %s."), |
5575 | 4400 gaim_account_get_username(gaim_connection_get_account(gc))); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4401 gaim_notify_info(gc, NULL, _("Account Confirmation Requested"), msg); |
2086 | 4402 } |
4403 | |
4404 return 1; | |
4405 } | |
4406 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4407 static int gaim_info_change(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 4408 GaimConnection *gc = sess->aux_data; |
2086 | 4409 va_list ap; |
3912 | 4410 fu16_t perms, err; |
4411 char *url, *sn, *email; | |
4412 int change; | |
2086 | 4413 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4414 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4415 change = va_arg(ap, int); |
4199 | 4416 perms = (fu16_t) va_arg(ap, unsigned int); |
4417 err = (fu16_t) va_arg(ap, unsigned int); | |
3912 | 4418 url = va_arg(ap, char *); |
4419 sn = va_arg(ap, char *); | |
4420 email = va_arg(ap, char *); | |
2086 | 4421 va_end(ap); |
4422 | |
8660 | 4423 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4424 "account info: because of %s, perms=0x%04x, err=0x%04x, url=%s, sn=%s, email=%s\n", |
3912 | 4425 change ? "change" : "request", perms, err, url, sn, email); |
4426 | |
4427 if (err && url) { | |
4428 char *dialog_msg; | |
4429 char *dialog_top = g_strdup_printf(_("Error Changing Account Info")); | |
4430 switch (err) { | |
4431 case 0x0001: { | |
4432 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name differs from the original."), err); | |
4433 } break; | |
4434 case 0x0006: { | |
4435 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name ends in a space."), err); | |
4436 } break; | |
4437 case 0x000b: { | |
4438 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name is too long."), err); | |
4439 } break; | |
4440 case 0x001d: { | |
4441 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); | |
4442 } break; | |
4443 case 0x0021: { | |
4444 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); | |
4445 } break; | |
4446 case 0x0023: { | |
4447 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to change email address because the given address is invalid."), err); | |
4448 } break; | |
4449 default: { | |
4450 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unknown error."), err); | |
4451 } break; | |
4452 } | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4453 gaim_notify_error(gc, NULL, dialog_top, dialog_msg); |
3912 | 4454 g_free(dialog_top); |
4455 g_free(dialog_msg); | |
4456 return 1; | |
4457 } | |
4458 | |
4459 if (sn) { | |
4585 | 4460 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
|
4461 gaim_notify_info(gc, NULL, _("Account Info"), dialog_msg); |
3912 | 4462 g_free(dialog_msg); |
4463 } | |
4464 | |
4465 if (email) { | |
5575 | 4466 char *dialog_msg = g_strdup_printf(_("The email address for %s is %s"), |
4467 gaim_account_get_username(gaim_connection_get_account(gc)), email); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4468 gaim_notify_info(gc, NULL, _("Account Info"), dialog_msg); |
3912 | 4469 g_free(dialog_msg); |
2086 | 4470 } |
4471 | |
4472 return 1; | |
4473 } | |
4474 | |
5575 | 4475 static void oscar_keepalive(GaimConnection *gc) { |
7283 | 4476 OscarData *od = (OscarData *)gc->proto_data; |
4617 | 4477 aim_flap_nop(od->sess, od->conn); |
2086 | 4478 } |
4479 | |
6059 | 4480 static int oscar_send_typing(GaimConnection *gc, const char *name, int typing) { |
7283 | 4481 OscarData *od = (OscarData *)gc->proto_data; |
4617 | 4482 struct direct_im *dim = find_direct_im(od, name); |
3595 | 4483 if (dim) |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
4484 if (typing == GAIM_TYPING) |
4870 | 4485 aim_odc_send_typing(od->sess, dim->conn, 0x0002); |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
4486 else if (typing == GAIM_TYPED) |
4870 | 4487 aim_odc_send_typing(od->sess, dim->conn, 0x0001); |
4488 else | |
4489 aim_odc_send_typing(od->sess, dim->conn, 0x0000); | |
3595 | 4490 else { |
5300 | 4491 /* Don't send if this turkey is in our deny list */ |
4492 GSList *list; | |
4493 for (list=gc->account->deny; (list && aim_sncmp(name, list->data)); list=list->next); | |
4494 if (!list) { | |
7261 | 4495 struct buddyinfo *bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(gc->account, name)); |
5300 | 4496 if (bi && bi->typingnot) { |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
4497 if (typing == GAIM_TYPING) |
5300 | 4498 aim_im_sendmtn(od->sess, 0x0001, name, 0x0002); |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
4499 else if (typing == GAIM_TYPED) |
5300 | 4500 aim_im_sendmtn(od->sess, 0x0001, name, 0x0001); |
4501 else | |
4502 aim_im_sendmtn(od->sess, 0x0001, name, 0x0000); | |
4503 } | |
3595 | 4504 } |
4505 } | |
2993 | 4506 return 0; |
4507 } | |
5575 | 4508 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
|
4509 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
|
4510 |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
4511 static int oscar_send_im(GaimConnection *gc, const char *name, const char *message, GaimConvImFlags imflags) { |
7283 | 4512 OscarData *od = (OscarData *)gc->proto_data; |
4617 | 4513 struct direct_im *dim = find_direct_im(od, name); |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
4514 int ret = 0; |
3659 | 4515 GError *err = NULL; |
5575 | 4516 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
|
4517 char *tmpmsg = NULL; |
3458 | 4518 |
4838 | 4519 if (dim && dim->connected) { |
4520 /* If we're directly connected, send a direct IM */ | |
6982 | 4521 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
|
4522 } else if (imflags & GAIM_CONV_IM_IMAGES) { |
3044 | 4523 /* Trying to send an IM image outside of a direct connection. */ |
4524 oscar_ask_direct_im(gc, name); | |
4838 | 4525 ret = -ENOTCONN; |
2086 | 4526 } else { |
4738 | 4527 struct buddyinfo *bi; |
3008 | 4528 struct aim_sendimext_args args; |
4529 struct stat st; | |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
4530 gsize len; |
4269 | 4531 |
7261 | 4532 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(gc->account, name)); |
4738 | 4533 if (!bi) { |
4534 bi = g_new0(struct buddyinfo, 1); | |
7261 | 4535 g_hash_table_insert(od->buddyinfo, g_strdup(gaim_normalize(gc->account, name)), bi); |
4738 | 4536 } |
4537 | |
3008 | 4538 args.flags = AIM_IMFLAGS_ACK | AIM_IMFLAGS_CUSTOMFEATURES; |
4665 | 4539 if (od->icq) { |
4540 args.features = features_icq; | |
4541 args.featureslen = sizeof(features_icq); | |
3008 | 4542 args.flags |= AIM_IMFLAGS_OFFLINE; |
4665 | 4543 } else { |
4544 args.features = features_aim; | |
4545 args.featureslen = sizeof(features_aim); | |
4972 | 4546 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
4547 if (imflags & GAIM_CONV_IM_AUTO_RESP) |
4972 | 4548 args.flags |= AIM_IMFLAGS_AWAY; |
4665 | 4549 } |
4269 | 4550 |
4738 | 4551 if (bi->ico_need) { |
8660 | 4552 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4553 "Sending buddy icon request with message\n"); |
3008 | 4554 args.flags |= AIM_IMFLAGS_BUDDYREQ; |
4738 | 4555 bi->ico_need = FALSE; |
3008 | 4556 } |
4269 | 4557 |
5575 | 4558 if (iconfile && !stat(iconfile, &st)) { |
8361 | 4559 FILE *file = fopen(iconfile, "rb"); |
3008 | 4560 if (file) { |
4561 char *buf = g_malloc(st.st_size); | |
4562 fread(buf, 1, st.st_size, file); | |
6039 | 4563 fclose(file); |
4269 | 4564 |
3008 | 4565 args.iconlen = st.st_size; |
4617 | 4566 args.iconsum = aimutil_iconsum(buf, st.st_size); |
3008 | 4567 args.iconstamp = st.st_mtime; |
4568 | |
7406 | 4569 if ((args.iconlen != bi->ico_me_len) || (args.iconsum != bi->ico_me_csum) || (args.iconstamp != bi->ico_me_time)) { |
4738 | 4570 bi->ico_informed = FALSE; |
7406 | 4571 bi->ico_sent = FALSE; |
4572 } | |
4738 | 4573 |
4574 if (!bi->ico_informed) { | |
8660 | 4575 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4576 "Claiming to have a buddy icon\n"); |
4738 | 4577 args.flags |= AIM_IMFLAGS_HASICON; |
4578 bi->ico_me_len = args.iconlen; | |
4579 bi->ico_me_csum = args.iconsum; | |
4580 bi->ico_me_time = args.iconstamp; | |
4581 bi->ico_informed = TRUE; | |
4582 } | |
4583 | |
3008 | 4584 g_free(buf); |
2086 | 4585 } |
4586 } | |
4269 | 4587 |
3008 | 4588 args.destsn = name; |
4269 | 4589 |
6310 | 4590 /* For ICQ send newlines as CR/LF, for AIM send newlines as <BR> */ |
4591 if (isdigit(name[0])) | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4592 tmpmsg = gaim_str_add_cr(message); |
6310 | 4593 else |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4594 tmpmsg = gaim_strdup_withhtml(message); |
6310 | 4595 len = strlen(tmpmsg); |
4596 | |
4597 args.flags |= oscar_encoding_check(tmpmsg); | |
3642 | 4598 if (args.flags & AIM_IMFLAGS_UNICODE) { |
8660 | 4599 gaim_debug_info("oscar", "Sending Unicode IM\n"); |
4662 | 4600 args.charset = 0x0002; |
4665 | 4601 args.charsubset = 0x0000; |
6310 | 4602 args.msg = g_convert(tmpmsg, len, "UCS-2BE", "UTF-8", NULL, &len, &err); |
3659 | 4603 if (err) { |
8660 | 4604 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4605 "Error converting a unicode message: %s\n", err->message); |
8660 | 4606 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4607 "This really shouldn't happen!\n"); |
3659 | 4608 /* We really shouldn't try to send the |
4609 * IM now, but I'm not sure what to do */ | |
4800 | 4610 g_error_free(err); |
3659 | 4611 } |
3850 | 4612 } else if (args.flags & AIM_IMFLAGS_ISO_8859_1) { |
8660 | 4613 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4614 "Sending ISO-8859-1 IM\n"); |
4662 | 4615 args.charset = 0x0003; |
4665 | 4616 args.charsubset = 0x0000; |
6310 | 4617 args.msg = g_convert(tmpmsg, len, "ISO-8859-1", "UTF-8", NULL, &len, &err); |
3659 | 4618 if (err) { |
8660 | 4619 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4620 "conversion error: %s\n", err->message); |
8660 | 4621 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4622 "Someone tell Ethan his 8859-1 detection is wrong\n"); |
3642 | 4623 args.flags ^= AIM_IMFLAGS_ISO_8859_1 | AIM_IMFLAGS_UNICODE; |
6310 | 4624 len = strlen(tmpmsg); |
4800 | 4625 g_error_free(err); |
6310 | 4626 args.msg = g_convert(tmpmsg, len, "UCS-2BE", "UTF8", NULL, &len, &err); |
3659 | 4627 if (err) { |
8660 | 4628 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4629 "Error in unicode fallback: %s\n", err->message); |
4800 | 4630 g_error_free(err); |
3659 | 4631 } |
3642 | 4632 } |
4633 } else { | |
4662 | 4634 args.charset = 0x0000; |
4635 args.charsubset = 0x0000; | |
6310 | 4636 args.msg = tmpmsg; |
3642 | 4637 } |
4638 args.msglen = len; | |
4269 | 4639 |
4617 | 4640 ret = aim_im_sendch1_ext(od->sess, &args); |
2086 | 4641 } |
4838 | 4642 |
6310 | 4643 g_free(tmpmsg); |
4644 | |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
4645 if (ret >= 0) |
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
4646 return 1; |
6310 | 4647 |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
4648 return ret; |
2086 | 4649 } |
4650 | |
7011 | 4651 static void oscar_get_info(GaimConnection *gc, const char *name) { |
7283 | 4652 OscarData *od = (OscarData *)gc->proto_data; |
7011 | 4653 |
7173 | 4654 if (od->icq && isdigit(name[0])) |
4624 | 4655 aim_icq_getallinfo(od->sess, name); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4656 else |
7235 | 4657 aim_locate_getinfoshort(od->sess, name, 0x00000003); |
7011 | 4658 } |
4659 | |
4660 static void oscar_set_dir(GaimConnection *gc, const char *first, const char *middle, const char *last, | |
3466 | 4661 const char *maiden, const char *city, const char *state, const char *country, int web) { |
4617 | 4662 /* XXX - some of these things are wrong, but i'm lazy */ |
7283 | 4663 OscarData *od = (OscarData *)gc->proto_data; |
7011 | 4664 aim_locate_setdirinfo(od->sess, first, middle, last, |
2086 | 4665 maiden, NULL, NULL, city, state, NULL, 0, web); |
4666 } | |
4667 | |
5575 | 4668 static void oscar_set_idle(GaimConnection *gc, int time) { |
7283 | 4669 OscarData *od = (OscarData *)gc->proto_data; |
7474 | 4670 aim_srv_setidle(od->sess, time); |
2086 | 4671 } |
4672 | |
5954 | 4673 static void oscar_set_info(GaimConnection *gc, const char *text) { |
7283 | 4674 OscarData *od = (OscarData *)gc->proto_data; |
5129 | 4675 fu32_t flags = 0; |
6019 | 4676 char *text_html = NULL; |
5129 | 4677 char *msg = NULL; |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
4678 gsize msglen = 0; |
2993 | 4679 |
4617 | 4680 if (od->rights.maxsiglen == 0) |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4681 gaim_notify_warning(gc, NULL, _("Unable to set AIM profile."), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4682 _("You have probably requested to set your " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4683 "profile before the login procedure completed. " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4684 "Your profile remains unset; try setting it " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4685 "again when you are fully connected.")); |
4617 | 4686 |
7334 | 4687 if (!text) { |
4688 aim_locate_setprofile(od->sess, NULL, "", 0, NULL, NULL, 0); | |
4689 return; | |
4690 } | |
6019 | 4691 |
7334 | 4692 text_html = gaim_strdup_withhtml(text); |
4693 flags = oscar_encoding_check(text_html); | |
4694 if (flags & AIM_IMFLAGS_UNICODE) { | |
4695 msg = g_convert(text_html, strlen(text_html), "UCS-2BE", "UTF-8", NULL, &msglen, NULL); | |
4696 aim_locate_setprofile(od->sess, "unicode-2-0", msg, (msglen > od->rights.maxsiglen ? od->rights.maxsiglen : msglen), NULL, NULL, 0); | |
4697 g_free(msg); | |
4698 } else if (flags & AIM_IMFLAGS_ISO_8859_1) { | |
4699 msg = g_convert(text_html, strlen(text_html), "ISO-8859-1", "UTF-8", NULL, &msglen, NULL); | |
4700 aim_locate_setprofile(od->sess, "iso-8859-1", msg, (msglen > od->rights.maxsiglen ? od->rights.maxsiglen : msglen), NULL, NULL, 0); | |
4701 g_free(msg); | |
4702 } else { | |
4703 msglen = strlen(text_html); | |
4704 aim_locate_setprofile(od->sess, "us-ascii", text_html, (msglen > od->rights.maxsiglen ? od->rights.maxsiglen : msglen), NULL, NULL, 0); | |
4705 } | |
4706 | |
4707 if (msglen > od->rights.maxsiglen) { | |
4708 gchar *errstr; | |
4709 errstr = g_strdup_printf(ngettext("The maximum profile length of %d byte " | |
4710 "has been exceeded. Gaim has truncated it for you.", | |
4711 "The maximum profile length of %d bytes " | |
4712 "has been exceeded. Gaim has truncated it for you.", | |
4713 od->rights.maxsiglen), od->rights.maxsiglen); | |
4714 gaim_notify_warning(gc, NULL, _("Profile too long."), errstr); | |
4715 g_free(errstr); | |
4716 } | |
4717 | |
4718 g_free(text_html); | |
2993 | 4719 |
4720 return; | |
2086 | 4721 } |
4722 | |
8257 | 4723 static void oscar_set_away_aim(GaimConnection *gc, OscarData *od, const char *state, const char *text) |
2993 | 4724 { |
5129 | 4725 fu32_t flags = 0; |
6019 | 4726 gchar *text_html = NULL; |
5129 | 4727 char *msg = NULL; |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
4728 gsize msglen = 0; |
2993 | 4729 |
8257 | 4730 if (!strcmp(state, _("Visible"))) { |
4731 aim_setextstatus(od->sess, AIM_ICQ_STATE_NORMAL); | |
4732 return; | |
4733 } else if (!strcmp(state, _("Invisible"))) { | |
4734 aim_setextstatus(od->sess, AIM_ICQ_STATE_INVISIBLE); | |
4735 return; | |
4736 } /* else... */ | |
4737 | |
8476 | 4738 if (!strcmp(state, _("Back"))) { |
4739 /* If this is our only online account then globally set Gaim not-away */ | |
4740 GList *gcs = gaim_connections_get_all(); | |
4741 if (gcs->next == NULL) | |
4742 do_im_back(NULL, NULL); | |
4743 } | |
4744 | |
8257 | 4745 aim_setextstatus(od->sess, AIM_ICQ_STATE_NORMAL); |
4746 | |
2993 | 4747 if (od->rights.maxawaymsglen == 0) |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4748 gaim_notify_warning(gc, NULL, _("Unable to set AIM away message."), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4749 _("You have probably requested to set your " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4750 "away message before the login procedure " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4751 "completed. You remain in a \"present\" " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4752 "state; try setting it again when you are " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4753 "fully connected.")); |
5129 | 4754 |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4755 if (gc->away) { |
2993 | 4756 g_free(gc->away); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4757 gc->away = NULL; |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4758 } |
2993 | 4759 |
5129 | 4760 if (!text) { |
7334 | 4761 aim_locate_setprofile(od->sess, NULL, NULL, 0, NULL, "", 0); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4762 return; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4763 } |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4764 |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
4765 text_html = gaim_strdup_withhtml(text); |
6019 | 4766 flags = oscar_encoding_check(text_html); |
5129 | 4767 if (flags & AIM_IMFLAGS_UNICODE) { |
6019 | 4768 msg = g_convert(text_html, strlen(text_html), "UCS-2BE", "UTF-8", NULL, &msglen, NULL); |
7011 | 4769 aim_locate_setprofile(od->sess, NULL, NULL, 0, "unicode-2-0", msg, |
7334 | 4770 (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen)); |
5129 | 4771 g_free(msg); |
4772 gc->away = g_strndup(text, od->rights.maxawaymsglen/2); | |
4773 } else if (flags & AIM_IMFLAGS_ISO_8859_1) { | |
6019 | 4774 msg = g_convert(text_html, strlen(text_html), "ISO-8859-1", "UTF-8", NULL, &msglen, NULL); |
7011 | 4775 aim_locate_setprofile(od->sess, NULL, NULL, 0, "iso-8859-1", msg, |
7334 | 4776 (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen)); |
5129 | 4777 g_free(msg); |
6019 | 4778 gc->away = g_strndup(text_html, od->rights.maxawaymsglen); |
5129 | 4779 } else { |
6019 | 4780 msglen = strlen(text_html); |
7011 | 4781 aim_locate_setprofile(od->sess, NULL, NULL, 0, "us-ascii", text_html, |
7334 | 4782 (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen)); |
6019 | 4783 gc->away = g_strndup(text_html, od->rights.maxawaymsglen); |
5129 | 4784 } |
4785 | |
4786 if (msglen > od->rights.maxawaymsglen) { | |
2993 | 4787 gchar *errstr; |
4788 | |
6308 | 4789 errstr = g_strdup_printf(ngettext("The maximum away message length of %d byte " |
4790 "has been exceeded. Gaim has truncated it for you.", | |
4791 "The maximum away message length of %d bytes " | |
4792 "has been exceeded. Gaim has truncated it for you.", | |
4793 od->rights.maxawaymsglen), od->rights.maxawaymsglen); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4794 gaim_notify_warning(gc, NULL, _("Away message too long."), errstr); |
2993 | 4795 g_free(errstr); |
4796 } | |
6019 | 4797 |
4798 g_free(text_html); | |
8257 | 4799 |
2993 | 4800 return; |
4801 } | |
4802 | |
7283 | 4803 static void oscar_set_away_icq(GaimConnection *gc, OscarData *od, const char *state, const char *message) |
2993 | 4804 { |
5575 | 4805 GaimAccount *account = gaim_connection_get_account(gc); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4806 if (gc->away) { |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4807 g_free(gc->away); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4808 gc->away = NULL; |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4809 } |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4810 |
8265 | 4811 if (strcmp(state, _("Invisible"))) |
5575 | 4812 account->perm_deny = 4; |
8265 | 4813 else |
5575 | 4814 account->perm_deny = 3; |
8265 | 4815 if ((od->sess->ssi.received_data) && (aim_ssi_getpermdeny(od->sess->ssi.local) != account->perm_deny)) |
4816 aim_ssi_setpermdeny(od->sess, account->perm_deny, 0xffffffff); | |
4342 | 4817 |
4818 if (!strcmp(state, _("Online"))) | |
4901 | 4819 aim_setextstatus(od->sess, AIM_ICQ_STATE_NORMAL); |
4342 | 4820 else if (!strcmp(state, _("Away"))) { |
4901 | 4821 aim_setextstatus(od->sess, AIM_ICQ_STATE_AWAY); |
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, _("Do Not Disturb"))) { |
4901 | 4824 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
|
4825 gc->away = g_strdup(""); |
4342 | 4826 } else if (!strcmp(state, _("Not Available"))) { |
4901 | 4827 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
|
4828 gc->away = g_strdup(""); |
4342 | 4829 } else if (!strcmp(state, _("Occupied"))) { |
4901 | 4830 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
|
4831 gc->away = g_strdup(""); |
4342 | 4832 } else if (!strcmp(state, _("Free For Chat"))) { |
4901 | 4833 aim_setextstatus(od->sess, AIM_ICQ_STATE_CHAT); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4834 gc->away = g_strdup(""); |
4342 | 4835 } else if (!strcmp(state, _("Invisible"))) { |
4901 | 4836 aim_setextstatus(od->sess, AIM_ICQ_STATE_INVISIBLE); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4837 gc->away = g_strdup(""); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4838 } else if (!strcmp(state, GAIM_AWAY_CUSTOM)) { |
2998 | 4839 if (message) { |
4901 | 4840 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
|
4841 gc->away = g_strdup(""); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4842 } else { |
4901 | 4843 aim_setextstatus(od->sess, AIM_ICQ_STATE_NORMAL); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4844 } |
2086 | 4845 } |
2993 | 4846 |
4847 return; | |
4848 } | |
4849 | |
6059 | 4850 static void oscar_set_away(GaimConnection *gc, const char *state, const char *message) |
2993 | 4851 { |
7283 | 4852 OscarData *od = (OscarData *)gc->proto_data; |
2993 | 4853 |
4854 if (od->icq) | |
4855 oscar_set_away_icq(gc, od, state, message); | |
4856 else | |
8257 | 4857 oscar_set_away_aim(gc, od, state, message); |
2993 | 4858 |
4859 return; | |
2086 | 4860 } |
4861 | |
6059 | 4862 static void oscar_warn(GaimConnection *gc, const char *name, int anon) { |
7283 | 4863 OscarData *od = (OscarData *)gc->proto_data; |
4617 | 4864 aim_im_warn(od->sess, od->conn, name, anon ? AIM_WARN_ANON : 0); |
2086 | 4865 } |
4866 | |
5575 | 4867 static void oscar_dir_search(GaimConnection *gc, const char *first, const char *middle, const char *last, |
3466 | 4868 const char *maiden, const char *city, const char *state, const char *country, const char *email) { |
7283 | 4869 OscarData *od = (OscarData *)gc->proto_data; |
2086 | 4870 if (strlen(email)) |
6879 | 4871 aim_search_address(od->sess, od->conn, email); |
2086 | 4872 } |
4873 | |
6787
faa491042c66
[gaim-migrate @ 7326]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
4874 static void oscar_add_buddy(GaimConnection *gc, const char *name, GaimGroup *g) { |
7283 | 4875 OscarData *od = (OscarData *)gc->proto_data; |
8150 | 4876 GaimBuddy *b; |
4877 | |
4878 if (g == NULL) { | |
4879 /* If we were called from oscar_add_buddies... */ | |
4880 b = gaim_find_buddy(gaim_connection_get_account(gc), name); | |
4881 g = gaim_find_buddys_group(b); | |
4882 } else | |
4883 b = gaim_find_buddy_in_group(gaim_connection_get_account(gc), name, g); | |
8092 | 4884 |
4885 if (!aim_snvalid(name)) { | |
4886 gchar *buf; | |
8150 | 4887 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 | 4888 gaim_notify_error(gc, NULL, _("Unable To Add"), buf); |
4889 g_free(buf); | |
8150 | 4890 |
4891 /* Remove from local list */ | |
4892 gaim_blist_remove_buddy(b); | |
4893 | |
8092 | 4894 return; |
4895 } | |
4896 | |
4230 | 4897 #ifdef NOSSI |
8143 | 4898 aim_buddylist_addbuddy(od->sess, od->conn, name); |
4230 | 4899 #else |
4900 if ((od->sess->ssi.received_data) && !(aim_ssi_itemlist_exists(od->sess->ssi.local, name))) { | |
8150 | 4901 if (b && g) { |
8660 | 4902 gaim_debug_info("oscar", |
8150 | 4903 "ssi: adding buddy %s to group %s\n", name, g->name); |
4904 aim_ssi_addbuddy(od->sess, b->name, g->name, gaim_get_buddy_alias_only(b), NULL, NULL, 0); | |
4230 | 4905 } |
4906 } | |
4907 #endif | |
8150 | 4908 |
4759 | 4909 if (od->icq) |
4910 aim_icq_getalias(od->sess, name); | |
4230 | 4911 } |
4912 | |
5575 | 4913 static void oscar_add_buddies(GaimConnection *gc, GList *buddies) { |
7283 | 4914 OscarData *od = (OscarData *)gc->proto_data; |
4230 | 4915 #ifdef NOSSI |
4916 char buf[MSG_LEN]; | |
4917 int n=0; | |
4918 while (buddies) { | |
4919 if (n > MSG_LEN - 18) { | |
7285 | 4920 aim_buddylist_set(od->sess, od->conn, buf); |
4230 | 4921 n = 0; |
3092 | 4922 } |
8150 | 4923 n += g_snprintf(buf + n, sizeof(buf) - n, "%s&", (const char *)buddies->data); |
4230 | 4924 buddies = buddies->next; |
4925 } | |
7285 | 4926 aim_buddylist_set(od->sess, od->conn, buf); |
4230 | 4927 #else |
4928 if (od->sess->ssi.received_data) { | |
4929 while (buddies) { | |
8092 | 4930 oscar_add_buddy(gc, buddies->data, NULL); |
4230 | 4931 buddies = buddies->next; |
4932 } | |
4933 } | |
4934 #endif | |
4935 } | |
4936 | |
6059 | 4937 static void oscar_remove_buddy(GaimConnection *gc, const char *name, const char *group) { |
7283 | 4938 OscarData *od = (OscarData *)gc->proto_data; |
4230 | 4939 #ifdef NOSSI |
8143 | 4940 aim_buddylist_removebuddy(od->sess, od->conn, name); |
4230 | 4941 #else |
4942 if (od->sess->ssi.received_data) { | |
8660 | 4943 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4944 "ssi: deleting buddy %s from group %s\n", name, group); |
4889 | 4945 aim_ssi_delbuddy(od->sess, name, group); |
4230 | 4946 } |
4947 #endif | |
4948 } | |
4949 | |
5575 | 4950 static void oscar_remove_buddies(GaimConnection *gc, GList *buddies, const char *group) { |
7283 | 4951 OscarData *od = (OscarData *)gc->proto_data; |
4230 | 4952 #ifdef NOSSI |
4953 GList *cur; | |
4954 for (cur=buddies; cur; cur=cur->next) | |
8143 | 4955 aim_buddylist_removebuddy(od->sess, od->conn, cur->data); |
4230 | 4956 #else |
4957 if (od->sess->ssi.received_data) { | |
3092 | 4958 while (buddies) { |
8150 | 4959 oscar_remove_buddy(gc, buddies->data, group); |
3092 | 4960 buddies = buddies->next; |
4961 } | |
4230 | 4962 } |
4963 #endif | |
4964 } | |
4965 | |
4966 #ifndef NOSSI | |
5575 | 4967 static void oscar_move_buddy(GaimConnection *gc, const char *name, const char *old_group, const char *new_group) { |
7283 | 4968 OscarData *od = (OscarData *)gc->proto_data; |
4303 | 4969 if (od->sess->ssi.received_data && strcmp(old_group, new_group)) { |
8660 | 4970 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4971 "ssi: moving buddy %s from group %s to group %s\n", name, old_group, new_group); |
4889 | 4972 aim_ssi_movebuddy(od->sess, old_group, new_group, name); |
4269 | 4973 } |
4974 } | |
4975 | |
5575 | 4976 static void oscar_alias_buddy(GaimConnection *gc, const char *name, const char *alias) { |
7283 | 4977 OscarData *od = (OscarData *)gc->proto_data; |
4269 | 4978 if (od->sess->ssi.received_data) { |
4979 char *gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, name); | |
4980 if (gname) { | |
8660 | 4981 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4982 "ssi: changing the alias for buddy %s to %s\n", name, alias); |
4889 | 4983 aim_ssi_aliasbuddy(od->sess, gname, name, alias); |
4269 | 4984 } |
4985 } | |
4986 } | |
4987 | |
8341 | 4988 static void oscar_rename_group(GaimConnection *gc, const char *old_group, const char *new_group, GList *members) { |
4989 OscarData *od = (OscarData *)gc->proto_data; | |
4230 | 4990 |
4991 if (od->sess->ssi.received_data) { | |
4992 if (aim_ssi_itemlist_finditem(od->sess->ssi.local, new_group, NULL, AIM_SSI_TYPE_GROUP)) { | |
8341 | 4993 oscar_remove_buddies(gc, members, old_group); |
4994 oscar_add_buddies(gc, members); | |
8660 | 4995 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4996 "ssi: moved all buddies from group %s to %s\n", old_group, new_group); |
4230 | 4997 } else { |
4889 | 4998 aim_ssi_rename_group(od->sess, old_group, new_group); |
8660 | 4999 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5000 "ssi: renamed group %s to %s\n", old_group, new_group); |
2995 | 5001 } |
5002 } | |
5003 } | |
5004 | |
5968 | 5005 static gboolean gaim_ssi_rerequestdata(gpointer data) { |
5006 aim_session_t *sess = data; | |
6350 | 5007 aim_ssi_reqdata(sess); |
5968 | 5008 return FALSE; |
5009 } | |
5010 | |
4642 | 5011 static int gaim_ssi_parseerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 5012 GaimConnection *gc = sess->aux_data; |
7283 | 5013 OscarData *od = gc->proto_data; |
4642 | 5014 va_list ap; |
5015 fu16_t reason; | |
5016 | |
5017 va_start(ap, fr); | |
5018 reason = (fu16_t)va_arg(ap, unsigned int); | |
5019 va_end(ap); | |
5020 | |
8660 | 5021 gaim_debug_error("oscar", "ssi: SNAC error %hu\n", reason); |
4642 | 5022 |
5023 if (reason == 0x0005) { | |
5892 | 5024 gaim_notify_error(gc, NULL, _("Unable To Retrieve Buddy List"), |
5828 | 5025 _("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
|
5026 od->getblisttimer = gaim_timeout_add(300000, gaim_ssi_rerequestdata, od->sess); |
4642 | 5027 } |
5028 | |
5029 /* Activate SSI */ | |
5030 /* Sending the enable causes other people to be able to see you, and you to see them */ | |
5031 /* Make sure your privacy setting/invisibility is set how you want it before this! */ | |
8660 | 5032 gaim_debug_info("oscar", "ssi: activating server-stored buddy list\n"); |
4642 | 5033 aim_ssi_enable(od->sess); |
5034 | |
5035 return 1; | |
5036 } | |
5037 | |
2991 | 5038 static int gaim_ssi_parserights(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 5039 GaimConnection *gc = sess->aux_data; |
7283 | 5040 OscarData *od = (OscarData *)gc->proto_data; |
4230 | 5041 int numtypes, i; |
5042 fu16_t *maxitems; | |
2991 | 5043 va_list ap; |
5044 | |
5045 va_start(ap, fr); | |
4230 | 5046 numtypes = va_arg(ap, int); |
5047 maxitems = va_arg(ap, fu16_t *); | |
2991 | 5048 va_end(ap); |
5049 | |
8660 | 5050 gaim_debug_misc("oscar", "ssi rights:"); |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
5051 |
4230 | 5052 for (i=0; i<numtypes; i++) |
8660 | 5053 gaim_debug_misc(NULL, " max type 0x%04x=%hd,", |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
5054 i, maxitems[i]); |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
5055 |
8660 | 5056 gaim_debug_misc(NULL, "\n"); |
4230 | 5057 |
5058 if (numtypes >= 0) | |
5059 od->rights.maxbuddies = maxitems[0]; | |
5060 if (numtypes >= 1) | |
5061 od->rights.maxgroups = maxitems[1]; | |
5062 if (numtypes >= 2) | |
5063 od->rights.maxpermits = maxitems[2]; | |
5064 if (numtypes >= 3) | |
5065 od->rights.maxdenies = maxitems[3]; | |
2991 | 5066 |
5067 return 1; | |
5068 } | |
5069 | |
5070 static int gaim_ssi_parselist(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 5071 GaimConnection *gc = sess->aux_data; |
5072 GaimAccount *account = gaim_connection_get_account(gc); | |
7283 | 5073 OscarData *od = (OscarData *)gc->proto_data; |
8150 | 5074 GaimGroup *g; |
5075 GaimBuddy *b; | |
2995 | 5076 struct aim_ssi_item *curitem; |
2991 | 5077 int tmp; |
4230 | 5078 va_list ap; |
8219 | 5079 fu16_t fmtver, numitems; |
5080 struct aim_ssi_item *items; | |
5081 fu32_t timestamp; | |
4230 | 5082 |
5083 va_start(ap, fr); | |
5084 fmtver = (fu16_t)va_arg(ap, int); | |
5085 numitems = (fu16_t)va_arg(ap, int); | |
8219 | 5086 items = va_arg(ap, struct aim_ssi_item *); |
4230 | 5087 timestamp = va_arg(ap, fu32_t); |
8219 | 5088 va_end(ap); |
2991 | 5089 |
8660 | 5090 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5091 "ssi: syncing local list and server list\n"); |
2991 | 5092 |
8219 | 5093 if ((timestamp == 0) || (numitems == 0)) { |
8660 | 5094 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 | 5095 return 1; |
5096 } | |
5097 | |
2991 | 5098 /* Clean the buddy list */ |
4889 | 5099 aim_ssi_cleanlist(sess); |
2991 | 5100 |
8150 | 5101 { /* If not in server list then prune from local list */ |
5102 GaimBlistNode *gnode, *cnode, *bnode; | |
5103 GaimBuddyList *blist; | |
5104 GSList *cur; | |
5105 | |
5106 /* Buddies */ | |
5107 cur = NULL; | |
5108 if ((blist = gaim_get_blist()) != NULL) { | |
5109 for (gnode = blist->root; gnode; gnode = gnode->next) { | |
5110 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
5111 continue; | |
5112 g = (GaimGroup *)gnode; | |
5113 for (cnode = gnode->child; cnode; cnode = cnode->next) { | |
5114 if(!GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
5115 continue; | |
5116 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
5117 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
5118 continue; | |
5119 b = (GaimBuddy *)bnode; | |
5120 if (b->account == gc->account) { | |
5121 if (aim_ssi_itemlist_exists(sess->ssi.local, b->name)) { | |
5122 /* If the buddy is an ICQ user then load his nickname */ | |
5123 const char *servernick = gaim_blist_node_get_string((GaimBlistNode*)b, "servernick"); | |
8214 | 5124 char *alias; |
8150 | 5125 if (servernick) |
5126 serv_got_alias(gc, b->name, servernick); | |
5127 | |
5128 /* Store local alias on server */ | |
8214 | 5129 alias = aim_ssi_getalias(sess->ssi.local, g->name, b->name); |
8150 | 5130 if (!alias && b->alias && strlen(b->alias)) |
5131 aim_ssi_aliasbuddy(sess, g->name, b->name, b->alias); | |
5132 free(alias); | |
5133 } else { | |
8660 | 5134 gaim_debug_info("oscar", |
8150 | 5135 "ssi: removing buddy %s from local list\n", b->name); |
5136 /* We can't actually remove now because it will screw up our looping */ | |
5137 cur = g_slist_prepend(cur, b); | |
5138 } | |
5139 } | |
5140 } | |
5141 } | |
5142 } | |
5143 } | |
8175 | 5144 |
8150 | 5145 while (cur != NULL) { |
5146 b = cur->data; | |
5147 cur = g_slist_remove(cur, b); | |
5148 gaim_blist_remove_buddy(b); | |
5149 } | |
5150 | |
5151 /* Permit list */ | |
5152 if (gc->account->permit) { | |
5153 for (cur=gc->account->permit; cur; cur=cur->next) | |
5154 if (!aim_ssi_itemlist_finditem(sess->ssi.local, NULL, cur->data, AIM_SSI_TYPE_PERMIT)) { | |
8660 | 5155 gaim_debug_info("oscar", |
8150 | 5156 "ssi: removing permit %s from local list\n", (const char *)cur->data); |
5157 gaim_privacy_permit_remove(account, cur->data, TRUE); | |
5158 cur = gc->account->permit; | |
5159 } | |
5160 } | |
5161 | |
5162 /* Deny list */ | |
5163 if (gc->account->deny) { | |
5164 for (cur=gc->account->deny; cur; cur=cur->next) | |
5165 if (!aim_ssi_itemlist_finditem(sess->ssi.local, NULL, cur->data, AIM_SSI_TYPE_DENY)) { | |
8660 | 5166 gaim_debug_info("oscar", |
8150 | 5167 "ssi: removing deny %s from local list\n", (const char *)cur->data); |
5168 gaim_privacy_deny_remove(account, cur->data, TRUE); | |
5169 cur = gc->account->deny; | |
5170 } | |
5171 } | |
5172 /* Presence settings (idle time visibility) */ | |
5173 if ((tmp = aim_ssi_getpresence(sess->ssi.local)) != 0xFFFFFFFF) | |
5174 if (!(tmp & 0x400)) | |
5175 aim_ssi_setpresence(sess, tmp | 0x400); | |
5176 } /* end pruning buddies from local list */ | |
5177 | |
2991 | 5178 /* Add from server list to local list */ |
4230 | 5179 for (curitem=sess->ssi.local; curitem; curitem=curitem->next) { |
7328 | 5180 if ((curitem->name == NULL) || (g_utf8_validate(curitem->name, -1, NULL))) |
2991 | 5181 switch (curitem->type) { |
4230 | 5182 case 0x0000: { /* Buddy */ |
4251 | 5183 if (curitem->name) { |
4292 | 5184 char *gname = aim_ssi_itemlist_findparentname(sess->ssi.local, curitem->name); |
7166 | 5185 char *gname_utf8 = gname ? gaim_utf8_try_convert(gname) : NULL; |
4282 | 5186 char *alias = aim_ssi_getalias(sess->ssi.local, gname, curitem->name); |
7166 | 5187 char *alias_utf8 = alias ? gaim_utf8_try_convert(alias) : NULL; |
8150 | 5188 b = gaim_find_buddy(gc->account, curitem->name); |
4458 | 5189 /* Should gname be freed here? -- elb */ |
4754 | 5190 /* Not with the current code, but that might be cleaner -- med */ |
4458 | 5191 free(alias); |
8150 | 5192 if (b) { |
4292 | 5193 /* Get server stored alias */ |
4705 | 5194 if (alias_utf8) { |
8150 | 5195 g_free(b->alias); |
5196 b->alias = g_strdup(alias_utf8); | |
4705 | 5197 } |
4282 | 5198 } else { |
8150 | 5199 b = gaim_buddy_new(gc->account, curitem->name, alias_utf8); |
5146 | 5200 |
4754 | 5201 if (!(g = gaim_find_group(gname_utf8 ? gname_utf8 : _("Orphans")))) { |
4687 | 5202 g = gaim_group_new(gname_utf8 ? gname_utf8 : _("Orphans")); |
4754 | 5203 gaim_blist_add_group(g, NULL); |
5204 } | |
5146 | 5205 |
8660 | 5206 gaim_debug_info("oscar", |
8150 | 5207 "ssi: adding b %s to group %s to local list\n", curitem->name, gname_utf8 ? gname_utf8 : _("Orphans")); |
5208 gaim_blist_add_buddy(b, NULL, g, NULL); | |
4251 | 5209 } |
8341 | 5210 if (!aim_sncmp(curitem->name, account->username)) { |
5211 char *comment = aim_ssi_getcomment(sess->ssi.local, gname, curitem->name); | |
5212 gaim_check_comment(od, comment); | |
5213 free(comment); | |
5214 } | |
7162 | 5215 g_free(gname_utf8); |
5216 g_free(alias_utf8); | |
2991 | 5217 } |
4230 | 5218 } break; |
5219 | |
5220 case 0x0001: { /* Group */ | |
4282 | 5221 /* Shouldn't add empty groups */ |
4230 | 5222 } break; |
5223 | |
5224 case 0x0002: { /* Permit buddy */ | |
2991 | 5225 if (curitem->name) { |
4230 | 5226 /* if (!find_permdeny_by_name(gc->permit, curitem->name)) { AAA */ |
2991 | 5227 GSList *list; |
5575 | 5228 for (list=account->permit; (list && aim_sncmp(curitem->name, list->data)); list=list->next); |
2991 | 5229 if (!list) { |
8660 | 5230 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5231 "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
|
5232 gaim_privacy_permit_add(account, curitem->name, TRUE); |
2991 | 5233 } |
5234 } | |
4230 | 5235 } break; |
5236 | |
5237 case 0x0003: { /* Deny buddy */ | |
2991 | 5238 if (curitem->name) { |
5239 GSList *list; | |
5575 | 5240 for (list=account->deny; (list && aim_sncmp(curitem->name, list->data)); list=list->next); |
2991 | 5241 if (!list) { |
8660 | 5242 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5243 "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
|
5244 gaim_privacy_deny_add(account, curitem->name, TRUE); |
2991 | 5245 } |
5246 } | |
4230 | 5247 } break; |
5248 | |
5249 case 0x0004: { /* Permit/deny setting */ | |
2991 | 5250 if (curitem->data) { |
5251 fu8_t permdeny; | |
5575 | 5252 if ((permdeny = aim_ssi_getpermdeny(sess->ssi.local)) && (permdeny != account->perm_deny)) { |
8660 | 5253 gaim_debug_info("oscar", |
5575 | 5254 "ssi: changing permdeny from %d to %hhu\n", account->perm_deny, permdeny); |
5255 account->perm_deny = permdeny; | |
5256 if (od->icq && account->perm_deny == 0x03) { | |
4342 | 5257 serv_set_away(gc, "Invisible", ""); |
5258 } | |
2991 | 5259 } |
5260 } | |
4230 | 5261 } break; |
5262 | |
5263 case 0x0005: { /* Presence setting */ | |
3109 | 5264 /* We don't want to change Gaim's setting because it applies to all accounts */ |
4230 | 5265 } break; |
2991 | 5266 } /* End of switch on curitem->type */ |
5267 } /* End of for loop */ | |
4230 | 5268 |
4901 | 5269 /* Set our ICQ status */ |
8257 | 5270 if (!gc->away) { |
4901 | 5271 aim_setextstatus(sess, AIM_ICQ_STATE_NORMAL); |
5272 } | |
5273 | |
4342 | 5274 /* Activate SSI */ |
5275 /* Sending the enable causes other people to be able to see you, and you to see them */ | |
5276 /* Make sure your privacy setting/invisibility is set how you want it before this! */ | |
8660 | 5277 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5278 "ssi: activating server-stored buddy list\n"); |
4642 | 5279 aim_ssi_enable(sess); |
4342 | 5280 |
2991 | 5281 return 1; |
2086 | 5282 } |
4230 | 5283 |
5284 static int gaim_ssi_parseack(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 5285 GaimConnection *gc = sess->aux_data; |
4230 | 5286 va_list ap; |
5287 struct aim_ssi_tmp *retval; | |
5288 | |
5289 va_start(ap, fr); | |
5290 retval = va_arg(ap, struct aim_ssi_tmp *); | |
5291 va_end(ap); | |
5292 | |
5293 while (retval) { | |
8660 | 5294 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5295 "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 | 5296 |
5297 if (retval->ack != 0xffff) | |
5298 switch (retval->ack) { | |
5299 case 0x0000: { /* added successfully */ | |
5300 } break; | |
5301 | |
4829 | 5302 case 0x000c: { /* you are over the limit, the cheat is to the limit, come on fhqwhgads */ |
5303 gchar *buf; | |
5304 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
|
5305 gaim_notify_error(gc, NULL, _("Unable To Add"), buf); |
4829 | 5306 g_free(buf); |
5307 } | |
5308 | |
7023 | 5309 case 0x000e: { /* buddy requires authorization */ |
4828 | 5310 if ((retval->action == AIM_CB_SSI_ADD) && (retval->name)) |
4269 | 5311 gaim_auth_sendrequest(gc, retval->name); |
4230 | 5312 } break; |
5313 | |
5314 default: { /* La la la */ | |
5197 | 5315 gchar *buf; |
8660 | 5316 gaim_debug_error("oscar", "ssi: Action 0x%04hx was unsuccessful with error 0x%04hx\n", retval->action, retval->ack); |
5402 | 5317 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
|
5318 gaim_notify_error(gc, NULL, _("Unable To Add"), buf); |
5197 | 5319 g_free(buf); |
4230 | 5320 } break; |
5321 } | |
5322 | |
5323 retval = retval->next; | |
5324 } | |
5325 | |
5326 return 1; | |
5327 } | |
5328 | |
8227 | 5329 static int gaim_ssi_parseadd(aim_session_t *sess, aim_frame_t *fr, ...) { |
5330 GaimConnection *gc = sess->aux_data; | |
5331 char *gname, *gname_utf8, *alias, *alias_utf8; | |
5332 GaimBuddy *b; | |
5333 GaimGroup *g; | |
5334 va_list ap; | |
5335 fu16_t type; | |
5336 const char *name; | |
5337 | |
5338 va_start(ap, fr); | |
5339 type = (fu16_t)va_arg(ap, int); | |
5340 name = va_arg(ap, char *); | |
5341 va_end(ap); | |
5342 | |
5343 if ((type != 0x0000) || (name == NULL)) | |
5344 return 1; | |
5345 | |
5346 gname = aim_ssi_itemlist_findparentname(sess->ssi.local, name); | |
5347 gname_utf8 = gname ? gaim_utf8_try_convert(gname) : NULL; | |
5348 alias = aim_ssi_getalias(sess->ssi.local, gname, name); | |
5349 alias_utf8 = alias ? gaim_utf8_try_convert(alias) : NULL; | |
5350 b = gaim_find_buddy(gc->account, name); | |
5351 free(alias); | |
5352 | |
5353 if (b) { | |
5354 /* Get server stored alias */ | |
5355 if (alias_utf8) { | |
5356 g_free(b->alias); | |
5357 b->alias = g_strdup(alias_utf8); | |
5358 } | |
5359 } else { | |
5360 b = gaim_buddy_new(gc->account, name, alias_utf8); | |
5361 | |
5362 if (!(g = gaim_find_group(gname_utf8 ? gname_utf8 : _("Orphans")))) { | |
5363 g = gaim_group_new(gname_utf8 ? gname_utf8 : _("Orphans")); | |
5364 gaim_blist_add_group(g, NULL); | |
5365 } | |
5366 | |
8660 | 5367 gaim_debug_info("oscar", |
8227 | 5368 "ssi: adding b %s to group %s to local list\n", name, gname_utf8 ? gname_utf8 : _("Orphans")); |
5369 gaim_blist_add_buddy(b, NULL, g, NULL); | |
5370 } | |
5371 g_free(gname_utf8); | |
5372 g_free(alias_utf8); | |
5373 | |
5374 return 1; | |
5375 } | |
5376 | |
4230 | 5377 static int gaim_ssi_authgiven(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 5378 GaimConnection *gc = sess->aux_data; |
4230 | 5379 va_list ap; |
5380 char *sn, *msg; | |
4236 | 5381 gchar *dialog_msg, *nombre; |
4230 | 5382 struct name_data *data; |
6695 | 5383 GaimBuddy *buddy; |
4230 | 5384 |
5385 va_start(ap, fr); | |
5386 sn = va_arg(ap, char *); | |
5387 msg = va_arg(ap, char *); | |
5388 va_end(ap); | |
5389 | |
8660 | 5390 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5391 "ssi: %s has given you permission to add him to your buddy list\n", sn); |
4230 | 5392 |
4687 | 5393 buddy = gaim_find_buddy(gc->account, sn); |
5394 if (buddy && (gaim_get_buddy_alias_only(buddy))) | |
5395 nombre = g_strdup_printf("%s (%s)", sn, gaim_get_buddy_alias_only(buddy)); | |
4236 | 5396 else |
5397 nombre = g_strdup(sn); | |
5398 | |
5399 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 | 5400 data = g_new(struct name_data, 1); |
5401 data->gc = gc; | |
5402 data->name = g_strdup(sn); | |
5403 data->nick = NULL; | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5404 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5405 gaim_request_yes_no(gc, NULL, _("Authorization Given"), dialog_msg, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5406 0, data, |
7023 | 5407 G_CALLBACK(gaim_icq_buddyadd), |
5836 | 5408 G_CALLBACK(oscar_free_name_data)); |
4236 | 5409 |
4230 | 5410 g_free(dialog_msg); |
4236 | 5411 g_free(nombre); |
4230 | 5412 |
5413 return 1; | |
5414 } | |
5415 | |
5416 static int gaim_ssi_authrequest(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 5417 GaimConnection *gc = sess->aux_data; |
4230 | 5418 va_list ap; |
5419 char *sn, *msg; | |
4236 | 5420 gchar *dialog_msg, *nombre; |
4230 | 5421 struct name_data *data; |
6695 | 5422 GaimBuddy *buddy; |
4230 | 5423 |
5424 va_start(ap, fr); | |
5425 sn = va_arg(ap, char *); | |
5426 msg = va_arg(ap, char *); | |
5427 va_end(ap); | |
5428 | |
8660 | 5429 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5430 "ssi: received authorization request from %s\n", sn); |
4230 | 5431 |
4687 | 5432 buddy = gaim_find_buddy(gc->account, sn); |
5433 if (buddy && (gaim_get_buddy_alias_only(buddy))) | |
5434 nombre = g_strdup_printf("%s (%s)", sn, gaim_get_buddy_alias_only(buddy)); | |
4236 | 5435 else |
5436 nombre = g_strdup(sn); | |
5437 | |
4337 | 5438 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 | 5439 data = g_new(struct name_data, 1); |
5440 data->gc = gc; | |
5441 data->name = g_strdup(sn); | |
5442 data->nick = NULL; | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5443 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5444 gaim_request_action(gc, NULL, _("Authorization Request"), dialog_msg, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5445 0, data, 2, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5446 _("Authorize"), G_CALLBACK(gaim_auth_grant), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5447 _("Deny"), G_CALLBACK(gaim_auth_dontgrant_msgprompt)); |
4236 | 5448 |
4230 | 5449 g_free(dialog_msg); |
4236 | 5450 g_free(nombre); |
4230 | 5451 |
5452 return 1; | |
5453 } | |
5454 | |
5455 static int gaim_ssi_authreply(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 5456 GaimConnection *gc = sess->aux_data; |
4230 | 5457 va_list ap; |
5458 char *sn, *msg; | |
4236 | 5459 gchar *dialog_msg, *nombre; |
4230 | 5460 fu8_t reply; |
6695 | 5461 GaimBuddy *buddy; |
4230 | 5462 |
5463 va_start(ap, fr); | |
5464 sn = va_arg(ap, char *); | |
5465 reply = (fu8_t)va_arg(ap, int); | |
5466 msg = va_arg(ap, char *); | |
5467 va_end(ap); | |
5468 | |
8660 | 5469 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5470 "ssi: received authorization reply from %s. Reply is 0x%04hhx\n", sn, reply); |
4236 | 5471 |
4687 | 5472 buddy = gaim_find_buddy(gc->account, sn); |
5473 if (buddy && (gaim_get_buddy_alias_only(buddy))) | |
5474 nombre = g_strdup_printf("%s (%s)", sn, gaim_get_buddy_alias_only(buddy)); | |
4236 | 5475 else |
5476 nombre = g_strdup(sn); | |
5477 | |
4230 | 5478 if (reply) { |
5479 /* Granted */ | |
7023 | 5480 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
|
5481 gaim_notify_info(gc, NULL, _("Authorization Granted"), dialog_msg); |
4230 | 5482 } else { |
5483 /* Denied */ | |
7023 | 5484 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
|
5485 gaim_notify_info(gc, NULL, _("Authorization Denied"), dialog_msg); |
4230 | 5486 } |
5487 g_free(dialog_msg); | |
4236 | 5488 g_free(nombre); |
4230 | 5489 |
5490 return 1; | |
5491 } | |
5492 | |
5493 static int gaim_ssi_gotadded(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5575 | 5494 GaimConnection *gc = sess->aux_data; |
4230 | 5495 va_list ap; |
5496 char *sn; | |
6695 | 5497 GaimBuddy *buddy; |
4230 | 5498 |
5499 va_start(ap, fr); | |
5500 sn = va_arg(ap, char *); | |
5501 va_end(ap); | |
5502 | |
4687 | 5503 buddy = gaim_find_buddy(gc->account, sn); |
8660 | 5504 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5505 "ssi: %s added you to their buddy list\n", sn); |
7015
dece74f05509
[gaim-migrate @ 7578]
Christian Hammond <chipx86@chipx86.com>
parents:
7011
diff
changeset
|
5506 gaim_account_notify_added(gc->account, NULL, sn, (buddy ? gaim_get_buddy_alias_only(buddy) : NULL), NULL); |
4230 | 5507 |
5508 return 1; | |
5509 } | |
4269 | 5510 #endif |
2086 | 5511 |
5575 | 5512 static GList *oscar_chat_info(GaimConnection *gc) { |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5513 GList *m = NULL; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5514 struct proto_chat_entry *pce; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5515 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5516 pce = g_new0(struct proto_chat_entry, 1); |
7841 | 5517 pce->label = _("_Group:"); |
5234 | 5518 pce->identifier = "room"; |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5519 m = g_list_append(m, pce); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5520 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5521 pce = g_new0(struct proto_chat_entry, 1); |
7841 | 5522 pce->label = _("_Exchange:"); |
5234 | 5523 pce->identifier = "exchange"; |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5524 pce->is_int = TRUE; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5525 pce->min = 4; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5526 pce->max = 20; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5527 m = g_list_append(m, pce); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5528 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5529 return m; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5530 } |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5531 |
8308 | 5532 static void oscar_join_chat(GaimConnection *gc, GHashTable *data) { |
5533 OscarData *od = (OscarData *)gc->proto_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5534 aim_conn_t *cur; |
5234 | 5535 char *name, *exchange; |
5536 | |
5537 name = g_hash_table_lookup(data, "room"); | |
5538 exchange = g_hash_table_lookup(data, "exchange"); | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5539 |
8660 | 5540 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5541 "Attempting to join chat room %s.\n", name); |
8308 | 5542 |
5543 if ((name == NULL) || (*name == '\0')) { | |
5544 gaim_notify_error(gc, NULL, _("Invalid chat name specified."), NULL); | |
5545 return; | |
5546 } | |
5547 | |
4617 | 5548 if ((cur = aim_getconn_type(od->sess, AIM_CONN_TYPE_CHATNAV))) { |
8660 | 5549 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5550 "chatnav exists, creating room\n"); |
5234 | 5551 aim_chatnav_createroom(od->sess, cur, name, atoi(exchange)); |
2086 | 5552 } else { |
5553 /* this gets tricky */ | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
5554 struct create_room *cr = g_new0(struct create_room, 1); |
8660 | 5555 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5556 "chatnav does not exist, opening chatnav\n"); |
5234 | 5557 cr->exchange = atoi(exchange); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
5558 cr->name = g_strdup(name); |
4617 | 5559 od->create_rooms = g_slist_append(od->create_rooms, cr); |
5560 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_CHATNAV); | |
2086 | 5561 } |
5562 } | |
5563 | |
8308 | 5564 static void oscar_chat_invite(GaimConnection *gc, int id, const char *message, const char *name) { |
5565 OscarData *od = (OscarData *)gc->proto_data; | |
5566 struct chat_connection *ccon = find_oscar_chat(gc, id); | |
2086 | 5567 |
5568 if (!ccon) | |
5569 return; | |
5570 | |
8225 | 5571 aim_im_sendch2_chatinvite(od->sess, name, message ? message : "", |
2086 | 5572 ccon->exchange, ccon->name, 0x0); |
5573 } | |
5574 | |
8308 | 5575 static void oscar_chat_leave(GaimConnection *gc, int id) { |
5576 OscarData *od = gc ? (OscarData *)gc->proto_data : NULL; | |
5577 GSList *bcs = gc->buddy_chats; | |
5679 | 5578 GaimConversation *b = NULL; |
2086 | 5579 struct chat_connection *c = NULL; |
5580 int count = 0; | |
5581 | |
5582 while (bcs) { | |
5583 count++; | |
5679 | 5584 b = (GaimConversation *)bcs->data; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
5585 if (id == gaim_conv_chat_get_id(GAIM_CONV_CHAT(b))) |
2086 | 5586 break; |
5587 bcs = bcs->next; | |
5588 b = NULL; | |
5589 } | |
5590 | |
5591 if (!b) | |
5592 return; | |
5593 | |
8660 | 5594 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5595 "Attempting to leave room %s (currently in %d rooms)\n", b->name, count); |
2086 | 5596 |
8308 | 5597 c = find_oscar_chat(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(b))); |
2086 | 5598 if (c != NULL) { |
4617 | 5599 if (od) |
5600 od->oscar_chats = g_slist_remove(od->oscar_chats, c); | |
2086 | 5601 if (c->inpa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
5602 gaim_input_remove(c->inpa); |
8308 | 5603 if (gc && od->sess) |
4617 | 5604 aim_conn_kill(od->sess, &c->conn); |
2086 | 5605 g_free(c->name); |
5606 g_free(c->show); | |
5607 g_free(c); | |
5608 } | |
5609 /* we do this because with Oscar it doesn't tell us we left */ | |
8308 | 5610 serv_got_chat_left(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(b))); |
2086 | 5611 } |
5612 | |
8219 | 5613 static int oscar_send_chat(GaimConnection *gc, int id, const char *message) { |
5614 OscarData *od = (OscarData *)gc->proto_data; | |
5615 GError *err = NULL; | |
5616 GaimConversation *conv = NULL; | |
2086 | 5617 struct chat_connection *c = NULL; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5618 char *buf, *buf2; |
8219 | 5619 char *charset = NULL; |
5620 int encoding; | |
5621 int len; | |
5622 | |
5623 if (!(conv = gaim_find_chat(gc, id))) | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5624 return -EINVAL; |
2086 | 5625 |
8219 | 5626 if (!(c = find_oscar_chat_by_conv(gc, conv))) |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5627 return -EINVAL; |
2086 | 5628 |
8219 | 5629 buf = gaim_strdup_withhtml(message); |
5630 len = strlen(buf); | |
5631 | |
5632 encoding = oscar_encoding_check(buf); | |
8233 | 5633 if (encoding & AIM_IMFLAGS_UNICODE) { |
8660 | 5634 gaim_debug_info("oscar", "Sending Unicode chat\n"); |
8219 | 5635 charset = "unicode-2-0"; |
5636 buf2 = g_convert(buf, len, "UCS-2BE", "UTF-8", NULL, &len, &err); | |
5637 if (err) { | |
8660 | 5638 gaim_debug_error("oscar", |
8359 | 5639 "Error converting to unicode-2-0: %s\n", err->message); |
5640 g_error_free(err); | |
5641 } | |
8219 | 5642 } else if (encoding & AIM_IMFLAGS_ISO_8859_1) { |
8660 | 5643 gaim_debug_info("oscar", "Sending ISO-8859-1 chat\n"); |
8219 | 5644 charset = "iso-8859-1"; |
5645 buf2 = g_convert(buf, len, "ISO-8859-1", "UTF-8", NULL, &len, &err); | |
5646 if (err) { | |
8660 | 5647 gaim_debug_error("oscar", |
8359 | 5648 "Error converting to iso-8859-1: %s\n", err->message); |
8219 | 5649 g_error_free(err); |
8359 | 5650 err = NULL; |
5651 | |
8660 | 5652 gaim_debug_info("oscar", "Falling back to Unicode\n"); |
8359 | 5653 charset = "unicode-2-0"; |
5654 buf2 = g_convert(buf, len, "UCS-2BE", "UTF-8", NULL, &len, &err); | |
8219 | 5655 if (err) { |
8660 | 5656 gaim_debug_error("oscar", |
8359 | 5657 "Error converting to unicode-2-0: %s\n", |
5658 err->message); | |
8219 | 5659 g_error_free(err); |
5660 } | |
2086 | 5661 } |
8219 | 5662 } else { |
5663 charset = "us-ascii"; | |
5664 buf2 = g_strdup(buf); | |
5665 } | |
8359 | 5666 g_free(buf); |
5667 | |
5668 if ((len > c->maxlen) || (len > c->maxvis)) { | |
5669 g_free(buf2); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5670 return -E2BIG; |
8359 | 5671 } |
5672 | |
5673 aim_chat_send_im(od->sess, c->conn, 0, buf2, len, charset, "en"); | |
8219 | 5674 g_free(buf2); |
8359 | 5675 |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5676 return 0; |
2086 | 5677 } |
5678 | |
6695 | 5679 static const char *oscar_list_icon(GaimAccount *a, GaimBuddy *b) { |
4766 | 5680 if (!b || (b && b->name && b->name[0] == '+')) { |
5646
48c63ee49961
[gaim-migrate @ 6060]
Christian Hammond <chipx86@chipx86.com>
parents:
5638
diff
changeset
|
5681 if (a != NULL && isdigit(*gaim_account_get_username(a))) |
4687 | 5682 return "icq"; |
5683 else | |
5684 return "aim"; | |
5685 } | |
5646
48c63ee49961
[gaim-migrate @ 6060]
Christian Hammond <chipx86@chipx86.com>
parents:
5638
diff
changeset
|
5686 |
48c63ee49961
[gaim-migrate @ 6060]
Christian Hammond <chipx86@chipx86.com>
parents:
5638
diff
changeset
|
5687 if (b != NULL && isdigit(b->name[0])) |
4687 | 5688 return "icq"; |
5689 return "aim"; | |
5690 } | |
5691 | |
6695 | 5692 static void oscar_list_emblems(GaimBuddy *b, char **se, char **sw, char **nw, char **ne) |
4687 | 5693 { |
7334 | 5694 GaimAccount *account = NULL; |
5695 GaimConnection *gc = NULL; | |
5696 OscarData *od = NULL; | |
4687 | 5697 char *emblems[4] = {NULL,NULL,NULL,NULL}; |
5698 int i = 0; | |
7334 | 5699 aim_userinfo_t *userinfo = NULL; |
5700 | |
5701 if (b != NULL) | |
5702 account = b->account; | |
5703 if (account != NULL) | |
5704 gc = account->gc; | |
5705 if (gc != NULL) | |
5706 od = gc->proto_data; | |
7945 | 5707 if (od != NULL) |
5708 userinfo = aim_locate_finduserinfo(od->sess, b->name); | |
4687 | 5709 |
5131 | 5710 if (!GAIM_BUDDY_IS_ONLINE(b)) { |
5711 char *gname; | |
7334 | 5712 if ((b->name) && (od) && (od->sess->ssi.received_data) && |
5131 | 5713 (gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, b->name)) && |
5714 (aim_ssi_waitingforauth(od->sess->ssi.local, gname, b->name))) { | |
5715 emblems[i++] = "notauthorized"; | |
5716 } else { | |
5717 emblems[i++] = "offline"; | |
5718 } | |
5719 } | |
4916 | 5720 |
4766 | 5721 if (b->name && (b->uc & 0xffff0000) && isdigit(b->name[0])) { |
4960 | 5722 int uc = b->uc >> 16; |
4766 | 5723 if (uc & AIM_ICQ_STATE_INVISIBLE) |
4960 | 5724 emblems[i++] = "invisible"; |
4766 | 5725 else if (uc & AIM_ICQ_STATE_CHAT) |
4960 | 5726 emblems[i++] = "freeforchat"; |
4766 | 5727 else if (uc & AIM_ICQ_STATE_DND) |
4960 | 5728 emblems[i++] = "dnd"; |
4766 | 5729 else if (uc & AIM_ICQ_STATE_OUT) |
4960 | 5730 emblems[i++] = "na"; |
4766 | 5731 else if (uc & AIM_ICQ_STATE_BUSY) |
4960 | 5732 emblems[i++] = "occupied"; |
4766 | 5733 else if (uc & AIM_ICQ_STATE_AWAY) |
5734 emblems[i++] = "away"; | |
5735 } else { | |
5736 if (b->uc & UC_UNAVAILABLE) | |
5737 emblems[i++] = "away"; | |
5738 } | |
4687 | 5739 if (b->uc & UC_WIRELESS) |
5740 emblems[i++] = "wireless"; | |
5741 if (b->uc & UC_AOL) | |
5742 emblems[i++] = "aol"; | |
5743 if (b->uc & UC_ADMIN) | |
5744 emblems[i++] = "admin"; | |
5745 if (b->uc & UC_AB && i < 4) | |
5746 emblems[i++] = "activebuddy"; | |
4766 | 5747 /* if (b->uc & UC_UNCONFIRMED && i < 4) |
5748 emblems[i++] = "unconfirmed"; */ | |
7334 | 5749 |
7945 | 5750 if ((i < 4) && (userinfo != NULL) && (userinfo->capabilities & AIM_CAPS_HIPTOP)) |
5751 emblems[i++] = "hiptop"; | |
5752 | |
5753 if ((i < 4) && (userinfo != NULL) && (userinfo->capabilities & AIM_CAPS_SECUREIM)) | |
7334 | 5754 emblems[i++] = "secure"; |
5755 | |
4687 | 5756 *se = emblems[0]; |
5757 *sw = emblems[1]; | |
5758 *nw = emblems[2]; | |
5759 *ne = emblems[3]; | |
5760 } | |
5761 | |
6695 | 5762 static char *oscar_tooltip_text(GaimBuddy *b) { |
5575 | 5763 GaimConnection *gc = b->account->gc; |
7283 | 5764 OscarData *od = gc->proto_data; |
7045 | 5765 aim_userinfo_t *userinfo = aim_locate_finduserinfo(od->sess, b->name); |
8701 | 5766 GString *str = g_string_new(""); |
5131 | 5767 |
5768 if (GAIM_BUDDY_IS_ONLINE(b)) { | |
8701 | 5769 oscar_string_append_info(gc, str, "\n", b, userinfo); |
7011 | 5770 |
5771 if ((userinfo != NULL) && (userinfo->flags & AIM_FLAG_AWAY) && (userinfo->away_len > 0) && (userinfo->away != NULL) && (userinfo->away_encoding != NULL)) { | |
8225 | 5772 gchar *charset = oscar_encoding_extract(userinfo->away_encoding); |
8392 | 5773 gchar *away_utf8 = oscar_encoding_to_utf8(charset, userinfo->away, userinfo->away_len); |
8225 | 5774 g_free(charset); |
7011 | 5775 if (away_utf8 != NULL) { |
7091 | 5776 gchar *tmp1, *tmp2; |
8341 | 5777 tmp1 = gaim_strcasereplace(away_utf8, "<BR>", "\n"); |
5778 g_free(away_utf8); | |
7095
c8bf2da398e3
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7093
diff
changeset
|
5779 tmp2 = gaim_markup_strip_html(tmp1); |
7091 | 5780 g_free(tmp1); |
8571 | 5781 tmp1 = gaim_escape_html(tmp2); |
7091 | 5782 g_free(tmp2); |
8700 | 5783 tmp2 = gaim_str_sub_away_formatters(tmp1, gaim_account_get_username(gaim_connection_get_account(gc))); |
8461 | 5784 g_free(tmp1); |
8701 | 5785 g_string_append_printf(str, "\n<b>%s:</b> %s", _("Away Message"), tmp2); |
8700 | 5786 g_free(tmp2); |
5836 | 5787 } |
5131 | 5788 } |
8701 | 5789 } |
5790 | |
5791 return g_string_free(str, FALSE); | |
5131 | 5792 } |
5793 | |
6695 | 5794 static char *oscar_status_text(GaimBuddy *b) { |
5575 | 5795 GaimConnection *gc = b->account->gc; |
7283 | 5796 OscarData *od = gc->proto_data; |
5167 | 5797 gchar *ret = NULL; |
5798 | |
5799 if ((b->uc & UC_UNAVAILABLE) || (((b->uc & 0xffff0000) >> 16) & AIM_ICQ_STATE_CHAT)) { | |
5800 if (isdigit(b->name[0])) | |
8701 | 5801 ret = oscar_icqstatus((b->uc & 0xffff0000) >> 16); |
7038 | 5802 else |
5803 ret = g_strdup(_("Away")); | |
5836 | 5804 } else if (GAIM_BUDDY_IS_ONLINE(b)) { |
7261 | 5805 struct buddyinfo *bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(b->account, b->name)); |
6292 | 5806 if (bi->availmsg) |
5807 ret = g_markup_escape_text(bi->availmsg, strlen(bi->availmsg)); | |
5836 | 5808 } else { |
5167 | 5809 char *gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, b->name); |
5810 if (aim_ssi_waitingforauth(od->sess->ssi.local, gname, b->name)) | |
5811 ret = g_strdup(_("Not Authorized")); | |
5812 else | |
5813 ret = g_strdup(_("Offline")); | |
5814 } | |
5815 | |
5816 return ret; | |
5817 } | |
5818 | |
5842 | 5819 |
5844 | 5820 static int oscar_icon_req(aim_session_t *sess, aim_frame_t *fr, ...) { |
5842 | 5821 GaimConnection *gc = sess->aux_data; |
7283 | 5822 OscarData *od = gc->proto_data; |
5892 | 5823 va_list ap; |
5842 | 5824 fu16_t type; |
5892 | 5825 fu8_t flags = 0, length = 0; |
5826 char *md5 = NULL; | |
5827 | |
7334 | 5828 |
5842 | 5829 va_start(ap, fr); |
5830 type = va_arg(ap, int); | |
5892 | 5831 |
5832 switch(type) { | |
5833 case 0x0000: | |
5834 case 0x0001: { | |
5835 flags = va_arg(ap, int); | |
5836 length = va_arg(ap, int); | |
5837 md5 = va_arg(ap, char *); | |
5838 | |
5839 if (flags == 0x41) { | |
5840 if (!aim_getconn_type(od->sess, AIM_CONN_TYPE_ICON) && !od->iconconnecting) { | |
5841 od->iconconnecting = TRUE; | |
5842 od->set_icon = TRUE; | |
5843 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_ICON); | |
5844 } else { | |
6039 | 5845 struct stat st; |
5846 const char *iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc)); | |
5847 if (iconfile == NULL) { | |
8363 | 5848 aim_ssi_delicon(od->sess); |
6039 | 5849 } else if (!stat(iconfile, &st)) { |
5850 char *buf = g_malloc(st.st_size); | |
5851 FILE *file = fopen(iconfile, "rb"); | |
5852 if (file) { | |
5853 fread(buf, 1, st.st_size, file); | |
5854 fclose(file); | |
8660 | 5855 gaim_debug_info("oscar", |
6039 | 5856 "Uploading icon to icon server\n"); |
6879 | 5857 aim_bart_upload(od->sess, buf, st.st_size); |
5892 | 5858 } else |
8660 | 5859 gaim_debug_error("oscar", |
6039 | 5860 "Can't open buddy icon file!\n"); |
5861 g_free(buf); | |
5862 } else { | |
8660 | 5863 gaim_debug_error("oscar", |
6039 | 5864 "Can't stat buddy icon file!\n"); |
5892 | 5865 } |
5866 } | |
8363 | 5867 } else if (flags == 0x81) { |
5868 const char *iconfile = gaim_account_get_buddy_icon(gaim_connection_get_account(gc)); | |
5869 if (iconfile == NULL) | |
5870 aim_ssi_delicon(od->sess); | |
5871 else | |
5872 aim_ssi_seticon(od->sess, md5, length); | |
5873 } | |
5892 | 5874 } break; |
5875 | |
5876 case 0x0002: { /* We just set an "available" message? */ | |
5877 } break; | |
5878 } | |
5879 | |
5842 | 5880 va_end(ap); |
5844 | 5881 |
5882 return 0; | |
5842 | 5883 } |
5892 | 5884 |
3952 | 5885 /* |
4617 | 5886 * We have just established a socket with the other dude, so set up some handlers. |
3952 | 5887 */ |
4617 | 5888 static int gaim_odc_initiate(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 5889 GaimConnection *gc = sess->aux_data; |
7283 | 5890 OscarData *od = (OscarData *)gc->proto_data; |
5679 | 5891 GaimConversation *cnv; |
2086 | 5892 struct direct_im *dim; |
5893 char buf[256]; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5894 char *sn; |
4617 | 5895 va_list ap; |
5896 aim_conn_t *newconn, *listenerconn; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5897 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5898 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5899 newconn = va_arg(ap, aim_conn_t *); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5900 listenerconn = va_arg(ap, aim_conn_t *); |
2086 | 5901 va_end(ap); |
5902 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5903 aim_conn_close(listenerconn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5904 aim_conn_kill(sess, &listenerconn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5905 |
4617 | 5906 sn = g_strdup(aim_odc_getsn(newconn)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5907 |
8660 | 5908 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5909 "DirectIM: initiate success to %s\n", sn); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5910 dim = find_direct_im(od, sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5911 |
6640
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6623
diff
changeset
|
5912 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
|
5913 gaim_input_remove(dim->watcher); |
2086 | 5914 dim->conn = newconn; |
4617 | 5915 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, oscar_callback, dim->conn); |
3008 | 5916 dim->connected = TRUE; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5917 g_snprintf(buf, sizeof buf, _("Direct IM with %s established"), sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5918 g_free(sn); |
6982 | 5919 gaim_conversation_write(cnv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL)); |
2086 | 5920 |
4617 | 5921 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, gaim_odc_incoming, 0); |
5922 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, gaim_odc_typing, 0); | |
6982 | 5923 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER, gaim_odc_update_ui, 0); |
4617 | 5924 |
2993 | 5925 return 1; |
5926 } | |
5927 | |
6982 | 5928 /* |
5929 * This is called when each chunk of an image is received. It can be used to | |
5930 * update a progress bar, or to eat lots of dry cat food. Wet cat food is | |
5931 * nasty, you sicko. | |
5932 */ | |
5933 static int gaim_odc_update_ui(aim_session_t *sess, aim_frame_t *fr, ...) { | |
2993 | 5934 va_list ap; |
5935 char *sn; | |
5936 double percent; | |
5575 | 5937 GaimConnection *gc = sess->aux_data; |
7283 | 5938 OscarData *od = (OscarData *)gc->proto_data; |
5679 | 5939 GaimConversation *c; |
2993 | 5940 struct direct_im *dim; |
5941 | |
5942 va_start(ap, fr); | |
5943 sn = va_arg(ap, char *); | |
5944 percent = va_arg(ap, double); | |
5945 va_end(ap); | |
6873 | 5946 |
2994 | 5947 if (!(dim = find_direct_im(od, sn))) |
5948 return 1; | |
3059 | 5949 if (dim->watcher) { |
5950 gaim_input_remove(dim->watcher); /* Otherwise, the callback will callback */ | |
5951 dim->watcher = 0; | |
5952 } | |
6640
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6623
diff
changeset
|
5953 |
6982 | 5954 c = gaim_find_conversation_with_account(sn, gaim_connection_get_account(gc)); |
6873 | 5955 if (c != NULL) |
5956 gaim_conversation_update_progress(c, percent); | |
2993 | 5957 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, |
5958 oscar_callback, dim->conn); | |
2086 | 5959 |
5960 return 1; | |
5961 } | |
5962 | |
6982 | 5963 /* |
5964 * This is called after a direct IM has been received in its entirety. This | |
5965 * function is passed a long chunk of data which contains the IM with any | |
5966 * data chunks (images) appended to it. | |
5967 * | |
5968 * This function rips out all the data chunks and creates an imgstore for | |
5969 * each one. In order to do this, it first goes through the IM and takes | |
5970 * out all the IMG tags. When doing so, it rewrites the original IMG tag | |
5971 * with one compatable with the imgstore Gaim core code. For each one, we | |
5972 * then read in chunks of data from the end of the message and actually | |
5973 * create the img store using the given data. | |
5974 * | |
5975 * For somewhat easy reference, here's a sample message | |
5976 * (without the whitespace and asterisks): | |
5977 * | |
5978 * <HTML><BODY BGCOLOR="#ffffff"> | |
5979 * <FONT LANG="0"> | |
5980 * This is a really stupid picture:<BR> | |
5981 * <IMG SRC="Sample.jpg" ID="1" WIDTH="283" HEIGHT="212" DATASIZE="9894"><BR> | |
5982 * Yeah it is<BR> | |
5983 * Here is another one:<BR> | |
5984 * <IMG SRC="Soap Bubbles.bmp" ID="2" WIDTH="256" HEIGHT="256" DATASIZE="65978"> | |
5985 * </FONT> | |
5986 * </BODY></HTML> | |
5987 * <BINARY> | |
5988 * <DATA ID="1" SIZE="9894">datadatadatadata</DATA> | |
5989 * <DATA ID="2" SIZE="65978">datadatadatadata</DATA> | |
5990 * </BINARY> | |
5991 */ | |
4617 | 5992 static int gaim_odc_incoming(aim_session_t *sess, aim_frame_t *fr, ...) { |
5575 | 5993 GaimConnection *gc = sess->aux_data; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
5994 GaimConvImFlags imflags = 0; |
8233 | 5995 gchar *utf8; |
6982 | 5996 GString *newmsg = g_string_new(""); |
5997 GSList *images = NULL; | |
2086 | 5998 va_list ap; |
6982 | 5999 const char *sn, *msg, *msgend, *binary; |
6000 size_t len; | |
6001 int encoding, isawaymsg; | |
2086 | 6002 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6003 va_start(ap, fr); |
6982 | 6004 sn = va_arg(ap, const char *); |
6005 msg = va_arg(ap, const char *); | |
6006 len = va_arg(ap, size_t); | |
3952 | 6007 encoding = va_arg(ap, int); |
4870 | 6008 isawaymsg = va_arg(ap, int); |
2086 | 6009 va_end(ap); |
6982 | 6010 msgend = msg + len; |
2086 | 6011 |
8660 | 6012 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6013 "Got DirectIM message from %s\n", sn); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6014 |
4870 | 6015 if (isawaymsg) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
6016 imflags |= GAIM_CONV_IM_AUTO_RESP; |
4870 | 6017 |
6982 | 6018 /* message has a binary trailer */ |
6019 if ((binary = gaim_strcasestr(msg, "<binary>"))) { | |
6020 GData *attribs; | |
6021 const char *tmp, *start, *end, *last = NULL; | |
6022 | |
6023 tmp = msg; | |
6024 | |
6025 /* for each valid image tag... */ | |
6026 while (gaim_markup_find_tag("img", tmp, &start, &end, &attribs)) { | |
6027 const char *id, *src, *datasize; | |
6028 const char *tag = NULL, *data = NULL; | |
6029 size_t size; | |
6030 int imgid = 0; | |
6031 | |
6032 /* update the location of the last img tag */ | |
6033 last = end; | |
6034 | |
6035 /* grab attributes */ | |
6036 id = g_datalist_get_data(&attribs, "id"); | |
6037 src = g_datalist_get_data(&attribs, "src"); | |
6038 datasize = g_datalist_get_data(&attribs, "datasize"); | |
6039 | |
6040 /* if we have id & datasize, build the data tag */ | |
6041 if (id && datasize) | |
6042 tag = g_strdup_printf("<data id=\"%s\" size=\"%s\">", id, datasize); | |
6043 | |
6044 /* if we have a tag, find the start of the data */ | |
6045 if (tag && (data = gaim_strcasestr(binary, tag))) | |
6046 data += strlen(tag); | |
6047 | |
6048 /* check the data is here and store it */ | |
6049 if (data + (size = atoi(datasize)) <= msgend) | |
6050 imgid = gaim_imgstore_add(data, size, src); | |
6051 | |
8233 | 6052 /* |
6053 * XXX - The code below contains some calls to oscar_encoding_to_utf8 | |
6054 * The hardcoded "us-ascii" value REALLY needs to be removed. | |
6055 */ | |
6982 | 6056 /* if we have a stored image... */ |
6057 if (imgid) { | |
6058 /* append the message up to the tag */ | |
8233 | 6059 utf8 = oscar_encoding_to_utf8("us-ascii", tmp, start - tmp); |
6060 if (utf8 != NULL) { | |
6061 newmsg = g_string_append(newmsg, utf8); | |
6062 g_free(utf8); | |
6063 } | |
6982 | 6064 |
6065 /* write the new image tag */ | |
6066 g_string_append_printf(newmsg, "<IMG ID=\"%d\">", imgid); | |
6067 | |
6068 /* and record the image number */ | |
6069 images = g_slist_append(images, GINT_TO_POINTER(imgid)); | |
6070 } else { | |
6071 /* otherwise, copy up to the end of the tag */ | |
8233 | 6072 utf8 = oscar_encoding_to_utf8("us-ascii", tmp, (end + 1) - tmp); |
6073 if (utf8 != NULL) { | |
6074 newmsg = g_string_append(newmsg, utf8); | |
6075 g_free(utf8); | |
6076 } | |
6982 | 6077 } |
6078 | |
6079 /* clear the attribute list */ | |
6080 g_datalist_clear(&attribs); | |
6081 | |
6082 /* continue from the end of the tag */ | |
6083 tmp = end + 1; | |
6084 } | |
6085 | |
6086 /* append any remaining message data (without the > :-) */ | |
6087 if (last++ && (last < binary)) | |
6088 newmsg = g_string_append_len(newmsg, last, binary - last); | |
6089 | |
6090 /* set the flag if we caught any images */ | |
6091 if (images) | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
6092 imflags |= GAIM_CONV_IM_IMAGES; |
6982 | 6093 } else { |
6094 g_string_append_len(newmsg, msg, len); | |
6095 } | |
6096 | |
4617 | 6097 /* XXX - I imagine Paco-Paco will want to do some voodoo with the encoding here */ |
6982 | 6098 serv_got_im(gc, sn, newmsg->str, imflags, time(NULL)); |
6099 | |
6100 /* free up the message */ | |
6101 g_string_free(newmsg, TRUE); | |
6102 | |
6103 /* unref any images we allocated */ | |
6104 if (images) { | |
6105 GSList *tmp; | |
6106 int id; | |
6107 | |
6108 for (tmp = images; tmp != NULL; tmp = tmp->next) { | |
6109 id = GPOINTER_TO_INT(tmp->data); | |
6110 gaim_imgstore_unref(id); | |
6111 } | |
6112 | |
6113 g_slist_free(images); | |
6114 } | |
2086 | 6115 |
6116 return 1; | |
6117 } | |
6118 | |
4617 | 6119 static int gaim_odc_typing(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 6120 va_list ap; |
6121 char *sn; | |
2993 | 6122 int typing; |
5575 | 6123 GaimConnection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6124 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6125 va_start(ap, fr); |
2086 | 6126 sn = va_arg(ap, char *); |
2993 | 6127 typing = va_arg(ap, int); |
2086 | 6128 va_end(ap); |
6129 | |
4870 | 6130 if (typing == 0x0002) { |
2993 | 6131 /* I had to leave this. It's just too funny. It reminds me of my sister. */ |
8660 | 6132 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6133 "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
|
6134 serv_got_typing(gc, sn, 0, GAIM_TYPING); |
4870 | 6135 } else if (typing == 0x0001) |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
6136 serv_got_typing(gc, sn, 0, GAIM_TYPED); |
4870 | 6137 else |
4342 | 6138 serv_got_typing_stopped(gc, sn); |
2086 | 6139 return 1; |
6140 } | |
6141 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
6142 static int gaim_odc_send_im(aim_session_t *sess, aim_conn_t *conn, const char *message, GaimConvImFlags imflags) { |
6982 | 6143 char *buf; |
6144 size_t len; | |
6145 int ret; | |
6146 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7111
diff
changeset
|
6147 if (imflags & GAIM_CONV_IM_IMAGES) { |
6982 | 6148 GString *msg = g_string_new(""); |
6149 GString *data = g_string_new("<BINARY>"); | |
6150 GData *attribs; | |
6151 const char *tmp, *start, *end, *last = NULL; | |
6152 int oscar_id = 0; | |
6153 | |
6154 tmp = message; | |
6155 | |
6156 /* for each valid IMG tag... */ | |
6157 while (gaim_markup_find_tag("img", tmp, &start, &end, &attribs)) { | |
6158 GaimStoredImage *image = NULL; | |
6159 const char *id; | |
6160 | |
6161 last = end; | |
6162 id = g_datalist_get_data(&attribs, "id"); | |
6163 | |
6164 /* ... if it refers to a valid gaim image ... */ | |
6165 if (id && (image = gaim_imgstore_get(atoi(id)))) { | |
6166 /* ... append the message from start to the tag ... */ | |
6167 msg = g_string_append_len(msg, tmp, start - tmp); | |
6168 oscar_id++; | |
6169 | |
6170 /* ... insert a new img tag with the oscar id ... */ | |
6171 if (image->filename) | |
6172 g_string_append_printf(msg, | |
6173 "<IMG SRC=\"file://%s\" ID=\"%d\" DATASIZE=\"%d\">", | |
7386 | 6174 image->filename, oscar_id, (int)image->size); |
6982 | 6175 else |
6176 g_string_append_printf(msg, | |
6177 "<IMG ID=\"%d\" DATASIZE=\"%d\">", | |
7386 | 6178 oscar_id, (int)image->size); |
6982 | 6179 |
6180 /* ... and append the data to the binary section ... */ | |
6181 g_string_append_printf(data, "<DATA ID=\"%d\" SIZE=\"%d\">", | |
7386 | 6182 oscar_id, (int)image->size); |
6982 | 6183 data = g_string_append_len(data, image->data, image->size); |
6184 data = g_string_append(data, "</DATA>"); | |
6185 } else { | |
6186 /* ... otherwise, allow the possibly invalid img tag through. */ | |
6187 /* should we do something else? */ | |
6188 msg = g_string_append_len(msg, tmp, (end + 1) - tmp); | |
6189 } | |
6190 | |
6191 g_datalist_clear(&attribs); | |
6192 | |
6193 /* continue from the end of the tag */ | |
6194 tmp = end + 1; | |
6195 } | |
6196 | |
6197 /* append any remaining message data (without the > :-) */ | |
6198 if (last++ && *last) | |
6199 msg = g_string_append(msg, last); | |
6200 | |
6201 /* if we inserted any images in the binary section, append it */ | |
6202 if (oscar_id) { | |
6203 msg = g_string_append_len(msg, data->str, data->len); | |
6204 msg = g_string_append(msg, "</BINARY>"); | |
6205 } | |
6206 | |
6207 len = msg->len; | |
6208 buf = msg->str; | |
6209 g_string_free(msg, FALSE); | |
6210 g_string_free(data, TRUE); | |
6211 } else { | |
6212 len = strlen(message); | |
6213 buf = g_memdup(message, len+1); | |
6214 } | |
6215 | |
6216 /* 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
|
6217 if (imflags & GAIM_CONV_IM_AUTO_RESP) |
6982 | 6218 ret = aim_odc_send_im(sess, conn, buf, len, 0, 1); |
6219 else | |
6220 ret = aim_odc_send_im(sess, conn, buf, len, 0, 0); | |
6221 | |
6222 g_free(buf); | |
6223 | |
6224 return ret; | |
6225 } | |
6226 | |
2086 | 6227 struct ask_do_dir_im { |
6228 char *who; | |
5575 | 6229 GaimConnection *gc; |
2086 | 6230 }; |
6231 | |
3730 | 6232 static void oscar_cancel_direct_im(struct ask_do_dir_im *data) { |
5136 | 6233 g_free(data->who); |
2086 | 6234 g_free(data); |
6235 } | |
6236 | |
3730 | 6237 static void oscar_direct_im(struct ask_do_dir_im *data) { |
5575 | 6238 GaimConnection *gc = data->gc; |
7283 | 6239 OscarData *od; |
2086 | 6240 struct direct_im *dim; |
8240 | 6241 int listenfd; |
2086 | 6242 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
6243 if (!g_list_find(gaim_connections_get_all(), gc)) { |
5136 | 6244 g_free(data->who); |
4244 | 6245 g_free(data); |
6246 return; | |
6247 } | |
6248 | |
7283 | 6249 od = (OscarData *)gc->proto_data; |
4244 | 6250 |
2086 | 6251 dim = find_direct_im(od, data->who); |
6252 if (dim) { | |
3008 | 6253 if (!(dim->connected)) { /* We'll free the old, unconnected dim, and start over */ |
6254 od->direct_ims = g_slist_remove(od->direct_ims, dim); | |
6255 gaim_input_remove(dim->watcher); | |
6256 g_free(dim); | |
8660 | 6257 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
6258 "Gave up on old direct IM, trying again\n"); |
3008 | 6259 } else { |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
6260 gaim_notify_error(gc, NULL, "DirectIM already open.", NULL); |
5136 | 6261 g_free(data->who); |
4244 | 6262 g_free(data); |
3008 | 6263 return; |
6264 } | |
2086 | 6265 } |
6266 dim = g_new0(struct direct_im, 1); | |
6267 dim->gc = gc; | |
6268 g_snprintf(dim->name, sizeof dim->name, "%s", data->who); | |
6269 | |
8246 | 6270 listenfd = gaim_network_listen_range(5190, 5199); |
8240 | 6271 dim->conn = aim_odc_initiate(od->sess, data->who, listenfd, gaim_network_get_port_from_fd(listenfd)); |
2086 | 6272 if (dim->conn != NULL) { |
6273 od->direct_ims = g_slist_append(od->direct_ims, dim); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
6274 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, |
2086 | 6275 oscar_callback, dim->conn); |
4617 | 6276 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIM_ESTABLISHED, |
6277 gaim_odc_initiate, 0); | |
2086 | 6278 } else { |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
6279 gaim_notify_error(gc, NULL, _("Unable to open Direct IM"), NULL); |
2086 | 6280 g_free(dim); |
6281 } | |
4244 | 6282 |
5136 | 6283 g_free(data->who); |
4244 | 6284 g_free(data); |
2086 | 6285 } |
6286 | |
5575 | 6287 static void oscar_ask_direct_im(GaimConnection *gc, const char *who) { |
5420 | 6288 gchar *buf; |
2086 | 6289 struct ask_do_dir_im *data = g_new0(struct ask_do_dir_im, 1); |
5136 | 6290 data->who = g_strdup(who); |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
6291 data->gc = gc; |
5420 | 6292 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
|
6293 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6294 gaim_request_action(gc, NULL, buf, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6295 _("Because this reveals your IP address, it " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6296 "may be considered a privacy risk. Do you " |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6297 "wish to continue?"), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6298 0, data, 2, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6299 _("Connect"), G_CALLBACK(oscar_direct_im), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
6300 _("Cancel"), G_CALLBACK(oscar_cancel_direct_im)); |
5420 | 6301 g_free(buf); |
2086 | 6302 } |
6303 | |
5575 | 6304 static void oscar_set_permit_deny(GaimConnection *gc) { |
6305 GaimAccount *account = gaim_connection_get_account(gc); | |
7283 | 6306 OscarData *od = (OscarData *)gc->proto_data; |
4230 | 6307 #ifdef NOSSI |
8143 | 6308 GSList *list; |
4230 | 6309 char buf[MAXMSGLEN]; |
6310 int at; | |
6311 | |
5575 | 6312 switch(account->perm_deny) { |
8175 | 6313 case GAIM_PRIVACY_ALLOW_ALL: |
5575 | 6314 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_DENYADD, gaim_account_get_username(account)); |
4230 | 6315 break; |
8175 | 6316 case GAIM_PRIVACY_DENY_ALL: |
5575 | 6317 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_PERMITADD, gaim_account_get_username(account)); |
4230 | 6318 break; |
8175 | 6319 case GAIM_PRIVACY_ALLOW_USERS: |
5575 | 6320 list = account->permit; |
4230 | 6321 at = 0; |
6322 while (list) { | |
6323 at += g_snprintf(buf + at, sizeof(buf) - at, "%s&", (char *)list->data); | |
6324 list = list->next; | |
6325 } | |
6326 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_PERMITADD, buf); | |
6327 break; | |
8175 | 6328 case GAIM_PRIVACY_DENY_USERS: |
5575 | 6329 list = account->deny; |
4230 | 6330 at = 0; |
6331 while (list) { | |
6332 at += g_snprintf(buf + at, sizeof(buf) - at, "%s&", (char *)list->data); | |
6333 list = list->next; | |
6334 } | |
6335 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_DENYADD, buf); | |
6336 break; | |
6337 default: | |
6338 break; | |
2086 | 6339 } |
4230 | 6340 #else |
8175 | 6341 if (od->sess->ssi.received_data) { |
6342 switch (account->perm_deny) { | |
6343 case GAIM_PRIVACY_ALLOW_ALL: | |
6344 aim_ssi_setpermdeny(od->sess, 0x01, 0xffffffff); | |
6345 break; | |
6346 case GAIM_PRIVACY_ALLOW_BUDDYLIST: | |
6347 aim_ssi_setpermdeny(od->sess, 0x05, 0xffffffff); | |
6348 break; | |
6349 case GAIM_PRIVACY_ALLOW_USERS: | |
6350 aim_ssi_setpermdeny(od->sess, 0x03, 0xffffffff); | |
6351 break; | |
6352 case GAIM_PRIVACY_DENY_ALL: | |
6353 aim_ssi_setpermdeny(od->sess, 0x02, 0xffffffff); | |
6354 break; | |
6355 case GAIM_PRIVACY_DENY_USERS: | |
6356 aim_ssi_setpermdeny(od->sess, 0x04, 0xffffffff); | |
6357 break; | |
6358 default: | |
6359 aim_ssi_setpermdeny(od->sess, 0x01, 0xffffffff); | |
6360 break; | |
6361 } | |
6362 } | |
4230 | 6363 #endif |
2086 | 6364 } |
6365 | |
5575 | 6366 static void oscar_add_permit(GaimConnection *gc, const char *who) { |
4269 | 6367 #ifdef NOSSI |
8143 | 6368 if (gc->account->perm_deny == 3) |
4269 | 6369 oscar_set_permit_deny(gc); |
6370 #else | |
7283 | 6371 OscarData *od = (OscarData *)gc->proto_data; |
8660 | 6372 gaim_debug_info("oscar", "ssi: About to add a permit\n"); |
4230 | 6373 if (od->sess->ssi.received_data) |
4889 | 6374 aim_ssi_addpermit(od->sess, who); |
4230 | 6375 #endif |
2086 | 6376 } |
6377 | |
5575 | 6378 static void oscar_add_deny(GaimConnection *gc, const char *who) { |
4269 | 6379 #ifdef NOSSI |
8143 | 6380 if (gc->account->perm_deny == 4) |
4269 | 6381 oscar_set_permit_deny(gc); |
6382 #else | |
7283 | 6383 OscarData *od = (OscarData *)gc->proto_data; |
8660 | 6384 gaim_debug_info("oscar", "ssi: About to add a deny\n"); |
4230 | 6385 if (od->sess->ssi.received_data) |
4889 | 6386 aim_ssi_adddeny(od->sess, who); |
4230 | 6387 #endif |
2086 | 6388 } |
6389 | |
5575 | 6390 static void oscar_rem_permit(GaimConnection *gc, const char *who) { |
4269 | 6391 #ifdef NOSSI |
8143 | 6392 if (gc->account->perm_deny == 3) |
4269 | 6393 oscar_set_permit_deny(gc); |
6394 #else | |
7283 | 6395 OscarData *od = (OscarData *)gc->proto_data; |
8660 | 6396 gaim_debug_info("oscar", "ssi: About to delete a permit\n"); |
4230 | 6397 if (od->sess->ssi.received_data) |
4889 | 6398 aim_ssi_delpermit(od->sess, who); |
4230 | 6399 #endif |
2086 | 6400 } |
6401 | |
5575 | 6402 static void oscar_rem_deny(GaimConnection *gc, const char *who) { |
4269 | 6403 #ifdef NOSSI |
8143 | 6404 if (gc->account->perm_deny == 4) |
4269 | 6405 oscar_set_permit_deny(gc); |
6406 #else | |
7283 | 6407 OscarData *od = (OscarData *)gc->proto_data; |
8660 | 6408 gaim_debug_info("oscar", "ssi: About to delete a deny\n"); |
4230 | 6409 if (od->sess->ssi.received_data) |
4889 | 6410 aim_ssi_deldeny(od->sess, who); |
4230 | 6411 #endif |
2086 | 6412 } |
6413 | |
5575 | 6414 static GList *oscar_away_states(GaimConnection *gc) |
2086 | 6415 { |
7283 | 6416 OscarData *od = gc->proto_data; |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
6417 GList *m = NULL; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
6418 |
8257 | 6419 if (od->icq) { |
6420 m = g_list_append(m, _("Online")); | |
6421 m = g_list_append(m, _("Away")); | |
6422 m = g_list_append(m, _("Do Not Disturb")); | |
6423 m = g_list_append(m, _("Not Available")); | |
6424 m = g_list_append(m, _("Occupied")); | |
6425 m = g_list_append(m, _("Free For Chat")); | |
6426 m = g_list_append(m, _("Invisible")); | |
6427 } else { | |
6428 m = g_list_append(m, GAIM_AWAY_CUSTOM); | |
8476 | 6429 m = g_list_append(m, _("Back")); |
8257 | 6430 m = g_list_append(m, _("Visible")); |
6431 m = g_list_append(m, _("Invisible")); | |
6432 } | |
4333 | 6433 |
6434 return m; | |
6435 } | |
6436 | |
7172 | 6437 static void oscar_ssi_editcomment(struct name_data *data, const char *text) { |
8341 | 6438 GaimConnection *gc = data->gc; |
6439 OscarData *od = gc->proto_data; | |
7172 | 6440 GaimBuddy *b; |
6441 GaimGroup *g; | |
6442 | |
6443 if (!(b = gaim_find_buddy(gaim_connection_get_account(data->gc), data->name))) { | |
6444 oscar_free_name_data(data); | |
6445 return; | |
6446 } | |
6447 | |
6448 if (!(g = gaim_find_buddys_group(b))) { | |
6449 oscar_free_name_data(data); | |
6450 return; | |
6451 } | |
6452 | |
6453 aim_ssi_editcomment(od->sess, g->name, data->name, text); | |
8341 | 6454 |
6455 if (!aim_sncmp(data->name, gc->account->username)) | |
6456 gaim_check_comment(od, text); | |
6457 | |
7172 | 6458 oscar_free_name_data(data); |
6459 } | |
6460 | |
6461 static void oscar_buddycb_edit_comment(GaimConnection *gc, const char *name) { | |
7283 | 6462 OscarData *od = gc->proto_data; |
7172 | 6463 struct name_data *data = g_new(struct name_data, 1); |
6464 GaimBuddy *b; | |
6465 GaimGroup *g; | |
6466 char *comment; | |
6467 gchar *comment_utf8; | |
6468 | |
6469 if (!(b = gaim_find_buddy(gaim_connection_get_account(gc), name))) | |
6470 return; | |
6471 if (!(g = gaim_find_buddys_group(b))) | |
6472 return; | |
6473 comment = aim_ssi_getcomment(od->sess->ssi.local, g->name, name); | |
6474 comment_utf8 = comment ? gaim_utf8_try_convert(comment) : NULL; | |
6475 | |
6476 data->gc = gc; | |
6477 data->name = g_strdup(name); | |
6478 data->nick = NULL; | |
6479 | |
6480 gaim_request_input(gc, NULL, _("Buddy Comment:"), NULL, | |
8697 | 6481 comment_utf8, TRUE, FALSE, NULL, |
7172 | 6482 _("OK"), G_CALLBACK(oscar_ssi_editcomment), |
6483 _("Cancel"), G_CALLBACK(oscar_free_name_data), | |
6484 data); | |
6485 | |
6486 free(comment); | |
6487 g_free(comment_utf8); | |
6488 } | |
6489 | |
5575 | 6490 static GList *oscar_buddy_menu(GaimConnection *gc, const char *who) { |
7283 | 6491 OscarData *od = gc->proto_data; |
4333 | 6492 GList *m = NULL; |
6493 struct proto_buddy_menu *pbm; | |
6494 | |
7172 | 6495 pbm = g_new0(struct proto_buddy_menu, 1); |
6496 pbm->label = _("Edit Buddy Comment"); | |
6497 pbm->callback = oscar_buddycb_edit_comment; | |
6498 pbm->gc = gc; | |
6499 m = g_list_append(m, pbm); | |
6500 | |
4333 | 6501 if (od->icq) { |
4624 | 6502 #if 0 |
4333 | 6503 pbm = g_new0(struct proto_buddy_menu, 1); |
6504 pbm->label = _("Get Status Msg"); | |
4969 | 6505 pbm->callback = oscar_get_icqstatusmsg; |
4333 | 6506 pbm->gc = gc; |
6507 m = g_list_append(m, pbm); | |
4624 | 6508 #endif |
4333 | 6509 } else { |
6695 | 6510 GaimBuddy *b = gaim_find_buddy(gc->account, who); |
7011 | 6511 aim_userinfo_t *userinfo; |
5975 | 6512 |
6513 if (b) | |
7045 | 6514 userinfo = aim_locate_finduserinfo(od->sess, b->name); |
7011 | 6515 |
6516 if (b && userinfo && aim_sncmp(gaim_account_get_username(gaim_connection_get_account(gc)), who) && GAIM_BUDDY_IS_ONLINE(b)) { | |
6517 if (userinfo->capabilities & AIM_CAPS_DIRECTIM) { | |
5917 | 6518 pbm = g_new0(struct proto_buddy_menu, 1); |
6519 pbm->label = _("Direct IM"); | |
6520 pbm->callback = oscar_ask_direct_im; | |
6521 pbm->gc = gc; | |
6522 m = g_list_append(m, pbm); | |
6523 } | |
7650 | 6524 |
6525 if (userinfo->capabilities & AIM_CAPS_SENDFILE) { | |
6526 pbm = g_new0(struct proto_buddy_menu, 1); | |
6527 pbm->label = _("Send File"); | |
6528 pbm->callback = oscar_ask_sendfile; | |
6529 pbm->gc = gc; | |
6530 m = g_list_append(m, pbm); | |
6531 } | |
4826 | 6532 #if 0 |
7011 | 6533 if (userinfo->capabilities & AIM_CAPS_GETFILE) { |
5917 | 6534 pbm = g_new0(struct proto_buddy_menu, 1); |
6535 pbm->label = _("Get File"); | |
6536 pbm->callback = oscar_ask_getfile; | |
6537 pbm->gc = gc; | |
6538 m = g_list_append(m, pbm); | |
6539 } | |
4826 | 6540 #endif |
4333 | 6541 } |
5131 | 6542 } |
5197 | 6543 |
5131 | 6544 if (od->sess->ssi.received_data) { |
6545 char *gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, who); | |
6546 if (gname && aim_ssi_waitingforauth(od->sess->ssi.local, gname, who)) { | |
6547 pbm = g_new0(struct proto_buddy_menu, 1); | |
6873 | 6548 pbm->label = _("Re-request Authorization"); |
5131 | 6549 pbm->callback = gaim_auth_sendrequest; |
6550 pbm->gc = gc; | |
6551 m = g_list_append(m, pbm); | |
4333 | 6552 } |
4916 | 6553 } |
6554 | |
4333 | 6555 return m; |
6556 } | |
6557 | |
5575 | 6558 static void oscar_format_screenname(GaimConnection *gc, const char *nick) { |
7283 | 6559 OscarData *od = gc->proto_data; |
5575 | 6560 if (!aim_sncmp(gaim_account_get_username(gaim_connection_get_account(gc)), nick)) { |
4333 | 6561 if (!aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH)) { |
6562 od->setnick = TRUE; | |
6563 od->newsn = g_strdup(nick); | |
6564 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
6565 } else { | |
6566 aim_admin_setnick(od->sess, aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH), nick); | |
6567 } | |
6568 } else { | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
6569 gaim_notify_error(gc, NULL, _("The new formatting is invalid."), |
8152 | 6570 _("Screen name formatting can change only capitalization and whitespace.")); |
4333 | 6571 } |
6572 } | |
6573 | |
5575 | 6574 static void oscar_show_format_screenname(GaimConnection *gc) |
4333 | 6575 { |
8152 | 6576 gaim_request_input(gc, NULL, _("New screen name formatting:"), NULL, |
8697 | 6577 gaim_connection_get_display_name(gc), FALSE, FALSE, NULL, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
6578 _("OK"), G_CALLBACK(oscar_format_screenname), |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
6579 _("Cancel"), NULL, |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
6580 gc); |
4333 | 6581 } |
6582 | |
5575 | 6583 static void oscar_confirm_account(GaimConnection *gc) |
4333 | 6584 { |
7283 | 6585 OscarData *od = gc->proto_data; |
4333 | 6586 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); |
6587 | |
6588 if (conn) { | |
6589 aim_admin_reqconfirm(od->sess, conn); | |
6590 } else { | |
6591 od->conf = TRUE; | |
6592 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
6593 } | |
6594 } | |
6595 | |
5575 | 6596 static void oscar_show_email(GaimConnection *gc) |
4333 | 6597 { |
7283 | 6598 OscarData *od = gc->proto_data; |
4333 | 6599 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); |
6600 | |
6601 if (conn) { | |
6602 aim_admin_getinfo(od->sess, conn, 0x11); | |
6603 } else { | |
6604 od->reqemail = TRUE; | |
6605 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
6606 } | |
6607 } | |
6608 | |
5575 | 6609 static void oscar_change_email(GaimConnection *gc, const char *email) |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6610 { |
7283 | 6611 OscarData *od = gc->proto_data; |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6612 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
|
6613 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6614 if (conn) { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6615 aim_admin_setemail(od->sess, conn, email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6616 } else { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6617 od->setemail = TRUE; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6618 od->email = g_strdup(email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6619 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6620 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6621 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
6622 |
5575 | 6623 static void oscar_show_change_email(GaimConnection *gc) |
4333 | 6624 { |
6035
8c44020a958e
[gaim-migrate @ 6485]
Christian Hammond <chipx86@chipx86.com>
parents:
6029
diff
changeset
|
6625 gaim_request_input(gc, NULL, _("Change Address To:"), NULL, NULL, |
8697 | 6626 FALSE, FALSE, NULL, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
6627 _("OK"), G_CALLBACK(oscar_change_email), |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
6628 _("Cancel"), NULL, |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
6629 gc); |
4333 | 6630 } |
6631 | |
5575 | 6632 static void oscar_show_awaitingauth(GaimConnection *gc) |
4333 | 6633 { |
7283 | 6634 OscarData *od = gc->proto_data; |
4333 | 6635 gchar *nombre, *text, *tmp; |
6695 | 6636 GaimBlistNode *gnode, *cnode, *bnode; |
4333 | 6637 int num=0; |
6638 | |
6873 | 6639 text = g_strdup(""); |
4333 | 6640 |
4785 | 6641 for (gnode = gaim_get_blist()->root; gnode; gnode = gnode->next) { |
6695 | 6642 GaimGroup *group = (GaimGroup *)gnode; |
4785 | 6643 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) |
6644 continue; | |
6695 | 6645 for (cnode = gnode->child; cnode; cnode = cnode->next) { |
6646 if(!GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
4785 | 6647 continue; |
6695 | 6648 for (bnode = cnode->child; bnode; bnode = bnode->next) { |
6649 GaimBuddy *buddy = (GaimBuddy *)bnode; | |
6650 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
6651 continue; | |
6652 if (buddy->account == gc->account && aim_ssi_waitingforauth(od->sess->ssi.local, group->name, buddy->name)) { | |
6653 if (gaim_get_buddy_alias_only(buddy)) | |
6654 nombre = g_strdup_printf(" %s (%s)", buddy->name, gaim_get_buddy_alias_only(buddy)); | |
6655 else | |
6656 nombre = g_strdup_printf(" %s", buddy->name); | |
6873 | 6657 tmp = g_strdup_printf("%s%s<br>", text, nombre); |
6695 | 6658 g_free(text); |
6659 text = tmp; | |
6660 g_free(nombre); | |
6661 num++; | |
6662 } | |
4333 | 6663 } |
2979 | 6664 } |
4333 | 6665 } |
6666 | |
6667 if (!num) { | |
6668 g_free(text); | |
6873 | 6669 text = g_strdup(_("<i>you are not waiting for authorization</i>")); |
6670 } | |
6671 | |
6672 gaim_notify_formatted(gc, NULL, _("You are awaiting authorization from " | |
6673 "the following buddies"), _("You can re-request " | |
6674 "authorization from these buddies by " | |
6675 "right-clicking on them and selecting " | |
6676 "\"Re-request Authorization.\""), text, NULL, NULL); | |
4333 | 6677 g_free(text); |
2979 | 6678 } |
6679 | |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6680 static void search_by_email_cb(GaimConnection *gc, const char *email) |
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 serv_dir_search(gc, "", "", "", "", "", "", "", email); |
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 |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6685 static void oscar_show_find_email(GaimConnection *gc) |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6686 { |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6687 gaim_request_input(gc, _("Find Buddy by E-mail"), |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6688 _("Search for a buddy by e-mail address"), |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6689 _("Type the e-mail address of the buddy you are " |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6690 "searching for."), |
8697 | 6691 NULL, FALSE, FALSE, NULL, |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6692 _("Search"), G_CALLBACK(search_by_email_cb), |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6693 _("Cancel"), NULL, gc); |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6694 } |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6695 |
7366 | 6696 #if 0 |
5917 | 6697 static void oscar_setavailmsg(GaimConnection *gc, char *text) { |
7283 | 6698 OscarData *od = (OscarData *)gc->proto_data; |
5917 | 6699 |
7334 | 6700 aim_locate_setprofile(od->sess, NULL, NULL, 0, NULL, "", 0); |
5917 | 6701 aim_srv_setavailmsg(od->sess, text); |
6702 } | |
6703 | |
6704 static void oscar_show_setavailmsg(GaimConnection *gc) | |
6705 { | |
7313 | 6706 gaim_request_input(gc, NULL, _("Available Message:"), NULL, |
6707 _("I'm doing work and hoping for a distraction--IM me!"), | |
8697 | 6708 TRUE, FALSE, NULL, |
5917 | 6709 _("OK"), G_CALLBACK(oscar_setavailmsg), |
6710 _("Cancel"), NULL, | |
6711 gc); | |
6712 } | |
7366 | 6713 #endif |
5917 | 6714 |
7067
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
6715 static void oscar_show_set_info(GaimConnection *gc) |
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
6716 { |
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
6717 gaim_account_request_change_user_info(gaim_connection_get_account(gc)); |
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
6718 } |
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
6719 |
8576 | 6720 static void oscar_show_set_info_icqurl(GaimConnection *gc) |
6721 { | |
6722 gaim_notify_uri(gc, "http://web.icq.com/whitepages/login/1,,,00.html"); | |
6723 } | |
6724 | |
7063
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
6725 static void oscar_change_pass(GaimConnection *gc) |
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
6726 { |
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
6727 gaim_account_request_change_password(gaim_connection_get_account(gc)); |
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
6728 } |
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
6729 |
5575 | 6730 static void oscar_show_chpassurl(GaimConnection *gc) |
4333 | 6731 { |
7283 | 6732 OscarData *od = gc->proto_data; |
5575 | 6733 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
|
6734 gaim_notify_uri(gc, substituted); |
5517 | 6735 g_free(substituted); |
4333 | 6736 } |
6737 | |
7026 | 6738 static void oscar_show_imforwardingurl(GaimConnection *gc) |
6739 { | |
6740 gaim_notify_uri(gc, "http://mymobile.aol.com/dbreg/register?action=imf&clientID=1"); | |
6741 } | |
6742 | |
5842 | 6743 static void oscar_set_icon(GaimConnection *gc, const char *iconfile) |
6744 { | |
7283 | 6745 OscarData *od = gc->proto_data; |
5844 | 6746 aim_session_t *sess = od->sess; |
5842 | 6747 FILE *file; |
6748 struct stat st; | |
5844 | 6749 |
6039 | 6750 if (iconfile == NULL) { |
8363 | 6751 aim_ssi_delicon(od->sess); |
6039 | 6752 } else if (!stat(iconfile, &st)) { |
5842 | 6753 char *buf = g_malloc(st.st_size); |
6754 file = fopen(iconfile, "rb"); | |
6755 if (file) { | |
6052 | 6756 md5_state_t *state; |
6039 | 6757 char md5[16]; |
5842 | 6758 int len = fread(buf, 1, st.st_size, file); |
6039 | 6759 fclose(file); |
6052 | 6760 state = g_malloc(sizeof(md5_state_t)); |
5842 | 6761 md5_init(state); |
6762 md5_append(state, buf, len); | |
6763 md5_finish(state, md5); | |
6764 g_free(state); | |
6765 aim_ssi_seticon(sess, md5, 16); | |
6766 } else | |
8660 | 6767 gaim_debug_error("oscar", |
5842 | 6768 "Can't open buddy icon file!\n"); |
6769 g_free(buf); | |
6770 } else | |
8660 | 6771 gaim_debug_error("oscar", |
5842 | 6772 "Can't stat buddy icon file!\n"); |
6773 } | |
6774 | |
6775 | |
5575 | 6776 static GList *oscar_actions(GaimConnection *gc) |
2086 | 6777 { |
7283 | 6778 OscarData *od = gc->proto_data; |
4333 | 6779 struct proto_actions_menu *pam; |
6780 GList *m = NULL; | |
6781 | |
6782 pam = g_new0(struct proto_actions_menu, 1); | |
7853 | 6783 pam->label = _("Set User Info..."); |
7067
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
6784 pam->callback = oscar_show_set_info; |
4333 | 6785 pam->gc = gc; |
6786 m = g_list_append(m, pam); | |
6787 | |
8576 | 6788 if (od->icq) { |
6789 pam = g_new0(struct proto_actions_menu, 1); | |
6790 pam->label = _("Set User Info (URL)..."); | |
6791 pam->callback = oscar_show_set_info_icqurl; | |
6792 pam->gc = gc; | |
6793 m = g_list_append(m, pam); | |
6794 } | |
6795 | |
7366 | 6796 #if 0 |
5917 | 6797 pam = g_new0(struct proto_actions_menu, 1); |
7853 | 6798 pam->label = _("Set Available Message..."); |
5917 | 6799 pam->callback = oscar_show_setavailmsg; |
6800 pam->gc = gc; | |
6801 m = g_list_append(m, pam); | |
7366 | 6802 #endif |
5917 | 6803 |
5238 | 6804 pam = g_new0(struct proto_actions_menu, 1); |
7853 | 6805 pam->label = _("Change Password..."); |
7063
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
6806 pam->callback = oscar_change_pass; |
5238 | 6807 pam->gc = gc; |
6808 m = g_list_append(m, pam); | |
4617 | 6809 |
6810 if (od->sess->authinfo->chpassurl) { | |
6811 pam = g_new0(struct proto_actions_menu, 1); | |
6812 pam->label = _("Change Password (URL)"); | |
6813 pam->callback = oscar_show_chpassurl; | |
6814 pam->gc = gc; | |
6815 m = g_list_append(m, pam); | |
6816 } | |
6817 | |
7026 | 6818 if (od->sess->authinfo->chpassurl) { |
6819 pam = g_new0(struct proto_actions_menu, 1); | |
6820 pam->label = _("Configure IM Forwarding (URL)"); | |
6821 pam->callback = oscar_show_imforwardingurl; | |
6822 pam->gc = gc; | |
6823 m = g_list_append(m, pam); | |
6824 } | |
6825 | |
5238 | 6826 if (!od->icq) { |
4617 | 6827 /* AIM actions */ |
6828 m = g_list_append(m, NULL); | |
4333 | 6829 |
5917 | 6830 pam = g_new0(struct proto_actions_menu, 1); |
8152 | 6831 pam->label = _("Format Screen Name..."); |
5844 | 6832 pam->callback = oscar_show_format_screenname; |
4333 | 6833 pam->gc = gc; |
6834 m = g_list_append(m, pam); | |
6835 | |
6836 pam = g_new0(struct proto_actions_menu, 1); | |
6837 pam->label = _("Confirm Account"); | |
6838 pam->callback = oscar_confirm_account; | |
6839 pam->gc = gc; | |
6840 m = g_list_append(m, pam); | |
6841 | |
6842 pam = g_new0(struct proto_actions_menu, 1); | |
7880 | 6843 pam->label = _("Display Currently Registered Address"); |
4333 | 6844 pam->callback = oscar_show_email; |
6845 pam->gc = gc; | |
6846 m = g_list_append(m, pam); | |
6847 | |
6848 pam = g_new0(struct proto_actions_menu, 1); | |
7880 | 6849 pam->label = _("Change Currently Registered Address..."); |
4333 | 6850 pam->callback = oscar_show_change_email; |
6851 pam->gc = gc; | |
6852 m = g_list_append(m, pam); | |
2086 | 6853 } |
4333 | 6854 |
6855 m = g_list_append(m, NULL); | |
6856 | |
6857 pam = g_new0(struct proto_actions_menu, 1); | |
6858 pam->label = _("Show Buddies Awaiting Authorization"); | |
6859 pam->callback = oscar_show_awaitingauth; | |
6860 pam->gc = gc; | |
6861 m = g_list_append(m, pam); | |
6862 | |
2086 | 6863 m = g_list_append(m, NULL); |
4333 | 6864 |
6865 pam = g_new0(struct proto_actions_menu, 1); | |
7853 | 6866 pam->label = _("Search for Buddy by Email..."); |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6867 pam->callback = oscar_show_find_email; |
4333 | 6868 pam->gc = gc; |
6869 m = g_list_append(m, pam); | |
6870 | |
8591 | 6871 #if 0 |
6872 pam = g_new0(struct proto_actions_menu, 1); | |
4333 | 6873 pam->label = _("Search for Buddy by Information"); |
6874 pam->callback = show_find_info; | |
6875 pam->gc = gc; | |
8591 | 6876 m = g_list_append(m, pam); |
6877 #endif | |
2086 | 6878 |
6879 return m; | |
6880 } | |
6881 | |
5575 | 6882 static void oscar_change_passwd(GaimConnection *gc, const char *old, const char *new) |
2086 | 6883 { |
7283 | 6884 OscarData *od = gc->proto_data; |
4617 | 6885 |
6886 if (od->icq) { | |
6887 aim_icq_changepasswd(od->sess, new); | |
2086 | 6888 } else { |
4617 | 6889 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); |
6890 if (conn) { | |
6891 aim_admin_changepasswd(od->sess, conn, new, old); | |
6892 } else { | |
6893 od->chpass = TRUE; | |
6894 od->oldp = g_strdup(old); | |
6895 od->newp = g_strdup(new); | |
6896 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
6897 } | |
2086 | 6898 } |
6899 } | |
6900 | |
6059 | 6901 static void oscar_convo_closed(GaimConnection *gc, const char *who) |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6902 { |
7283 | 6903 OscarData *od = gc->proto_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6904 struct direct_im *dim = find_direct_im(od, who); |
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 if (!dim) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6907 return; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6908 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6909 od->direct_ims = g_slist_remove(od->direct_ims, dim); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6910 gaim_input_remove(dim->watcher); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6911 aim_conn_kill(od->sess, &dim->conn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6912 g_free(dim); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6913 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6914 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6915 static GaimPluginProtocolInfo prpl_info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6916 { |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6917 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
|
6918 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6919 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6920 oscar_list_icon, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6921 oscar_list_emblems, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6922 oscar_status_text, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6923 oscar_tooltip_text, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6924 oscar_away_states, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6925 oscar_actions, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6926 oscar_buddy_menu, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6927 oscar_chat_info, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6928 oscar_login, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6929 oscar_close, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6930 oscar_send_im, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6931 oscar_set_info, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6932 oscar_send_typing, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6933 oscar_get_info, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6934 oscar_set_away, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6935 oscar_set_dir, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6936 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6937 oscar_dir_search, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6938 oscar_set_idle, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6939 oscar_change_passwd, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6940 oscar_add_buddy, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6941 oscar_add_buddies, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6942 oscar_remove_buddy, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6943 oscar_remove_buddies, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6944 oscar_add_permit, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6945 oscar_add_deny, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6946 oscar_rem_permit, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6947 oscar_rem_deny, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6948 oscar_set_permit_deny, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6949 oscar_warn, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6950 oscar_join_chat, |
8562 | 6951 NULL, /* reject chat invite */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6952 oscar_chat_invite, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6953 oscar_chat_leave, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6954 NULL, |
8219 | 6955 oscar_send_chat, |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6956 oscar_keepalive, |
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 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6959 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6960 #ifndef NOSSI |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6961 oscar_alias_buddy, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6962 oscar_move_buddy, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6963 oscar_rename_group, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6964 #else |
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 NULL, |
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 #endif |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6969 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6970 oscar_convo_closed, |
5842 | 6971 NULL, |
8586 | 6972 oscar_set_icon, |
8589 | 6973 NULL, |
6974 NULL, | |
6975 NULL, | |
6976 NULL, | |
6977 NULL, | |
6978 NULL, | |
6979 NULL, | |
6980 NULL | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6981 }; |
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 static GaimPluginInfo info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6984 { |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6985 2, /**< api_version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6986 GAIM_PLUGIN_PROTOCOL, /**< type */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6987 NULL, /**< ui_requirement */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6988 0, /**< flags */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6989 NULL, /**< dependencies */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6990 GAIM_PRIORITY_DEFAULT, /**< priority */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6991 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6992 "prpl-oscar", /**< id */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6993 "AIM/ICQ", /**< name */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6994 VERSION, /**< version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6995 /** summary */ |
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 /** description */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6998 N_("AIM/ICQ Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6999 NULL, /**< author */ |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6350
diff
changeset
|
7000 GAIM_WEBSITE, /**< homepage */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7001 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7002 NULL, /**< load */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7003 NULL, /**< unload */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7004 NULL, /**< destroy */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7005 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7006 NULL, /**< ui_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7007 &prpl_info /**< extra_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7008 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7009 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7010 static void |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5917
diff
changeset
|
7011 init_plugin(GaimPlugin *plugin) |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7012 { |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
7013 GaimAccountOption *option; |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
7014 |
5685
43ea75092684
[gaim-migrate @ 6106]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
7015 option = gaim_account_option_string_new(_("Auth host"), "server", |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
7016 "login.oscar.aol.com"); |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
7017 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
7018 option); |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
7019 |
5685
43ea75092684
[gaim-migrate @ 6106]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
7020 option = gaim_account_option_int_new(_("Auth port"), "port", 5190); |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
7021 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
7022 option); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7023 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
7024 my_protocol = plugin; |
2086 | 7025 } |
7026 | |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5917
diff
changeset
|
7027 GAIM_INIT_PLUGIN(oscar, init_plugin, info); |