Mercurial > pidgin.yaz
annotate src/protocols/oscar/oscar.c @ 13663:b76c6de0c3b5
[gaim-migrate @ 16065]
Kill a number of trivial UNUSED_VALUE "defects":
CID 155
CID 156
CID 157
CID 158
CID 159
CID 160
CID 161
CID 162
CID 163
CID 165
CID 166
CID 167
CID 173
CID 174
CID 177
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Wed, 19 Apr 2006 05:50:50 +0000 |
parents | b198d0c26b83 |
children | 4132d997ccec |
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 | |
11155 | 7 * Some code copyright (C) 2001-2005, Mark Doliner <thekingant@users.sourceforge.net> |
11049 | 8 * Some code copyright (C) 2005, Jonathan Clark <ardentlygnarly@users.sourceforge.net> |
6302 | 9 * |
10 * Most libfaim code copyright (C) 1998-2001 Adam Fritzler <afritz@auk.cx> | |
8151 | 11 * Some libfaim code copyright (C) 2001-2004 Mark Doliner <thekingant@users.sourceforge.net> |
2086 | 12 * |
13 * This program is free software; you can redistribute it and/or modify | |
14 * it under the terms of the GNU General Public License as published by | |
15 * the Free Software Foundation; either version 2 of the License, or | |
16 * (at your option) any later version. | |
17 * | |
18 * This program is distributed in the hope that it will be useful, | |
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
10485 | 20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
2086 | 21 * GNU General Public License for more details. |
22 * | |
23 * You should have received a copy of the GNU General Public License | |
24 * along with this program; if not, write to the Free Software | |
25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
26 * | |
27 */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
28 #include "internal.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
29 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
30 #include "account.h" |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
31 #include "accountopt.h" |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
32 #include "buddyicon.h" |
11404 | 33 #include "cipher.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
34 #include "conversation.h" |
7083
3100a6e03644
[gaim-migrate @ 7648]
Christian Hammond <chipx86@chipx86.com>
parents:
7082
diff
changeset
|
35 #include "core.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
36 #include "debug.h" |
6982 | 37 #include "imgstore.h" |
8231
f50c059b6384
[gaim-migrate @ 8954]
Christian Hammond <chipx86@chipx86.com>
parents:
8227
diff
changeset
|
38 #include "network.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
39 #include "notify.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
40 #include "privacy.h" |
2086 | 41 #include "prpl.h" |
4889 | 42 #include "proxy.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
43 #include "request.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
44 #include "util.h" |
9943 | 45 #include "version.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
46 |
13234 | 47 #include "oscar.h" |
48 #include "peer.h" | |
2086 | 49 |
13592 | 50 #define OSCAR_STATUS_ID_INVISIBLE "invisible" |
51 #define OSCAR_STATUS_ID_OFFLINE "offline" | |
52 #define OSCAR_STATUS_ID_AVAILABLE "available" | |
53 #define OSCAR_STATUS_ID_AWAY "away" | |
54 #define OSCAR_STATUS_ID_DND "dnd" | |
55 #define OSCAR_STATUS_ID_NA "na" | |
56 #define OSCAR_STATUS_ID_OCCUPIED "occupied" | |
57 #define OSCAR_STATUS_ID_FREE4CHAT "free4chat" | |
58 #define OSCAR_STATUS_ID_CUSTOM "custom" | |
9975 | 59 |
2086 | 60 #define AIMHASHDATA "http://gaim.sourceforge.net/aim_data.php3" |
61 | |
7283 | 62 #define OSCAR_CONNECT_STEPS 6 |
11338 | 63 #define OSCAR_DEFAULT_LOGIN_SERVER "login.oscar.aol.com" |
64 #define OSCAR_DEFAULT_LOGIN_PORT 5190 | |
9830 | 65 #define OSCAR_DEFAULT_CUSTOM_ENCODING "ISO-8859-1" |
10570 | 66 #define OSCAR_DEFAULT_AUTHORIZATION TRUE |
67 #define OSCAR_DEFAULT_HIDE_IP TRUE | |
68 #define OSCAR_DEFAULT_WEB_AWARE FALSE | |
13592 | 69 #define OSCAR_DEFAULT_USE_RV_PROXY FALSE |
70 | |
71 static int caps_aim = OSCAR_CAPABILITY_CHAT | OSCAR_CAPABILITY_BUDDYICON | OSCAR_CAPABILITY_DIRECTIM | OSCAR_CAPABILITY_SENDFILE | OSCAR_CAPABILITY_INTEROPERATE | OSCAR_CAPABILITY_ICHAT; | |
72 static int caps_icq = OSCAR_CAPABILITY_BUDDYICON | OSCAR_CAPABILITY_DIRECTIM | OSCAR_CAPABILITY_SENDFILE | OSCAR_CAPABILITY_ICQUTF8 | OSCAR_CAPABILITY_INTEROPERATE | OSCAR_CAPABILITY_ICHAT; | |
3458 | 73 |
13234 | 74 static guint8 features_aim[] = {0x01, 0x01, 0x01, 0x02}; |
75 static guint8 features_icq[] = {0x01, 0x06}; | |
76 static guint8 features_icq_offline[] = {0x01}; | |
77 static guint8 ck[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; | |
2086 | 78 |
13592 | 79 typedef struct _NewFlapConnectionData NewFlapConnectionData; |
80 struct _NewFlapConnectionData | |
81 { | |
82 GaimConnection *gc; | |
83 FlapConnection *conn; | |
84 guint16 cookielen; | |
85 guint8 *cookie; | |
86 gpointer data; | |
2086 | 87 }; |
88 | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
89 struct create_room { |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
90 char *name; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
91 int exchange; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
92 }; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
93 |
13592 | 94 struct chat_connection |
95 { | |
2086 | 96 char *name; |
97 char *show; /* AOL did something funny to us */ | |
13234 | 98 guint16 exchange; |
99 guint16 instance; | |
13592 | 100 FlapConnection *conn; |
2086 | 101 int id; |
5575 | 102 GaimConnection *gc; /* i hate this. */ |
8733 | 103 GaimConversation *conv; /* bah. */ |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
104 int maxlen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
105 int maxvis; |
2086 | 106 }; |
107 | |
13592 | 108 struct oscar_ask_directim_data |
109 { | |
110 OscarData *od; | |
111 char *who; | |
2086 | 112 }; |
113 | |
7011 | 114 /* |
115 * Various PRPL-specific buddy info that we want to keep track of | |
11651 | 116 * Some other info is maintained by locate.c, and I'd like to move |
7011 | 117 * the rest of this to libfaim, mostly im.c |
11651 | 118 * |
13592 | 119 * TODO: More of this should use the status API. |
7011 | 120 */ |
4738 | 121 struct buddyinfo { |
122 gboolean typingnot; | |
13234 | 123 guint32 ipaddr; |
5836 | 124 |
125 unsigned long ico_me_len; | |
126 unsigned long ico_me_csum; | |
127 time_t ico_me_time; | |
128 gboolean ico_informed; | |
4738 | 129 |
130 unsigned long ico_len; | |
131 unsigned long ico_csum; | |
132 time_t ico_time; | |
133 gboolean ico_need; | |
7406 | 134 gboolean ico_sent; |
2086 | 135 }; |
136 | |
4230 | 137 struct name_data { |
5575 | 138 GaimConnection *gc; |
4230 | 139 gchar *name; |
3453 | 140 gchar *nick; |
3141 | 141 }; |
142 | |
5129 | 143 static char *msgerrreason[] = { |
144 N_("Invalid error"), | |
145 N_("Invalid SNAC"), | |
146 N_("Rate to host"), | |
147 N_("Rate to client"), | |
148 N_("Not logged in"), | |
149 N_("Service unavailable"), | |
150 N_("Service not defined"), | |
151 N_("Obsolete SNAC"), | |
152 N_("Not supported by host"), | |
153 N_("Not supported by client"), | |
154 N_("Refused by client"), | |
155 N_("Reply too big"), | |
156 N_("Responses lost"), | |
157 N_("Request denied"), | |
158 N_("Busted SNAC payload"), | |
159 N_("Insufficient rights"), | |
160 N_("In local permit/deny"), | |
161 N_("Too evil (sender)"), | |
162 N_("Too evil (receiver)"), | |
163 N_("User temporarily unavailable"), | |
164 N_("No match"), | |
165 N_("List overflow"), | |
166 N_("Request ambiguous"), | |
167 N_("Queue full"), | |
168 N_("Not while on AOL") | |
169 }; | |
170 static int msgerrreasonlen = 25; | |
171 | |
172 /* All the libfaim->gaim callback functions */ | |
13592 | 173 static int gaim_parse_auth_resp (OscarData *, FlapConnection *, FlapFrame *, ...); |
174 static int gaim_parse_login (OscarData *, FlapConnection *, FlapFrame *, ...); | |
175 static int gaim_parse_auth_securid_request(OscarData *, FlapConnection *, FlapFrame *, ...); | |
176 static int gaim_handle_redirect (OscarData *, FlapConnection *, FlapFrame *, ...); | |
177 static int gaim_info_change (OscarData *, FlapConnection *, FlapFrame *, ...); | |
178 static int gaim_account_confirm (OscarData *, FlapConnection *, FlapFrame *, ...); | |
179 static int gaim_parse_oncoming (OscarData *, FlapConnection *, FlapFrame *, ...); | |
180 static int gaim_parse_offgoing (OscarData *, FlapConnection *, FlapFrame *, ...); | |
181 static int gaim_parse_incoming_im(OscarData *, FlapConnection *, FlapFrame *, ...); | |
182 static int gaim_parse_misses (OscarData *, FlapConnection *, FlapFrame *, ...); | |
183 static int gaim_parse_clientauto (OscarData *, FlapConnection *, FlapFrame *, ...); | |
184 static int gaim_parse_userinfo (OscarData *, FlapConnection *, FlapFrame *, ...); | |
185 static int gaim_got_infoblock (OscarData *, FlapConnection *, FlapFrame *, ...); | |
186 static int gaim_parse_motd (OscarData *, FlapConnection *, FlapFrame *, ...); | |
187 static int gaim_chatnav_info (OscarData *, FlapConnection *, FlapFrame *, ...); | |
188 static int gaim_conv_chat_join (OscarData *, FlapConnection *, FlapFrame *, ...); | |
189 static int gaim_conv_chat_leave (OscarData *, FlapConnection *, FlapFrame *, ...); | |
190 static int gaim_conv_chat_info_update (OscarData *, FlapConnection *, FlapFrame *, ...); | |
191 static int gaim_conv_chat_incoming_msg(OscarData *, FlapConnection *, FlapFrame *, ...); | |
192 static int gaim_email_parseupdate(OscarData *, FlapConnection *, FlapFrame *, ...); | |
193 static int gaim_icon_error (OscarData *, FlapConnection *, FlapFrame *, ...); | |
194 static int gaim_icon_parseicon (OscarData *, FlapConnection *, FlapFrame *, ...); | |
195 static int oscar_icon_req (OscarData *, FlapConnection *, FlapFrame *, ...); | |
196 static int gaim_parse_msgack (OscarData *, FlapConnection *, FlapFrame *, ...); | |
197 static int gaim_parse_ratechange (OscarData *, FlapConnection *, FlapFrame *, ...); | |
198 static int gaim_parse_evilnotify (OscarData *, FlapConnection *, FlapFrame *, ...); | |
199 static int gaim_parse_searcherror(OscarData *, FlapConnection *, FlapFrame *, ...); | |
200 static int gaim_parse_searchreply(OscarData *, FlapConnection *, FlapFrame *, ...); | |
201 static int gaim_bosrights (OscarData *, FlapConnection *, FlapFrame *, ...); | |
202 static int gaim_connerr (OscarData *, FlapConnection *, FlapFrame *, ...); | |
203 static int gaim_parse_msgerr (OscarData *, FlapConnection *, FlapFrame *, ...); | |
204 static int gaim_parse_mtn (OscarData *, FlapConnection *, FlapFrame *, ...); | |
205 static int gaim_parse_locaterights(OscarData *, FlapConnection *, FlapFrame *, ...); | |
206 static int gaim_parse_buddyrights(OscarData *, FlapConnection *, FlapFrame *, ...); | |
207 static int gaim_parse_locerr (OscarData *, FlapConnection *, FlapFrame *, ...); | |
208 static int gaim_icbm_param_info (OscarData *, FlapConnection *, FlapFrame *, ...); | |
209 static int gaim_parse_genericerr (OscarData *, FlapConnection *, FlapFrame *, ...); | |
210 static int gaim_memrequest (OscarData *, FlapConnection *, FlapFrame *, ...); | |
211 static int gaim_selfinfo (OscarData *, FlapConnection *, FlapFrame *, ...); | |
212 static int gaim_offlinemsg (OscarData *, FlapConnection *, FlapFrame *, ...); | |
213 static int gaim_offlinemsgdone (OscarData *, FlapConnection *, FlapFrame *, ...); | |
214 static int gaim_icqalias (OscarData *, FlapConnection *, FlapFrame *, ...); | |
215 static int gaim_icqinfo (OscarData *, FlapConnection *, FlapFrame *, ...); | |
216 static int gaim_popup (OscarData *, FlapConnection *, FlapFrame *, ...); | |
217 static int gaim_ssi_parseerr (OscarData *, FlapConnection *, FlapFrame *, ...); | |
218 static int gaim_ssi_parserights (OscarData *, FlapConnection *, FlapFrame *, ...); | |
219 static int gaim_ssi_parselist (OscarData *, FlapConnection *, FlapFrame *, ...); | |
220 static int gaim_ssi_parseack (OscarData *, FlapConnection *, FlapFrame *, ...); | |
221 static int gaim_ssi_parseadd (OscarData *, FlapConnection *, FlapFrame *, ...); | |
222 static int gaim_ssi_authgiven (OscarData *, FlapConnection *, FlapFrame *, ...); | |
223 static int gaim_ssi_authrequest (OscarData *, FlapConnection *, FlapFrame *, ...); | |
224 static int gaim_ssi_authreply (OscarData *, FlapConnection *, FlapFrame *, ...); | |
225 static int gaim_ssi_gotadded (OscarData *, FlapConnection *, FlapFrame *, ...); | |
5129 | 226 |
227 static gboolean gaim_icon_timerfunc(gpointer data); | |
13592 | 228 |
12816 | 229 static void recent_buddies_cb(const char *name, GaimPrefType type, gconstpointer value, gpointer data); |
11347 | 230 static void oscar_set_info(GaimConnection *gc, const char *info); |
11965 | 231 static void oscar_set_info_and_status(GaimAccount *account, gboolean setinfo, const char *rawinfo, gboolean setstatus, GaimStatus *status); |
12652 | 232 static void oscar_set_extendedstatus(GaimConnection *gc); |
12663 | 233 static gboolean gaim_ssi_rerequestdata(gpointer data); |
9935 | 234 |
5836 | 235 static void oscar_free_name_data(struct name_data *data) { |
4230 | 236 g_free(data->name); |
237 g_free(data->nick); | |
238 g_free(data); | |
239 } | |
240 | |
13592 | 241 /** |
242 * Determine how we can send this message. Per the warnings elsewhere | |
243 * in this file, these little checks determine the simplest encoding | |
244 * we can use for a given message send using it. | |
245 */ | |
246 static guint32 | |
247 oscar_charset_check(const char *utf8) | |
5129 | 248 { |
249 int i = 0; | |
9826 | 250 int charset = AIM_CHARSET_ASCII; |
5129 | 251 |
13592 | 252 /* |
253 * Can we get away with using our custom encoding? | |
254 */ | |
255 while (utf8[i]) | |
256 { | |
5129 | 257 if ((unsigned char)utf8[i] > 0x7f) { |
258 /* not ASCII! */ | |
9826 | 259 charset = AIM_CHARSET_CUSTOM; |
5129 | 260 break; |
261 } | |
262 i++; | |
263 } | |
13592 | 264 |
265 /* | |
266 * Must we send this message as UNICODE (in the UCS-2BE encoding)? | |
267 */ | |
268 while (utf8[i]) | |
269 { | |
5129 | 270 /* ISO-8859-1 is 0x00-0xbf in the first byte |
271 * followed by 0xc0-0xc3 in the second */ | |
272 if ((unsigned char)utf8[i] < 0x80) { | |
273 i++; | |
274 continue; | |
275 } else if (((unsigned char)utf8[i] & 0xfc) == 0xc0 && | |
13226 | 276 ((unsigned char)utf8[i + 1] & 0xc0) == 0x80) { |
5129 | 277 i += 2; |
278 continue; | |
279 } | |
9826 | 280 charset = AIM_CHARSET_UNICODE; |
5129 | 281 break; |
282 } | |
283 | |
9807 | 284 return charset; |
5129 | 285 } |
286 | |
13592 | 287 /** |
8225 | 288 * Take a string of the form charset="bleh" where bleh is |
13226 | 289 * one of us-ascii, utf-8, iso-8859-1, or unicode-2-0, and |
8225 | 290 * return a newly allocated string containing bleh. |
291 */ | |
13592 | 292 static gchar * |
293 oscar_encoding_extract(const char *encoding) | |
5129 | 294 { |
8225 | 295 gchar *ret = NULL; |
296 char *begin, *end; | |
297 | |
9933 | 298 g_return_val_if_fail(encoding != NULL, NULL); |
299 | |
8735
92cbf9713795
[gaim-migrate @ 9490]
Christian Hammond <chipx86@chipx86.com>
parents:
8733
diff
changeset
|
300 /* Make sure encoding begins with charset= */ |
10540 | 301 if (strncmp(encoding, "text/aolrtf; charset=", 21) && |
302 strncmp(encoding, "text/x-aolrtf; charset=", 23)) | |
303 { | |
8225 | 304 return NULL; |
10540 | 305 } |
8225 | 306 |
307 begin = strchr(encoding, '"'); | |
308 end = strrchr(encoding, '"'); | |
309 | |
310 if ((begin == NULL) || (end == NULL) || (begin >= end)) | |
311 return NULL; | |
312 | |
313 ret = g_strndup(begin+1, (end-1) - begin); | |
314 | |
315 return ret; | |
316 } | |
317 | |
13592 | 318 gchar * |
9830 | 319 oscar_encoding_to_utf8(const char *encoding, const char *text, int textlen) |
5129 | 320 { |
321 gchar *utf8 = NULL; | |
9595 | 322 |
323 if ((encoding == NULL) || encoding[0] == '\0') { | |
324 gaim_debug_info("oscar", "Empty encoding, assuming UTF-8\n"); | |
10396 | 325 } else if (!strcasecmp(encoding, "iso-8859-1")) { |
10376 | 326 utf8 = g_convert(text, textlen, "UTF-8", "iso-8859-1", NULL, NULL, NULL); |
10396 | 327 } else if (!strcasecmp(encoding, "ISO-8859-1-Windows-3.1-Latin-1")) { |
10375 | 328 utf8 = g_convert(text, textlen, "UTF-8", "Windows-1252", NULL, NULL, NULL); |
10396 | 329 } else if (!strcasecmp(encoding, "unicode-2-0")) { |
9595 | 330 utf8 = g_convert(text, textlen, "UTF-8", "UCS-2BE", NULL, NULL, NULL); |
10396 | 331 } else if (strcasecmp(encoding, "us-ascii") && strcmp(encoding, "utf-8")) { |
9595 | 332 gaim_debug_warning("oscar", "Unrecognized character encoding \"%s\", " |
10096 | 333 "attempting to convert to UTF-8 anyway\n", encoding); |
9595 | 334 utf8 = g_convert(text, textlen, "UTF-8", encoding, NULL, NULL, NULL); |
335 } | |
336 | |
337 /* | |
338 * If utf8 is still NULL then either the encoding is us-ascii/utf-8 or | |
339 * we have been unable to convert the text to utf-8 from the encoding | |
340 * that was specified. So we check if the text is valid utf-8 then | |
341 * just copy it. | |
342 */ | |
343 if (utf8 == NULL) { | |
9638 | 344 if (textlen != 0 && *text != '\0' |
13226 | 345 && !g_utf8_validate(text, textlen, NULL)) |
13592 | 346 utf8 = g_strdup(_("(There was an error receiving this message. The buddy you are speaking with is probably using a different encoding than expected. If you know what encoding he is using, you can specify it in the advanced account options for your AIM/ICQ account.)")); |
9476 | 347 else |
9481 | 348 utf8 = g_strndup(text, textlen); |
5129 | 349 } |
350 | |
351 return utf8; | |
352 } | |
353 | |
13592 | 354 static gchar * |
355 oscar_utf8_try_convert(GaimAccount *account, const gchar *msg) | |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
356 { |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
357 const char *charset = NULL; |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
358 char *ret = NULL; |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
359 |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
360 if(aim_sn_is_icq(gaim_account_get_username(account))) |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
361 charset = gaim_account_get_string(account, "encoding", NULL); |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
362 |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
363 if(charset && *charset) |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
364 ret = g_convert(msg, -1, "UTF-8", charset, NULL, NULL, NULL); |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
365 |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
366 if(!ret) |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
367 ret = gaim_utf8_try_convert(msg); |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
368 |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
369 return ret; |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
370 } |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
371 |
9830 | 372 static gchar * |
11159 | 373 gaim_plugin_oscar_convert_to_utf8(const gchar *data, gsize datalen, const char *charsetstr, gboolean fallback) |
9830 | 374 { |
375 gchar *ret = NULL; | |
376 GError *err = NULL; | |
377 | |
9908 | 378 if ((charsetstr == NULL) || (*charsetstr == '\0')) |
379 return NULL; | |
380 | |
381 if (strcasecmp("UTF-8", charsetstr)) { | |
382 if (fallback) | |
383 ret = g_convert_with_fallback(data, datalen, "UTF-8", charsetstr, "?", NULL, NULL, &err); | |
384 else | |
385 ret = g_convert(data, datalen, "UTF-8", charsetstr, NULL, NULL, &err); | |
386 if (err != NULL) { | |
387 gaim_debug_warning("oscar", "Conversation from %s failed: %s.\n", | |
388 charsetstr, err->message); | |
389 g_error_free(err); | |
390 } | |
391 } else { | |
392 if (g_utf8_validate(data, datalen, NULL)) | |
393 ret = g_strndup(data, datalen); | |
394 else | |
395 gaim_debug_warning("oscar", "String is not valid UTF-8.\n"); | |
396 } | |
397 | |
398 return ret; | |
399 } | |
400 | |
13592 | 401 /** |
11081 | 402 * This attemps to decode an incoming IM into a UTF8 string. |
403 * | |
9908 | 404 * We try decoding using two different character sets. The charset |
405 * specified in the IM determines the order in which we attempt to | |
406 * decode. We do this because there are lots of broken ICQ clients | |
407 * that don't correctly send non-ASCII messages. And if Gaim isn't | |
408 * able to deal with that crap, then people complain like banshees. | |
409 * charsetstr1 is always set to what the correct encoding should be. | |
410 */ | |
13592 | 411 gchar * |
13234 | 412 gaim_plugin_oscar_decode_im_part(GaimAccount *account, const char *sourcesn, guint16 charset, guint16 charsubset, const gchar *data, gsize datalen) |
9908 | 413 { |
414 gchar *ret = NULL; | |
415 const gchar *charsetstr1, *charsetstr2; | |
416 | |
417 gaim_debug_info("oscar", "Parsing IM part, charset=0x%04hx, charsubset=0x%04hx, datalen=%hd\n", charset, charsubset, datalen); | |
9830 | 418 |
419 if ((datalen == 0) || (data == NULL)) | |
420 return NULL; | |
421 | |
9908 | 422 if (charset == AIM_CHARSET_UNICODE) { |
423 charsetstr1 = "UCS-2BE"; | |
424 charsetstr2 = "UTF-8"; | |
425 } else if (charset == AIM_CHARSET_CUSTOM) { | |
11369 | 426 if ((sourcesn != NULL) && isdigit(sourcesn[0])) |
9908 | 427 charsetstr1 = gaim_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); |
9830 | 428 else |
9908 | 429 charsetstr1 = "ISO-8859-1"; |
430 charsetstr2 = "UTF-8"; | |
431 } else if (charset == AIM_CHARSET_ASCII) { | |
432 /* Should just be "ASCII" */ | |
9914 | 433 charsetstr1 = "ASCII"; |
9908 | 434 charsetstr2 = gaim_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); |
435 } else if (charset == 0x000d) { | |
9830 | 436 /* Mobile AIM client on a Nokia 3100 and an LG VX6000 */ |
9908 | 437 charsetstr1 = "ISO-8859-1"; |
438 charsetstr2 = gaim_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); | |
439 } else { | |
9830 | 440 /* Unknown, hope for valid UTF-8... */ |
9908 | 441 charsetstr1 = "UTF-8"; |
442 charsetstr2 = gaim_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); | |
443 } | |
444 | |
445 ret = gaim_plugin_oscar_convert_to_utf8(data, datalen, charsetstr1, FALSE); | |
446 if (ret == NULL) | |
447 ret = gaim_plugin_oscar_convert_to_utf8(data, datalen, charsetstr2, TRUE); | |
448 if (ret == NULL) | |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
449 ret = g_strdup(_("(There was an error receiving this message. The buddy you are speaking to most likely has a buggy client.)")); |
9830 | 450 |
451 return ret; | |
452 } | |
453 | |
13592 | 454 /** |
11081 | 455 * Figure out what encoding to use when sending a given outgoing message. |
456 */ | |
9830 | 457 static void |
13226 | 458 gaim_plugin_oscar_convert_to_best_encoding(GaimConnection *gc, |
459 const char *destsn, const gchar *from, | |
460 gchar **msg, int *msglen_int, | |
13234 | 461 guint16 *charset, guint16 *charsubset) |
9830 | 462 { |
463 OscarData *od = gc->proto_data; | |
464 GaimAccount *account = gaim_connection_get_account(gc); | |
465 GError *err = NULL; | |
466 aim_userinfo_t *userinfo = NULL; | |
467 const gchar *charsetstr; | |
10039 | 468 gsize msglen; |
9830 | 469 |
470 /* Attempt to send as ASCII */ | |
10098 | 471 if (oscar_charset_check(from) == AIM_CHARSET_ASCII) { |
10097 | 472 *msg = g_convert(from, strlen(from), "ASCII", "UTF-8", NULL, &msglen, NULL); |
10098 | 473 *charset = AIM_CHARSET_ASCII; |
9830 | 474 *charsubset = 0x0000; |
10039 | 475 *msglen_int = msglen; |
9830 | 476 return; |
477 } | |
478 | |
479 /* | |
10565 | 480 * If we're sending to an ICQ user, and they are in our |
481 * buddy list, and they are advertising the Unicode | |
482 * capability, and they are online, then attempt to send | |
483 * as UCS-2BE. | |
9830 | 484 */ |
9975 | 485 if ((destsn != NULL) && aim_sn_is_icq(destsn)) |
13592 | 486 userinfo = aim_locate_finduserinfo(od, destsn); |
487 | |
488 if ((userinfo != NULL) && (userinfo->capabilities & OSCAR_CAPABILITY_ICQUTF8)) | |
10565 | 489 { |
490 GaimBuddy *b; | |
491 b = gaim_find_buddy(account, destsn); | |
492 if ((b != NULL) && (GAIM_BUDDY_IS_ONLINE(b))) | |
493 { | |
494 *msg = g_convert(from, strlen(from), "UCS-2BE", "UTF-8", NULL, &msglen, NULL); | |
495 if (*msg != NULL) | |
496 { | |
497 *charset = AIM_CHARSET_UNICODE; | |
498 *charsubset = 0x0000; | |
499 *msglen_int = msglen; | |
500 return; | |
501 } | |
9830 | 502 } |
503 } | |
504 | |
505 /* | |
506 * If this is AIM then attempt to send as ISO-8859-1. If this is | |
507 * ICQ then attempt to send as the user specified character encoding. | |
508 */ | |
509 charsetstr = "ISO-8859-1"; | |
9975 | 510 if ((destsn != NULL) && aim_sn_is_icq(destsn)) |
9830 | 511 charsetstr = gaim_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); |
512 | |
10097 | 513 /* |
514 * XXX - We need a way to only attempt to convert if we KNOW "from" | |
515 * can be converted to "charsetstr" | |
516 */ | |
10039 | 517 *msg = g_convert(from, strlen(from), charsetstr, "UTF-8", NULL, &msglen, NULL); |
9830 | 518 if (*msg != NULL) { |
519 *charset = AIM_CHARSET_CUSTOM; | |
520 *charsubset = 0x0000; | |
10039 | 521 *msglen_int = msglen; |
9830 | 522 return; |
523 } | |
524 | |
525 /* | |
526 * Nothing else worked, so send as UCS-2BE. | |
527 */ | |
10039 | 528 *msg = g_convert(from, strlen(from), "UCS-2BE", "UTF-8", NULL, &msglen, &err); |
9830 | 529 if (*msg != NULL) { |
530 *charset = AIM_CHARSET_UNICODE; | |
531 *charsubset = 0x0000; | |
10039 | 532 *msglen_int = msglen; |
9830 | 533 return; |
534 } | |
535 | |
9908 | 536 gaim_debug_error("oscar", "Error converting a Unicode message: %s\n", err->message); |
9830 | 537 g_error_free(err); |
538 | |
539 gaim_debug_error("oscar", "This should NEVER happen! Sending UTF-8 text flagged as ASCII.\n"); | |
540 *msg = g_strdup(from); | |
10039 | 541 *msglen_int = strlen(*msg); |
9830 | 542 *charset = AIM_CHARSET_ASCII; |
543 *charsubset = 0x0000; | |
544 return; | |
545 } | |
546 | |
13356 | 547 /** |
548 * Looks for %n, %d, or %t in a string, and replaces them with the | |
549 * specified name, date, and time, respectively. | |
550 * | |
551 * @param str The string that may contain the special variables. | |
552 * @param name The sender name. | |
553 * | |
554 * @return A newly allocated string where the special variables are | |
555 * expanded. This should be g_free'd by the caller. | |
556 */ | |
557 static gchar * | |
558 gaim_str_sub_away_formatters(const char *str, const char *name) | |
559 { | |
560 char *c; | |
561 GString *cpy; | |
562 time_t t; | |
563 struct tm *tme; | |
564 | |
565 g_return_val_if_fail(str != NULL, NULL); | |
566 g_return_val_if_fail(name != NULL, NULL); | |
567 | |
568 /* Create an empty GString that is hopefully big enough for most messages */ | |
569 cpy = g_string_sized_new(1024); | |
570 | |
571 t = time(NULL); | |
572 tme = localtime(&t); | |
573 | |
574 c = (char *)str; | |
575 while (*c) { | |
576 switch (*c) { | |
577 case '%': | |
578 if (*(c + 1)) { | |
579 switch (*(c + 1)) { | |
580 case 'n': | |
581 /* append name */ | |
582 g_string_append(cpy, name); | |
583 c++; | |
584 break; | |
585 case 'd': | |
586 /* append date */ | |
587 g_string_append(cpy, gaim_date_format_short(tme)); | |
588 c++; | |
589 break; | |
590 case 't': | |
591 /* append time */ | |
592 g_string_append(cpy, gaim_time_format(tme)); | |
593 c++; | |
594 break; | |
595 default: | |
596 g_string_append_c(cpy, *c); | |
597 } | |
598 } else { | |
599 g_string_append_c(cpy, *c); | |
600 } | |
601 break; | |
602 default: | |
603 g_string_append_c(cpy, *c); | |
604 } | |
605 c++; | |
606 } | |
607 | |
608 return g_string_free(cpy, FALSE); | |
609 } | |
610 | |
12412
a88ca6da0b38
[gaim-migrate @ 14719]
Richard Laager <rlaager@wiktel.com>
parents:
12393
diff
changeset
|
611 static gchar *oscar_caps_to_string(guint caps) |
8701 | 612 { |
9407 | 613 GString *str; |
13104
e1e5462b7d81
[gaim-migrate @ 15466]
Richard Laager <rlaager@wiktel.com>
parents:
13074
diff
changeset
|
614 const gchar *tmp; |
8701 | 615 guint bit = 1; |
616 | |
9407 | 617 str = g_string_new(""); |
618 | |
8701 | 619 if (!caps) { |
620 return NULL; | |
13592 | 621 } else while (bit <= OSCAR_CAPABILITY_LAST) { |
8701 | 622 if (bit & caps) { |
623 switch (bit) { | |
13592 | 624 case OSCAR_CAPABILITY_BUDDYICON: |
8701 | 625 tmp = _("Buddy Icon"); |
626 break; | |
13592 | 627 case OSCAR_CAPABILITY_TALK: |
8701 | 628 tmp = _("Voice"); |
629 break; | |
13592 | 630 case OSCAR_CAPABILITY_DIRECTIM: |
8701 | 631 tmp = _("AIM Direct IM"); |
632 break; | |
13592 | 633 case OSCAR_CAPABILITY_CHAT: |
8701 | 634 tmp = _("Chat"); |
635 break; | |
13592 | 636 case OSCAR_CAPABILITY_GETFILE: |
8701 | 637 tmp = _("Get File"); |
638 break; | |
13592 | 639 case OSCAR_CAPABILITY_SENDFILE: |
8701 | 640 tmp = _("Send File"); |
641 break; | |
13592 | 642 case OSCAR_CAPABILITY_GAMES: |
643 case OSCAR_CAPABILITY_GAMES2: | |
8701 | 644 tmp = _("Games"); |
645 break; | |
13592 | 646 case OSCAR_CAPABILITY_ADDINS: |
8701 | 647 tmp = _("Add-Ins"); |
648 break; | |
13592 | 649 case OSCAR_CAPABILITY_SENDBUDDYLIST: |
8701 | 650 tmp = _("Send Buddy List"); |
651 break; | |
13592 | 652 case OSCAR_CAPABILITY_ICQ_DIRECT: |
8701 | 653 tmp = _("ICQ Direct Connect"); |
654 break; | |
13592 | 655 case OSCAR_CAPABILITY_APINFO: |
8701 | 656 tmp = _("AP User"); |
657 break; | |
13592 | 658 case OSCAR_CAPABILITY_ICQRTF: |
8701 | 659 tmp = _("ICQ RTF"); |
660 break; | |
13592 | 661 case OSCAR_CAPABILITY_EMPTY: |
8701 | 662 tmp = _("Nihilist"); |
663 break; | |
13592 | 664 case OSCAR_CAPABILITY_ICQSERVERRELAY: |
8701 | 665 tmp = _("ICQ Server Relay"); |
666 break; | |
13592 | 667 case OSCAR_CAPABILITY_ICQUTF8OLD: |
8701 | 668 tmp = _("Old ICQ UTF8"); |
669 break; | |
13592 | 670 case OSCAR_CAPABILITY_TRILLIANCRYPT: |
8701 | 671 tmp = _("Trillian Encryption"); |
672 break; | |
13592 | 673 case OSCAR_CAPABILITY_ICQUTF8: |
8701 | 674 tmp = _("ICQ UTF8"); |
675 break; | |
13592 | 676 case OSCAR_CAPABILITY_HIPTOP: |
8701 | 677 tmp = _("Hiptop"); |
678 break; | |
13592 | 679 case OSCAR_CAPABILITY_SECUREIM: |
8701 | 680 tmp = _("Security Enabled"); |
681 break; | |
13592 | 682 case OSCAR_CAPABILITY_VIDEO: |
8701 | 683 tmp = _("Video Chat"); |
684 break; | |
685 /* Not actually sure about this one... WinAIM doesn't show anything */ | |
13592 | 686 case OSCAR_CAPABILITY_ICHATAV: |
8701 | 687 tmp = _("iChat AV"); |
688 break; | |
13592 | 689 case OSCAR_CAPABILITY_LIVEVIDEO: |
8701 | 690 tmp = _("Live Video"); |
691 break; | |
13592 | 692 case OSCAR_CAPABILITY_CAMERA: |
8701 | 693 tmp = _("Camera"); |
694 break; | |
695 default: | |
696 tmp = NULL; | |
697 break; | |
698 } | |
699 if (tmp) | |
9532 | 700 g_string_append_printf(str, "%s%s", (*(str->str) == '\0' ? "" : ", "), tmp); |
8701 | 701 } |
702 bit <<= 1; | |
703 } | |
9407 | 704 |
705 return g_string_free(str, FALSE); | |
8701 | 706 } |
707 | |
708 static char *oscar_icqstatus(int state) { | |
709 /* Make a cute little string that shows the status of the dude or dudet */ | |
710 if (state & AIM_ICQ_STATE_CHAT) | |
711 return g_strdup_printf(_("Free For Chat")); | |
712 else if (state & AIM_ICQ_STATE_DND) | |
713 return g_strdup_printf(_("Do Not Disturb")); | |
714 else if (state & AIM_ICQ_STATE_OUT) | |
715 return g_strdup_printf(_("Not Available")); | |
716 else if (state & AIM_ICQ_STATE_BUSY) | |
717 return g_strdup_printf(_("Occupied")); | |
718 else if (state & AIM_ICQ_STATE_AWAY) | |
719 return g_strdup_printf(_("Away")); | |
720 else if (state & AIM_ICQ_STATE_WEBAWARE) | |
721 return g_strdup_printf(_("Web Aware")); | |
722 else if (state & AIM_ICQ_STATE_INVISIBLE) | |
723 return g_strdup_printf(_("Invisible")); | |
724 else | |
725 return g_strdup_printf(_("Online")); | |
726 } | |
727 | |
9973 | 728 static void |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
729 oscar_string_append(GaimAccount *account, GString *str, const char *newline, |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
730 const char *name, const char *value) |
8700 | 731 { |
732 gchar *utf8; | |
733 | |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
734 if (value && value[0] && (utf8 = oscar_utf8_try_convert(account, value))) { |
8701 | 735 g_string_append_printf(str, "%s<b>%s:</b> %s", newline, name, utf8); |
8700 | 736 g_free(utf8); |
737 } | |
738 } | |
739 | |
9973 | 740 static void oscar_string_append_info(GaimConnection *gc, GString *str, const char *newline, GaimBuddy *b, aim_userinfo_t *userinfo) |
8701 | 741 { |
10042 | 742 OscarData *od; |
743 GaimAccount *account; | |
10517
461334f300d7
[gaim-migrate @ 11821]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10504
diff
changeset
|
744 GaimPresence *presence = NULL; |
461334f300d7
[gaim-migrate @ 11821]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10504
diff
changeset
|
745 GaimStatus *status = NULL; |
8701 | 746 GaimGroup *g = NULL; |
747 struct buddyinfo *bi = NULL; | |
748 char *tmp; | |
749 | |
10042 | 750 od = gc->proto_data; |
751 account = gaim_connection_get_account(gc); | |
752 | |
753 if ((str == NULL) || (newline == NULL) || ((b == NULL) && (userinfo == NULL))) | |
8701 | 754 return; |
755 | |
756 if (userinfo == NULL) | |
13592 | 757 userinfo = aim_locate_finduserinfo(od, b->name); |
8701 | 758 |
759 if (b == NULL) | |
10042 | 760 b = gaim_find_buddy(account, userinfo->sn); |
8701 | 761 |
11369 | 762 if (b != NULL) { |
12088 | 763 g = gaim_buddy_get_group(b); |
10498 | 764 presence = gaim_buddy_get_presence(b); |
765 status = gaim_presence_get_active_status(presence); | |
766 } | |
8701 | 767 |
768 if (userinfo != NULL) | |
769 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(account, userinfo->sn)); | |
770 | |
8733 | 771 if (b != NULL) { |
10498 | 772 if (gaim_presence_is_online(presence)) { |
9975 | 773 if (aim_sn_is_icq(b->name)) { |
11510 | 774 GaimStatus *status = gaim_presence_get_active_status(presence); |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
775 oscar_string_append(gc->account, str, newline, _("Status"), |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
776 gaim_status_get_name(status)); |
8733 | 777 } |
778 } else { | |
13592 | 779 tmp = aim_ssi_itemlist_findparentname(od->ssi.local, b->name); |
780 if (aim_ssi_waitingforauth(od->ssi.local, tmp, b->name)) | |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
781 oscar_string_append(gc->account, str, newline, _("Status"), |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
782 _("Not Authorized")); |
8733 | 783 else |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
784 oscar_string_append(gc->account, str, newline, _("Status"), |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
785 _("Offline")); |
8701 | 786 } |
8733 | 787 } |
8701 | 788 |
789 if ((bi != NULL) && (bi->ipaddr != 0)) { | |
9625 | 790 tmp = g_strdup_printf("%hhu.%hhu.%hhu.%hhu", |
8701 | 791 (bi->ipaddr & 0xff000000) >> 24, |
792 (bi->ipaddr & 0x00ff0000) >> 16, | |
793 (bi->ipaddr & 0x0000ff00) >> 8, | |
794 (bi->ipaddr & 0x000000ff)); | |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
795 oscar_string_append(gc->account, str, newline, _("IP Address"), tmp); |
8701 | 796 g_free(tmp); |
797 } | |
798 | |
11257 | 799 |
800 if ((userinfo != NULL) && (userinfo->warnlevel != 0)) { | |
11285 | 801 tmp = g_strdup_printf("%d", (int)(userinfo->warnlevel/10.0 + .5)); |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
802 oscar_string_append(gc->account, str, newline, _("Warning Level"), tmp); |
11257 | 803 g_free(tmp); |
804 } | |
805 | |
8701 | 806 if ((b != NULL) && (b->name != NULL) && (g != NULL) && (g->name != NULL)) { |
13592 | 807 tmp = aim_ssi_getcomment(od->ssi.local, g->name, b->name); |
8701 | 808 if (tmp != NULL) { |
9625 | 809 char *tmp2 = g_markup_escape_text(tmp, strlen(tmp)); |
8701 | 810 g_free(tmp); |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
811 oscar_string_append(gc->account, str, newline, _("Buddy Comment"), tmp2); |
9625 | 812 g_free(tmp2); |
8701 | 813 } |
814 } | |
815 } | |
816 | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
817 static char *extract_name(const char *name) { |
4121 | 818 char *tmp, *x; |
2086 | 819 int i, j; |
4120 | 820 |
821 if (!name) | |
4121 | 822 return NULL; |
13381
d1b29fb3b6d0
[gaim-migrate @ 15754]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13356
diff
changeset
|
823 |
4120 | 824 x = strchr(name, '-'); |
4121 | 825 |
2086 | 826 if (!x) return NULL; |
827 x = strchr(++x, '-'); | |
828 if (!x) return NULL; | |
829 tmp = g_strdup(++x); | |
830 | |
831 for (i = 0, j = 0; x[i]; i++) { | |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
832 char hex[3]; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
833 if (x[i] != '%') { |
2086 | 834 tmp[j++] = x[i]; |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
835 continue; |
2086 | 836 } |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
837 strncpy(hex, x + ++i, 2); hex[2] = 0; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
838 i++; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
839 tmp[j++] = strtol(hex, NULL, 16); |
2086 | 840 } |
841 | |
842 tmp[j] = 0; | |
843 return tmp; | |
844 } | |
845 | |
10458 | 846 static struct chat_connection * |
847 find_oscar_chat(GaimConnection *gc, int id) | |
848 { | |
849 OscarData *od = (OscarData *)gc->proto_data; | |
850 GSList *cur; | |
851 struct chat_connection *cc; | |
852 | |
853 for (cur = od->oscar_chats; cur != NULL; cur = cur->next) | |
854 { | |
855 cc = (struct chat_connection *)cur->data; | |
856 if (cc->id == id) | |
857 return cc; | |
858 } | |
859 | |
860 return NULL; | |
861 } | |
862 | |
863 static struct chat_connection * | |
13592 | 864 find_oscar_chat_by_conn(GaimConnection *gc, FlapConnection *conn) |
10458 | 865 { |
866 OscarData *od = (OscarData *)gc->proto_data; | |
867 GSList *cur; | |
868 struct chat_connection *cc; | |
869 | |
870 for (cur = od->oscar_chats; cur != NULL; cur = cur->next) | |
871 { | |
872 cc = (struct chat_connection *)cur->data; | |
873 if (cc->conn == conn) | |
874 return cc; | |
875 } | |
876 | |
877 return NULL; | |
878 } | |
879 | |
880 static struct chat_connection * | |
881 find_oscar_chat_by_conv(GaimConnection *gc, GaimConversation *conv) | |
882 { | |
883 OscarData *od = (OscarData *)gc->proto_data; | |
884 GSList *cur; | |
885 struct chat_connection *cc; | |
886 | |
887 for (cur = od->oscar_chats; cur != NULL; cur = cur->next) | |
888 { | |
889 cc = (struct chat_connection *)cur->data; | |
890 if (cc->conv == conv) | |
891 return cc; | |
892 } | |
893 | |
894 return NULL; | |
895 } | |
896 | |
897 static void | |
13592 | 898 oscar_chat_destroy(struct chat_connection *cc) |
899 { | |
900 g_free(cc->name); | |
901 g_free(cc->show); | |
902 g_free(cc); | |
903 } | |
904 | |
905 static void | |
10458 | 906 oscar_chat_kill(GaimConnection *gc, struct chat_connection *cc) |
907 { | |
908 OscarData *od = (OscarData *)gc->proto_data; | |
909 | |
910 /* Notify the conversation window that we've left the chat */ | |
911 serv_got_chat_left(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(cc->conv))); | |
912 | |
913 /* Destroy the chat_connection */ | |
914 od->oscar_chats = g_slist_remove(od->oscar_chats, cc); | |
13608 | 915 flap_connection_schedule_destroy(cc->conn, OSCAR_DISCONNECT_DONE); |
13592 | 916 oscar_chat_destroy(cc); |
917 } | |
12909
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12816
diff
changeset
|
918 |
8e3b85fe4a55
[gaim-migrate @ 15262]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12816
diff
changeset
|
919 static void |
13592 | 920 destroy_new_conn_data(NewFlapConnectionData *new_conn_data) |
921 { | |
922 if ((new_conn_data->data != NULL) && | |
923 (new_conn_data->conn->type == SNAC_FAMILY_CHAT)) | |
924 { | |
925 oscar_chat_destroy(new_conn_data->data); | |
926 } | |
927 g_free(new_conn_data->cookie); | |
928 g_free(new_conn_data); | |
929 } | |
930 | |
931 /** | |
932 * This is the callback function anytime gaim_proxy_connect() | |
933 * establishes a new TCP connection with an oscar host. Depending | |
934 * on the type of host, we do a few different things here. | |
8983 | 935 */ |
13231 | 936 static void |
13592 | 937 connection_established_cb(gpointer data, gint source, GaimInputCondition cond) |
13231 | 938 { |
13592 | 939 NewFlapConnectionData *new_conn_data; |
13231 | 940 GaimConnection *gc; |
7283 | 941 OscarData *od; |
13604 | 942 GaimAccount *account; |
13592 | 943 FlapConnection *conn; |
944 | |
945 new_conn_data = data; | |
946 gc = new_conn_data->gc; | |
947 | |
948 if (!g_list_find(gaim_connections_get_all(), gc)) | |
13231 | 949 { |
13592 | 950 if (source >= 0) |
951 close(source); | |
952 destroy_new_conn_data(new_conn_data); | |
2086 | 953 return; |
954 } | |
13226 | 955 |
13231 | 956 od = gc->proto_data; |
13604 | 957 account = gaim_connection_get_account(gc); |
13592 | 958 conn = new_conn_data->conn; |
959 conn->fd = source; | |
960 | |
961 if (source < 0) | |
13231 | 962 { |
13592 | 963 gaim_debug_error("oscar", "unable to connect FLAP server " |
964 "of type 0x%04hx\n", conn->type); | |
965 if (conn->type == SNAC_FAMILY_AUTH) | |
966 gaim_connection_error(gc, _("Could not connect to authentication server")); | |
967 if (conn->type == SNAC_FAMILY_LOCATE) | |
968 gaim_connection_error(gc, _("Could not connect to BOS server")); | |
969 else /* Maybe we should call this for BOS connections, too? */ | |
13608 | 970 flap_connection_schedule_destroy(conn, |
971 OSCAR_DISCONNECT_COULD_NOT_CONNECT); | |
13592 | 972 destroy_new_conn_data(new_conn_data); |
13231 | 973 return; |
13592 | 974 } |
975 | |
976 gaim_debug_info("oscar", "connected to FLAP server of type 0x%04hx\n", | |
977 conn->type); | |
978 conn->watcher_incoming = gaim_input_add(conn->fd, | |
979 GAIM_INPUT_READ, flap_connection_recv_cb, conn); | |
980 if (new_conn_data->cookie == NULL) | |
13602 | 981 { |
13604 | 982 if (!aim_sn_is_icq(gaim_account_get_username(account))) |
13602 | 983 /* |
984 * We don't send this when authenticating an ICQ account | |
985 * because for some reason ICQ is still using the | |
986 * assy/insecure authentication procedure. | |
987 */ | |
988 flap_connection_send_version(od, conn); | |
989 } | |
13592 | 990 else |
991 flap_connection_send_version_with_cookie(od, conn, | |
992 new_conn_data->cookielen, new_conn_data->cookie); | |
993 | |
994 if (conn->type == SNAC_FAMILY_AUTH) | |
995 { | |
996 aim_request_login(od, conn, gaim_account_get_username(account)); | |
997 gaim_debug_info("oscar", "Screen name sent, waiting for response\n"); | |
998 gaim_connection_update_progress(gc, _("Screen name sent"), 1, OSCAR_CONNECT_STEPS); | |
999 ck[1] = 0x65; | |
1000 } | |
1001 else if (conn->type == SNAC_FAMILY_LOCATE) | |
1002 { | |
1003 gaim_connection_update_progress(gc, _("Connection established, cookie sent"), 4, OSCAR_CONNECT_STEPS); | |
1004 ck[4] = 0x61; | |
1005 } | |
1006 else if (conn->type == SNAC_FAMILY_CHAT) | |
1007 { | |
1008 od->oscar_chats = g_slist_append(od->oscar_chats, new_conn_data->data); | |
1009 new_conn_data->data = NULL; | |
1010 } | |
1011 | |
1012 destroy_new_conn_data(new_conn_data); | |
1013 } | |
1014 | |
1015 static void | |
1016 flap_connection_established_bos(OscarData *od, FlapConnection *conn) | |
1017 { | |
1018 GaimConnection *gc = od->gc; | |
1019 | |
1020 aim_reqpersonalinfo(od, conn); | |
1021 | |
1022 gaim_debug_info("oscar", "ssi: requesting rights and list\n"); | |
1023 aim_ssi_reqrights(od); | |
1024 aim_ssi_reqdata(od); | |
1025 if (od->getblisttimer > 0) | |
1026 gaim_timeout_remove(od->getblisttimer); | |
1027 od->getblisttimer = gaim_timeout_add(30000, gaim_ssi_rerequestdata, od); | |
1028 | |
1029 aim_locate_reqrights(od); | |
1030 aim_buddylist_reqrights(od, conn); | |
1031 aim_im_reqparams(od); | |
1032 aim_bos_reqrights(od, conn); /* TODO: Don't call this with ssi */ | |
1033 | |
1034 gaim_connection_update_progress(gc, _("Finalizing connection"), 5, OSCAR_CONNECT_STEPS); | |
1035 } | |
1036 | |
1037 static void | |
1038 flap_connection_established_admin(OscarData *od, FlapConnection *conn) | |
2086 | 1039 { |
13592 | 1040 aim_clientready(od, conn); |
1041 gaim_debug_info("oscar", "connected to admin\n"); | |
1042 | |
1043 if (od->chpass) { | |
1044 gaim_debug_info("oscar", "changing password\n"); | |
1045 aim_admin_changepasswd(od, conn, od->newp, od->oldp); | |
1046 g_free(od->oldp); | |
1047 od->oldp = NULL; | |
1048 g_free(od->newp); | |
1049 od->newp = NULL; | |
1050 od->chpass = FALSE; | |
1051 } | |
1052 if (od->setnick) { | |
1053 gaim_debug_info("oscar", "formatting screen name\n"); | |
1054 aim_admin_setnick(od, conn, od->newsn); | |
1055 g_free(od->newsn); | |
1056 od->newsn = NULL; | |
1057 od->setnick = FALSE; | |
1058 } | |
1059 if (od->conf) { | |
1060 gaim_debug_info("oscar", "confirming account\n"); | |
1061 aim_admin_reqconfirm(od, conn); | |
1062 od->conf = FALSE; | |
1063 } | |
1064 if (od->reqemail) { | |
1065 gaim_debug_info("oscar", "requesting e-mail address\n"); | |
1066 aim_admin_getinfo(od, conn, 0x0011); | |
1067 od->reqemail = FALSE; | |
1068 } | |
1069 if (od->setemail) { | |
1070 gaim_debug_info("oscar", "setting e-mail address\n"); | |
1071 aim_admin_setemail(od, conn, od->email); | |
1072 g_free(od->email); | |
1073 od->email = NULL; | |
1074 od->setemail = FALSE; | |
1075 } | |
1076 } | |
1077 | |
1078 static void | |
1079 flap_connection_established_chat(OscarData *od, FlapConnection *conn) | |
1080 { | |
1081 GaimConnection *gc = od->gc; | |
1082 struct chat_connection *chatcon; | |
1083 static int id = 1; | |
1084 | |
1085 aim_clientready(od, conn); | |
1086 | |
1087 chatcon = find_oscar_chat_by_conn(gc, conn); | |
1088 chatcon->id = id; | |
1089 chatcon->conv = serv_got_joined_chat(gc, id++, chatcon->show); | |
1090 } | |
1091 | |
1092 static void | |
1093 flap_connection_established_chatnav(OscarData *od, FlapConnection *conn) | |
1094 { | |
1095 aim_clientready(od, conn); | |
1096 aim_chatnav_reqrights(od, conn); | |
1097 } | |
1098 | |
1099 static void | |
1100 flap_connection_established_alert(OscarData *od, FlapConnection *conn) | |
1101 { | |
1102 aim_email_sendcookies(od); | |
1103 aim_email_activate(od); | |
1104 aim_clientready(od, conn); | |
1105 } | |
1106 | |
1107 static void | |
1108 flap_connection_established_bart(OscarData *od, FlapConnection *conn) | |
1109 { | |
1110 GaimConnection *gc = od->gc; | |
1111 | |
1112 aim_clientready(od, conn); | |
1113 | |
1114 od->iconconnecting = FALSE; | |
1115 | |
1116 if (od->icontimer) | |
1117 gaim_timeout_remove(od->icontimer); | |
1118 od->icontimer = gaim_timeout_add(100, gaim_icon_timerfunc, gc); | |
1119 } | |
1120 | |
1121 static int | |
1122 flap_connection_established(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) | |
1123 { | |
1124 gaim_debug_info("oscar", "FLAP connection of type 0x%04hx is " | |
1125 "now fully connected\n", conn->type); | |
1126 if (conn->type == SNAC_FAMILY_LOCATE) | |
1127 flap_connection_established_bos(od, conn); | |
1128 else if (conn->type == SNAC_FAMILY_ADMIN) | |
1129 flap_connection_established_admin(od, conn); | |
1130 else if (conn->type == SNAC_FAMILY_CHAT) | |
1131 flap_connection_established_chat(od, conn); | |
1132 else if (conn->type == SNAC_FAMILY_CHATNAV) | |
1133 flap_connection_established_chatnav(od, conn); | |
1134 else if (conn->type == SNAC_FAMILY_ALERT) | |
1135 flap_connection_established_alert(od, conn); | |
1136 else if (conn->type == SNAC_FAMILY_BART) | |
1137 flap_connection_established_bart(od, conn); | |
1138 | |
1139 return 1; | |
2086 | 1140 } |
1141 | |
10444 | 1142 static void |
11837 | 1143 oscar_login(GaimAccount *account) |
10444 | 1144 { |
13592 | 1145 GaimConnection *gc; |
1146 OscarData *od; | |
1147 NewFlapConnectionData *new_conn_data; | |
1148 | |
1149 gc = gaim_account_get_connection(account); | |
1150 od = gc->proto_data = oscar_data_new(); | |
1151 od->gc = gc; | |
1152 | |
1153 oscar_data_addhandler(od, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); | |
1154 oscar_data_addhandler(od, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, flap_connection_established, 0); | |
1155 | |
1156 oscar_data_addhandler(od, SNAC_FAMILY_ADMIN, 0x0003, gaim_info_change, 0); | |
1157 oscar_data_addhandler(od, SNAC_FAMILY_ADMIN, 0x0005, gaim_info_change, 0); | |
1158 oscar_data_addhandler(od, SNAC_FAMILY_ADMIN, 0x0007, gaim_account_confirm, 0); | |
1159 oscar_data_addhandler(od, SNAC_FAMILY_ALERT, 0x0001, gaim_parse_genericerr, 0); | |
1160 oscar_data_addhandler(od, SNAC_FAMILY_ALERT, SNAC_SUBTYPE_ALERT_MAILSTATUS, gaim_email_parseupdate, 0); | |
1161 oscar_data_addhandler(od, SNAC_FAMILY_AUTH, 0x0003, gaim_parse_auth_resp, 0); | |
1162 oscar_data_addhandler(od, SNAC_FAMILY_AUTH, 0x0007, gaim_parse_login, 0); | |
1163 oscar_data_addhandler(od, SNAC_FAMILY_AUTH, SNAC_SUBTYPE_AUTH_SECURID_REQUEST, gaim_parse_auth_securid_request, 0); | |
1164 oscar_data_addhandler(od, SNAC_FAMILY_BART, SNAC_SUBTYPE_BART_ERROR, gaim_icon_error, 0); | |
1165 oscar_data_addhandler(od, SNAC_FAMILY_BART, SNAC_SUBTYPE_BART_RESPONSE, gaim_icon_parseicon, 0); | |
1166 oscar_data_addhandler(od, SNAC_FAMILY_BOS, 0x0001, gaim_parse_genericerr, 0); | |
1167 oscar_data_addhandler(od, SNAC_FAMILY_BOS, 0x0003, gaim_bosrights, 0); | |
1168 oscar_data_addhandler(od, SNAC_FAMILY_BUDDY, 0x0001, gaim_parse_genericerr, 0); | |
1169 oscar_data_addhandler(od, SNAC_FAMILY_BUDDY, SNAC_SUBTYPE_BUDDY_RIGHTSINFO, gaim_parse_buddyrights, 0); | |
1170 oscar_data_addhandler(od, SNAC_FAMILY_BUDDY, SNAC_SUBTYPE_BUDDY_ONCOMING, gaim_parse_oncoming, 0); | |
1171 oscar_data_addhandler(od, SNAC_FAMILY_BUDDY, SNAC_SUBTYPE_BUDDY_OFFGOING, gaim_parse_offgoing, 0); | |
1172 oscar_data_addhandler(od, SNAC_FAMILY_CHAT, 0x0001, gaim_parse_genericerr, 0); | |
1173 oscar_data_addhandler(od, SNAC_FAMILY_CHAT, SNAC_SUBTYPE_CHAT_USERJOIN, gaim_conv_chat_join, 0); | |
1174 oscar_data_addhandler(od, SNAC_FAMILY_CHAT, SNAC_SUBTYPE_CHAT_USERLEAVE, gaim_conv_chat_leave, 0); | |
1175 oscar_data_addhandler(od, SNAC_FAMILY_CHAT, SNAC_SUBTYPE_CHAT_ROOMINFOUPDATE, gaim_conv_chat_info_update, 0); | |
1176 oscar_data_addhandler(od, SNAC_FAMILY_CHAT, SNAC_SUBTYPE_CHAT_INCOMINGMSG, gaim_conv_chat_incoming_msg, 0); | |
1177 oscar_data_addhandler(od, SNAC_FAMILY_CHATNAV, 0x0001, gaim_parse_genericerr, 0); | |
1178 oscar_data_addhandler(od, SNAC_FAMILY_CHATNAV, SNAC_SUBTYPE_CHATNAV_INFO, gaim_chatnav_info, 0); | |
1179 oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_ERROR, gaim_ssi_parseerr, 0); | |
1180 oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_RIGHTSINFO, gaim_ssi_parserights, 0); | |
1181 oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_LIST, gaim_ssi_parselist, 0); | |
1182 oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_SRVACK, gaim_ssi_parseack, 0); | |
1183 oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_ADD, gaim_ssi_parseadd, 0); | |
1184 oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_RECVAUTH, gaim_ssi_authgiven, 0); | |
1185 oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_RECVAUTHREQ, gaim_ssi_authrequest, 0); | |
1186 oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_RECVAUTHREP, gaim_ssi_authreply, 0); | |
1187 oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_ADDED, gaim_ssi_gotadded, 0); | |
1188 oscar_data_addhandler(od, SNAC_FAMILY_ICBM, 0x0005, gaim_icbm_param_info, 0); | |
1189 oscar_data_addhandler(od, SNAC_FAMILY_ICBM, SNAC_SUBTYPE_ICBM_INCOMING, gaim_parse_incoming_im, 0); | |
1190 oscar_data_addhandler(od, SNAC_FAMILY_ICBM, SNAC_SUBTYPE_ICBM_MISSEDCALL, gaim_parse_misses, 0); | |
1191 oscar_data_addhandler(od, SNAC_FAMILY_ICBM, SNAC_SUBTYPE_ICBM_CLIENTAUTORESP, gaim_parse_clientauto, 0); | |
1192 oscar_data_addhandler(od, SNAC_FAMILY_ICBM, SNAC_SUBTYPE_ICBM_ERROR, gaim_parse_msgerr, 0); | |
1193 oscar_data_addhandler(od, SNAC_FAMILY_ICBM, SNAC_SUBTYPE_ICBM_MTN, gaim_parse_mtn, 0); | |
1194 oscar_data_addhandler(od, SNAC_FAMILY_ICBM, SNAC_SUBTYPE_ICBM_ACK, gaim_parse_msgack, 0); | |
1195 oscar_data_addhandler(od, SNAC_FAMILY_ICQ, SNAC_SUBTYPE_ICQ_OFFLINEMSG, gaim_offlinemsg, 0); | |
1196 oscar_data_addhandler(od, SNAC_FAMILY_ICQ, SNAC_SUBTYPE_ICQ_OFFLINEMSGCOMPLETE, gaim_offlinemsgdone, 0); | |
1197 oscar_data_addhandler(od, SNAC_FAMILY_ICQ, SNAC_SUBTYPE_ICQ_ALIAS, gaim_icqalias, 0); | |
1198 oscar_data_addhandler(od, SNAC_FAMILY_ICQ, SNAC_SUBTYPE_ICQ_INFO, gaim_icqinfo, 0); | |
1199 oscar_data_addhandler(od, SNAC_FAMILY_LOCATE, SNAC_SUBTYPE_LOCATE_RIGHTSINFO, gaim_parse_locaterights, 0); | |
1200 oscar_data_addhandler(od, SNAC_FAMILY_LOCATE, SNAC_SUBTYPE_LOCATE_USERINFO, gaim_parse_userinfo, 0); | |
1201 oscar_data_addhandler(od, SNAC_FAMILY_LOCATE, SNAC_SUBTYPE_LOCATE_ERROR, gaim_parse_locerr, 0); | |
1202 oscar_data_addhandler(od, SNAC_FAMILY_LOCATE, SNAC_SUBTYPE_LOCATE_GOTINFOBLOCK, gaim_got_infoblock, 0); | |
1203 oscar_data_addhandler(od, SNAC_FAMILY_OSERVICE, 0x0001, gaim_parse_genericerr, 0); | |
1204 oscar_data_addhandler(od, SNAC_FAMILY_OSERVICE, 0x000f, gaim_selfinfo, 0); | |
1205 oscar_data_addhandler(od, SNAC_FAMILY_OSERVICE, 0x001f, gaim_memrequest, 0); | |
1206 oscar_data_addhandler(od, SNAC_FAMILY_OSERVICE, 0x0021, oscar_icon_req,0); | |
1207 oscar_data_addhandler(od, SNAC_FAMILY_OSERVICE, SNAC_SUBTYPE_OSERVICE_RATECHANGE, gaim_parse_ratechange, 0); | |
1208 oscar_data_addhandler(od, SNAC_FAMILY_OSERVICE, SNAC_SUBTYPE_OSERVICE_REDIRECT, gaim_handle_redirect, 0); | |
1209 oscar_data_addhandler(od, SNAC_FAMILY_OSERVICE, SNAC_SUBTYPE_OSERVICE_MOTD, gaim_parse_motd, 0); | |
1210 oscar_data_addhandler(od, SNAC_FAMILY_OSERVICE, SNAC_SUBTYPE_OSERVICE_EVIL, gaim_parse_evilnotify, 0); | |
1211 oscar_data_addhandler(od, SNAC_FAMILY_POPUP, 0x0002, gaim_popup, 0); | |
1212 oscar_data_addhandler(od, SNAC_FAMILY_USERLOOKUP, SNAC_SUBTYPE_USERLOOKUP_ERROR, gaim_parse_searcherror, 0); | |
1213 oscar_data_addhandler(od, SNAC_FAMILY_USERLOOKUP, 0x0003, gaim_parse_searchreply, 0); | |
2086 | 1214 |
8660 | 1215 gaim_debug_misc("oscar", "oscar_login: gc = %p\n", gc); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
1216 |
8437 | 1217 if (!aim_snvalid(gaim_account_get_username(account))) { |
1218 gchar *buf; | |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
1219 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 | 1220 gaim_connection_error(gc, buf); |
1221 g_free(buf); | |
1222 } | |
1223 | |
9975 | 1224 if (aim_sn_is_icq((gaim_account_get_username(account)))) { |
4617 | 1225 od->icq = TRUE; |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
1226 } else { |
6622 | 1227 gc->flags |= GAIM_CONNECTION_HTML; |
1228 gc->flags |= GAIM_CONNECTION_AUTO_RESP; | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
1229 } |
2086 | 1230 |
9935 | 1231 /* Connect to core Gaim signals */ |
10087 | 1232 gaim_prefs_connect_callback(gc, "/plugins/prpl/oscar/recent_buddies", recent_buddies_cb, gc); |
9935 | 1233 |
13592 | 1234 new_conn_data = g_new(NewFlapConnectionData, 1); |
1235 new_conn_data->gc = gc; | |
1236 new_conn_data->conn = flap_connection_new(od, SNAC_FAMILY_AUTH); | |
1237 new_conn_data->cookielen = 0; | |
1238 new_conn_data->cookie = NULL; | |
13631 | 1239 new_conn_data->data = NULL; |
13592 | 1240 |
1241 if (gaim_proxy_connect(account, | |
1242 gaim_account_get_string(account, "server", OSCAR_DEFAULT_LOGIN_SERVER), | |
1243 gaim_account_get_int(account, "port", OSCAR_DEFAULT_LOGIN_PORT), | |
1244 connection_established_cb, new_conn_data) < 0) | |
1245 { | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1246 gaim_connection_error(gc, _("Couldn't connect to host")); |
2086 | 1247 return; |
1248 } | |
7282 | 1249 |
7283 | 1250 gaim_connection_update_progress(gc, _("Connecting"), 0, OSCAR_CONNECT_STEPS); |
8341 | 1251 ck[0] = 0x5a; |
5575 | 1252 } |
1253 | |
13592 | 1254 static void |
1255 oscar_close(GaimConnection *gc) | |
1256 { | |
13597 | 1257 OscarData *od; |
1258 | |
1259 od = (OscarData *)gc->proto_data; | |
4617 | 1260 |
13592 | 1261 while (od->oscar_chats) |
1262 { | |
1263 struct chat_connection *cc = od->oscar_chats->data; | |
1264 od->oscar_chats = g_slist_remove(od->oscar_chats, cc); | |
1265 oscar_chat_destroy(cc); | |
3630 | 1266 } |
13597 | 1267 while (od->create_rooms) |
1268 { | |
4617 | 1269 struct create_room *cr = od->create_rooms->data; |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
1270 g_free(cr->name); |
4617 | 1271 od->create_rooms = g_slist_remove(od->create_rooms, cr); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
1272 g_free(cr); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
1273 } |
13592 | 1274 oscar_data_destroy(od); |
2086 | 1275 gc->proto_data = NULL; |
13597 | 1276 |
1277 gaim_prefs_disconnect_by_handle(gc); | |
1278 | |
8660 | 1279 gaim_debug_info("oscar", "Signed off.\n"); |
2086 | 1280 } |
1281 | |
13592 | 1282 static int |
1283 gaim_parse_auth_resp(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) | |
8446 | 1284 { |
13592 | 1285 GaimConnection *gc = od->gc; |
6029 | 1286 GaimAccount *account = gc->account; |
1287 char *host; int port; | |
1288 int i, rc; | |
13592 | 1289 NewFlapConnectionData *new_conn_data; |
2086 | 1290 va_list ap; |
2704 | 1291 struct aim_authresp_info *info; |
6029 | 1292 |
11338 | 1293 port = gaim_account_get_int(account, "port", OSCAR_DEFAULT_LOGIN_PORT); |
2086 | 1294 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1295 va_start(ap, fr); |
2704 | 1296 info = va_arg(ap, struct aim_authresp_info *); |
2086 | 1297 va_end(ap); |
1298 | |
8660 | 1299 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1300 "inside auth_resp (Screen name: %s)\n", info->sn); |
2704 | 1301 |
4293 | 1302 if (info->errorcode || !info->bosip || !info->cookielen || !info->cookie) { |
4056 | 1303 char buf[256]; |
2704 | 1304 switch (info->errorcode) { |
2086 | 1305 case 0x05: |
1306 /* Incorrect nick/password */ | |
6498 | 1307 gc->wants_to_die = TRUE; |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1308 gaim_connection_error(gc, _("Incorrect nickname or password.")); |
2086 | 1309 break; |
1310 case 0x11: | |
1311 /* Suspended account */ | |
6498 | 1312 gc->wants_to_die = TRUE; |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1313 gaim_connection_error(gc, _("Your account is currently suspended.")); |
2086 | 1314 break; |
3498 | 1315 case 0x14: |
1316 /* service temporarily unavailable */ | |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1317 gaim_connection_error(gc, _("The AOL Instant Messenger service is temporarily unavailable.")); |
3498 | 1318 break; |
2086 | 1319 case 0x18: |
1320 /* connecting too frequently */ | |
6498 | 1321 gc->wants_to_die = TRUE; |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1322 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 | 1323 break; |
1324 case 0x1c: | |
1325 /* client too old */ | |
6498 | 1326 gc->wants_to_die = TRUE; |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6350
diff
changeset
|
1327 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
|
1328 gaim_connection_error(gc, buf); |
2086 | 1329 break; |
1330 default: | |
6623 | 1331 gaim_connection_error(gc, _("Authentication failed")); |
2086 | 1332 break; |
1333 } | |
13226 | 1334 gaim_debug_error("oscar", "Login Error Code 0x%04hx\n", info->errorcode); |
1335 gaim_debug_error("oscar", "Error URL: %s\n", info->errorurl); | |
2086 | 1336 od->killme = TRUE; |
1337 return 1; | |
1338 } | |
1339 | |
9992 | 1340 gaim_debug_misc("oscar", "Reg status: %hu\n", info->regstatus); |
13592 | 1341 gaim_debug_misc("oscar", "E-mail: %s\n", |
1342 (info->email != NULL) ? info->email : "null"); | |
8660 | 1343 gaim_debug_misc("oscar", "BOSIP: %s\n", info->bosip); |
13226 | 1344 gaim_debug_info("oscar", "Closing auth connection...\n"); |
13608 | 1345 flap_connection_schedule_destroy(conn, OSCAR_DISCONNECT_DONE); |
13592 | 1346 |
1347 for (i = 0; i < strlen(info->bosip); i++) { | |
2704 | 1348 if (info->bosip[i] == ':') { |
1349 port = atoi(&(info->bosip[i+1])); | |
2086 | 1350 break; |
1351 } | |
1352 } | |
2704 | 1353 host = g_strndup(info->bosip, i); |
13592 | 1354 new_conn_data = g_new(NewFlapConnectionData, 1); |
1355 new_conn_data->gc = gc; | |
1356 new_conn_data->conn = flap_connection_new(od, SNAC_FAMILY_LOCATE); | |
1357 new_conn_data->cookielen = info->cookielen; | |
1358 new_conn_data->cookie = g_memdup(info->cookie, info->cookielen); | |
13631 | 1359 new_conn_data->data = NULL; |
13592 | 1360 rc = gaim_proxy_connect(gc->account, host, port, connection_established_cb, new_conn_data); |
2086 | 1361 g_free(host); |
4366 | 1362 if (rc < 0) { |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
1363 gaim_connection_error(gc, _("Could Not Connect")); |
2086 | 1364 od->killme = TRUE; |
1365 return 0; | |
1366 } | |
2704 | 1367 |
7283 | 1368 gaim_connection_update_progress(gc, _("Received authorization"), 3, OSCAR_CONNECT_STEPS); |
8341 | 1369 ck[3] = 0x64; |
7282 | 1370 |
2086 | 1371 return 1; |
1372 } | |
1373 | |
10464 | 1374 static void |
1375 gaim_parse_auth_securid_request_yes_cb(gpointer user_data, const char *msg) | |
1376 { | |
1377 GaimConnection *gc = user_data; | |
1378 OscarData *od = gc->proto_data; | |
13592 | 1379 |
1380 aim_auth_securid_send(od, msg); | |
10464 | 1381 } |
1382 | |
1383 static void | |
1384 gaim_parse_auth_securid_request_no_cb(gpointer user_data, const char *value) | |
1385 { | |
1386 GaimConnection *gc = user_data; | |
1387 OscarData *od = gc->proto_data; | |
1388 | |
1389 /* Disconnect */ | |
1390 gc->wants_to_die = TRUE; | |
1391 gaim_connection_error(gc, _("The SecurID key entered is invalid.")); | |
1392 od->killme = TRUE; | |
1393 } | |
1394 | |
1395 static int | |
13592 | 1396 gaim_parse_auth_securid_request(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) |
10464 | 1397 { |
13592 | 1398 GaimConnection *gc = od->gc; |
10464 | 1399 GaimAccount *account = gaim_connection_get_account(gc); |
1400 gchar *primary; | |
1401 | |
1402 gaim_debug_info("oscar", "Got SecurID request\n"); | |
1403 | |
1404 primary = g_strdup_printf("Enter the SecurID key for %s.", gaim_account_get_username(account)); | |
1405 gaim_request_input(gc, NULL, _("Enter SecurID"), primary, | |
1406 _("Enter the 6 digit number from the digital display."), | |
1407 FALSE, FALSE, NULL, | |
1408 _("OK"), G_CALLBACK(gaim_parse_auth_securid_request_yes_cb), | |
1409 _("Cancel"), G_CALLBACK(gaim_parse_auth_securid_request_no_cb), | |
1410 gc); | |
1411 g_free(primary); | |
1412 | |
1413 return 1; | |
1414 } | |
1415 | |
7285 | 1416 /* XXX - Should use gaim_url_fetch for the below stuff */ |
2086 | 1417 struct pieceofcrap { |
5575 | 1418 GaimConnection *gc; |
2086 | 1419 unsigned long offset; |
1420 unsigned long len; | |
1421 char *modname; | |
1422 int fd; | |
13592 | 1423 FlapConnection *conn; |
2086 | 1424 unsigned int inpa; |
1425 }; | |
1426 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1427 static void damn_you(gpointer data, gint source, GaimInputCondition c) |
2086 | 1428 { |
1429 struct pieceofcrap *pos = data; | |
7283 | 1430 OscarData *od = pos->gc->proto_data; |
2086 | 1431 char in = '\0'; |
1432 int x = 0; | |
1433 unsigned char m[17]; | |
1434 | |
1435 while (read(pos->fd, &in, 1) == 1) { | |
1436 if (in == '\n') | |
1437 x++; | |
1438 else if (in != '\r') | |
1439 x = 0; | |
1440 if (x == 2) | |
1441 break; | |
1442 in = '\0'; | |
1443 } | |
1444 if (in != '\n') { | |
4056 | 1445 char buf[256]; |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
1446 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
|
1447 "this is fixed. Check %s for updates."), GAIM_WEBSITE); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1448 gaim_notify_warning(pos->gc, NULL, |
7422 | 1449 _("Gaim was unable to get a valid AIM login hash."), |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1450 buf); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1451 gaim_input_remove(pos->inpa); |
2086 | 1452 close(pos->fd); |
1453 g_free(pos); | |
1454 return; | |
1455 } | |
13662 | 1456 if (read(pos->fd, m, 16) != 16) |
1457 { | |
1458 gaim_debug_warning("oscar", "Could not read full AIM login hash " | |
1459 "from " AIMHASHDATA "--that's bad.\n"); | |
1460 } | |
2086 | 1461 m[16] = '\0'; |
8660 | 1462 gaim_debug_misc("oscar", "Sending hash: "); |
2086 | 1463 for (x = 0; x < 16; x++) |
8660 | 1464 gaim_debug_misc(NULL, "%02hhx ", (unsigned char)m[x]); |
1465 | |
1466 gaim_debug_misc(NULL, "\n"); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1467 gaim_input_remove(pos->inpa); |
2086 | 1468 close(pos->fd); |
13592 | 1469 aim_sendmemblock(od, pos->conn, 0, 16, m, AIM_SENDMEMBLOCK_FLAG_ISHASH); |
2086 | 1470 g_free(pos); |
1471 } | |
1472 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1473 static void straight_to_hell(gpointer data, gint source, GaimInputCondition cond) { |
2086 | 1474 struct pieceofcrap *pos = data; |
5420 | 1475 gchar *buf; |
2086 | 1476 |
4366 | 1477 pos->fd = source; |
1478 | |
2086 | 1479 if (source < 0) { |
5420 | 1480 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
|
1481 "this is fixed. Check %s for updates."), GAIM_WEBSITE); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1482 gaim_notify_warning(pos->gc, NULL, |
7422 | 1483 _("Gaim was unable to get a valid AIM login hash."), |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1484 buf); |
5420 | 1485 g_free(buf); |
2086 | 1486 if (pos->modname) |
1487 g_free(pos->modname); | |
1488 g_free(pos); | |
1489 return; | |
1490 } | |
1491 | |
5420 | 1492 buf = g_strdup_printf("GET " AIMHASHDATA "?offset=%ld&len=%ld&modname=%s HTTP/1.0\n\n", |
2086 | 1493 pos->offset, pos->len, pos->modname ? pos->modname : ""); |
1494 write(pos->fd, buf, strlen(buf)); | |
5420 | 1495 g_free(buf); |
2086 | 1496 if (pos->modname) |
1497 g_free(pos->modname); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1498 pos->inpa = gaim_input_add(pos->fd, GAIM_INPUT_READ, damn_you, pos); |
2086 | 1499 return; |
1500 } | |
1501 | |
1502 /* size of icbmui.ocm, the largest module in AIM 3.5 */ | |
1503 #define AIM_MAX_FILE_SIZE 98304 | |
1504 | |
13592 | 1505 int gaim_memrequest(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
2086 | 1506 va_list ap; |
1507 struct pieceofcrap *pos; | |
13234 | 1508 guint32 offset, len; |
2086 | 1509 char *modname; |
1510 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1511 va_start(ap, fr); |
13234 | 1512 offset = va_arg(ap, guint32); |
1513 len = va_arg(ap, guint32); | |
2086 | 1514 modname = va_arg(ap, char *); |
1515 va_end(ap); | |
1516 | |
13226 | 1517 gaim_debug_misc("oscar", "offset: %u, len: %u, file: %s\n", |
1518 offset, len, (modname ? modname : "aim.exe")); | |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1519 |
2086 | 1520 if (len == 0) { |
8660 | 1521 gaim_debug_misc("oscar", "len is 0, hashing NULL\n"); |
13592 | 1522 aim_sendmemblock(od, conn, offset, len, NULL, |
2086 | 1523 AIM_SENDMEMBLOCK_FLAG_ISREQUEST); |
1524 return 1; | |
1525 } | |
9625 | 1526 /* uncomment this when you're convinced it's right. remember, it's been wrong before. */ |
1527 #if 0 | |
2086 | 1528 if (offset > AIM_MAX_FILE_SIZE || len > AIM_MAX_FILE_SIZE) { |
1529 char *buf; | |
1530 int i = 8; | |
1531 if (modname) | |
1532 i += strlen(modname); | |
1533 buf = g_malloc(i); | |
1534 i = 0; | |
1535 if (modname) { | |
1536 memcpy(buf, modname, strlen(modname)); | |
1537 i += strlen(modname); | |
1538 } | |
1539 buf[i++] = offset & 0xff; | |
1540 buf[i++] = (offset >> 8) & 0xff; | |
1541 buf[i++] = (offset >> 16) & 0xff; | |
1542 buf[i++] = (offset >> 24) & 0xff; | |
1543 buf[i++] = len & 0xff; | |
1544 buf[i++] = (len >> 8) & 0xff; | |
1545 buf[i++] = (len >> 16) & 0xff; | |
1546 buf[i++] = (len >> 24) & 0xff; | |
8660 | 1547 gaim_debug_misc("oscar", "len + offset is invalid, " |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1548 "hashing request\n"); |
13592 | 1549 aim_sendmemblock(od, command->conn, offset, i, buf, AIM_SENDMEMBLOCK_FLAG_ISREQUEST); |
2086 | 1550 g_free(buf); |
1551 return 1; | |
1552 } | |
9625 | 1553 #endif |
2086 | 1554 |
1555 pos = g_new0(struct pieceofcrap, 1); | |
13592 | 1556 pos->gc = od->gc; |
1557 pos->conn = conn; | |
2086 | 1558 |
1559 pos->offset = offset; | |
1560 pos->len = len; | |
1561 pos->modname = modname ? g_strdup(modname) : NULL; | |
1562 | |
13592 | 1563 if (gaim_proxy_connect(pos->gc->account, "gaim.sourceforge.net", 80, straight_to_hell, pos) != 0) |
1564 { | |
4056 | 1565 char buf[256]; |
2086 | 1566 if (pos->modname) |
1567 g_free(pos->modname); | |
1568 g_free(pos); | |
13592 | 1569 g_snprintf(buf, sizeof(buf), _("You may be disconnected shortly. " |
1570 "Check %s for updates."), GAIM_WEBSITE); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1571 gaim_notify_warning(pos->gc, NULL, |
7422 | 1572 _("Gaim was unable to get a valid login hash."), |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
1573 buf); |
2086 | 1574 } |
1575 | |
1576 return 1; | |
1577 } | |
1578 | |
13592 | 1579 static int |
1580 gaim_parse_login(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) | |
1581 { | |
1582 GaimConnection *gc; | |
1583 GaimAccount *account; | |
13239 | 1584 ClientInfo info = CLIENTINFO_GAIM; |
7011 | 1585 va_list ap; |
1586 char *key; | |
2086 | 1587 |
13592 | 1588 gc = od->gc; |
1589 account = gaim_connection_get_account(gc); | |
1590 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1591 va_start(ap, fr); |
2086 | 1592 key = va_arg(ap, char *); |
1593 va_end(ap); | |
1594 | |
13592 | 1595 aim_send_login(od, conn, gaim_account_get_username(account), |
12049 | 1596 gaim_connection_get_password(gc), &info, key); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1597 |
7283 | 1598 gaim_connection_update_progress(gc, _("Password sent"), 2, OSCAR_CONNECT_STEPS); |
8341 | 1599 ck[2] = 0x6c; |
7282 | 1600 |
2086 | 1601 return 1; |
1602 } | |
1603 | |
13592 | 1604 static int |
1605 gaim_handle_redirect(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) | |
2086 | 1606 { |
13592 | 1607 GaimConnection *gc = od->gc; |
5575 | 1608 GaimAccount *account = gaim_connection_get_account(gc); |
13592 | 1609 char *host, *separator; |
2086 | 1610 int port; |
13592 | 1611 NewFlapConnectionData *new_conn_data; |
4821 | 1612 va_list ap; |
1613 struct aim_redirect_data *redir; | |
2086 | 1614 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1615 va_start(ap, fr); |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1616 redir = va_arg(ap, struct aim_redirect_data *); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1617 va_end(ap); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1618 |
13592 | 1619 port = gaim_account_get_int(account, "port", OSCAR_DEFAULT_LOGIN_PORT); |
1620 separator = strchr(redir->ip, ':'); | |
1621 if (separator != NULL) | |
1622 { | |
13595 | 1623 host = g_strndup(redir->ip, (int)separator - (int)redir->ip); |
13592 | 1624 port = atoi(separator + 1); |
1625 } | |
1626 else | |
1627 host = g_strdup(redir->ip); | |
1628 | |
1629 gaim_debug_info("oscar", "Connecting to FLAP server %s:%d of type 0x%04hx\n", | |
1630 host, port, redir->group); | |
1631 new_conn_data = g_new(NewFlapConnectionData, 1); | |
1632 new_conn_data->gc = gc; | |
1633 new_conn_data->conn = flap_connection_new(od, redir->group); | |
1634 new_conn_data->cookielen = redir->cookielen; | |
1635 new_conn_data->cookie = g_memdup(redir->cookie, redir->cookielen); | |
1636 if (new_conn_data->conn->type == SNAC_FAMILY_CHAT) | |
1637 { | |
1638 struct chat_connection *cc; | |
1639 cc = g_new0(struct chat_connection, 1); | |
1640 cc->conn = new_conn_data->conn; | |
1641 cc->gc = gc; | |
1642 cc->name = g_strdup(redir->chat.room); | |
1643 cc->exchange = redir->chat.exchange; | |
1644 cc->instance = redir->chat.instance; | |
1645 cc->show = extract_name(redir->chat.room); | |
1646 new_conn_data->data = cc; | |
1647 gaim_debug_info("oscar", "Connecting to chat room %s exchange %hu\n", cc->name, cc->exchange); | |
1648 } | |
13631 | 1649 else |
1650 { | |
1651 new_conn_data->data = NULL; | |
1652 } | |
13592 | 1653 |
1654 if (gaim_proxy_connect(account, host, port, connection_established_cb, new_conn_data) != 0) | |
1655 { | |
13608 | 1656 flap_connection_schedule_destroy(new_conn_data->conn, |
1657 OSCAR_DISCONNECT_COULD_NOT_CONNECT); | |
13592 | 1658 gaim_debug_error("oscar", "Unable to connect to FLAP server " |
1659 "of type 0x%04hx\n", redir->group); | |
1660 destroy_new_conn_data(new_conn_data); | |
1661 } | |
2086 | 1662 g_free(host); |
13592 | 1663 |
2086 | 1664 return 1; |
1665 } | |
1666 | |
13592 | 1667 static int gaim_parse_oncoming(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) |
10042 | 1668 { |
1669 GaimConnection *gc; | |
1670 GaimAccount *account; | |
11973 | 1671 GaimPresence *presence; |
4738 | 1672 struct buddyinfo *bi; |
2993 | 1673 time_t time_idle = 0, signon = 0; |
1674 int type = 0; | |
12349 | 1675 gboolean buddy_is_away = FALSE; |
1676 const char *status_id; | |
1677 gboolean have_status_message = FALSE; | |
1678 char *message = NULL; | |
2086 | 1679 va_list ap; |
4738 | 1680 aim_userinfo_t *info; |
10042 | 1681 |
13592 | 1682 gc = od->gc; |
10042 | 1683 account = gaim_connection_get_account(gc); |
11973 | 1684 presence = gaim_account_get_presence(account); |
4194 | 1685 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1686 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
1687 info = va_arg(ap, aim_userinfo_t *); |
2086 | 1688 va_end(ap); |
11973 | 1689 |
10130 | 1690 g_return_val_if_fail(info != NULL, 1); |
1691 g_return_val_if_fail(info->sn != NULL, 1); | |
1692 | |
4766 | 1693 if (info->present & AIM_USERINFO_PRESENT_FLAGS) { |
1694 if (info->flags & AIM_FLAG_AWAY) | |
11369 | 1695 buddy_is_away = TRUE; |
1696 } | |
2993 | 1697 if (info->present & AIM_USERINFO_PRESENT_ICQEXTSTATUS) { |
11510 | 1698 type = info->icqinfo.status; |
3013 | 1699 if (!(info->icqinfo.status & AIM_ICQ_STATE_CHAT) && |
1700 (info->icqinfo.status != AIM_ICQ_STATE_NORMAL)) { | |
10042 | 1701 buddy_is_away = TRUE; |
3013 | 1702 } |
2993 | 1703 } |
1704 | |
12349 | 1705 if (aim_sn_is_icq(info->sn)) { |
1706 if (type & AIM_ICQ_STATE_CHAT) | |
1707 status_id = OSCAR_STATUS_ID_FREE4CHAT; | |
1708 else if (type & AIM_ICQ_STATE_DND) | |
1709 status_id = OSCAR_STATUS_ID_DND; | |
1710 else if (type & AIM_ICQ_STATE_OUT) | |
1711 status_id = OSCAR_STATUS_ID_NA; | |
1712 else if (type & AIM_ICQ_STATE_BUSY) | |
1713 status_id = OSCAR_STATUS_ID_OCCUPIED; | |
1714 else if (type & AIM_ICQ_STATE_AWAY) | |
1715 status_id = OSCAR_STATUS_ID_AWAY; | |
1716 else if (type & AIM_ICQ_STATE_INVISIBLE) | |
1717 status_id = OSCAR_STATUS_ID_INVISIBLE; | |
1718 else | |
1719 status_id = OSCAR_STATUS_ID_AVAILABLE; | |
1720 } else { | |
12653 | 1721 if (buddy_is_away) |
12349 | 1722 status_id = OSCAR_STATUS_ID_AWAY; |
1723 else | |
1724 status_id = OSCAR_STATUS_ID_AVAILABLE; | |
1725 } | |
1726 | |
1727 /* | |
1728 * Handle the available message. If info->status is NULL then the user | |
1729 * may or may not have an available message, so don't do anything. If | |
1730 * info->status is set to the empty string, then the user's client DOES | |
1731 * support available messages and the user DOES NOT have one set. | |
1732 * Otherwise info->status contains the available message. | |
1733 */ | |
1734 if (info->status != NULL) | |
1735 { | |
1736 have_status_message = TRUE; | |
1737 if (info->status[0] != '\0') | |
1738 message = oscar_encoding_to_utf8(info->status_encoding, | |
1739 info->status, info->status_len); | |
1740 } | |
1741 | |
1742 if (have_status_message) | |
1743 { | |
1744 gaim_prpl_got_user_status(account, info->sn, status_id, | |
1745 "message", message, NULL); | |
1746 g_free(message); | |
1747 } | |
1748 else | |
1749 gaim_prpl_got_user_status(account, info->sn, status_id, NULL); | |
1750 | |
12350 | 1751 /* Login time stuff */ |
5836 | 1752 if (info->present & AIM_USERINFO_PRESENT_ONLINESINCE) |
1753 signon = info->onlinesince; | |
1754 else if (info->present & AIM_USERINFO_PRESENT_SESSIONLEN) | |
2993 | 1755 signon = time(NULL) - info->sessionlen; |
10567 | 1756 if (!aim_sncmp(gaim_account_get_username(account), info->sn)) { |
5575 | 1757 gaim_connection_set_display_name(gc, info->sn); |
11973 | 1758 od->timeoffset = signon - gaim_presence_get_login_time(presence); |
10567 | 1759 } |
12350 | 1760 gaim_prpl_got_user_login_time(account, info->sn, signon - od->timeoffset); |
1761 | |
1762 /* Idle time stuff */ | |
1763 /* info->idletime is the number of minutes that this user has been idle */ | |
1764 if (info->present & AIM_USERINFO_PRESENT_IDLE) | |
1765 time_idle = time(NULL) - info->idletime * 60; | |
1766 | |
1767 if (time_idle > 0) | |
1768 gaim_prpl_got_user_idle(account, info->sn, TRUE, time_idle); | |
1769 else | |
1770 gaim_prpl_got_user_idle(account, info->sn, FALSE, 0); | |
1771 | |
1772 /* Server stored icon stuff */ | |
9982 | 1773 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(account, info->sn)); |
4738 | 1774 if (!bi) { |
1775 bi = g_new0(struct buddyinfo, 1); | |
9982 | 1776 g_hash_table_insert(od->buddyinfo, g_strdup(gaim_normalize(account, info->sn)), bi); |
4738 | 1777 } |
4739 | 1778 bi->typingnot = FALSE; |
1779 bi->ico_informed = FALSE; | |
6857 | 1780 bi->ipaddr = info->icqinfo.ipaddr; |
1781 | |
4853 | 1782 if (info->iconcsumlen) { |
13654 | 1783 const char *filename, *saved_b16 = NULL; |
9801 | 1784 char *b16 = NULL, *filepath = NULL; |
7093 | 1785 GaimBuddy *b = NULL; |
4853 | 1786 |
7106
db6bd3e794d8
[gaim-migrate @ 7671]
Christian Hammond <chipx86@chipx86.com>
parents:
7098
diff
changeset
|
1787 b16 = gaim_base16_encode(info->iconcsum, info->iconcsumlen); |
9982 | 1788 b = gaim_find_buddy(account, info->sn); |
7093 | 1789 /* |
1790 * If for some reason the checksum is valid, but cached file is not.. | |
1791 * we want to know. | |
1792 */ | |
13654 | 1793 if (b != NULL) |
1794 filename = gaim_blist_node_get_string((GaimBlistNode*)b, "buddy_icon"); | |
1795 else | |
1796 filename = NULL; | |
7093 | 1797 if (filename != NULL) { |
1798 if (g_file_test(filename, G_FILE_TEST_EXISTS)) | |
7693 | 1799 saved_b16 = gaim_blist_node_get_string((GaimBlistNode*)b, |
1800 "icon_checksum"); | |
9801 | 1801 else { |
1802 filepath = g_build_filename(gaim_buddy_icons_get_cache_dir(), | |
1803 filename, NULL); | |
1804 if (g_file_test(filepath, G_FILE_TEST_EXISTS)) | |
1805 saved_b16 = gaim_blist_node_get_string((GaimBlistNode*)b, | |
1806 "icon_checksum"); | |
1807 g_free(filepath); | |
1808 } | |
7093 | 1809 } else |
1810 saved_b16 = NULL; | |
7054
7c04a0775918
[gaim-migrate @ 7617]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
7045
diff
changeset
|
1811 |
4853 | 1812 if (!b16 || !saved_b16 || strcmp(b16, saved_b16)) { |
1813 GSList *cur = od->requesticon; | |
1814 while (cur && aim_sncmp((char *)cur->data, info->sn)) | |
1815 cur = cur->next; | |
1816 if (!cur) { | |
9982 | 1817 od->requesticon = g_slist_append(od->requesticon, g_strdup(gaim_normalize(account, info->sn))); |
4853 | 1818 if (od->icontimer) |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
1819 gaim_timeout_remove(od->icontimer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
1820 od->icontimer = gaim_timeout_add(500, gaim_icon_timerfunc, gc); |
4853 | 1821 } |
1822 } | |
6053 | 1823 g_free(b16); |
4853 | 1824 } |
1825 | |
2086 | 1826 return 1; |
1827 } | |
1828 | |
8341 | 1829 static void gaim_check_comment(OscarData *od, const char *str) { |
11159 | 1830 if ((str == NULL) || strcmp(str, (const char *)ck)) |
13592 | 1831 aim_locate_setcaps(od, caps_aim); |
8341 | 1832 else |
13592 | 1833 aim_locate_setcaps(od, caps_aim | OSCAR_CAPABILITY_SECUREIM); |
1834 } | |
1835 | |
1836 static int gaim_parse_offgoing(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { | |
1837 GaimConnection *gc = od->gc; | |
9982 | 1838 GaimAccount *account = gaim_connection_get_account(gc); |
2086 | 1839 va_list ap; |
4739 | 1840 aim_userinfo_t *info; |
2086 | 1841 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1842 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
1843 info = va_arg(ap, aim_userinfo_t *); |
2086 | 1844 va_end(ap); |
1845 | |
12349 | 1846 gaim_prpl_got_user_status(account, info->sn, OSCAR_STATUS_ID_OFFLINE, NULL); |
2086 | 1847 |
7261 | 1848 g_hash_table_remove(od->buddyinfo, gaim_normalize(gc->account, info->sn)); |
5837 | 1849 |
2086 | 1850 return 1; |
1851 } | |
1852 | |
13592 | 1853 static int incomingim_chan1(OscarData *od, FlapConnection *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch1_args *args) { |
1854 GaimConnection *gc = od->gc; | |
8708 | 1855 GaimAccount *account = gaim_connection_get_account(gc); |
12216 | 1856 GaimMessageFlags flags = 0; |
4738 | 1857 struct buddyinfo *bi; |
11303
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11285
diff
changeset
|
1858 char *iconfile; |
9806 | 1859 GString *message; |
1860 gchar *tmp; | |
1861 aim_mpmsg_section_t *curpart; | |
12675 | 1862 const char *start; |
1863 GData *attribs; | |
9806 | 1864 |
11537 | 1865 gaim_debug_misc("oscar", "Received IM from %s with %d parts\n", |
9806 | 1866 userinfo->sn, args->mpmsg.numparts); |
4738 | 1867 |
10595 | 1868 if (args->mpmsg.numparts == 0) |
1869 return 1; | |
1870 | |
8708 | 1871 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(account, userinfo->sn)); |
4738 | 1872 if (!bi) { |
1873 bi = g_new0(struct buddyinfo, 1); | |
8708 | 1874 g_hash_table_insert(od->buddyinfo, g_strdup(gaim_normalize(account, userinfo->sn)), bi); |
4738 | 1875 } |
2273
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
1876 |
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
1877 if (args->icbmflags & AIM_IMFLAGS_AWAY) |
12216 | 1878 flags |= GAIM_MESSAGE_AUTO_RESP; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1879 |
4738 | 1880 if (args->icbmflags & AIM_IMFLAGS_TYPINGNOT) |
1881 bi->typingnot = TRUE; | |
1882 else | |
1883 bi->typingnot = FALSE; | |
1884 | |
4380 | 1885 if ((args->icbmflags & AIM_IMFLAGS_HASICON) && (args->iconlen) && (args->iconsum) && (args->iconstamp)) { |
13226 | 1886 gaim_debug_misc("oscar", "%s has an icon\n", userinfo->sn); |
4738 | 1887 if ((args->iconlen != bi->ico_len) || (args->iconsum != bi->ico_csum) || (args->iconstamp != bi->ico_time)) { |
1888 bi->ico_need = TRUE; | |
1889 bi->ico_len = args->iconlen; | |
1890 bi->ico_csum = args->iconsum; | |
1891 bi->ico_time = args->iconstamp; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1892 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1893 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1894 |
11303
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11285
diff
changeset
|
1895 iconfile = gaim_buddy_icons_get_full_path(gaim_account_get_buddy_icon(account)); |
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11285
diff
changeset
|
1896 if ((iconfile != NULL) && |
7406 | 1897 (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
|
1898 FILE *file; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1899 struct stat st; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1900 |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
1901 if (!g_stat(iconfile, &st)) { |
11159 | 1902 guchar *buf = g_malloc(st.st_size); |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
1903 file = g_fopen(iconfile, "rb"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1904 if (file) { |
9532 | 1905 /* XXX - Use g_file_get_contents() */ |
2603
24664768a739
[gaim-migrate @ 2616]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2597
diff
changeset
|
1906 int len = fread(buf, 1, st.st_size, file); |
8660 | 1907 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1908 "Sending buddy icon to %s (%d bytes, " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1909 "%lu reported)\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1910 userinfo->sn, len, st.st_size); |
13592 | 1911 aim_im_sendch2_icon(od, userinfo->sn, buf, st.st_size, |
4617 | 1912 st.st_mtime, aimutil_iconsum(buf, st.st_size)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1913 fclose(file); |
2336
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
1914 } else |
13226 | 1915 gaim_debug_error("oscar", "Can't open buddy icon file!\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1916 g_free(buf); |
2336
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
1917 } else |
13226 | 1918 gaim_debug_error("oscar", "Can't stat buddy icon file!\n"); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1919 } |
11303
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11285
diff
changeset
|
1920 g_free(iconfile); |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1921 |
9806 | 1922 message = g_string_new(""); |
1923 curpart = args->mpmsg.parts; | |
1924 while (curpart != NULL) { | |
11159 | 1925 tmp = gaim_plugin_oscar_decode_im_part(account, userinfo->sn, curpart->charset, |
12675 | 1926 curpart->charsubset, curpart->data, curpart->datalen); |
9806 | 1927 if (tmp != NULL) { |
1928 g_string_append(message, tmp); | |
1929 g_free(tmp); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1930 } |
9806 | 1931 |
1932 curpart = curpart->next; | |
1933 } | |
1934 tmp = g_string_free(message, FALSE); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1935 |
8666 | 1936 /* |
10781 | 1937 * If the message is from an ICQ user and to an ICQ user then escape any HTML, |
9016 | 1938 * because HTML is not sent over ICQ as a means to format a message. |
10781 | 1939 * So any HTML we receive is intended to be displayed. Also, \r\n must be |
1940 * replaced with <br> | |
8995 | 1941 * |
1942 * Note: There *may* be some clients which send messages as HTML formatted - | |
1943 * they need to be special-cased somehow. | |
8666 | 1944 */ |
9982 | 1945 if (aim_sn_is_icq(gaim_account_get_username(account)) && aim_sn_is_icq(userinfo->sn)) { |
8995 | 1946 /* being recevied by ICQ from ICQ - escape HTML so it is displayed as sent */ |
10732
c4cb90065e1d
[gaim-migrate @ 12334]
Luke Schierer <lschiere@pidgin.im>
parents:
10715
diff
changeset
|
1947 gchar *tmp2 = g_markup_escape_text(tmp, -1); |
8493 | 1948 g_free(tmp); |
1949 tmp = tmp2; | |
10783 | 1950 tmp2 = gaim_strreplace(tmp, "\r\n", "<br>"); |
10781 | 1951 g_free(tmp); |
1952 tmp = tmp2; | |
8493 | 1953 } |
1954 | |
12675 | 1955 /* |
1956 * Convert iChat color tags to normal font tags. | |
1957 */ | |
13600 | 1958 if (gaim_markup_find_tag("body", tmp, &start, NULL, &attribs)) |
12675 | 1959 { |
1960 const char *ichattextcolor, *ichatballooncolor; | |
1961 | |
1962 ichattextcolor = g_datalist_get_data(&attribs, "ichattextcolor"); | |
1963 if (ichattextcolor != NULL) | |
1964 { | |
1965 gchar *tmp2; | |
1966 tmp2 = g_strdup_printf("<font color=\"%s\">%s</font>", ichattextcolor, tmp); | |
1967 g_free(tmp); | |
1968 tmp = tmp2; | |
1969 } | |
1970 | |
1971 ichatballooncolor = g_datalist_get_data(&attribs, "ichatballooncolor"); | |
1972 if (ichatballooncolor != NULL) | |
1973 { | |
1974 gchar *tmp2; | |
1975 tmp2 = g_strdup_printf("<font back=\"%s\">%s</font>", ichatballooncolor, tmp); | |
1976 g_free(tmp); | |
1977 tmp = tmp2; | |
1978 } | |
1979 | |
1980 g_datalist_clear(&attribs); | |
1981 } | |
1982 | |
6982 | 1983 serv_got_im(gc, userinfo->sn, tmp, flags, time(NULL)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1984 g_free(tmp); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1985 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1986 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1987 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1988 |
13592 | 1989 static int |
1990 incomingim_chan2(OscarData *od, FlapConnection *conn, aim_userinfo_t *userinfo, IcbmArgsCh2 *args) | |
1991 { | |
9070 | 1992 GaimConnection *gc; |
9933 | 1993 GaimAccount *account; |
1994 const char *username = NULL; | |
1995 char *message = NULL; | |
9070 | 1996 |
13592 | 1997 g_return_val_if_fail(od != NULL, 0); |
1998 g_return_val_if_fail(od->gc != NULL, 0); | |
1999 | |
2000 gc = od->gc; | |
9933 | 2001 account = gaim_connection_get_account(gc); |
9070 | 2002 od = gc->proto_data; |
9933 | 2003 username = gaim_account_get_username(account); |
2004 | |
2005 if (args == NULL) | |
4121 | 2006 return 0; |
4194 | 2007 |
13592 | 2008 gaim_debug_misc("oscar", "Incoming rendezvous message of type %u, " |
2009 "user %s, status %hu\n", args->type, userinfo->sn, args->status); | |
9933 | 2010 |
2011 if (args->msg != NULL) | |
2012 { | |
2013 if (args->encoding != NULL) | |
2014 { | |
2015 char *encoding = NULL; | |
2016 encoding = oscar_encoding_extract(args->encoding); | |
2017 message = oscar_encoding_to_utf8(encoding, args->msg, args->msglen); | |
2018 g_free(encoding); | |
2019 } else { | |
2020 if (g_utf8_validate(args->msg, args->msglen, NULL)) | |
2021 message = g_strdup(args->msg); | |
2022 } | |
2023 } | |
2869 | 2024 |
13592 | 2025 if (args->type & OSCAR_CAPABILITY_CHAT) |
2026 { | |
4121 | 2027 char *name; |
5234 | 2028 GHashTable *components; |
2029 | |
9933 | 2030 if (!args->info.chat.roominfo.name || !args->info.chat.roominfo.exchange) { |
2031 g_free(message); | |
4121 | 2032 return 1; |
9933 | 2033 } |
5234 | 2034 components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, |
2035 g_free); | |
4121 | 2036 name = extract_name(args->info.chat.roominfo.name); |
13592 | 2037 g_hash_table_replace(components, g_strdup("room"), |
2038 g_strdup(name ? name : args->info.chat.roominfo.name)); | |
2039 g_hash_table_replace(components, g_strdup("exchange"), | |
2040 g_strdup_printf("%d", args->info.chat.roominfo.exchange)); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2041 serv_got_chat_invite(gc, |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2042 name ? name : args->info.chat.roominfo.name, |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2043 userinfo->sn, |
9933 | 2044 message, |
5234 | 2045 components); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2046 if (name) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2047 g_free(name); |
13592 | 2048 } |
2049 | |
2050 else if ((args->type & OSCAR_CAPABILITY_SENDFILE) || | |
2051 (args->type & OSCAR_CAPABILITY_DIRECTIM)) | |
2052 { | |
2053 if (args->status == AIM_RENDEZVOUS_PROPOSE) | |
2054 { | |
2055 peer_connection_got_proposition(od, userinfo->sn, message, args); | |
2056 } | |
2057 else if (args->status == AIM_RENDEZVOUS_CANCEL) | |
2058 { | |
2059 /* The other user canceled a peer request */ | |
2060 PeerConnection *conn; | |
2061 | |
2062 conn = peer_connection_find_by_cookie(od, userinfo->sn, args->cookie); | |
2063 /* | |
2064 * If conn is NULL it means we haven't tried to create | |
2065 * a connection with that user. They may be trying to | |
2066 * do something malicious. | |
2067 */ | |
2068 if (conn != NULL) | |
2069 { | |
13608 | 2070 peer_connection_destroy(conn, OSCAR_DISCONNECT_REMOTE_CLOSED); |
11369 | 2071 } |
13592 | 2072 } |
2073 else if (args->status == AIM_RENDEZVOUS_CONNECTED) | |
2074 { | |
2075 /* Remote user has accepted our peer request */ | |
2076 PeerConnection *conn; | |
2077 | |
2078 conn = peer_connection_find_by_cookie(od, userinfo->sn, args->cookie); | |
2079 /* | |
2080 * If conn is NULL it means we haven't tried to create | |
2081 * a connection with that user. They may be trying to | |
2082 * do something malicious. | |
2083 */ | |
2084 if (conn != NULL) | |
2085 { | |
2086 if (conn->listenerfd != -1) | |
11369 | 2087 { |
13592 | 2088 /* |
2089 * If they are connecting directly to us then | |
2090 * continue the peer negotiation by | |
2091 * accepting connections on our listener port. | |
2092 */ | |
2093 conn->watcher_incoming = gaim_input_add(conn->listenerfd, | |
2094 GAIM_INPUT_READ, peer_connection_listen_cb, conn); | |
11369 | 2095 } |
2096 } | |
3630 | 2097 } |
13592 | 2098 } |
2099 | |
2100 else if (args->type & OSCAR_CAPABILITY_GETFILE) | |
2101 { | |
2102 } | |
2103 | |
2104 else if (args->type & OSCAR_CAPABILITY_TALK) | |
2105 { | |
2106 } | |
2107 | |
2108 else if (args->type & OSCAR_CAPABILITY_BUDDYICON) | |
2109 { | |
9933 | 2110 gaim_buddy_icons_set_for_user(account, userinfo->sn, |
2111 args->info.icon.icon, | |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
2112 args->info.icon.length); |
13592 | 2113 } |
2114 | |
2115 else if (args->type & OSCAR_CAPABILITY_ICQSERVERRELAY) | |
2116 { | |
2117 gaim_debug_error("oscar", "Got an ICQ Server Relay message of " | |
2118 "type %d\n", args->info.rtfmsg.msgtype); | |
2119 } | |
2120 | |
2121 else | |
2122 { | |
2123 gaim_debug_error("oscar", "Unknown request class %hu\n", | |
2124 args->type); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2125 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2126 |
9933 | 2127 g_free(message); |
2128 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2129 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2130 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2131 |
3453 | 2132 /* |
4230 | 2133 * Authorization Functions |
13226 | 2134 * Most of these are callbacks from dialogs. They're used by both |
4230 | 2135 * methods of authorization (SSI and old-school channel 4 ICBM) |
3453 | 2136 */ |
4269 | 2137 /* When you ask other people for authorization */ |
13592 | 2138 static void |
2139 gaim_auth_request(struct name_data *data, char *msg) | |
2140 { | |
13654 | 2141 GaimConnection *gc; |
2142 OscarData *od; | |
2143 GaimBuddy *buddy; | |
2144 GaimGroup *group; | |
2145 | |
2146 gc = data->gc; | |
2147 od = gc->proto_data; | |
2148 buddy = gaim_find_buddy(gaim_connection_get_account(gc), data->name); | |
2149 if (buddy != NULL) | |
2150 group = gaim_buddy_get_group(buddy); | |
2151 else | |
2152 group = NULL; | |
2153 | |
2154 if (group != NULL) | |
2155 { | |
2156 gaim_debug_info("oscar", "ssi: adding buddy %s to group %s\n", | |
2157 buddy->name, group->name); | |
2158 aim_ssi_sendauthrequest(od, data->name, msg ? msg : _("Please authorize me so I can add you to my buddy list.")); | |
2159 if (!aim_ssi_itemlist_finditem(od->ssi.local, group->name, buddy->name, AIM_SSI_TYPE_BUDDY)) | |
2160 aim_ssi_addbuddy(od, buddy->name, group->name, gaim_buddy_get_alias_only(buddy), NULL, NULL, 1); | |
4230 | 2161 } |
4337 | 2162 } |
2163 | |
13592 | 2164 static void |
2165 gaim_auth_request_msgprompt(struct name_data *data) | |
2166 { | |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2167 gaim_request_input(data->gc, NULL, _("Authorization Request Message:"), |
8697 | 2168 NULL, _("Please authorize me!"), TRUE, FALSE, NULL, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2169 _("OK"), G_CALLBACK(gaim_auth_request), |
5836 | 2170 _("Cancel"), G_CALLBACK(oscar_free_name_data), |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2171 data); |
4230 | 2172 } |
2173 | |
13592 | 2174 static void |
2175 gaim_auth_dontrequest(struct name_data *data) | |
2176 { | |
5575 | 2177 GaimConnection *gc = data->gc; |
4244 | 2178 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2179 if (g_list_find(gaim_connections_get_all(), gc)) { |
8151 | 2180 /* Remove from local list */ |
2181 GaimBuddy *b = gaim_find_buddy(gaim_connection_get_account(gc), data->name); | |
2182 gaim_blist_remove_buddy(b); | |
4244 | 2183 } |
2184 | |
5836 | 2185 oscar_free_name_data(data); |
4230 | 2186 } |
2187 | |
9030 | 2188 |
13592 | 2189 static void |
2190 gaim_auth_sendrequest(GaimConnection *gc, char *name) | |
2191 { | |
13262 | 2192 struct name_data *data = g_new0(struct name_data, 1); |
6695 | 2193 GaimBuddy *buddy; |
4269 | 2194 gchar *dialog_msg, *nombre; |
2195 | |
4687 | 2196 buddy = gaim_find_buddy(gc->account, name); |
9620 | 2197 if (buddy && (gaim_buddy_get_alias_only(buddy))) |
2198 nombre = g_strdup_printf("%s (%s)", name, gaim_buddy_get_alias_only(buddy)); | |
4269 | 2199 else |
4830 | 2200 nombre = NULL; |
2201 | |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
2202 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 | 2203 data->gc = gc; |
2204 data->name = g_strdup(name); | |
2205 data->nick = NULL; | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2206 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2207 gaim_request_action(gc, NULL, _("Request Authorization"), dialog_msg, |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2208 0, data, 2, |
12603
e4e47871c373
[gaim-migrate @ 14938]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
2209 _("_Request Authorization"), |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2210 G_CALLBACK(gaim_auth_request_msgprompt), |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2211 _("Cancel"), G_CALLBACK(gaim_auth_dontrequest)); |
4269 | 2212 |
2213 g_free(dialog_msg); | |
2214 g_free(nombre); | |
2215 } | |
2216 | |
9030 | 2217 |
13592 | 2218 static void |
2219 gaim_auth_sendrequest_menu(GaimBlistNode *node, gpointer ignored) | |
2220 { | |
9030 | 2221 GaimBuddy *buddy; |
2222 GaimConnection *gc; | |
2223 | |
2224 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); | |
2225 | |
2226 buddy = (GaimBuddy *) node; | |
2227 gc = gaim_account_get_connection(buddy->account); | |
2228 gaim_auth_sendrequest(gc, buddy->name); | |
2229 } | |
2230 | |
4230 | 2231 /* When other people ask you for authorization */ |
13592 | 2232 static void |
2233 gaim_auth_grant(struct name_data *data) | |
2234 { | |
5575 | 2235 GaimConnection *gc = data->gc; |
4244 | 2236 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2237 if (g_list_find(gaim_connections_get_all(), gc)) { |
7283 | 2238 OscarData *od = gc->proto_data; |
13592 | 2239 aim_ssi_sendauthreply(od, data->name, 0x01, NULL); |
4244 | 2240 } |
2241 | |
5836 | 2242 oscar_free_name_data(data); |
3141 | 2243 } |
2244 | |
4230 | 2245 /* When other people ask you for authorization */ |
13592 | 2246 static void |
2247 gaim_auth_dontgrant(struct name_data *data, char *msg) | |
2248 { | |
5575 | 2249 GaimConnection *gc = data->gc; |
4244 | 2250 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2251 if (g_list_find(gaim_connections_get_all(), gc)) { |
7283 | 2252 OscarData *od = gc->proto_data; |
13592 | 2253 aim_ssi_sendauthreply(od, data->name, 0x00, msg ? msg : _("No reason given.")); |
2254 } | |
2255 } | |
2256 | |
2257 static void | |
2258 gaim_auth_dontgrant_msgprompt(struct name_data *data) | |
2259 { | |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2260 gaim_request_input(data->gc, NULL, _("Authorization Denied Message:"), |
8697 | 2261 NULL, _("No reason given."), TRUE, FALSE, NULL, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2262 _("OK"), G_CALLBACK(gaim_auth_dontgrant), |
5836 | 2263 _("Cancel"), G_CALLBACK(oscar_free_name_data), |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
2264 data); |
3141 | 2265 } |
2266 | |
7023 | 2267 /* When someone sends you buddies */ |
13592 | 2268 static void |
2269 gaim_icq_buddyadd(struct name_data *data) | |
2270 { | |
5575 | 2271 GaimConnection *gc = data->gc; |
4244 | 2272 |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5579
diff
changeset
|
2273 if (g_list_find(gaim_connections_get_all(), gc)) { |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7054
diff
changeset
|
2274 gaim_blist_request_add_buddy(gaim_connection_get_account(gc), data->name, NULL, data->nick); |
4244 | 2275 } |
2276 | |
5836 | 2277 oscar_free_name_data(data); |
3453 | 2278 } |
2279 | |
13592 | 2280 static int |
2281 incomingim_chan4(OscarData *od, FlapConnection *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch4_args *args, time_t t) | |
2282 { | |
2283 GaimConnection *gc = od->gc; | |
9908 | 2284 GaimAccount *account = gaim_connection_get_account(gc); |
4076 | 2285 gchar **msg1, **msg2; |
6051 | 2286 int i, numtoks; |
4076 | 2287 |
4121 | 2288 if (!args->type || !args->msg || !args->uin) |
2289 return 1; | |
4194 | 2290 |
8660 | 2291 gaim_debug_info("oscar", |
13592 | 2292 "Received a channel 4 message of type 0x%02hx.\n", |
9908 | 2293 args->type); |
4076 | 2294 |
9919 | 2295 /* |
2296 * Split up the message at the delimeter character, then convert each | |
2297 * string to UTF-8. Unless, of course, this is a type 1 message. If | |
2298 * this is a type 1 message, then the delimiter 0xfe could be a valid | |
2299 * character in whatever encoding the message was sent in. Type 1 | |
2300 * messages are always made up of only one part, so we can easily account | |
2301 * for this suck-ass part of the protocol by splitting the string into at | |
2302 * most 1 baby string. | |
2303 */ | |
2304 msg1 = g_strsplit(args->msg, "\376", (args->type == 0x01 ? 1 : 0)); | |
6051 | 2305 for (numtoks=0; msg1[numtoks]; numtoks++); |
2306 msg2 = (gchar **)g_malloc((numtoks+1)*sizeof(gchar *)); | |
4076 | 2307 for (i=0; msg1[i]; i++) { |
11920 | 2308 gaim_str_strip_char(msg1[i], '\r'); |
9908 | 2309 msg2[i] = gaim_plugin_oscar_decode_im_part(account, "1", AIM_CHARSET_ASCII, 0x0000, msg1[i], strlen(msg1[i])); |
4076 | 2310 } |
2311 msg2[i] = NULL; | |
2312 | |
3952 | 2313 switch (args->type) { |
4173 | 2314 case 0x01: { /* MacICQ message or basic offline message */ |
4076 | 2315 if (i >= 1) { |
5556 | 2316 gchar *uin = g_strdup_printf("%u", args->uin); |
8493 | 2317 gchar *tmp; |
2318 | |
2319 /* If the message came from an ICQ user then escape any HTML */ | |
10732
c4cb90065e1d
[gaim-migrate @ 12334]
Luke Schierer <lschiere@pidgin.im>
parents:
10715
diff
changeset
|
2320 tmp = g_markup_escape_text(msg2[0], -1); |
8493 | 2321 |
4076 | 2322 if (t) { /* This is an offline message */ |
9680 | 2323 /* The timestamp is UTC-ish, so we need to get the offset */ |
9698 | 2324 #ifdef HAVE_TM_GMTOFF |
9724 | 2325 time_t now; |
2326 struct tm *tm; | |
2327 now = time(NULL); | |
2328 tm = localtime(&now); | |
2329 t += tm->tm_gmtoff; | |
9698 | 2330 #else |
2331 # ifdef HAVE_TIMEZONE | |
9680 | 2332 tzset(); |
2333 t -= timezone; | |
9698 | 2334 # endif |
2335 #endif | |
8514 | 2336 serv_got_im(gc, uin, tmp, 0, t); |
4076 | 2337 } else { /* This is a message from MacICQ/Miranda */ |
8514 | 2338 serv_got_im(gc, uin, tmp, 0, time(NULL)); |
4076 | 2339 } |
2340 g_free(uin); | |
8493 | 2341 g_free(tmp); |
4075 | 2342 } |
3316 | 2343 } break; |
2344 | |
4173 | 2345 case 0x04: { /* Someone sent you a URL */ |
4076 | 2346 if (i >= 2) { |
7385 | 2347 if (msg2[1] != NULL) { |
2348 gchar *uin = g_strdup_printf("%u", args->uin); | |
2349 gchar *message = g_strdup_printf("<A HREF=\"%s\">%s</A>", | |
2350 msg2[1], | |
2351 (msg2[0] && msg2[0][0]) ? msg2[0] : msg2[1]); | |
2352 serv_got_im(gc, uin, message, 0, time(NULL)); | |
2353 g_free(uin); | |
2354 g_free(message); | |
2355 } | |
3453 | 2356 } |
2357 } break; | |
2358 | |
4173 | 2359 case 0x06: { /* Someone requested authorization */ |
4076 | 2360 if (i >= 6) { |
4230 | 2361 struct name_data *data = g_new(struct name_data, 1); |
11102
eac408c8900f
[gaim-migrate @ 13142]
Richard Laager <rlaager@wiktel.com>
parents:
11084
diff
changeset
|
2362 gchar *sn = g_strdup_printf("%u", args->uin); |
eac408c8900f
[gaim-migrate @ 13142]
Richard Laager <rlaager@wiktel.com>
parents:
11084
diff
changeset
|
2363 gchar *reason; |
eac408c8900f
[gaim-migrate @ 13142]
Richard Laager <rlaager@wiktel.com>
parents:
11084
diff
changeset
|
2364 gchar *dialog_msg; |
eac408c8900f
[gaim-migrate @ 13142]
Richard Laager <rlaager@wiktel.com>
parents:
11084
diff
changeset
|
2365 |
eac408c8900f
[gaim-migrate @ 13142]
Richard Laager <rlaager@wiktel.com>
parents:
11084
diff
changeset
|
2366 if (msg2[5] != NULL) |
eac408c8900f
[gaim-migrate @ 13142]
Richard Laager <rlaager@wiktel.com>
parents:
11084
diff
changeset
|
2367 reason = gaim_plugin_oscar_decode_im_part(account, sn, AIM_CHARSET_CUSTOM, 0x0000, msg2[5], strlen(msg2[5])); |
eac408c8900f
[gaim-migrate @ 13142]
Richard Laager <rlaager@wiktel.com>
parents:
11084
diff
changeset
|
2368 else |
eac408c8900f
[gaim-migrate @ 13142]
Richard Laager <rlaager@wiktel.com>
parents:
11084
diff
changeset
|
2369 reason = g_strdup(_("No reason given.")); |
eac408c8900f
[gaim-migrate @ 13142]
Richard Laager <rlaager@wiktel.com>
parents:
11084
diff
changeset
|
2370 |
11369 | 2371 dialog_msg = g_strdup_printf(_("The user %u wants to add %s to their buddy list for the following reason:\n%s"), |
2372 args->uin, gaim_account_get_username(gc->account), reason); | |
11102
eac408c8900f
[gaim-migrate @ 13142]
Richard Laager <rlaager@wiktel.com>
parents:
11084
diff
changeset
|
2373 g_free(reason); |
8660 | 2374 gaim_debug_info("oscar", |
5556 | 2375 "Received an authorization request from UIN %u\n", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2376 args->uin); |
4076 | 2377 data->gc = gc; |
11102
eac408c8900f
[gaim-migrate @ 13142]
Richard Laager <rlaager@wiktel.com>
parents:
11084
diff
changeset
|
2378 data->name = sn; |
4230 | 2379 data->nick = NULL; |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2380 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2381 gaim_request_action(gc, NULL, _("Authorization Request"), |
9948 | 2382 dialog_msg, GAIM_DEFAULT_ACTION_NONE, data, |
12603
e4e47871c373
[gaim-migrate @ 14938]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
2383 2, _("_Authorize"), |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2384 G_CALLBACK(gaim_auth_grant), |
12603
e4e47871c373
[gaim-migrate @ 14938]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
2385 _("_Deny"), |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2386 G_CALLBACK(gaim_auth_dontgrant_msgprompt)); |
4076 | 2387 g_free(dialog_msg); |
2388 } | |
3141 | 2389 } break; |
2390 | |
4173 | 2391 case 0x07: { /* Someone has denied you authorization */ |
4076 | 2392 if (i >= 1) { |
7023 | 2393 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
|
2394 gaim_notify_info(gc, NULL, _("ICQ authorization denied."), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2395 dialog_msg); |
4076 | 2396 g_free(dialog_msg); |
2397 } | |
3141 | 2398 } break; |
2399 | |
4173 | 2400 case 0x08: { /* Someone has granted you authorization */ |
7023 | 2401 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
|
2402 gaim_notify_info(gc, NULL, "ICQ authorization accepted.", |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2403 dialog_msg); |
3141 | 2404 g_free(dialog_msg); |
2405 } break; | |
2406 | |
4333 | 2407 case 0x09: { /* Message from the Godly ICQ server itself, I think */ |
2408 if (i >= 5) { | |
2409 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
|
2410 gaim_notify_info(gc, NULL, "ICQ Server Message", dialog_msg); |
4333 | 2411 g_free(dialog_msg); |
2412 } | |
2413 } break; | |
2414 | |
4173 | 2415 case 0x0d: { /* Someone has sent you a pager message from http://www.icq.com/your_uin */ |
4076 | 2416 if (i >= 6) { |
4194 | 2417 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
|
2418 gaim_notify_info(gc, NULL, "ICQ Page", dialog_msg); |
4076 | 2419 g_free(dialog_msg); |
2420 } | |
4075 | 2421 } break; |
2422 | |
4173 | 2423 case 0x0e: { /* Someone has emailed you at your_uin@pager.icq.com */ |
4076 | 2424 if (i >= 6) { |
13545
cfc2f7fcb3dd
[gaim-migrate @ 15922]
Richard Laager <rlaager@wiktel.com>
parents:
13477
diff
changeset
|
2425 gchar *dialog_msg = g_strdup_printf(_("You have received an ICQ e-mail from %s [%s]\n\nMessage is:\n%s"), msg2[0], msg2[3], msg2[5]); |
cfc2f7fcb3dd
[gaim-migrate @ 15922]
Richard Laager <rlaager@wiktel.com>
parents:
13477
diff
changeset
|
2426 gaim_notify_info(gc, NULL, "ICQ E-Mail", dialog_msg); |
4076 | 2427 g_free(dialog_msg); |
2428 } | |
4075 | 2429 } break; |
2430 | |
4173 | 2431 case 0x12: { |
3141 | 2432 /* Ack for authorizing/denying someone. Or possibly an ack for sending any system notice */ |
7023 | 2433 /* Someone added you to their buddy list? */ |
3141 | 2434 } break; |
2435 | |
7023 | 2436 case 0x13: { /* Someone has sent you some ICQ buddies */ |
7631 | 2437 guint i, num; |
3453 | 2438 gchar **text; |
4173 | 2439 text = g_strsplit(args->msg, "\376", 0); |
3453 | 2440 if (text) { |
2441 num = 0; | |
2442 for (i=0; i<strlen(text[0]); i++) | |
2443 num = num*10 + text[0][i]-48; | |
2444 for (i=0; i<num; i++) { | |
4230 | 2445 struct name_data *data = g_new(struct name_data, 1); |
7023 | 2446 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 | 2447 data->gc = gc; |
4790 | 2448 data->name = g_strdup(text[i*2+1]); |
2449 data->nick = g_strdup(text[i*2+2]); | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2450 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
2451 gaim_request_action(gc, NULL, message, |
7023 | 2452 _("Do you want to add this buddy " |
2453 "to your buddy list?"), | |
9972 | 2454 GAIM_DEFAULT_ACTION_NONE, data, 2, |
7023 | 2455 _("Add"), G_CALLBACK(gaim_icq_buddyadd), |
12603
e4e47871c373
[gaim-migrate @ 14938]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
2456 _("_Decline"), G_CALLBACK(oscar_free_name_data)); |
3453 | 2457 g_free(message); |
2458 } | |
2459 g_strfreev(text); | |
2460 } | |
2461 } break; | |
2462 | |
7023 | 2463 case 0x1a: { /* Someone has sent you a greeting card or requested buddies? */ |
3453 | 2464 /* This is boring and silly. */ |
2465 } break; | |
2466 | |
3141 | 2467 default: { |
8660 | 2468 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2469 "Received a channel 4 message of unknown type " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2470 "(type 0x%02hhx).\n", args->type); |
3141 | 2471 } break; |
2472 } | |
2473 | |
4076 | 2474 g_strfreev(msg1); |
2475 g_strfreev(msg2); | |
2476 | |
3141 | 2477 return 1; |
2478 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2479 |
13592 | 2480 static int gaim_parse_incoming_im(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
13234 | 2481 guint16 channel; |
4200 | 2482 int ret = 0; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2483 aim_userinfo_t *userinfo; |
2086 | 2484 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2485 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2486 va_start(ap, fr); |
13234 | 2487 channel = (guint16)va_arg(ap, unsigned int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2488 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 2489 |
3141 | 2490 switch (channel) { |
2491 case 1: { /* standard message */ | |
2492 struct aim_incomingim_ch1_args *args; | |
2493 args = va_arg(ap, struct aim_incomingim_ch1_args *); | |
13592 | 2494 ret = incomingim_chan1(od, conn, userinfo, args); |
3141 | 2495 } break; |
2496 | |
8735
92cbf9713795
[gaim-migrate @ 9490]
Christian Hammond <chipx86@chipx86.com>
parents:
8733
diff
changeset
|
2497 case 2: { /* rendezvous */ |
13592 | 2498 IcbmArgsCh2 *args; |
2499 args = va_arg(ap, IcbmArgsCh2 *); | |
2500 ret = incomingim_chan2(od, conn, userinfo, args); | |
3141 | 2501 } break; |
2502 | |
2503 case 4: { /* ICQ */ | |
2504 struct aim_incomingim_ch4_args *args; | |
2505 args = va_arg(ap, struct aim_incomingim_ch4_args *); | |
13592 | 2506 ret = incomingim_chan4(od, conn, userinfo, args, 0); |
3141 | 2507 } break; |
2508 | |
2509 default: { | |
8660 | 2510 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2511 "ICBM received on unsupported channel (channel " |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2512 "0x%04hx).", channel); |
3141 | 2513 } break; |
2086 | 2514 } |
2515 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2516 va_end(ap); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2517 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2518 return ret; |
2086 | 2519 } |
2520 | |
13592 | 2521 static int gaim_parse_misses(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
2522 GaimConnection *gc = od->gc; | |
8733 | 2523 GaimAccount *account = gaim_connection_get_account(gc); |
5420 | 2524 char *buf; |
2086 | 2525 va_list ap; |
13234 | 2526 guint16 chan, nummissed, reason; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2527 aim_userinfo_t *userinfo; |
2086 | 2528 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2529 va_start(ap, fr); |
13234 | 2530 chan = (guint16)va_arg(ap, unsigned int); |
4200 | 2531 userinfo = va_arg(ap, aim_userinfo_t *); |
13234 | 2532 nummissed = (guint16)va_arg(ap, unsigned int); |
2533 reason = (guint16)va_arg(ap, unsigned int); | |
2086 | 2534 va_end(ap); |
2535 | |
2536 switch(reason) { | |
5420 | 2537 case 0: /* Invalid (0) */ |
2538 buf = g_strdup_printf( | |
2539 ngettext( | |
4276 | 2540 "You missed %hu message from %s because it was invalid.", |
2541 "You missed %hu messages from %s because they were invalid.", | |
2542 nummissed), | |
4282 | 2543 nummissed, |
2544 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2545 break; |
5420 | 2546 case 1: /* Message too large */ |
2547 buf = g_strdup_printf( | |
2548 ngettext( | |
4276 | 2549 "You missed %hu message from %s because it was too large.", |
2550 "You missed %hu messages from %s because they were too large.", | |
2551 nummissed), | |
4282 | 2552 nummissed, |
2553 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2554 break; |
5420 | 2555 case 2: /* Rate exceeded */ |
2556 buf = g_strdup_printf( | |
2557 ngettext( | |
4276 | 2558 "You missed %hu message from %s because the rate limit has been exceeded.", |
2559 "You missed %hu messages from %s because the rate limit has been exceeded.", | |
2560 nummissed), | |
4282 | 2561 nummissed, |
2562 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2563 break; |
5420 | 2564 case 3: /* Evil Sender */ |
2565 buf = g_strdup_printf( | |
2566 ngettext( | |
4276 | 2567 "You missed %hu message from %s because he/she was too evil.", |
2568 "You missed %hu messages from %s because he/she was too evil.", | |
2569 nummissed), | |
4282 | 2570 nummissed, |
2571 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2572 break; |
5420 | 2573 case 4: /* Evil Receiver */ |
2574 buf = g_strdup_printf( | |
2575 ngettext( | |
4276 | 2576 "You missed %hu message from %s because you are too evil.", |
2577 "You missed %hu messages from %s because you are too evil.", | |
2578 nummissed), | |
4282 | 2579 nummissed, |
2580 userinfo->sn); | |
2086 | 2581 break; |
2582 default: | |
5420 | 2583 buf = g_strdup_printf( |
2584 ngettext( | |
4276 | 2585 "You missed %hu message from %s for an unknown reason.", |
2586 "You missed %hu messages from %s for an unknown reason.", | |
2587 nummissed), | |
4282 | 2588 nummissed, |
2589 userinfo->sn); | |
2086 | 2590 break; |
2591 } | |
8733 | 2592 |
9627 | 2593 if (!gaim_conv_present_error(userinfo->sn, account, buf)) |
13592 | 2594 gaim_notify_error(od->gc, NULL, buf, NULL); |
5420 | 2595 g_free(buf); |
2086 | 2596 |
2597 return 1; | |
2598 } | |
2599 | |
13592 | 2600 static int |
2601 gaim_parse_clientauto_ch2(OscarData *od, const char *who, guint16 reason, const guchar *cookie) | |
2602 { | |
2603 if (reason == 0x0003) | |
2604 { | |
2605 /* Rendezvous was refused. */ | |
2606 PeerConnection *conn; | |
2607 | |
2608 conn = peer_connection_find_by_cookie(od, who, cookie); | |
2609 | |
2610 if (conn == NULL) | |
2611 { | |
2612 gaim_debug_info("oscar", "Received a rendezvous cancel message " | |
2613 "for a nonexistant connection from %s.\n", who); | |
4151 | 2614 } |
13592 | 2615 else |
2616 { | |
13608 | 2617 peer_connection_destroy(conn, OSCAR_DISCONNECT_REMOTE_REFUSED); |
13592 | 2618 } |
2619 } | |
2620 else | |
2621 { | |
2622 gaim_debug_warning("oscar", "Received an unknown rendezvous " | |
2623 "message from %s. Type 0x%04hx\n", who, reason); | |
3630 | 2624 } |
2625 | |
2626 return 0; | |
2627 } | |
2628 | |
13592 | 2629 static int gaim_parse_clientauto_ch4(OscarData *od, char *who, guint16 reason, guint32 state, char *msg) { |
2630 GaimConnection *gc = od->gc; | |
4151 | 2631 |
2632 switch(reason) { | |
2633 case 0x0003: { /* Reply from an ICQ status message request */ | |
9244 | 2634 char *title, *statusmsg, **splitmsg, *dialogmsg; |
2635 | |
2636 title = g_strdup_printf(_("Info for %s"), who); | |
4151 | 2637 |
2638 /* Split at (carriage return/newline)'s, then rejoin later with BRs between. */ | |
9244 | 2639 statusmsg = oscar_icqstatus(state); |
4151 | 2640 splitmsg = g_strsplit(msg, "\r\n", 0); |
9244 | 2641 dialogmsg = g_strdup_printf(_("<B>UIN:</B> %s<BR><B>Status:</B> %s<HR>%s"), who, statusmsg, g_strjoinv("<BR>", splitmsg)); |
2642 g_free(statusmsg); | |
4151 | 2643 g_strfreev(splitmsg); |
9244 | 2644 |
11533
c9b815aeddc1
[gaim-migrate @ 13782]
Richard Laager <rlaager@wiktel.com>
parents:
11532
diff
changeset
|
2645 gaim_notify_userinfo(gc, who, dialogmsg, NULL, NULL); |
9244 | 2646 |
2647 g_free(title); | |
2648 g_free(dialogmsg); | |
4151 | 2649 } break; |
2650 | |
2651 default: { | |
8660 | 2652 gaim_debug_warning("oscar", |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
2653 "Received an unknown client auto-response from %s. " |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2654 "Type 0x%04hx\n", who, reason); |
4151 | 2655 } break; |
2656 } /* end of switch */ | |
2657 | |
2658 return 0; | |
2659 } | |
2660 | |
13592 | 2661 static int gaim_parse_clientauto(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
3212 | 2662 va_list ap; |
13234 | 2663 guint16 chan, reason; |
3212 | 2664 char *who; |
2665 | |
2666 va_start(ap, fr); | |
13234 | 2667 chan = (guint16)va_arg(ap, unsigned int); |
3212 | 2668 who = va_arg(ap, char *); |
13234 | 2669 reason = (guint16)va_arg(ap, unsigned int); |
3212 | 2670 |
3952 | 2671 if (chan == 0x0002) { /* File transfer declined */ |
11159 | 2672 guchar *cookie = va_arg(ap, guchar *); |
13592 | 2673 return gaim_parse_clientauto_ch2(od, who, reason, cookie); |
3952 | 2674 } else if (chan == 0x0004) { /* ICQ message */ |
13234 | 2675 guint32 state = 0; |
4151 | 2676 char *msg = NULL; |
2677 if (reason == 0x0003) { | |
13234 | 2678 state = va_arg(ap, guint32); |
4151 | 2679 msg = va_arg(ap, char *); |
2680 } | |
13592 | 2681 return gaim_parse_clientauto_ch4(od, who, reason, state, msg); |
4151 | 2682 } |
3952 | 2683 |
3212 | 2684 va_end(ap); |
2685 | |
2686 return 1; | |
2687 } | |
2688 | |
13592 | 2689 static int gaim_parse_genericerr(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
2086 | 2690 va_list ap; |
13234 | 2691 guint16 reason; |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
2692 char *m; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2693 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2694 va_start(ap, fr); |
13234 | 2695 reason = (guint16) va_arg(ap, unsigned int); |
2086 | 2696 va_end(ap); |
2697 | |
8660 | 2698 gaim_debug_error("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2699 "snac threw error (reason 0x%04hx: %s)\n", reason, |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2700 (reason < msgerrreasonlen) ? msgerrreason[reason] : "unknown"); |
2086 | 2701 |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
2702 m = g_strdup_printf(_("SNAC threw error: %s\n"), |
5411 | 2703 reason < msgerrreasonlen ? _(msgerrreason[reason]) : _("Unknown error")); |
13592 | 2704 gaim_notify_error(od->gc, NULL, m, NULL); |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
2705 g_free(m); |
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
2706 |
2086 | 2707 return 1; |
2708 } | |
2709 | |
13592 | 2710 static int gaim_parse_msgerr(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
2711 GaimConnection *gc = od->gc; | |
2712 #ifdef TODOFT | |
7283 | 2713 OscarData *od = gc->proto_data; |
6240
ac191233b816
[gaim-migrate @ 6734]
Christian Hammond <chipx86@chipx86.com>
parents:
6173
diff
changeset
|
2714 GaimXfer *xfer; |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
2715 #endif |
4617 | 2716 va_list ap; |
13234 | 2717 guint16 reason; |
4617 | 2718 char *data, *buf; |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
2719 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2720 va_start(ap, fr); |
13234 | 2721 reason = (guint16)va_arg(ap, unsigned int); |
3752 | 2722 data = va_arg(ap, char *); |
2086 | 2723 va_end(ap); |
2724 | |
8660 | 2725 gaim_debug_error("oscar", |
10130 | 2726 "Message error with data %s and reason %hu\n", |
2727 (data != NULL ? data : ""), reason); | |
4617 | 2728 |
13592 | 2729 #ifdef TODOFT |
4617 | 2730 /* If this was a file transfer request, data is a cookie */ |
2731 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
|
2732 gaim_xfer_cancel_remote(xfer); |
3630 | 2733 return 1; |
2734 } | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
2735 #endif |
3630 | 2736 |
4617 | 2737 /* Data is assumed to be the destination sn */ |
9826 | 2738 buf = g_strdup_printf(_("Unable to send message: %s"), (reason < msgerrreasonlen) ? msgerrreason[reason] : _("Unknown reason.")); |
2739 if (!gaim_conv_present_error(data, gaim_connection_get_account(gc), buf)) { | |
2740 g_free(buf); | |
2741 buf = g_strdup_printf(_("Unable to send message to %s:"), data ? data : "(unknown)"); | |
13592 | 2742 gaim_notify_error(od->gc, NULL, buf, |
9826 | 2743 (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("Unknown reason.")); |
2744 } | |
2745 g_free(buf); | |
2746 | |
2086 | 2747 return 1; |
2748 } | |
2749 | |
13592 | 2750 static int gaim_parse_mtn(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
2751 GaimConnection *gc = od->gc; | |
3595 | 2752 va_list ap; |
13234 | 2753 guint16 type1, type2; |
3595 | 2754 char *sn; |
2755 | |
2756 va_start(ap, fr); | |
13234 | 2757 type1 = (guint16) va_arg(ap, unsigned int); |
3595 | 2758 sn = va_arg(ap, char *); |
13234 | 2759 type2 = (guint16) va_arg(ap, unsigned int); |
3595 | 2760 va_end(ap); |
2761 | |
2762 switch (type2) { | |
2763 case 0x0000: { /* Text has been cleared */ | |
2764 serv_got_typing_stopped(gc, sn); | |
2765 } break; | |
2766 | |
2767 case 0x0001: { /* Paused typing */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
2768 serv_got_typing(gc, sn, 0, GAIM_TYPED); |
3595 | 2769 } break; |
2770 | |
2771 case 0x0002: { /* Typing */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
2772 serv_got_typing(gc, sn, 0, GAIM_TYPING); |
3595 | 2773 } break; |
2774 | |
2775 default: { | |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
2776 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 | 2777 } break; |
2778 } | |
2779 | |
2780 return 1; | |
2781 } | |
2782 | |
7141 | 2783 /* |
13381
d1b29fb3b6d0
[gaim-migrate @ 15754]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13356
diff
changeset
|
2784 * We get this error when there was an error in the locate family. This |
7259 | 2785 * happens when you request info of someone who is offline. |
7141 | 2786 */ |
13592 | 2787 static int gaim_parse_locerr(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
9826 | 2788 gchar *buf; |
2086 | 2789 va_list ap; |
13234 | 2790 guint16 reason; |
2086 | 2791 char *destn; |
2792 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2793 va_start(ap, fr); |
13234 | 2794 reason = (guint16) va_arg(ap, unsigned int); |
2086 | 2795 destn = va_arg(ap, char *); |
2796 va_end(ap); | |
2797 | |
7781 | 2798 if (destn == NULL) |
7793 | 2799 return 1; |
12653 | 2800 |
9826 | 2801 buf = g_strdup_printf(_("User information not available: %s"), (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("Unknown reason.")); |
13592 | 2802 if (!gaim_conv_present_error(destn, gaim_connection_get_account((GaimConnection*)od->gc), buf)) { |
9826 | 2803 g_free(buf); |
9627 | 2804 buf = g_strdup_printf(_("User information for %s unavailable:"), destn); |
13592 | 2805 gaim_notify_error(od->gc, NULL, buf, (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("Unknown reason.")); |
9826 | 2806 } |
2807 g_free(buf); | |
2086 | 2808 |
2809 return 1; | |
2810 } | |
2811 | |
13592 | 2812 static int gaim_parse_userinfo(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
2813 GaimConnection *gc = od->gc; | |
8700 | 2814 GaimAccount *account = gaim_connection_get_account(gc); |
2815 GString *str; | |
11532
57439a383f4f
[gaim-migrate @ 13781]
Luke Schierer <lschiere@pidgin.im>
parents:
11531
diff
changeset
|
2816 gchar *tmp = NULL, *info_utf8 = NULL, *away_utf8 = NULL; |
4791 | 2817 va_list ap; |
7011 | 2818 aim_userinfo_t *userinfo; |
2086 | 2819 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2820 va_start(ap, fr); |
7011 | 2821 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 2822 va_end(ap); |
2823 | |
8700 | 2824 str = g_string_new(""); |
2825 g_string_append_printf(str, "<b>%s:</b> %s", _("Screen Name"), userinfo->sn); | |
2826 g_string_append_printf(str, "\n<br><b>%s</b>: %d%%", _("Warning Level"), (int)((userinfo->warnlevel/10.0) + 0.5)); | |
7011 | 2827 |
10116 | 2828 if (userinfo->present & AIM_USERINFO_PRESENT_ONLINESINCE) { |
10567 | 2829 time_t t = userinfo->onlinesince - od->timeoffset; |
13119
fcde3faa1f57
[gaim-migrate @ 15481]
Richard Laager <rlaager@wiktel.com>
parents:
13104
diff
changeset
|
2830 oscar_string_append(gc->account, str, "\n<br>", _("Online Since"), gaim_date_format_full(localtime(&t))); |
10116 | 2831 } |
2832 | |
2833 if (userinfo->present & AIM_USERINFO_PRESENT_MEMBERSINCE) { | |
10567 | 2834 time_t t = userinfo->membersince - od->timeoffset; |
13119
fcde3faa1f57
[gaim-migrate @ 15481]
Richard Laager <rlaager@wiktel.com>
parents:
13104
diff
changeset
|
2835 oscar_string_append(gc->account, str, "\n<br>", _("Member Since"), gaim_date_format_full(localtime(&t))); |
10116 | 2836 } |
7011 | 2837 |
12430 | 2838 if (userinfo->capabilities != 0) { |
2839 tmp = oscar_caps_to_string(userinfo->capabilities); | |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
2840 oscar_string_append(gc->account, str, "\n<br>", _("Capabilities"), tmp); |
12430 | 2841 g_free(tmp); |
2842 } | |
2843 | |
7011 | 2844 if (userinfo->present & AIM_USERINFO_PRESENT_IDLE) { |
8700 | 2845 tmp = gaim_str_seconds_to_string(userinfo->idletime*60); |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
2846 oscar_string_append(gc->account, str, "\n<br>", _("Idle"), tmp); |
8700 | 2847 g_free(tmp); |
2848 } | |
2849 | |
8701 | 2850 oscar_string_append_info(gc, str, "\n<br>", NULL, userinfo); |
7011 | 2851 |
13007 | 2852 /* Available message */ |
2853 if ((userinfo->status != NULL) && !(userinfo->flags & AIM_FLAG_AWAY)) | |
2854 { | |
2855 if (userinfo->status[0] != '\0') | |
2856 tmp = oscar_encoding_to_utf8(userinfo->status_encoding, | |
2857 userinfo->status, userinfo->status_len); | |
2858 oscar_string_append(gc->account, str, "\n<br>", _("Available Message"), tmp); | |
2859 g_free(tmp); | |
2860 } | |
2861 | |
2862 /* Away message */ | |
7011 | 2863 if ((userinfo->flags & AIM_FLAG_AWAY) && (userinfo->away_len > 0) && (userinfo->away != NULL) && (userinfo->away_encoding != NULL)) { |
8700 | 2864 tmp = oscar_encoding_extract(userinfo->away_encoding); |
2865 away_utf8 = oscar_encoding_to_utf8(tmp, userinfo->away, userinfo->away_len); | |
2866 g_free(tmp); | |
7011 | 2867 if (away_utf8 != NULL) { |
12661 | 2868 g_string_append_printf(str, "\n<hr>%s", away_utf8); |
7011 | 2869 g_free(away_utf8); |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2870 } |
7011 | 2871 } |
2872 | |
13007 | 2873 /* Info */ |
7011 | 2874 if ((userinfo->info_len > 0) && (userinfo->info != NULL) && (userinfo->info_encoding != NULL)) { |
8700 | 2875 tmp = oscar_encoding_extract(userinfo->info_encoding); |
2876 info_utf8 = oscar_encoding_to_utf8(tmp, userinfo->info, userinfo->info_len); | |
2877 g_free(tmp); | |
7011 | 2878 if (info_utf8 != NULL) { |
12661 | 2879 g_string_append_printf(str, "\n<hr>%s", info_utf8); |
7011 | 2880 g_free(info_utf8); |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2881 } |
7011 | 2882 } |
2883 | |
8701 | 2884 tmp = gaim_str_sub_away_formatters(str->str, gaim_account_get_username(account)); |
8700 | 2885 g_string_free(str, TRUE); |
11920 | 2886 gaim_str_strip_char(tmp, '\r'); |
11533
c9b815aeddc1
[gaim-migrate @ 13782]
Richard Laager <rlaager@wiktel.com>
parents:
11532
diff
changeset
|
2887 gaim_notify_userinfo(gc, userinfo->sn, tmp, NULL, NULL); |
8700 | 2888 g_free(tmp); |
4151 | 2889 |
2086 | 2890 return 1; |
2891 } | |
2892 | |
13592 | 2893 static int gaim_got_infoblock(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) |
12189 | 2894 { |
13592 | 2895 GaimConnection *gc = od->gc; |
12189 | 2896 GaimBuddy *b; |
2897 GaimPresence *presence; | |
12349 | 2898 GaimStatus *status; |
12189 | 2899 gchar *message = NULL; |
2900 | |
2901 va_list ap; | |
2902 aim_userinfo_t *userinfo; | |
2903 | |
2904 va_start(ap, fr); | |
2905 userinfo = va_arg(ap, aim_userinfo_t *); | |
2906 va_end(ap); | |
2907 | |
2908 b = gaim_find_buddy(gaim_connection_get_account(gc), userinfo->sn); | |
2909 if (b == NULL) | |
2910 return 1; | |
2911 | |
2912 presence = gaim_buddy_get_presence(b); | |
12349 | 2913 status = gaim_presence_get_active_status(presence); |
2914 | |
12426 | 2915 if (!gaim_status_is_available(status) && gaim_status_is_online(status)) |
12271 | 2916 { |
13654 | 2917 if ((userinfo->flags & AIM_FLAG_AWAY) && |
12189 | 2918 (userinfo->away_len > 0) && (userinfo->away != NULL) && (userinfo->away_encoding != NULL)) { |
2919 gchar *charset = oscar_encoding_extract(userinfo->away_encoding); | |
2920 message = oscar_encoding_to_utf8(charset, userinfo->away, userinfo->away_len); | |
2921 g_free(charset); | |
12393 | 2922 gaim_status_set_attr_string(status, "message", message); |
2923 g_free(message); | |
12189 | 2924 } |
12349 | 2925 |
2926 gaim_blist_update_buddy_status(b, status); | |
2927 } | |
12189 | 2928 |
2929 return 1; | |
2930 } | |
2931 | |
13592 | 2932 static int gaim_parse_motd(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) |
8341 | 2933 { |
2086 | 2934 char *msg; |
13234 | 2935 guint16 id; |
2086 | 2936 va_list ap; |
2937 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2938 va_start(ap, fr); |
13234 | 2939 id = (guint16) va_arg(ap, unsigned int); |
2086 | 2940 msg = va_arg(ap, char *); |
2941 va_end(ap); | |
2942 | |
8660 | 2943 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2944 "MOTD: %s (%hu)\n", msg ? msg : "Unknown", id); |
2092
59b0377d18aa
[gaim-migrate @ 2102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
2945 if (id < 4) |
13592 | 2946 gaim_notify_warning(od->gc, NULL, |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2947 _("Your AIM connection may be lost."), NULL); |
2086 | 2948 |
2949 return 1; | |
2950 } | |
2951 | |
13592 | 2952 static int gaim_chatnav_info(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
2086 | 2953 va_list ap; |
13234 | 2954 guint16 type; |
2086 | 2955 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2956 va_start(ap, fr); |
13234 | 2957 type = (guint16) va_arg(ap, unsigned int); |
2086 | 2958 |
2959 switch(type) { | |
2960 case 0x0002: { | |
13234 | 2961 guint8 maxrooms; |
2086 | 2962 struct aim_chat_exchangeinfo *exchanges; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2963 int exchangecount, i; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2964 |
13234 | 2965 maxrooms = (guint8) va_arg(ap, unsigned int); |
2086 | 2966 exchangecount = va_arg(ap, int); |
2967 exchanges = va_arg(ap, struct aim_chat_exchangeinfo *); | |
2968 | |
13592 | 2969 gaim_debug_misc("oscar", "chat info: Chat Rights:\n"); |
8660 | 2970 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2971 "chat info: \tMax Concurrent Rooms: %hhd\n", maxrooms); |
8660 | 2972 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2973 "chat info: \tExchange List: (%d total)\n", exchangecount); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2974 for (i = 0; i < exchangecount; i++) |
8660 | 2975 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2976 "chat info: \t\t%hu %s\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2977 exchanges[i].number, exchanges[i].name ? exchanges[i].name : ""); |
4617 | 2978 while (od->create_rooms) { |
2979 struct create_room *cr = od->create_rooms->data; | |
8660 | 2980 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
2981 "creating room %s\n", cr->name); |
13592 | 2982 aim_chatnav_createroom(od, conn, cr->name, cr->exchange); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
2983 g_free(cr->name); |
4617 | 2984 od->create_rooms = g_slist_remove(od->create_rooms, cr); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
2985 g_free(cr); |
2086 | 2986 } |
2987 } | |
2988 break; | |
2989 case 0x0008: { | |
2990 char *fqcn, *name, *ck; | |
13234 | 2991 guint16 instance, flags, maxmsglen, maxoccupancy, unknown, exchange; |
2992 guint8 createperms; | |
2993 guint32 createtime; | |
2086 | 2994 |
2995 fqcn = va_arg(ap, char *); | |
13234 | 2996 instance = (guint16)va_arg(ap, unsigned int); |
2997 exchange = (guint16)va_arg(ap, unsigned int); | |
2998 flags = (guint16)va_arg(ap, unsigned int); | |
2999 createtime = va_arg(ap, guint32); | |
3000 maxmsglen = (guint16)va_arg(ap, unsigned int); | |
3001 maxoccupancy = (guint16)va_arg(ap, unsigned int); | |
3002 createperms = (guint8)va_arg(ap, unsigned int); | |
3003 unknown = (guint16)va_arg(ap, unsigned int); | |
4200 | 3004 name = va_arg(ap, char *); |
3005 ck = va_arg(ap, char *); | |
4194 | 3006 |
8660 | 3007 gaim_debug_misc("oscar", |
13592 | 3008 "created room: %s %hu %hu %hu %u %hu %hu %hhu %hu %s %s\n", |
3009 fqcn, exchange, instance, flags, createtime, | |
2086 | 3010 maxmsglen, maxoccupancy, createperms, unknown, |
3011 name, ck); | |
13592 | 3012 aim_chat_join(od, exchange, ck, instance); |
2086 | 3013 } |
3014 break; | |
3015 default: | |
8660 | 3016 gaim_debug_warning("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3017 "chatnav info: unknown type (%04hx)\n", type); |
2086 | 3018 break; |
3019 } | |
4194 | 3020 |
3021 va_end(ap); | |
3022 | |
2086 | 3023 return 1; |
3024 } | |
3025 | |
13592 | 3026 static int gaim_conv_chat_join(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
2086 | 3027 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3028 int count, i; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3029 aim_userinfo_t *info; |
13592 | 3030 GaimConnection *gc = od->gc; |
2086 | 3031 |
3032 struct chat_connection *c = NULL; | |
3033 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3034 va_start(ap, fr); |
2086 | 3035 count = va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3036 info = va_arg(ap, aim_userinfo_t *); |
2086 | 3037 va_end(ap); |
3038 | |
13592 | 3039 c = find_oscar_chat_by_conn(gc, conn); |
2086 | 3040 if (!c) |
3041 return 1; | |
3042 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3043 for (i = 0; i < count; i++) |
9846 | 3044 gaim_conv_chat_add_user(GAIM_CONV_CHAT(c->conv), info[i].sn, NULL, GAIM_CBFLAGS_NONE, TRUE); |
2086 | 3045 |
3046 return 1; | |
3047 } | |
3048 | |
13592 | 3049 static int gaim_conv_chat_leave(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
2086 | 3050 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3051 int count, i; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3052 aim_userinfo_t *info; |
13592 | 3053 GaimConnection *gc = od->gc; |
2086 | 3054 |
3055 struct chat_connection *c = NULL; | |
3056 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3057 va_start(ap, fr); |
2086 | 3058 count = va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3059 info = va_arg(ap, aim_userinfo_t *); |
2086 | 3060 va_end(ap); |
3061 | |
13592 | 3062 c = find_oscar_chat_by_conn(gc, conn); |
2086 | 3063 if (!c) |
3064 return 1; | |
3065 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3066 for (i = 0; i < count; i++) |
8733 | 3067 gaim_conv_chat_remove_user(GAIM_CONV_CHAT(c->conv), info[i].sn, NULL); |
2086 | 3068 |
3069 return 1; | |
3070 } | |
3071 | |
13592 | 3072 static int gaim_conv_chat_info_update(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3073 va_list ap; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3074 aim_userinfo_t *userinfo; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3075 struct aim_chat_roominfo *roominfo; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3076 char *roomname; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3077 int usercount; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3078 char *roomdesc; |
13234 | 3079 guint16 unknown_c9, unknown_d2, unknown_d5, maxmsglen, maxvisiblemsglen; |
3080 guint32 creationtime; | |
13592 | 3081 GaimConnection *gc = od->gc; |
3082 struct chat_connection *ccon = find_oscar_chat_by_conn(gc, conn); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3083 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3084 va_start(ap, fr); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3085 roominfo = va_arg(ap, struct aim_chat_roominfo *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3086 roomname = va_arg(ap, char *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3087 usercount= va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3088 userinfo = va_arg(ap, aim_userinfo_t *); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3089 roomdesc = va_arg(ap, char *); |
13234 | 3090 unknown_c9 = (guint16)va_arg(ap, unsigned int); |
3091 creationtime = va_arg(ap, guint32); | |
3092 maxmsglen = (guint16)va_arg(ap, unsigned int); | |
3093 unknown_d2 = (guint16)va_arg(ap, unsigned int); | |
3094 unknown_d5 = (guint16)va_arg(ap, unsigned int); | |
3095 maxvisiblemsglen = (guint16)va_arg(ap, unsigned int); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3096 va_end(ap); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3097 |
8660 | 3098 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3099 "inside chat_info_update (maxmsglen = %hu, maxvislen = %hu)\n", |
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3100 maxmsglen, maxvisiblemsglen); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3101 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3102 ccon->maxlen = maxmsglen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3103 ccon->maxvis = maxvisiblemsglen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3104 |
2086 | 3105 return 1; |
3106 } | |
3107 | |
13592 | 3108 static int gaim_conv_chat_incoming_msg(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
3109 GaimConnection *gc = od->gc; | |
3110 struct chat_connection *ccon = find_oscar_chat_by_conn(gc, conn); | |
8225 | 3111 gchar *utf8; |
2086 | 3112 va_list ap; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3113 aim_userinfo_t *info; |
8225 | 3114 int len; |
2086 | 3115 char *msg; |
8219 | 3116 char *charset; |
2086 | 3117 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3118 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3119 info = va_arg(ap, aim_userinfo_t *); |
8219 | 3120 len = va_arg(ap, int); |
4194 | 3121 msg = va_arg(ap, char *); |
8219 | 3122 charset = va_arg(ap, char *); |
4194 | 3123 va_end(ap); |
2086 | 3124 |
8225 | 3125 utf8 = oscar_encoding_to_utf8(charset, msg, len); |
8667 | 3126 if (utf8 == NULL) |
3127 /* The conversion failed! */ | |
8668 | 3128 utf8 = g_strdup(_("[Unable to display a message from this user because it contained invalid characters.]")); |
8225 | 3129 serv_got_chat_in(gc, ccon->id, info->sn, 0, utf8, time((time_t)NULL)); |
3130 g_free(utf8); | |
2086 | 3131 |
3132 return 1; | |
3133 } | |
3134 | |
13592 | 3135 static int gaim_email_parseupdate(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
3694 | 3136 va_list ap; |
13592 | 3137 GaimConnection *gc = od->gc; |
3694 | 3138 struct aim_emailinfo *emailinfo; |
3725 | 3139 int havenewmail; |
7297 | 3140 char *alertitle, *alerturl; |
3694 | 3141 |
3142 va_start(ap, fr); | |
3143 emailinfo = va_arg(ap, struct aim_emailinfo *); | |
3725 | 3144 havenewmail = va_arg(ap, int); |
7301 | 3145 alertitle = va_arg(ap, char *); |
3146 alerturl = va_arg(ap, char *); | |
3694 | 3147 va_end(ap); |
3148 | |
9661 | 3149 if ((emailinfo != NULL) && gaim_account_get_check_mail(gc->account)) { |
3150 gchar *to = g_strdup_printf("%s%s%s", gaim_account_get_username(gaim_connection_get_account(gc)), | |
3151 emailinfo->domain ? "@" : "", | |
3152 emailinfo->domain ? emailinfo->domain : ""); | |
5542 | 3153 if (emailinfo->unread && havenewmail) |
3154 gaim_notify_emails(gc, emailinfo->nummsgs, FALSE, NULL, NULL, (const char **)&to, (const char **)&emailinfo->url, NULL, NULL); | |
5537 | 3155 g_free(to); |
3694 | 3156 } |
13226 | 3157 |
7301 | 3158 if (alertitle) |
8660 | 3159 gaim_debug_misc("oscar", "Got an alert '%s' %s\n", alertitle, alerturl ? alerturl : ""); |
3694 | 3160 |
3161 return 1; | |
3162 } | |
3163 | |
13592 | 3164 static int gaim_icon_error(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
3165 GaimConnection *gc = od->gc; | |
4804 | 3166 char *sn; |
3167 | |
3168 sn = od->requesticon->data; | |
13592 | 3169 gaim_debug_misc("oscar", "removing %s from hash table\n", sn); |
4804 | 3170 od->requesticon = g_slist_remove(od->requesticon, sn); |
13592 | 3171 g_free(sn); |
4804 | 3172 |
3173 if (od->icontimer) | |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
3174 gaim_timeout_remove(od->icontimer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
3175 od->icontimer = gaim_timeout_add(500, gaim_icon_timerfunc, gc); |
4804 | 3176 |
3177 return 1; | |
3178 } | |
3179 | |
13592 | 3180 static int gaim_icon_parseicon(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
3181 GaimConnection *gc = od->gc; | |
4804 | 3182 GSList *cur; |
3183 va_list ap; | |
3184 char *sn; | |
13234 | 3185 guint8 iconcsumtype, *iconcsum, *icon; |
3186 guint16 iconcsumlen, iconlen; | |
4804 | 3187 |
3188 va_start(ap, fr); | |
3189 sn = va_arg(ap, char *); | |
11024 | 3190 iconcsumtype = va_arg(ap, int); |
13234 | 3191 iconcsum = va_arg(ap, guint8 *); |
4853 | 3192 iconcsumlen = va_arg(ap, int); |
13234 | 3193 icon = va_arg(ap, guint8 *); |
4804 | 3194 iconlen = va_arg(ap, int); |
3195 va_end(ap); | |
3196 | |
11024 | 3197 /* |
3198 * Some AIM clients will send a blank GIF image with iconlen 90 when | |
3199 * no icon is set. Ignore these. | |
3200 */ | |
3201 if ((iconlen > 0) && (iconlen != 90)) { | |
4853 | 3202 char *b16; |
13654 | 3203 GaimBuddy *b; |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
3204 gaim_buddy_icons_set_for_user(gaim_connection_get_account(gc), |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6787
diff
changeset
|
3205 sn, icon, iconlen); |
7106
db6bd3e794d8
[gaim-migrate @ 7671]
Christian Hammond <chipx86@chipx86.com>
parents:
7098
diff
changeset
|
3206 b16 = gaim_base16_encode(iconcsum, iconcsumlen); |
13654 | 3207 b = gaim_find_buddy(gc->account, sn); |
3208 if ((b16 != NULL) && (b != NULL)) { | |
7693 | 3209 gaim_blist_node_set_string((GaimBlistNode*)b, "icon_checksum", b16); |
7162 | 3210 g_free(b16); |
5129 | 3211 } |
4853 | 3212 } |
4804 | 3213 |
3214 cur = od->requesticon; | |
3215 while (cur) { | |
3216 char *cursn = cur->data; | |
3217 if (!aim_sncmp(cursn, sn)) { | |
3218 od->requesticon = g_slist_remove(od->requesticon, cursn); | |
13592 | 3219 g_free(cursn); |
4804 | 3220 cur = od->requesticon; |
3221 } else | |
3222 cur = cur->next; | |
3223 } | |
3224 | |
3225 if (od->icontimer) | |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
3226 gaim_timeout_remove(od->icontimer); |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8266
diff
changeset
|
3227 od->icontimer = gaim_timeout_add(250, gaim_icon_timerfunc, gc); |
4804 | 3228 |
3229 return 1; | |
3230 } | |
3231 | |
3232 static gboolean gaim_icon_timerfunc(gpointer data) { | |
5575 | 3233 GaimConnection *gc = data; |
7283 | 3234 OscarData *od = gc->proto_data; |
7011 | 3235 aim_userinfo_t *userinfo; |
13592 | 3236 FlapConnection *conn; |
3237 | |
3238 conn = flap_connection_getbytype(od, SNAC_FAMILY_BART); | |
5892 | 3239 if (!conn) { |
3240 if (!od->iconconnecting) { | |
13592 | 3241 aim_reqservice(od, SNAC_FAMILY_BART); |
5892 | 3242 od->iconconnecting = TRUE; |
3243 } | |
4804 | 3244 return FALSE; |
3245 } | |
3246 | |
5842 | 3247 if (od->set_icon) { |
6039 | 3248 struct stat st; |
11303
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11285
diff
changeset
|
3249 char *iconfile = gaim_buddy_icons_get_full_path(gaim_account_get_buddy_icon(gaim_connection_get_account(gc))); |
6039 | 3250 if (iconfile == NULL) { |
13592 | 3251 aim_ssi_delicon(od); |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
3252 } else if (!g_stat(iconfile, &st)) { |
11159 | 3253 guchar *buf = g_malloc(st.st_size); |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
3254 FILE *file = g_fopen(iconfile, "rb"); |
6039 | 3255 if (file) { |
9532 | 3256 /* XXX - Use g_file_get_contents()? */ |
6039 | 3257 fread(buf, 1, st.st_size, file); |
3258 fclose(file); | |
8660 | 3259 gaim_debug_info("oscar", |
6039 | 3260 "Uploading icon to icon server\n"); |
13592 | 3261 aim_bart_upload(od, buf, st.st_size); |
5842 | 3262 } else |
8660 | 3263 gaim_debug_error("oscar", |
6039 | 3264 "Can't open buddy icon file!\n"); |
3265 g_free(buf); | |
3266 } else { | |
8660 | 3267 gaim_debug_error("oscar", |
6039 | 3268 "Can't stat buddy icon file!\n"); |
5842 | 3269 } |
11303
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11285
diff
changeset
|
3270 g_free(iconfile); |
5842 | 3271 od->set_icon = FALSE; |
3272 } | |
3273 | |
3274 if (!od->requesticon) { | |
8660 | 3275 gaim_debug_misc("oscar", |
5842 | 3276 "no more icons to request\n"); |
3277 return FALSE; | |
3278 } | |
3279 | |
13592 | 3280 userinfo = aim_locate_finduserinfo(od, (char *)od->requesticon->data); |
7011 | 3281 if ((userinfo != NULL) && (userinfo->iconcsumlen > 0)) { |
13592 | 3282 aim_bart_request(od, od->requesticon->data, userinfo->iconcsumtype, userinfo->iconcsum, userinfo->iconcsumlen); |
4804 | 3283 return FALSE; |
3284 } else { | |
13592 | 3285 gchar *sn = od->requesticon->data; |
4804 | 3286 od->requesticon = g_slist_remove(od->requesticon, sn); |
13592 | 3287 g_free(sn); |
4804 | 3288 } |
3289 | |
3290 return TRUE; | |
3291 } | |
3292 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3293 /* |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3294 * 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
|
3295 */ |
13592 | 3296 static int gaim_parse_msgack(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
2086 | 3297 va_list ap; |
13234 | 3298 guint16 type; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3299 char *sn; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3300 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3301 va_start(ap, fr); |
13234 | 3302 type = (guint16) va_arg(ap, unsigned int); |
2086 | 3303 sn = va_arg(ap, char *); |
3304 va_end(ap); | |
3305 | |
8660 | 3306 gaim_debug_info("oscar", "Sent message to %s.\n", sn); |
2086 | 3307 |
3308 return 1; | |
3309 } | |
3310 | |
13592 | 3311 static int gaim_parse_ratechange(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3312 static const char *codes[5] = { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3313 "invalid", |
4194 | 3314 "change", |
3315 "warning", | |
3316 "limit", | |
3317 "limit cleared", | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3318 }; |
2086 | 3319 va_list ap; |
13234 | 3320 guint16 code, rateclass; |
3321 guint32 windowsize, clear, alert, limit, disconnect, currentavg, maxavg; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3322 |
13226 | 3323 va_start(ap, fr); |
13234 | 3324 code = (guint16)va_arg(ap, unsigned int); |
3325 rateclass= (guint16)va_arg(ap, unsigned int); | |
3326 windowsize = va_arg(ap, guint32); | |
3327 clear = va_arg(ap, guint32); | |
3328 alert = va_arg(ap, guint32); | |
3329 limit = va_arg(ap, guint32); | |
3330 disconnect = va_arg(ap, guint32); | |
3331 currentavg = va_arg(ap, guint32); | |
3332 maxavg = va_arg(ap, guint32); | |
2086 | 3333 va_end(ap); |
3334 | |
8660 | 3335 gaim_debug_misc("oscar", |
5556 | 3336 "rate %s (param ID 0x%04hx): curavg = %u, maxavg = %u, alert at %u, " |
3337 "clear warning at %u, limit at %u, disconnect at %u (window size = %u)\n", | |
2086 | 3338 (code < 5) ? codes[code] : codes[0], |
3339 rateclass, | |
3340 currentavg, maxavg, | |
3341 alert, clear, | |
3342 limit, disconnect, | |
3343 windowsize); | |
3344 | |
13256 | 3345 if (code == AIM_RATE_CODE_LIMIT) |
3346 { | |
13592 | 3347 gaim_notify_error(od->gc, NULL, _("Rate limiting error."), |
6040 | 3348 _("The last action you attempted could not be " |
3349 "performed because you are over the rate limit. " | |
3350 "Please wait 10 seconds and try again.")); | |
2086 | 3351 } |
3352 | |
3353 return 1; | |
3354 } | |
3355 | |
13592 | 3356 static int gaim_parse_evilnotify(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
13662 | 3357 #ifdef CRAZY_WARNING |
2086 | 3358 va_list ap; |
13234 | 3359 guint16 newevil; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3360 aim_userinfo_t *userinfo; |
2086 | 3361 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3362 va_start(ap, fr); |
13234 | 3363 newevil = (guint16) va_arg(ap, unsigned int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3364 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 3365 va_end(ap); |
3366 | |
11285 | 3367 gaim_prpl_got_account_warning_level(account, (userinfo && userinfo->sn) ? userinfo->sn : NULL, (newevil/10.0) + 0.5); |
3368 #endif | |
2086 | 3369 |
3370 return 1; | |
3371 } | |
3372 | |
13592 | 3373 static int gaim_selfinfo(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
9982 | 3374 int warning_level; |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3375 va_list ap; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3376 aim_userinfo_t *info; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3377 |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3378 va_start(ap, fr); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3379 info = va_arg(ap, aim_userinfo_t *); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3380 va_end(ap); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3381 |
11285 | 3382 /* |
3383 * What's with the + 0.5? | |
3384 * The 0.5 is basically poor-man's rounding. Normally | |
3385 * casting "13.7" to an int will truncate to "13," but | |
3386 * with 13.7 + 0.5 = 14.2, which becomes "14" when | |
3387 * truncated. | |
3388 */ | |
9982 | 3389 warning_level = info->warnlevel/10.0 + 0.5; |
3390 | |
11285 | 3391 #ifdef CRAZY_WARNING |
3392 gaim_presence_set_warning_level(presence, warning_level); | |
3393 #endif | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3394 |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3395 return 1; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3396 } |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3397 |
13592 | 3398 static int gaim_connerr(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
3399 GaimConnection *gc = od->gc; | |
4649 | 3400 va_list ap; |
13234 | 3401 guint16 code; |
4649 | 3402 char *msg; |
3403 | |
3404 va_start(ap, fr); | |
13234 | 3405 code = (guint16)va_arg(ap, int); |
4649 | 3406 msg = va_arg(ap, char *); |
3407 va_end(ap); | |
3408 | |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
3409 gaim_debug_info("oscar", "Disconnected. Code is 0x%04x and msg is %s\n", |
10458 | 3410 code, (msg != NULL ? msg : "")); |
3411 | |
3412 g_return_val_if_fail(fr != NULL, 1); | |
13592 | 3413 g_return_val_if_fail(conn != NULL, 1); |
3414 | |
3415 if (conn->type == SNAC_FAMILY_LOCATE) { | |
4651 | 3416 if (code == 0x0001) { |
6113 | 3417 gc->wants_to_die = TRUE; |
10715 | 3418 gaim_connection_error(gc, _("You have signed on from another location.")); |
4651 | 3419 } else { |
5579 | 3420 gaim_connection_error(gc, _("You have been signed off for an unknown reason.")); |
4651 | 3421 } |
4666 | 3422 od->killme = TRUE; |
13592 | 3423 } else if (conn->type == SNAC_FAMILY_CHAT) { |
10458 | 3424 struct chat_connection *cc; |
3425 GaimConversation *conv; | |
3426 | |
13592 | 3427 cc = find_oscar_chat_by_conn(gc, conn); |
10458 | 3428 conv = gaim_find_chat(gc, cc->id); |
3429 | |
3430 if (conv != NULL) | |
3431 { | |
3432 gchar *buf; | |
3433 buf = g_strdup_printf(_("You have been disconnected from chat " | |
3434 "room %s."), cc->name); | |
3435 gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_ERROR, time(NULL)); | |
3436 g_free(buf); | |
3437 } | |
3438 oscar_chat_kill(gc, cc); | |
4649 | 3439 } |
3440 | |
3441 return 1; | |
3442 } | |
3443 | |
13592 | 3444 static int gaim_icbm_param_info(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3445 struct aim_icbmparameters *params; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3446 va_list ap; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3447 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3448 va_start(ap, fr); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3449 params = va_arg(ap, struct aim_icbmparameters *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3450 va_end(ap); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3451 |
4194 | 3452 /* XXX - evidently this crashes on solaris. i have no clue why |
8660 | 3453 gaim_debug_misc("oscar", "ICBM Parameters: maxchannel = %hu, default flags = 0x%08lx, max msg len = %hu, " |
5556 | 3454 "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
|
3455 params->maxchan, params->flags, params->maxmsglen, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3456 ((float)params->maxsenderwarn)/10.0, ((float)params->maxrecverwarn)/10.0, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3457 params->minmsginterval); |
2427
5bc3b39fc0a5
[gaim-migrate @ 2440]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2421
diff
changeset
|
3458 */ |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3459 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3460 /* Maybe senderwarn and recverwarn should be user preferences... */ |
3595 | 3461 params->flags = 0x0000000b; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3462 params->maxmsglen = 8000; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3463 params->minmsginterval = 0; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3464 |
13592 | 3465 aim_im_setparams(od, params); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3466 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3467 return 1; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3468 } |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3469 |
13592 | 3470 static int gaim_parse_locaterights(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) |
2993 | 3471 { |
13592 | 3472 GaimConnection *gc = od->gc; |
11338 | 3473 GaimAccount *account = gaim_connection_get_account(gc); |
5306 | 3474 va_list ap; |
13234 | 3475 guint16 maxsiglen; |
2993 | 3476 |
3477 va_start(ap, fr); | |
13234 | 3478 maxsiglen = (guint16) va_arg(ap, int); |
2993 | 3479 va_end(ap); |
3480 | |
8660 | 3481 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3482 "locate rights: max sig len = %d\n", maxsiglen); |
2993 | 3483 |
4617 | 3484 od->rights.maxsiglen = od->rights.maxawaymsglen = (guint)maxsiglen; |
3485 | |
3486 if (od->icq) | |
13592 | 3487 aim_locate_setcaps(od, caps_icq); |
5301 | 3488 else |
13592 | 3489 aim_locate_setcaps(od, caps_aim); |
11965 | 3490 oscar_set_info_and_status(account, TRUE, account->user_info, TRUE, |
3491 gaim_account_get_active_status(account)); | |
2993 | 3492 |
3493 return 1; | |
3494 } | |
3495 | |
13592 | 3496 static int gaim_parse_buddyrights(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3497 va_list ap; |
13234 | 3498 guint16 maxbuddies, maxwatchers; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3499 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3500 va_start(ap, fr); |
13234 | 3501 maxbuddies = (guint16) va_arg(ap, unsigned int); |
3502 maxwatchers = (guint16) va_arg(ap, unsigned int); | |
2086 | 3503 va_end(ap); |
3504 | |
8660 | 3505 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3506 "buddy list rights: Max buddies = %hu / Max watchers = %hu\n", maxbuddies, maxwatchers); |
2086 | 3507 |
4617 | 3508 od->rights.maxbuddies = (guint)maxbuddies; |
3509 od->rights.maxwatchers = (guint)maxwatchers; | |
2993 | 3510 |
2086 | 3511 return 1; |
3512 } | |
3513 | |
13592 | 3514 static int gaim_bosrights(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
11808 | 3515 GaimConnection *gc; |
3516 GaimAccount *account; | |
3517 GaimStatus *status; | |
3518 const char *message; | |
12344 | 3519 char *tmp; |
7334 | 3520 va_list ap; |
13234 | 3521 guint16 maxpermits, maxdenies; |
2086 | 3522 |
13592 | 3523 gc = od->gc; |
11808 | 3524 od = (OscarData *)gc->proto_data; |
11809 | 3525 account = gaim_connection_get_account(gc); |
11808 | 3526 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3527 va_start(ap, fr); |
13234 | 3528 maxpermits = (guint16) va_arg(ap, unsigned int); |
3529 maxdenies = (guint16) va_arg(ap, unsigned int); | |
2086 | 3530 va_end(ap); |
3531 | |
8660 | 3532 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3533 "BOS rights: Max permit = %hu / Max deny = %hu\n", maxpermits, maxdenies); |
2086 | 3534 |
4617 | 3535 od->rights.maxpermits = (guint)maxpermits; |
3536 od->rights.maxdenies = (guint)maxdenies; | |
2993 | 3537 |
5576
8c398efc88f2
[gaim-migrate @ 5980]
Christian Hammond <chipx86@chipx86.com>
parents:
5575
diff
changeset
|
3538 gaim_connection_set_state(gc, GAIM_CONNECTED); |
2993 | 3539 |
8660 | 3540 gaim_debug_info("oscar", "buddy list loaded\n"); |
2993 | 3541 |
13592 | 3542 aim_clientready(od, conn); |
11808 | 3543 |
3544 /* Set our available message based on the current status */ | |
3545 status = gaim_account_get_active_status(account); | |
3546 if (gaim_status_is_available(status)) | |
3547 message = gaim_status_get_attr_string(status, "message"); | |
11810 | 3548 else |
3549 message = NULL; | |
12344 | 3550 tmp = gaim_markup_strip_html(message); |
13592 | 3551 aim_srv_setstatusmsg(od, tmp); |
3552 g_free(tmp); | |
3553 | |
3554 aim_srv_setidle(od, 0); | |
4617 | 3555 |
4664 | 3556 if (od->icq) { |
13592 | 3557 aim_icq_reqofflinemsgs(od); |
12652 | 3558 oscar_set_extendedstatus(gc); |
13592 | 3559 aim_icq_setsecurity(od, |
10570 | 3560 gaim_account_get_bool(account, "authorization", OSCAR_DEFAULT_AUTHORIZATION), |
12652 | 3561 gaim_account_get_bool(account, "web_aware", OSCAR_DEFAULT_WEB_AWARE)); |
4664 | 3562 } |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3563 |
13592 | 3564 aim_reqservice(od, SNAC_FAMILY_CHATNAV); |
3565 if (od->authinfo->email != NULL) | |
3566 aim_reqservice(od, SNAC_FAMILY_ALERT); | |
2086 | 3567 |
3568 return 1; | |
3569 } | |
3570 | |
13592 | 3571 static int gaim_offlinemsg(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3572 va_list ap; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3573 struct aim_icq_offlinemsg *msg; |
4075 | 3574 struct aim_incomingim_ch4_args args; |
3575 time_t t; | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3576 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3577 va_start(ap, fr); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3578 msg = va_arg(ap, struct aim_icq_offlinemsg *); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3579 va_end(ap); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3580 |
8660 | 3581 gaim_debug_info("oscar", |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
3582 "Received offline message. Converting to channel 4 ICBM...\n"); |
4075 | 3583 args.uin = msg->sender; |
3584 args.type = msg->type; | |
4173 | 3585 args.flags = msg->flags; |
4076 | 3586 args.msglen = msg->msglen; |
4075 | 3587 args.msg = msg->msg; |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3588 t = gaim_time_build(msg->year, msg->month, msg->day, msg->hour, msg->minute, 0); |
13592 | 3589 incomingim_chan4(od, conn, NULL, &args, t); |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3590 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3591 return 1; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3592 } |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3593 |
13592 | 3594 static int gaim_offlinemsgdone(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3595 { |
13592 | 3596 aim_icq_ackofflinemsgs(od); |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3597 return 1; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3598 } |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3599 |
13592 | 3600 static int gaim_icqinfo(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3601 { |
13592 | 3602 GaimConnection *gc = od->gc; |
8670 | 3603 GaimBuddy *buddy; |
8853 | 3604 struct buddyinfo *bi = NULL; |
4624 | 3605 gchar who[16]; |
8670 | 3606 GString *str; |
11533
c9b815aeddc1
[gaim-migrate @ 13782]
Richard Laager <rlaager@wiktel.com>
parents:
11532
diff
changeset
|
3607 gchar *utf8; |
9634 | 3608 const gchar *alias; |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3609 va_list ap; |
4151 | 3610 struct aim_icq_info *info; |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3611 |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3612 va_start(ap, fr); |
4151 | 3613 info = va_arg(ap, struct aim_icq_info *); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3614 va_end(ap); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3615 |
4664 | 3616 if (!info->uin) |
3617 return 0; | |
3618 | |
8670 | 3619 str = g_string_sized_new(100); |
5556 | 3620 g_snprintf(who, sizeof(who), "%u", info->uin); |
8670 | 3621 buddy = gaim_find_buddy(gaim_connection_get_account(gc), who); |
3622 if (buddy != NULL) | |
3623 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(buddy->account, buddy->name)); | |
3624 | |
3625 g_string_append_printf(str, "<b>%s:</b> %s", _("UIN"), who); | |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3626 oscar_string_append(gc->account, str, "\n<br>", _("Nick"), info->nick); |
8670 | 3627 if ((bi != NULL) && (bi->ipaddr != 0)) { |
3628 char *tstr = g_strdup_printf("%hhu.%hhu.%hhu.%hhu", | |
3629 (bi->ipaddr & 0xff000000) >> 24, | |
3630 (bi->ipaddr & 0x00ff0000) >> 16, | |
3631 (bi->ipaddr & 0x0000ff00) >> 8, | |
3632 (bi->ipaddr & 0x000000ff)); | |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3633 oscar_string_append(gc->account, str, "\n<br>", _("IP Address"), tstr); |
8670 | 3634 g_free(tstr); |
3635 } | |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3636 oscar_string_append(gc->account, str, "\n<br>", _("First Name"), info->first); |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3637 oscar_string_append(gc->account, str, "\n<br>", _("Last Name"), info->last); |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3638 if (info->email && info->email[0] && (utf8 = oscar_utf8_try_convert(gc->account, info->email))) { |
13545
cfc2f7fcb3dd
[gaim-migrate @ 15922]
Richard Laager <rlaager@wiktel.com>
parents:
13477
diff
changeset
|
3639 g_string_append_printf(str, "\n<br><b>%s:</b> <a href=\"mailto:%s\">%s</a>", _("E-Mail Address"), utf8, utf8); |
8670 | 3640 g_free(utf8); |
4625 | 3641 } |
3642 if (info->numaddresses && info->email2) { | |
3643 int i; | |
3644 for (i = 0; i < info->numaddresses; i++) { | |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3645 if (info->email2[i] && info->email2[i][0] && (utf8 = oscar_utf8_try_convert(gc->account, info->email2[i]))) { |
13545
cfc2f7fcb3dd
[gaim-migrate @ 15922]
Richard Laager <rlaager@wiktel.com>
parents:
13477
diff
changeset
|
3646 g_string_append_printf(str, "\n<br><b>%s:</b> <a href=\"mailto:%s\">%s</a>", _("E-Mail Address"), utf8, utf8); |
8670 | 3647 g_free(utf8); |
4643 | 3648 } |
4625 | 3649 } |
4624 | 3650 } |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3651 oscar_string_append(gc->account, str, "\n<br>", _("Mobile Phone"), info->mobile); |
10022 | 3652 if (info->gender != 0) |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3653 oscar_string_append(gc->account, str, "\n<br>", _("Gender"), info->gender == 1 ? _("Female") : _("Male")); |
12491 | 3654 if ((info->birthyear > 1900) && (info->birthmonth > 0) && (info->birthday > 0)) { |
4627 | 3655 struct tm tm; |
3656 tm.tm_mday = (int)info->birthday; | |
3657 tm.tm_mon = (int)info->birthmonth-1; | |
3658 tm.tm_year = (int)info->birthyear-1900; | |
13104
e1e5462b7d81
[gaim-migrate @ 15466]
Richard Laager <rlaager@wiktel.com>
parents:
13074
diff
changeset
|
3659 oscar_string_append(gc->account, str, "\n<br>", _("Birthday"), |
e1e5462b7d81
[gaim-migrate @ 15466]
Richard Laager <rlaager@wiktel.com>
parents:
13074
diff
changeset
|
3660 gaim_date_format_short(&tm)); |
4151 | 3661 } |
12491 | 3662 if ((info->age > 0) && (info->age < 255)) { |
4624 | 3663 char age[5]; |
3664 snprintf(age, sizeof(age), "%hhd", info->age); | |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3665 oscar_string_append(gc->account, str, "\n<br>", _("Age"), age); |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3666 } |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3667 if (info->personalwebpage && info->personalwebpage[0] && (utf8 = oscar_utf8_try_convert(gc->account, info->personalwebpage))) { |
8670 | 3668 g_string_append_printf(str, "\n<br><b>%s:</b> <a href=\"%s\">%s</a>", _("Personal Web Page"), utf8, utf8); |
3669 g_free(utf8); | |
4819 | 3670 } |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3671 if (info->info && info->info[0] && (utf8 = oscar_utf8_try_convert(gc->account, info->info))) { |
8670 | 3672 g_string_append_printf(str, "<hr><b>%s:</b><br>%s", _("Additional Information"), utf8); |
3673 g_free(utf8); | |
3674 } | |
10683 | 3675 g_string_append_printf(str, "<hr>"); |
4641 | 3676 if ((info->homeaddr && (info->homeaddr[0])) || (info->homecity && info->homecity[0]) || (info->homestate && info->homestate[0]) || (info->homezip && info->homezip[0])) { |
8670 | 3677 g_string_append_printf(str, "<b>%s:</b>", _("Home Address")); |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3678 oscar_string_append(gc->account, str, "\n<br>", _("Address"), info->homeaddr); |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3679 oscar_string_append(gc->account, str, "\n<br>", _("City"), info->homecity); |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3680 oscar_string_append(gc->account, str, "\n<br>", _("State"), info->homestate); |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3681 oscar_string_append(gc->account, str, "\n<br>", _("Zip Code"), info->homezip); |
10683 | 3682 g_string_append_printf(str, "\n<hr>"); |
4151 | 3683 } |
4641 | 3684 if ((info->workaddr && info->workaddr[0]) || (info->workcity && info->workcity[0]) || (info->workstate && info->workstate[0]) || (info->workzip && info->workzip[0])) { |
8670 | 3685 g_string_append_printf(str, "<b>%s:</b>", _("Work Address")); |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3686 oscar_string_append(gc->account, str, "\n<br>", _("Address"), info->workaddr); |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3687 oscar_string_append(gc->account, str, "\n<br>", _("City"), info->workcity); |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3688 oscar_string_append(gc->account, str, "\n<br>", _("State"), info->workstate); |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3689 oscar_string_append(gc->account, str, "\n<br>", _("Zip Code"), info->workzip); |
10683 | 3690 g_string_append_printf(str, "\n<hr>"); |
4624 | 3691 } |
4641 | 3692 if ((info->workcompany && info->workcompany[0]) || (info->workdivision && info->workdivision[0]) || (info->workposition && info->workposition[0]) || (info->workwebpage && info->workwebpage[0])) { |
8670 | 3693 g_string_append_printf(str, "<b>%s:</b>", _("Work Information")); |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3694 oscar_string_append(gc->account, str, "\n<br>", _("Company"), info->workcompany); |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3695 oscar_string_append(gc->account, str, "\n<br>", _("Division"), info->workdivision); |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3696 oscar_string_append(gc->account, str, "\n<br>", _("Position"), info->workposition); |
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3697 if (info->workwebpage && info->workwebpage[0] && (utf8 = oscar_utf8_try_convert(gc->account, info->workwebpage))) { |
8670 | 3698 g_string_append_printf(str, "\n<br><b>%s:</b> <a href=\"%s\">%s</a>", _("Web Page"), utf8, utf8); |
3699 g_free(utf8); | |
4624 | 3700 } |
10683 | 3701 g_string_append_printf(str, "\n<hr>"); |
8670 | 3702 } |
3703 | |
9634 | 3704 if (buddy != NULL) |
3705 alias = gaim_buddy_get_alias(buddy); | |
3706 else | |
3707 alias = who; | |
11533
c9b815aeddc1
[gaim-migrate @ 13782]
Richard Laager <rlaager@wiktel.com>
parents:
11532
diff
changeset
|
3708 gaim_notify_userinfo(gc, who, str->str, NULL, NULL); |
8670 | 3709 g_string_free(str, TRUE); |
4151 | 3710 |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3711 return 1; |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3712 } |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3713 |
13592 | 3714 static int gaim_icqalias(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) |
4759 | 3715 { |
13592 | 3716 GaimConnection *gc = od->gc; |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3717 GaimAccount *account = gaim_connection_get_account(gc); |
4820 | 3718 gchar who[16], *utf8; |
6695 | 3719 GaimBuddy *b; |
4759 | 3720 va_list ap; |
3721 struct aim_icq_info *info; | |
3722 | |
3723 va_start(ap, fr); | |
3724 info = va_arg(ap, struct aim_icq_info *); | |
3725 va_end(ap); | |
3726 | |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
3727 if (info->uin && info->nick && info->nick[0] && (utf8 = oscar_utf8_try_convert(account, info->nick))) { |
5556 | 3728 g_snprintf(who, sizeof(who), "%u", info->uin); |
4820 | 3729 serv_got_alias(gc, who, utf8); |
4759 | 3730 if ((b = gaim_find_buddy(gc->account, who))) { |
7693 | 3731 gaim_blist_node_set_string((GaimBlistNode*)b, "servernick", utf8); |
4759 | 3732 } |
4820 | 3733 g_free(utf8); |
4759 | 3734 } |
3735 | |
3736 return 1; | |
3737 } | |
3738 | |
13592 | 3739 static int gaim_popup(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3740 { |
13592 | 3741 GaimConnection *gc = od->gc; |
7032 | 3742 gchar *text; |
3743 va_list ap; | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3744 char *msg, *url; |
13234 | 3745 guint16 wid, hei, delay; |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3746 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3747 va_start(ap, fr); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3748 msg = va_arg(ap, char *); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3749 url = va_arg(ap, char *); |
13234 | 3750 wid = (guint16) va_arg(ap, int); |
3751 hei = (guint16) va_arg(ap, int); | |
3752 delay = (guint16) va_arg(ap, int); | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3753 va_end(ap); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3754 |
7032 | 3755 text = g_strdup_printf("%s<br><a href=\"%s\">%s</a>", msg, url, url); |
3756 gaim_notify_formatted(gc, NULL, _("Pop-Up Message"), NULL, text, NULL, NULL); | |
3757 g_free(text); | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3758 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3759 return 1; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3760 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3761 |
13640 | 3762 static void oscar_searchresults_add_buddy_cb(GaimConnection *gc, GList *row, void *user_data) |
11359 | 3763 { |
3764 gaim_blist_request_add_buddy(gaim_connection_get_account(gc), | |
3765 g_list_nth_data(row, 0), NULL, NULL); | |
3766 } | |
3767 | |
13592 | 3768 static int gaim_parse_searchreply(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) |
7032 | 3769 { |
13592 | 3770 GaimConnection *gc = od->gc; |
11359 | 3771 GaimNotifySearchResults *results; |
3772 GaimNotifySearchColumn *column; | |
6873 | 3773 gchar *secondary; |
3774 int i, num; | |
2086 | 3775 va_list ap; |
6873 | 3776 char *email, *SNs; |
2086 | 3777 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3778 va_start(ap, fr); |
6873 | 3779 email = va_arg(ap, char *); |
2086 | 3780 num = va_arg(ap, int); |
3781 SNs = va_arg(ap, char *); | |
3782 va_end(ap); | |
3783 | |
12257
ca27de274225
[gaim-migrate @ 14559]
Richard Laager <rlaager@wiktel.com>
parents:
12254
diff
changeset
|
3784 results = gaim_notify_searchresults_new(); |
ca27de274225
[gaim-migrate @ 14559]
Richard Laager <rlaager@wiktel.com>
parents:
12254
diff
changeset
|
3785 |
ca27de274225
[gaim-migrate @ 14559]
Richard Laager <rlaager@wiktel.com>
parents:
12254
diff
changeset
|
3786 if (results == NULL) { |
ca27de274225
[gaim-migrate @ 14559]
Richard Laager <rlaager@wiktel.com>
parents:
12254
diff
changeset
|
3787 gaim_debug_error("oscar", "gaim_parse_searchreply: " |
ca27de274225
[gaim-migrate @ 14559]
Richard Laager <rlaager@wiktel.com>
parents:
12254
diff
changeset
|
3788 "Unable to display the search results.\n"); |
ca27de274225
[gaim-migrate @ 14559]
Richard Laager <rlaager@wiktel.com>
parents:
12254
diff
changeset
|
3789 gaim_notify_error(gc, NULL, |
ca27de274225
[gaim-migrate @ 14559]
Richard Laager <rlaager@wiktel.com>
parents:
12254
diff
changeset
|
3790 _("Unable to display the search results."), |
ca27de274225
[gaim-migrate @ 14559]
Richard Laager <rlaager@wiktel.com>
parents:
12254
diff
changeset
|
3791 NULL); |
12260 | 3792 return 1; |
12257
ca27de274225
[gaim-migrate @ 14559]
Richard Laager <rlaager@wiktel.com>
parents:
12254
diff
changeset
|
3793 } |
ca27de274225
[gaim-migrate @ 14559]
Richard Laager <rlaager@wiktel.com>
parents:
12254
diff
changeset
|
3794 |
12254
95fd673021f6
[gaim-migrate @ 14556]
Richard Laager <rlaager@wiktel.com>
parents:
12243
diff
changeset
|
3795 secondary = g_strdup_printf( |
95fd673021f6
[gaim-migrate @ 14556]
Richard Laager <rlaager@wiktel.com>
parents:
12243
diff
changeset
|
3796 ngettext("The following screen name is associated with %s", |
95fd673021f6
[gaim-migrate @ 14556]
Richard Laager <rlaager@wiktel.com>
parents:
12243
diff
changeset
|
3797 "The following screen names are associated with %s", |
95fd673021f6
[gaim-migrate @ 14556]
Richard Laager <rlaager@wiktel.com>
parents:
12243
diff
changeset
|
3798 num), |
95fd673021f6
[gaim-migrate @ 14556]
Richard Laager <rlaager@wiktel.com>
parents:
12243
diff
changeset
|
3799 email); |
10439 | 3800 |
13592 | 3801 column = gaim_notify_searchresults_column_new(_("Screen name")); |
11359 | 3802 gaim_notify_searchresults_column_add(results, column); |
3803 | |
3804 for (i = 0; i < num; i++) { | |
3805 GList *row = NULL; | |
3806 row = g_list_append(row, g_strdup(&SNs[i * (MAXSNLEN + 1)])); | |
3807 gaim_notify_searchresults_row_add(results, row); | |
3808 } | |
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12617
diff
changeset
|
3809 gaim_notify_searchresults_button_add(results, GAIM_NOTIFY_BUTTON_ADD, |
11359 | 3810 oscar_searchresults_add_buddy_cb); |
3811 gaim_notify_searchresults(gc, NULL, NULL, secondary, results, NULL, NULL); | |
6873 | 3812 |
3813 g_free(secondary); | |
2086 | 3814 |
3815 return 1; | |
3816 } | |
3817 | |
13592 | 3818 static int gaim_parse_searcherror(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
2086 | 3819 va_list ap; |
6873 | 3820 char *email; |
5420 | 3821 char *buf; |
2086 | 3822 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3823 va_start(ap, fr); |
6873 | 3824 email = va_arg(ap, char *); |
2086 | 3825 va_end(ap); |
3826 | |
13545
cfc2f7fcb3dd
[gaim-migrate @ 15922]
Richard Laager <rlaager@wiktel.com>
parents:
13477
diff
changeset
|
3827 buf = g_strdup_printf(_("No results found for e-mail address %s"), email); |
13592 | 3828 gaim_notify_error(od->gc, NULL, buf, NULL); |
5420 | 3829 g_free(buf); |
2086 | 3830 |
3831 return 1; | |
3832 } | |
3833 | |
13592 | 3834 static int gaim_account_confirm(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
3835 GaimConnection *gc = od->gc; | |
13234 | 3836 guint16 status; |
2086 | 3837 va_list ap; |
3838 char msg[256]; | |
3839 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3840 va_start(ap, fr); |
13234 | 3841 status = (guint16) va_arg(ap, unsigned int); /* status code of confirmation request */ |
2086 | 3842 va_end(ap); |
3843 | |
8660 | 3844 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
3845 "account confirmation returned status 0x%04x (%s)\n", status, |
13592 | 3846 status ? "unknown" : "e-mail sent"); |
3912 | 3847 if (!status) { |
13545
cfc2f7fcb3dd
[gaim-migrate @ 15922]
Richard Laager <rlaager@wiktel.com>
parents:
13477
diff
changeset
|
3848 g_snprintf(msg, sizeof(msg), _("You should receive an e-mail asking to confirm %s."), |
5575 | 3849 gaim_account_get_username(gaim_connection_get_account(gc))); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3850 gaim_notify_info(gc, NULL, _("Account Confirmation Requested"), msg); |
2086 | 3851 } |
3852 | |
3853 return 1; | |
3854 } | |
3855 | |
13592 | 3856 static int gaim_info_change(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
3857 GaimConnection *gc = od->gc; | |
2086 | 3858 va_list ap; |
13234 | 3859 guint16 perms, err; |
3912 | 3860 char *url, *sn, *email; |
3861 int change; | |
2086 | 3862 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3863 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3864 change = va_arg(ap, int); |
13234 | 3865 perms = (guint16) va_arg(ap, unsigned int); |
3866 err = (guint16) va_arg(ap, unsigned int); | |
3912 | 3867 url = va_arg(ap, char *); |
3868 sn = va_arg(ap, char *); | |
3869 email = va_arg(ap, char *); | |
2086 | 3870 va_end(ap); |
3871 | |
8660 | 3872 gaim_debug_misc("oscar", |
9626 | 3873 "account info: because of %s, perms=0x%04x, err=0x%04x, url=%s, sn=%s, email=%s\n", |
3874 change ? "change" : "request", perms, err, | |
3875 (url != NULL) ? url : "(null)", | |
3876 (sn != NULL) ? sn : "(null)", | |
3877 (email != NULL) ? email : "(null)"); | |
3878 | |
3879 if ((err > 0) && (url != NULL)) { | |
3912 | 3880 char *dialog_msg; |
3881 char *dialog_top = g_strdup_printf(_("Error Changing Account Info")); | |
3882 switch (err) { | |
3883 case 0x0001: { | |
3884 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name differs from the original."), err); | |
3885 } break; | |
3886 case 0x0006: { | |
11399 | 3887 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because it is invalid."), err); |
3912 | 3888 } break; |
3889 case 0x000b: { | |
3890 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name is too long."), err); | |
3891 } break; | |
3892 case 0x001d: { | |
13545
cfc2f7fcb3dd
[gaim-migrate @ 15922]
Richard Laager <rlaager@wiktel.com>
parents:
13477
diff
changeset
|
3893 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to change e-mail address because there is already a request pending for this screen name."), err); |
3912 | 3894 } break; |
3895 case 0x0021: { | |
13545
cfc2f7fcb3dd
[gaim-migrate @ 15922]
Richard Laager <rlaager@wiktel.com>
parents:
13477
diff
changeset
|
3896 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to change e-mail address because the given address has too many screen names associated with it."), err); |
3912 | 3897 } break; |
3898 case 0x0023: { | |
13545
cfc2f7fcb3dd
[gaim-migrate @ 15922]
Richard Laager <rlaager@wiktel.com>
parents:
13477
diff
changeset
|
3899 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to change e-mail address because the given address is invalid."), err); |
3912 | 3900 } break; |
3901 default: { | |
3902 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unknown error."), err); | |
3903 } break; | |
3904 } | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3905 gaim_notify_error(gc, NULL, dialog_top, dialog_msg); |
3912 | 3906 g_free(dialog_top); |
3907 g_free(dialog_msg); | |
3908 return 1; | |
3909 } | |
3910 | |
9626 | 3911 if (sn != NULL) { |
4585 | 3912 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
|
3913 gaim_notify_info(gc, NULL, _("Account Info"), dialog_msg); |
3912 | 3914 g_free(dialog_msg); |
3915 } | |
3916 | |
9626 | 3917 if (email != NULL) { |
13545
cfc2f7fcb3dd
[gaim-migrate @ 15922]
Richard Laager <rlaager@wiktel.com>
parents:
13477
diff
changeset
|
3918 char *dialog_msg = g_strdup_printf(_("The e-mail address for %s is %s"), |
5575 | 3919 gaim_account_get_username(gaim_connection_get_account(gc)), email); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
3920 gaim_notify_info(gc, NULL, _("Account Info"), dialog_msg); |
3912 | 3921 g_free(dialog_msg); |
2086 | 3922 } |
3923 | |
3924 return 1; | |
3925 } | |
3926 | |
13592 | 3927 static void |
3928 oscar_keepalive(GaimConnection *gc) | |
3929 { | |
3930 OscarData *od; | |
3931 FlapConnection *conn; | |
3932 | |
3933 od = (OscarData *)gc->proto_data; | |
3934 conn = flap_connection_getbytype(od, SNAC_FAMILY_LOCATE); | |
3935 if (conn != NULL) | |
3936 flap_connection_send_keepalive(od, conn); | |
3937 } | |
3938 | |
3939 static int | |
3940 oscar_send_typing(GaimConnection *gc, const char *name, int typing) | |
3941 { | |
3942 OscarData *od; | |
3943 PeerConnection *conn; | |
3944 | |
3945 od = (OscarData *)gc->proto_data; | |
3946 conn = peer_connection_find_by_type(od, name, OSCAR_CAPABILITY_DIRECTIM); | |
3947 | |
3948 if ((conn != NULL) && (conn->ready)) | |
3949 { | |
3950 peer_odc_send_typing(conn, typing); | |
3951 } | |
3595 | 3952 else { |
5300 | 3953 /* Don't send if this turkey is in our deny list */ |
3954 GSList *list; | |
3955 for (list=gc->account->deny; (list && aim_sncmp(name, list->data)); list=list->next); | |
3956 if (!list) { | |
7261 | 3957 struct buddyinfo *bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(gc->account, name)); |
5300 | 3958 if (bi && bi->typingnot) { |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
3959 if (typing == GAIM_TYPING) |
13592 | 3960 aim_im_sendmtn(od, 0x0001, name, 0x0002); |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5868
diff
changeset
|
3961 else if (typing == GAIM_TYPED) |
13592 | 3962 aim_im_sendmtn(od, 0x0001, name, 0x0001); |
5300 | 3963 else |
13592 | 3964 aim_im_sendmtn(od, 0x0001, name, 0x0000); |
5300 | 3965 } |
3595 | 3966 } |
3967 } | |
2993 | 3968 return 0; |
3969 } | |
9030 | 3970 |
13592 | 3971 /* TODO: Move this into odc.c! */ |
3972 static void | |
3973 gaim_odc_send_im(PeerConnection *conn, const char *message, GaimMessageFlags imflags) | |
3974 { | |
13601 | 3975 GString *msg; |
3976 GString *data; | |
3977 gchar *tmp; | |
3978 int tmplen; | |
3979 guint16 charset, charsubset; | |
13592 | 3980 GData *attribs; |
3981 const char *start, *end, *last; | |
3982 int oscar_id = 0; | |
3983 | |
13601 | 3984 msg = g_string_new("<HTML><BODY>"); |
3985 data = g_string_new("<BINARY>"); | |
13592 | 3986 last = message; |
3987 | |
3988 /* for each valid IMG tag... */ | |
3989 while (last && *last && gaim_markup_find_tag("img", last, &start, &end, &attribs)) | |
3990 { | |
3991 GaimStoredImage *image = NULL; | |
3992 const char *id; | |
3993 | |
3994 if (start - last) { | |
3995 g_string_append_len(msg, last, start - last); | |
3996 } | |
3997 | |
3998 id = g_datalist_get_data(&attribs, "id"); | |
3999 | |
4000 /* ... if it refers to a valid gaim image ... */ | |
4001 if (id && (image = gaim_imgstore_get(atoi(id)))) { | |
4002 /* ... append the message from start to the tag ... */ | |
4003 unsigned long size = gaim_imgstore_get_size(image); | |
4004 const char *filename = gaim_imgstore_get_filename(image); | |
4005 gpointer imgdata = gaim_imgstore_get_data(image); | |
4006 | |
4007 oscar_id++; | |
4008 | |
4009 /* ... insert a new img tag with the oscar id ... */ | |
4010 if (filename) | |
4011 g_string_append_printf(msg, | |
4012 "<IMG SRC=\"%s\" ID=\"%d\" DATASIZE=\"%lu\">", | |
4013 filename, oscar_id, size); | |
4014 else | |
4015 g_string_append_printf(msg, | |
4016 "<IMG ID=\"%d\" DATASIZE=\"%lu\">", | |
4017 oscar_id, size); | |
4018 | |
4019 /* ... and append the data to the binary section ... */ | |
4020 g_string_append_printf(data, "<DATA ID=\"%d\" SIZE=\"%lu\">", | |
4021 oscar_id, size); | |
13601 | 4022 g_string_append_len(data, imgdata, size); |
4023 g_string_append(data, "</DATA>"); | |
13592 | 4024 } |
4025 /* If the tag is invalid, skip it, thus no else here */ | |
4026 | |
4027 g_datalist_clear(&attribs); | |
4028 | |
4029 /* continue from the end of the tag */ | |
4030 last = end + 1; | |
4031 } | |
4032 | |
13601 | 4033 /* append any remaining message data */ |
13592 | 4034 if (last && *last) |
13601 | 4035 g_string_append(msg, last); |
4036 | |
4037 g_string_append(msg, "</BODY></HTML>"); | |
4038 | |
4039 /* Convert the message to a good encoding */ | |
4040 gaim_plugin_oscar_convert_to_best_encoding(conn->od->gc, | |
4041 conn->sn, msg->str, &tmp, &tmplen, &charset, &charsubset); | |
4042 g_string_free(msg, TRUE); | |
4043 msg = g_string_new_len(tmp, tmplen); | |
4044 | |
4045 /* Append any binary data that we may have */ | |
13592 | 4046 if (oscar_id) { |
4047 msg = g_string_append_len(msg, data->str, data->len); | |
4048 msg = g_string_append(msg, "</BINARY>"); | |
4049 } | |
4050 g_string_free(data, TRUE); | |
4051 | |
13601 | 4052 peer_odc_send_im(conn, msg->str, msg->len, charset, |
4053 imflags & GAIM_MESSAGE_AUTO_RESP); | |
13592 | 4054 g_string_free(msg, TRUE); |
4055 } | |
4056 | |
4057 static int | |
4058 oscar_send_im(GaimConnection *gc, const char *name, const char *message, GaimMessageFlags imflags) | |
4059 { | |
4060 OscarData *od; | |
4061 GaimAccount *account; | |
4062 PeerConnection *conn; | |
4063 int ret; | |
4064 char *iconfile; | |
12677 | 4065 char *tmp1, *tmp2; |
4066 | |
13592 | 4067 od = (OscarData *)gc->proto_data; |
4068 account = gaim_connection_get_account(gc); | |
4069 ret = 0; | |
4070 iconfile = gaim_buddy_icons_get_full_path(gaim_account_get_buddy_icon(account)); | |
4071 | |
12677 | 4072 if (imflags & GAIM_MESSAGE_AUTO_RESP) |
4073 tmp1 = gaim_str_sub_away_formatters(message, name); | |
4074 else | |
4075 tmp1 = g_strdup(message); | |
3458 | 4076 |
13592 | 4077 conn = peer_connection_find_by_type(od, name, OSCAR_CAPABILITY_DIRECTIM); |
4078 if ((conn != NULL) && (conn->ready)) | |
4079 { | |
4838 | 4080 /* If we're directly connected, send a direct IM */ |
13592 | 4081 gaim_odc_send_im(conn, tmp1, imflags); |
2086 | 4082 } else { |
4738 | 4083 struct buddyinfo *bi; |
3008 | 4084 struct aim_sendimext_args args; |
4085 struct stat st; | |
6478
338147ea6896
[gaim-migrate @ 6991]
Christian Hammond <chipx86@chipx86.com>
parents:
6465
diff
changeset
|
4086 gsize len; |
10246 | 4087 GaimConversation *conv; |
4088 | |
11338 | 4089 conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, name, account); |
8962 | 4090 |
12677 | 4091 if (strstr(tmp1, "<IMG ")) |
8962 | 4092 gaim_conversation_write(conv, "", |
4093 _("Your IM Image was not sent. " | |
4094 "You must be Direct Connected to send IM Images."), | |
4095 GAIM_MESSAGE_ERROR, time(NULL)); | |
4269 | 4096 |
10246 | 4097 bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(account, name)); |
4738 | 4098 if (!bi) { |
4099 bi = g_new0(struct buddyinfo, 1); | |
10246 | 4100 g_hash_table_insert(od->buddyinfo, g_strdup(gaim_normalize(account, name)), bi); |
4738 | 4101 } |
4102 | |
3008 | 4103 args.flags = AIM_IMFLAGS_ACK | AIM_IMFLAGS_CUSTOMFEATURES; |
4665 | 4104 if (od->icq) { |
11185 | 4105 /* We have to present different "features" (whose meaning |
11172 | 4106 is unclear and are merely a result of protocol inspection) |
4107 to offline ICQ buddies. Otherwise, the official | |
4108 ICQ client doesn't treat those messages as being "ANSI- | |
4109 encoded" (and instead, assumes them to be UTF-8). | |
4110 For more details, see SF issue 1179452. | |
4111 */ | |
4112 GaimBuddy *buddy = gaim_find_buddy(gc->account, name); | |
11910 | 4113 if (buddy && GAIM_BUDDY_IS_ONLINE(buddy)) { |
11172 | 4114 args.features = features_icq; |
4115 args.featureslen = sizeof(features_icq); | |
4116 } else { | |
4117 args.features = features_icq_offline; | |
4118 args.featureslen = sizeof(features_icq_offline); | |
4119 } | |
3008 | 4120 args.flags |= AIM_IMFLAGS_OFFLINE; |
4665 | 4121 } else { |
4122 args.features = features_aim; | |
4123 args.featureslen = sizeof(features_aim); | |
4972 | 4124 |
12216 | 4125 if (imflags & GAIM_MESSAGE_AUTO_RESP) |
4972 | 4126 args.flags |= AIM_IMFLAGS_AWAY; |
4665 | 4127 } |
4269 | 4128 |
4738 | 4129 if (bi->ico_need) { |
8660 | 4130 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4131 "Sending buddy icon request with message\n"); |
3008 | 4132 args.flags |= AIM_IMFLAGS_BUDDYREQ; |
4738 | 4133 bi->ico_need = FALSE; |
3008 | 4134 } |
4269 | 4135 |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
4136 if (iconfile && !g_stat(iconfile, &st)) { |
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
4137 FILE *file = g_fopen(iconfile, "rb"); |
3008 | 4138 if (file) { |
11159 | 4139 guchar *buf = g_malloc(st.st_size); |
13592 | 4140 /* TODO: Use g_file_get_contents()? */ |
3008 | 4141 fread(buf, 1, st.st_size, file); |
6039 | 4142 fclose(file); |
4269 | 4143 |
3008 | 4144 args.iconlen = st.st_size; |
4617 | 4145 args.iconsum = aimutil_iconsum(buf, st.st_size); |
3008 | 4146 args.iconstamp = st.st_mtime; |
4147 | |
7406 | 4148 if ((args.iconlen != bi->ico_me_len) || (args.iconsum != bi->ico_me_csum) || (args.iconstamp != bi->ico_me_time)) { |
4738 | 4149 bi->ico_informed = FALSE; |
7406 | 4150 bi->ico_sent = FALSE; |
4151 } | |
4738 | 4152 |
4153 if (!bi->ico_informed) { | |
8660 | 4154 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4155 "Claiming to have a buddy icon\n"); |
4738 | 4156 args.flags |= AIM_IMFLAGS_HASICON; |
4157 bi->ico_me_len = args.iconlen; | |
4158 bi->ico_me_csum = args.iconsum; | |
4159 bi->ico_me_time = args.iconstamp; | |
4160 bi->ico_informed = TRUE; | |
4161 } | |
4162 | |
3008 | 4163 g_free(buf); |
2086 | 4164 } |
4165 } | |
11303
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11285
diff
changeset
|
4166 g_free(iconfile); |
4269 | 4167 |
3008 | 4168 args.destsn = name; |
4269 | 4169 |
8985 | 4170 /* |
13165
c0a6b8f29035
[gaim-migrate @ 15528]
Evan Schoenberg <evan.s@dreskin.net>
parents:
13158
diff
changeset
|
4171 * If we're IMing an SMS user or an ICQ user from an ICQ account, then strip HTML. |
13226 | 4172 */ |
13168
bdb8d7beb5a7
[gaim-migrate @ 15531]
Evan Schoenberg <evan.s@dreskin.net>
parents:
13165
diff
changeset
|
4173 if (aim_sn_is_sms(name)) { |
13165
c0a6b8f29035
[gaim-migrate @ 15528]
Evan Schoenberg <evan.s@dreskin.net>
parents:
13158
diff
changeset
|
4174 /* Messaging an SMS (mobile) user */ |
13226 | 4175 tmp2 = gaim_unescape_html(tmp1); |
13165
c0a6b8f29035
[gaim-migrate @ 15528]
Evan Schoenberg <evan.s@dreskin.net>
parents:
13158
diff
changeset
|
4176 } else if (aim_sn_is_icq(gaim_account_get_username(account))) { |
10781 | 4177 if (aim_sn_is_icq(name)) |
4178 /* From ICQ to ICQ */ | |
12677 | 4179 tmp2 = gaim_unescape_html(tmp1); |
10781 | 4180 else |
4181 /* From ICQ to AIM */ | |
12677 | 4182 tmp2 = g_strdup(tmp1); |
8995 | 4183 } else { |
10785 | 4184 /* From AIM to AIM and AIM to ICQ */ |
12677 | 4185 tmp2 = g_strdup(tmp1); |
8995 | 4186 } |
12677 | 4187 g_free(tmp1); |
4188 tmp1 = tmp2; | |
4189 len = strlen(tmp1); | |
4190 | |
4191 gaim_plugin_oscar_convert_to_best_encoding(gc, name, tmp1, (char **)&args.msg, &args.msglen, &args.charset, &args.charsubset); | |
9830 | 4192 gaim_debug_info("oscar", "Sending IM, charset=0x%04hx, charsubset=0x%04hx, length=%d\n", |
4193 args.charset, args.charsubset, args.msglen); | |
13592 | 4194 ret = aim_im_sendch1_ext(od, &args); |
9830 | 4195 g_free((char *)args.msg); |
2086 | 4196 } |
4838 | 4197 |
12677 | 4198 g_free(tmp1); |
6310 | 4199 |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
4200 if (ret >= 0) |
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
4201 return 1; |
6310 | 4202 |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
4203 return ret; |
2086 | 4204 } |
4205 | |
7011 | 4206 static void oscar_get_info(GaimConnection *gc, const char *name) { |
7283 | 4207 OscarData *od = (OscarData *)gc->proto_data; |
7011 | 4208 |
9975 | 4209 if (od->icq && aim_sn_is_icq(name)) |
13592 | 4210 aim_icq_getallinfo(od, name); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4211 else |
13592 | 4212 aim_locate_getinfoshort(od, name, 0x00000003); |
7011 | 4213 } |
4214 | |
8950 | 4215 #if 0 |
7011 | 4216 static void oscar_set_dir(GaimConnection *gc, const char *first, const char *middle, const char *last, |
3466 | 4217 const char *maiden, const char *city, const char *state, const char *country, int web) { |
4617 | 4218 /* XXX - some of these things are wrong, but i'm lazy */ |
7283 | 4219 OscarData *od = (OscarData *)gc->proto_data; |
13592 | 4220 aim_locate_setdirinfo(od, first, middle, last, |
2086 | 4221 maiden, NULL, NULL, city, state, NULL, 0, web); |
4222 } | |
8950 | 4223 #endif |
2086 | 4224 |
5575 | 4225 static void oscar_set_idle(GaimConnection *gc, int time) { |
7283 | 4226 OscarData *od = (OscarData *)gc->proto_data; |
13592 | 4227 aim_srv_setidle(od, time); |
2086 | 4228 } |
4229 | |
11347 | 4230 static |
4231 gchar *gaim_prpl_oscar_convert_to_infotext(const gchar *str, gsize *ret_len, char **encoding) | |
4232 { | |
9807 | 4233 int charset = 0; |
11347 | 4234 char *encoded = NULL; |
4235 | |
4236 charset = oscar_charset_check(str); | |
4237 if (charset == AIM_CHARSET_UNICODE) { | |
4238 encoded = g_convert(str, strlen(str), "UCS-2BE", "UTF-8", NULL, ret_len, NULL); | |
4239 *encoding = "unicode-2-0"; | |
4240 } else if (charset == AIM_CHARSET_CUSTOM) { | |
4241 encoded = g_convert(str, strlen(str), "ISO-8859-1", "UTF-8", NULL, ret_len, NULL); | |
4242 *encoding = "iso-8859-1"; | |
4243 } else { | |
4244 encoded = g_strdup(str); | |
4245 *ret_len = strlen(str); | |
4246 *encoding = "us-ascii"; | |
4247 } | |
4248 | |
4249 return encoded; | |
4250 } | |
4251 | |
4252 static void | |
4253 oscar_set_info(GaimConnection *gc, const char *rawinfo) | |
4254 { | |
11965 | 4255 GaimAccount *account; |
11347 | 4256 GaimStatus *status; |
11965 | 4257 |
4258 account = gaim_connection_get_account(gc); | |
4259 status = gaim_account_get_active_status(account); | |
4260 oscar_set_info_and_status(account, TRUE, rawinfo, FALSE, status); | |
4261 } | |
4262 | |
4263 static void | |
4264 oscar_set_extendedstatus(GaimConnection *gc) | |
4265 { | |
4266 OscarData *od; | |
4267 GaimAccount *account; | |
12653 | 4268 GaimStatus *status; |
4269 const gchar *status_id; | |
13234 | 4270 guint32 data = 0x00000000; |
11965 | 4271 |
4272 od = gc->proto_data; | |
4273 account = gaim_connection_get_account(gc); | |
12653 | 4274 status = gaim_account_get_active_status(account); |
4275 status_id = gaim_status_get_id(status); | |
11965 | 4276 |
12652 | 4277 data |= AIM_ICQ_STATE_HIDEIP; |
4278 if (gaim_account_get_bool(account, "web_aware", OSCAR_DEFAULT_WEB_AWARE)) | |
4279 data |= AIM_ICQ_STATE_WEBAWARE; | |
4280 | |
12653 | 4281 if (!strcmp(status_id, OSCAR_STATUS_ID_AVAILABLE) || !strcmp(status_id, OSCAR_STATUS_ID_AVAILABLE)) |
4282 data |= AIM_ICQ_STATE_NORMAL; | |
4283 else if (!strcmp(status_id, OSCAR_STATUS_ID_AWAY)) | |
4284 data |= AIM_ICQ_STATE_AWAY; | |
4285 else if (!strcmp(status_id, OSCAR_STATUS_ID_DND)) | |
4286 data |= AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_DND | AIM_ICQ_STATE_BUSY; | |
4287 else if (!strcmp(status_id, OSCAR_STATUS_ID_NA)) | |
4288 data |= AIM_ICQ_STATE_OUT | AIM_ICQ_STATE_AWAY; | |
4289 else if (!strcmp(status_id, OSCAR_STATUS_ID_OCCUPIED)) | |
4290 data |= AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_BUSY; | |
4291 else if (!strcmp(status_id, OSCAR_STATUS_ID_FREE4CHAT)) | |
4292 data |= AIM_ICQ_STATE_CHAT; | |
4293 else if (!strcmp(status_id, OSCAR_STATUS_ID_INVISIBLE)) | |
12652 | 4294 data |= AIM_ICQ_STATE_INVISIBLE; |
12653 | 4295 else if (!strcmp(status_id, OSCAR_STATUS_ID_CUSTOM)) |
4296 data |= AIM_ICQ_STATE_OUT | AIM_ICQ_STATE_AWAY; | |
12652 | 4297 |
13592 | 4298 aim_setextstatus(od, data); |
11965 | 4299 } |
4300 | |
4301 static void | |
4302 oscar_set_info_and_status(GaimAccount *account, gboolean setinfo, const char *rawinfo, | |
4303 gboolean setstatus, GaimStatus *status) | |
4304 { | |
4305 GaimConnection *gc = gaim_account_get_connection(account); | |
4306 OscarData *od = gc->proto_data; | |
4307 GaimPresence *presence; | |
11347 | 4308 GaimStatusType *status_type; |
4309 GaimStatusPrimitive primitive; | |
11965 | 4310 gboolean invisible; |
11347 | 4311 |
4312 char *htmlinfo; | |
4313 char *info_encoding = NULL; | |
4314 char *info = NULL; | |
4315 gsize infolen = 0; | |
4316 | |
4317 const char *htmlaway; | |
4318 char *away_encoding = NULL; | |
4319 char *away = NULL; | |
4320 gsize awaylen = 0; | |
4321 | |
4322 status_type = gaim_status_get_type(status); | |
4323 primitive = gaim_status_type_get_primitive(status_type); | |
11965 | 4324 presence = gaim_account_get_presence(account); |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12588
diff
changeset
|
4325 invisible = gaim_presence_is_status_primitive_active(presence, GAIM_STATUS_INVISIBLE); |
11965 | 4326 |
4327 if (!setinfo) | |
4328 { | |
4329 /* Do nothing! */ | |
4330 } | |
4331 else if (od->rights.maxsiglen == 0) | |
4332 { | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4333 gaim_notify_warning(gc, NULL, _("Unable to set AIM profile."), |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4334 _("You have probably requested to set your " |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
4335 "profile before the login procedure completed. " |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4336 "Your profile remains unset; try setting it " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
4337 "again when you are fully connected.")); |
11965 | 4338 } |
4339 else if (rawinfo != NULL) | |
11347 | 4340 { |
4341 htmlinfo = gaim_strdup_withhtml(rawinfo); | |
4342 info = gaim_prpl_oscar_convert_to_infotext(htmlinfo, &infolen, &info_encoding); | |
4343 g_free(htmlinfo); | |
4344 | |
4345 if (infolen > od->rights.maxsiglen) | |
4346 { | |
4347 gchar *errstr; | |
4348 errstr = g_strdup_printf(ngettext("The maximum profile length of %d byte " | |
4349 "has been exceeded. Gaim has truncated it for you.", | |
4350 "The maximum profile length of %d bytes " | |
4351 "has been exceeded. Gaim has truncated it for you.", | |
4352 od->rights.maxsiglen), od->rights.maxsiglen); | |
4353 gaim_notify_warning(gc, NULL, _("Profile too long."), errstr); | |
4354 g_free(errstr); | |
4355 } | |
4356 } | |
4357 | |
11965 | 4358 if (!setstatus) |
4359 { | |
4360 /* Do nothing! */ | |
4361 } | |
4362 else if (primitive == GAIM_STATUS_AVAILABLE) | |
11347 | 4363 { |
12349 | 4364 const char *status_html; |
4365 char *status_text; | |
4366 | |
4367 status_html = gaim_status_get_attr_string(status, "message"); | |
4368 if (status_html != NULL) | |
11965 | 4369 { |
12349 | 4370 status_text = gaim_markup_strip_html(status_html); |
12617 | 4371 /* If the status_text is longer than 60 character then truncate it */ |
4372 if (strlen(status_text) > 60) | |
4373 { | |
4374 char *tmp = g_utf8_find_prev_char(status_text, &status_text[58]); | |
4375 strcpy(tmp, "..."); | |
4376 } | |
13592 | 4377 else |
4378 { | |
4379 /* User did not specify an available message */ | |
4380 status_text = NULL; | |
4381 } | |
4382 aim_srv_setstatusmsg(od, status_text); | |
4383 g_free(status_text); | |
11965 | 4384 } |
4385 | |
4386 /* This is needed for us to un-set any previous away message. */ | |
4387 away = g_strdup(""); | |
4388 } | |
4389 else if (primitive == GAIM_STATUS_AWAY) | |
4390 { | |
11347 | 4391 htmlaway = gaim_status_get_attr_string(status, "message"); |
11965 | 4392 if ((htmlaway == NULL) || (*htmlaway == '\0')) |
11347 | 4393 htmlaway = _("Away"); |
4394 away = gaim_prpl_oscar_convert_to_infotext(htmlaway, &awaylen, &away_encoding); | |
4395 | |
4396 if (awaylen > od->rights.maxawaymsglen) | |
4397 { | |
4398 gchar *errstr; | |
4399 | |
4400 errstr = g_strdup_printf(ngettext("The maximum away message length of %d byte " | |
4401 "has been exceeded. Gaim has truncated it for you.", | |
4402 "The maximum away message length of %d bytes " | |
4403 "has been exceeded. Gaim has truncated it for you.", | |
4404 od->rights.maxawaymsglen), od->rights.maxawaymsglen); | |
4405 gaim_notify_warning(gc, NULL, _("Away message too long."), errstr); | |
4406 g_free(errstr); | |
4407 } | |
4408 } | |
4409 | |
11965 | 4410 if (setstatus) |
4411 oscar_set_extendedstatus(gc); | |
4412 | |
13592 | 4413 aim_locate_setprofile(od, info_encoding, info, MIN(infolen, od->rights.maxsiglen), |
11347 | 4414 away_encoding, away, MIN(awaylen, od->rights.maxawaymsglen)); |
4415 g_free(info); | |
4416 g_free(away); | |
2086 | 4417 } |
4418 | |
9991 | 4419 static void |
4420 oscar_set_status_icq(GaimAccount *account, GaimStatus *status) | |
2993 | 4421 { |
9991 | 4422 GaimConnection *gc = gaim_account_get_connection(account); |
10646 | 4423 OscarData *od = NULL; |
9991 | 4424 |
10646 | 4425 if (gc) |
4426 od = (OscarData *)gc->proto_data; | |
4427 if (!od) | |
4428 return; | |
4429 | |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12588
diff
changeset
|
4430 if (gaim_status_type_get_primitive(gaim_status_get_type(status)) == GAIM_STATUS_INVISIBLE) |
11766 | 4431 account->perm_deny = GAIM_PRIVACY_ALLOW_USERS; |
8265 | 4432 else |
11766 | 4433 account->perm_deny = GAIM_PRIVACY_DENY_USERS; |
9991 | 4434 |
13592 | 4435 if ((od->ssi.received_data) && (aim_ssi_getpermdeny(od->ssi.local) != account->perm_deny)) |
4436 aim_ssi_setpermdeny(od, account->perm_deny, 0xffffffff); | |
4342 | 4437 |
12653 | 4438 oscar_set_extendedstatus(gc); |
2993 | 4439 } |
4440 | |
9991 | 4441 static void |
4442 oscar_set_status(GaimAccount *account, GaimStatus *status) | |
2993 | 4443 { |
10747 | 4444 gaim_debug_info("oscar", "Set status to %s\n", gaim_status_get_name(status)); |
4445 | |
10498 | 4446 if (!gaim_status_is_active(status)) |
10485 | 4447 return; |
4448 | |
11718 | 4449 if (!gaim_account_is_connected(account)) |
4450 return; | |
4451 | |
12653 | 4452 /* Set the AIM-style away message for both AIM and ICQ accounts */ |
4453 oscar_set_info_and_status(account, FALSE, NULL, TRUE, status); | |
4454 | |
4455 /* Set the ICQ status for ICQ accounts only */ | |
11718 | 4456 if (aim_sn_is_icq(gaim_account_get_username(account))) |
4457 oscar_set_status_icq(account, status); | |
2086 | 4458 } |
4459 | |
11285 | 4460 #ifdef CRAZY_WARN |
9991 | 4461 static void |
4462 oscar_warn(GaimConnection *gc, const char *name, gboolean anonymous) { | |
7283 | 4463 OscarData *od = (OscarData *)gc->proto_data; |
13592 | 4464 aim_im_warn(od, od->conn, name, anonymous ? AIM_WARN_ANON : 0); |
2086 | 4465 } |
11285 | 4466 #endif |
2086 | 4467 |
10747 | 4468 static void |
4469 oscar_add_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *group) { | |
7283 | 4470 OscarData *od = (OscarData *)gc->proto_data; |
9285 | 4471 |
4472 if (!aim_snvalid(buddy->name)) { | |
8092 | 4473 gchar *buf; |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
4474 buf = g_strdup_printf(_("Could not add the buddy %s because the screen name is invalid. Screen names must either start with a letter and contain only letters, numbers and spaces, or contain only numbers."), buddy->name); |
9627 | 4475 if (!gaim_conv_present_error(buddy->name, gaim_connection_get_account(gc), buf)) |
4476 gaim_notify_error(gc, NULL, _("Unable To Add"), buf); | |
8092 | 4477 g_free(buf); |
8150 | 4478 |
4479 /* Remove from local list */ | |
9285 | 4480 gaim_blist_remove_buddy(buddy); |
8150 | 4481 |
8092 | 4482 return; |
4483 } | |
4484 | |
13592 | 4485 if ((od->ssi.received_data) && !(aim_ssi_itemlist_finditem(od->ssi.local, group->name, buddy->name, AIM_SSI_TYPE_BUDDY))) { |
13654 | 4486 gaim_debug_info("oscar", |
4487 "ssi: adding buddy %s to group %s\n", buddy->name, group->name); | |
4488 aim_ssi_addbuddy(od, buddy->name, group->name, gaim_buddy_get_alias_only(buddy), NULL, NULL, 0); | |
4230 | 4489 } |
8150 | 4490 |
10157 | 4491 /* XXX - Should this be done from AIM accounts, as well? */ |
4759 | 4492 if (od->icq) |
13592 | 4493 aim_icq_getalias(od, buddy->name); |
9285 | 4494 } |
4495 | |
4496 static void oscar_remove_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *group) { | |
7283 | 4497 OscarData *od = (OscarData *)gc->proto_data; |
9285 | 4498 |
13592 | 4499 if (od->ssi.received_data) { |
8660 | 4500 gaim_debug_info("oscar", |
9285 | 4501 "ssi: deleting buddy %s from group %s\n", buddy->name, group->name); |
13592 | 4502 aim_ssi_delbuddy(od, buddy->name, group->name); |
4230 | 4503 } |
10866 | 4504 } |
4505 | |
5575 | 4506 static void oscar_move_buddy(GaimConnection *gc, const char *name, const char *old_group, const char *new_group) { |
7283 | 4507 OscarData *od = (OscarData *)gc->proto_data; |
13592 | 4508 if (od->ssi.received_data && strcmp(old_group, new_group)) { |
8660 | 4509 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4510 "ssi: moving buddy %s from group %s to group %s\n", name, old_group, new_group); |
13592 | 4511 aim_ssi_movebuddy(od, old_group, new_group, name); |
4269 | 4512 } |
4513 } | |
4514 | |
5575 | 4515 static void oscar_alias_buddy(GaimConnection *gc, const char *name, const char *alias) { |
7283 | 4516 OscarData *od = (OscarData *)gc->proto_data; |
13592 | 4517 if (od->ssi.received_data) { |
4518 char *gname = aim_ssi_itemlist_findparentname(od->ssi.local, name); | |
4269 | 4519 if (gname) { |
8660 | 4520 gaim_debug_info("oscar", |
9586 | 4521 "ssi: changing the alias for buddy %s to %s\n", name, alias ? alias : "(none)"); |
13592 | 4522 aim_ssi_aliasbuddy(od, gname, name, alias); |
4269 | 4523 } |
4524 } | |
4525 } | |
4526 | |
11005 | 4527 /* |
4528 * FYI, the OSCAR SSI code removes empty groups automatically. | |
4529 */ | |
9285 | 4530 static void oscar_rename_group(GaimConnection *gc, const char *old_name, GaimGroup *group, GList *moved_buddies) { |
8341 | 4531 OscarData *od = (OscarData *)gc->proto_data; |
4230 | 4532 |
13592 | 4533 if (od->ssi.received_data) { |
4534 if (aim_ssi_itemlist_finditem(od->ssi.local, group->name, NULL, AIM_SSI_TYPE_GROUP)) { | |
9285 | 4535 GList *cur, *groups = NULL; |
11643 | 4536 GaimAccount *account = gaim_connection_get_account(gc); |
9285 | 4537 |
4538 /* Make a list of what the groups each buddy is in */ | |
4539 for (cur = moved_buddies; cur != NULL; cur = cur->next) { | |
4540 GaimBlistNode *node = cur->data; | |
11002
bf03a5271395
[gaim-migrate @ 12857]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10949
diff
changeset
|
4541 /* node is GaimBuddy, parent is a GaimContact. |
bf03a5271395
[gaim-migrate @ 12857]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10949
diff
changeset
|
4542 * We must go two levels up to get the Group */ |
bf03a5271395
[gaim-migrate @ 12857]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10949
diff
changeset
|
4543 groups = g_list_append(groups, |
bf03a5271395
[gaim-migrate @ 12857]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10949
diff
changeset
|
4544 node->parent->parent); |
9285 | 4545 } |
4546 | |
11643 | 4547 gaim_account_remove_buddies(account, moved_buddies, groups); |
4548 gaim_account_add_buddies(account, moved_buddies); | |
9285 | 4549 g_list_free(groups); |
8660 | 4550 gaim_debug_info("oscar", |
9285 | 4551 "ssi: moved all buddies from group %s to %s\n", old_name, group->name); |
4230 | 4552 } else { |
13592 | 4553 aim_ssi_rename_group(od, old_name, group->name); |
8660 | 4554 gaim_debug_info("oscar", |
9285 | 4555 "ssi: renamed group %s to %s\n", old_name, group->name); |
2995 | 4556 } |
4557 } | |
4558 } | |
4559 | |
5968 | 4560 static gboolean gaim_ssi_rerequestdata(gpointer data) { |
13592 | 4561 OscarData *od = data; |
4562 | |
4563 aim_ssi_reqdata(od); | |
12663 | 4564 |
13060 | 4565 return TRUE; |
5968 | 4566 } |
4567 | |
13592 | 4568 static int gaim_ssi_parseerr(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
4569 GaimConnection *gc = od->gc; | |
4642 | 4570 va_list ap; |
13234 | 4571 guint16 reason; |
4642 | 4572 |
4573 va_start(ap, fr); | |
13234 | 4574 reason = (guint16)va_arg(ap, unsigned int); |
4642 | 4575 va_end(ap); |
4576 | |
8660 | 4577 gaim_debug_error("oscar", "ssi: SNAC error %hu\n", reason); |
4642 | 4578 |
4579 if (reason == 0x0005) { | |
5892 | 4580 gaim_notify_error(gc, NULL, _("Unable To Retrieve Buddy List"), |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
4581 _("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.")); |
12663 | 4582 if (od->getblisttimer > 0) |
4583 gaim_timeout_remove(od->getblisttimer); | |
13592 | 4584 od->getblisttimer = gaim_timeout_add(30000, gaim_ssi_rerequestdata, od); |
4642 | 4585 } |
4586 | |
11965 | 4587 oscar_set_extendedstatus(gc); |
4588 | |
4642 | 4589 /* Activate SSI */ |
4590 /* Sending the enable causes other people to be able to see you, and you to see them */ | |
4591 /* Make sure your privacy setting/invisibility is set how you want it before this! */ | |
8660 | 4592 gaim_debug_info("oscar", "ssi: activating server-stored buddy list\n"); |
13592 | 4593 aim_ssi_enable(od); |
4642 | 4594 |
4595 return 1; | |
4596 } | |
4597 | |
13592 | 4598 static int gaim_ssi_parserights(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
9982 | 4599 int i; |
4600 va_list ap; | |
4601 int numtypes; | |
13234 | 4602 guint16 *maxitems; |
2991 | 4603 |
4604 va_start(ap, fr); | |
4230 | 4605 numtypes = va_arg(ap, int); |
13234 | 4606 maxitems = va_arg(ap, guint16 *); |
2991 | 4607 va_end(ap); |
4608 | |
8660 | 4609 gaim_debug_misc("oscar", "ssi rights:"); |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
4610 |
4230 | 4611 for (i=0; i<numtypes; i++) |
8660 | 4612 gaim_debug_misc(NULL, " max type 0x%04x=%hd,", |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
4613 i, maxitems[i]); |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5208
diff
changeset
|
4614 |
8660 | 4615 gaim_debug_misc(NULL, "\n"); |
4230 | 4616 |
4617 if (numtypes >= 0) | |
4618 od->rights.maxbuddies = maxitems[0]; | |
4619 if (numtypes >= 1) | |
4620 od->rights.maxgroups = maxitems[1]; | |
4621 if (numtypes >= 2) | |
4622 od->rights.maxpermits = maxitems[2]; | |
4623 if (numtypes >= 3) | |
4624 od->rights.maxdenies = maxitems[3]; | |
2991 | 4625 |
4626 return 1; | |
4627 } | |
4628 | |
13592 | 4629 static int gaim_ssi_parselist(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) |
11965 | 4630 { |
4631 GaimConnection *gc; | |
4632 GaimAccount *account; | |
8150 | 4633 GaimGroup *g; |
4634 GaimBuddy *b; | |
2995 | 4635 struct aim_ssi_item *curitem; |
13234 | 4636 guint32 tmp; |
4230 | 4637 va_list ap; |
13234 | 4638 guint16 fmtver, numitems; |
4639 guint32 timestamp; | |
4230 | 4640 |
13592 | 4641 gc = od->gc; |
11965 | 4642 od = gc->proto_data; |
4643 account = gaim_connection_get_account(gc); | |
4644 | |
4230 | 4645 va_start(ap, fr); |
13234 | 4646 fmtver = (guint16)va_arg(ap, int); |
4647 numitems = (guint16)va_arg(ap, int); | |
4648 timestamp = va_arg(ap, guint32); | |
8219 | 4649 va_end(ap); |
2991 | 4650 |
12663 | 4651 /* Don't attempt to re-request our buddy list later */ |
4652 if (od->getblisttimer != 0) | |
4653 gaim_timeout_remove(od->getblisttimer); | |
4654 od->getblisttimer = 0; | |
4655 | |
8660 | 4656 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4657 "ssi: syncing local list and server list\n"); |
2991 | 4658 |
8219 | 4659 if ((timestamp == 0) || (numitems == 0)) { |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
4660 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 | 4661 return 1; |
4662 } | |
4663 | |
2991 | 4664 /* Clean the buddy list */ |
13592 | 4665 aim_ssi_cleanlist(od); |
2991 | 4666 |
8150 | 4667 { /* If not in server list then prune from local list */ |
4668 GaimBlistNode *gnode, *cnode, *bnode; | |
4669 GaimBuddyList *blist; | |
9539 | 4670 GSList *cur, *next; |
8150 | 4671 |
4672 /* Buddies */ | |
4673 cur = NULL; | |
4674 if ((blist = gaim_get_blist()) != NULL) { | |
4675 for (gnode = blist->root; gnode; gnode = gnode->next) { | |
4676 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
4677 continue; | |
4678 g = (GaimGroup *)gnode; | |
4679 for (cnode = gnode->child; cnode; cnode = cnode->next) { | |
4680 if(!GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
4681 continue; | |
4682 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
4683 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
4684 continue; | |
4685 b = (GaimBuddy *)bnode; | |
4686 if (b->account == gc->account) { | |
13592 | 4687 if (aim_ssi_itemlist_exists(od->ssi.local, b->name)) { |
8150 | 4688 /* If the buddy is an ICQ user then load his nickname */ |
4689 const char *servernick = gaim_blist_node_get_string((GaimBlistNode*)b, "servernick"); | |
8214 | 4690 char *alias; |
8150 | 4691 if (servernick) |
4692 serv_got_alias(gc, b->name, servernick); | |
4693 | |
4694 /* Store local alias on server */ | |
13592 | 4695 alias = aim_ssi_getalias(od->ssi.local, g->name, b->name); |
8150 | 4696 if (!alias && b->alias && strlen(b->alias)) |
13592 | 4697 aim_ssi_aliasbuddy(od, g->name, b->name, b->alias); |
4698 g_free(alias); | |
8150 | 4699 } else { |
8660 | 4700 gaim_debug_info("oscar", |
8150 | 4701 "ssi: removing buddy %s from local list\n", b->name); |
4702 /* We can't actually remove now because it will screw up our looping */ | |
4703 cur = g_slist_prepend(cur, b); | |
4704 } | |
4705 } | |
4706 } | |
4707 } | |
4708 } | |
4709 } | |
8175 | 4710 |
8150 | 4711 while (cur != NULL) { |
4712 b = cur->data; | |
4713 cur = g_slist_remove(cur, b); | |
4714 gaim_blist_remove_buddy(b); | |
4715 } | |
4716 | |
4717 /* Permit list */ | |
4718 if (gc->account->permit) { | |
9539 | 4719 next = gc->account->permit; |
4720 while (next != NULL) { | |
4721 cur = next; | |
4722 next = next->next; | |
13592 | 4723 if (!aim_ssi_itemlist_finditem(od->ssi.local, NULL, cur->data, AIM_SSI_TYPE_PERMIT)) { |
8660 | 4724 gaim_debug_info("oscar", |
8150 | 4725 "ssi: removing permit %s from local list\n", (const char *)cur->data); |
4726 gaim_privacy_permit_remove(account, cur->data, TRUE); | |
4727 } | |
9539 | 4728 } |
8150 | 4729 } |
4730 | |
4731 /* Deny list */ | |
4732 if (gc->account->deny) { | |
9539 | 4733 next = gc->account->deny; |
4734 while (next != NULL) { | |
4735 cur = next; | |
4736 next = next->next; | |
13592 | 4737 if (!aim_ssi_itemlist_finditem(od->ssi.local, NULL, cur->data, AIM_SSI_TYPE_DENY)) { |
8660 | 4738 gaim_debug_info("oscar", |
8150 | 4739 "ssi: removing deny %s from local list\n", (const char *)cur->data); |
4740 gaim_privacy_deny_remove(account, cur->data, TRUE); | |
4741 } | |
9539 | 4742 } |
8150 | 4743 } |
4744 /* Presence settings (idle time visibility) */ | |
13592 | 4745 if ((tmp = aim_ssi_getpresence(od->ssi.local)) != 0xFFFFFFFF) |
8150 | 4746 if (!(tmp & 0x400)) |
13592 | 4747 aim_ssi_setpresence(od, tmp | 0x400); |
8150 | 4748 } /* end pruning buddies from local list */ |
4749 | |
2991 | 4750 /* Add from server list to local list */ |
13592 | 4751 for (curitem=od->ssi.local; curitem; curitem=curitem->next) { |
7328 | 4752 if ((curitem->name == NULL) || (g_utf8_validate(curitem->name, -1, NULL))) |
2991 | 4753 switch (curitem->type) { |
4230 | 4754 case 0x0000: { /* Buddy */ |
4251 | 4755 if (curitem->name) { |
13592 | 4756 char *gname = aim_ssi_itemlist_findparentname(od->ssi.local, curitem->name); |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
4757 char *gname_utf8 = gname ? oscar_utf8_try_convert(gc->account, gname) : NULL; |
13592 | 4758 char *alias = aim_ssi_getalias(od->ssi.local, gname, curitem->name); |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
4759 char *alias_utf8 = alias ? oscar_utf8_try_convert(gc->account, alias) : NULL; |
8150 | 4760 b = gaim_find_buddy(gc->account, curitem->name); |
4458 | 4761 /* Should gname be freed here? -- elb */ |
4754 | 4762 /* Not with the current code, but that might be cleaner -- med */ |
13592 | 4763 g_free(alias); |
8150 | 4764 if (b) { |
4292 | 4765 /* Get server stored alias */ |
4705 | 4766 if (alias_utf8) { |
8150 | 4767 g_free(b->alias); |
4768 b->alias = g_strdup(alias_utf8); | |
4705 | 4769 } |
4282 | 4770 } else { |
8150 | 4771 b = gaim_buddy_new(gc->account, curitem->name, alias_utf8); |
5146 | 4772 |
4754 | 4773 if (!(g = gaim_find_group(gname_utf8 ? gname_utf8 : _("Orphans")))) { |
4687 | 4774 g = gaim_group_new(gname_utf8 ? gname_utf8 : _("Orphans")); |
4754 | 4775 gaim_blist_add_group(g, NULL); |
4776 } | |
5146 | 4777 |
8660 | 4778 gaim_debug_info("oscar", |
9285 | 4779 "ssi: adding buddy %s to group %s to local list\n", curitem->name, gname_utf8 ? gname_utf8 : _("Orphans")); |
8150 | 4780 gaim_blist_add_buddy(b, NULL, g, NULL); |
4251 | 4781 } |
8341 | 4782 if (!aim_sncmp(curitem->name, account->username)) { |
13592 | 4783 char *comment = aim_ssi_getcomment(od->ssi.local, gname, curitem->name); |
8341 | 4784 gaim_check_comment(od, comment); |
13592 | 4785 g_free(comment); |
8341 | 4786 } |
7162 | 4787 g_free(gname_utf8); |
4788 g_free(alias_utf8); | |
2991 | 4789 } |
4230 | 4790 } break; |
4791 | |
4792 case 0x0001: { /* Group */ | |
4282 | 4793 /* Shouldn't add empty groups */ |
4230 | 4794 } break; |
4795 | |
4796 case 0x0002: { /* Permit buddy */ | |
2991 | 4797 if (curitem->name) { |
4230 | 4798 /* if (!find_permdeny_by_name(gc->permit, curitem->name)) { AAA */ |
2991 | 4799 GSList *list; |
5575 | 4800 for (list=account->permit; (list && aim_sncmp(curitem->name, list->data)); list=list->next); |
2991 | 4801 if (!list) { |
8660 | 4802 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4803 "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
|
4804 gaim_privacy_permit_add(account, curitem->name, TRUE); |
2991 | 4805 } |
4806 } | |
4230 | 4807 } break; |
4808 | |
4809 case 0x0003: { /* Deny buddy */ | |
2991 | 4810 if (curitem->name) { |
4811 GSList *list; | |
5575 | 4812 for (list=account->deny; (list && aim_sncmp(curitem->name, list->data)); list=list->next); |
2991 | 4813 if (!list) { |
8660 | 4814 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4815 "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
|
4816 gaim_privacy_deny_add(account, curitem->name, TRUE); |
2991 | 4817 } |
4818 } | |
4230 | 4819 } break; |
4820 | |
4821 case 0x0004: { /* Permit/deny setting */ | |
2991 | 4822 if (curitem->data) { |
13234 | 4823 guint8 permdeny; |
13592 | 4824 if ((permdeny = aim_ssi_getpermdeny(od->ssi.local)) && (permdeny != account->perm_deny)) { |
8660 | 4825 gaim_debug_info("oscar", |
5575 | 4826 "ssi: changing permdeny from %d to %hhu\n", account->perm_deny, permdeny); |
4827 account->perm_deny = permdeny; | |
11766 | 4828 if (od->icq && account->perm_deny == GAIM_PRIVACY_ALLOW_USERS) { |
4829 gaim_presence_set_status_active(account->presence, OSCAR_STATUS_ID_INVISIBLE, TRUE); | |
4342 | 4830 } |
2991 | 4831 } |
4832 } | |
4230 | 4833 } break; |
4834 | |
4835 case 0x0005: { /* Presence setting */ | |
3109 | 4836 /* We don't want to change Gaim's setting because it applies to all accounts */ |
4230 | 4837 } break; |
2991 | 4838 } /* End of switch on curitem->type */ |
4839 } /* End of for loop */ | |
4230 | 4840 |
11965 | 4841 oscar_set_extendedstatus(gc); |
4901 | 4842 |
4342 | 4843 /* Activate SSI */ |
4844 /* Sending the enable causes other people to be able to see you, and you to see them */ | |
4845 /* Make sure your privacy setting/invisibility is set how you want it before this! */ | |
8660 | 4846 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4847 "ssi: activating server-stored buddy list\n"); |
13592 | 4848 aim_ssi_enable(od); |
4342 | 4849 |
2991 | 4850 return 1; |
2086 | 4851 } |
4230 | 4852 |
13592 | 4853 static int gaim_ssi_parseack(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
4854 GaimConnection *gc = od->gc; | |
4230 | 4855 va_list ap; |
4856 struct aim_ssi_tmp *retval; | |
4857 | |
4858 va_start(ap, fr); | |
4859 retval = va_arg(ap, struct aim_ssi_tmp *); | |
4860 va_end(ap); | |
4861 | |
4862 while (retval) { | |
8660 | 4863 gaim_debug_misc("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4864 "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 | 4865 |
4866 if (retval->ack != 0xffff) | |
4867 switch (retval->ack) { | |
4868 case 0x0000: { /* added successfully */ | |
4869 } break; | |
4870 | |
4829 | 4871 case 0x000c: { /* you are over the limit, the cheat is to the limit, come on fhqwhgads */ |
4872 gchar *buf; | |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
4873 buf = g_strdup_printf(_("Could not add the buddy %s because you have too many buddies in your buddy list. Please remove one and try again."), (retval->name ? retval->name : _("(no name)"))); |
9758 | 4874 if ((retval->name != NULL) && !gaim_conv_present_error(retval->name, gaim_connection_get_account(gc), buf)) |
9627 | 4875 gaim_notify_error(gc, NULL, _("Unable To Add"), buf); |
4829 | 4876 g_free(buf); |
4877 } | |
4878 | |
7023 | 4879 case 0x000e: { /* buddy requires authorization */ |
13592 | 4880 if ((retval->action == SNAC_SUBTYPE_FEEDBAG_ADD) && (retval->name)) |
4269 | 4881 gaim_auth_sendrequest(gc, retval->name); |
4230 | 4882 } break; |
4883 | |
4884 default: { /* La la la */ | |
5197 | 4885 gchar *buf; |
8660 | 4886 gaim_debug_error("oscar", "ssi: Action 0x%04hx was unsuccessful with error 0x%04hx\n", retval->action, retval->ack); |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
4887 buf = g_strdup_printf(_("Could not add the buddy %s for an unknown reason. The most common reason for this is that you have the maximum number of allowed buddies in your buddy list."), (retval->name ? retval->name : _("(no name)"))); |
9758 | 4888 if ((retval->name != NULL) && !gaim_conv_present_error(retval->name, gaim_connection_get_account(gc), buf)) |
9627 | 4889 gaim_notify_error(gc, NULL, _("Unable To Add"), buf); |
5197 | 4890 g_free(buf); |
4230 | 4891 } break; |
4892 } | |
4893 | |
4894 retval = retval->next; | |
4895 } | |
4896 | |
4897 return 1; | |
4898 } | |
4899 | |
13592 | 4900 static int gaim_ssi_parseadd(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
4901 GaimConnection *gc = od->gc; | |
8227 | 4902 char *gname, *gname_utf8, *alias, *alias_utf8; |
4903 GaimBuddy *b; | |
4904 GaimGroup *g; | |
4905 va_list ap; | |
13234 | 4906 guint16 type; |
8227 | 4907 const char *name; |
4908 | |
4909 va_start(ap, fr); | |
13234 | 4910 type = (guint16)va_arg(ap, int); |
8227 | 4911 name = va_arg(ap, char *); |
4912 va_end(ap); | |
4913 | |
4914 if ((type != 0x0000) || (name == NULL)) | |
4915 return 1; | |
4916 | |
13592 | 4917 gname = aim_ssi_itemlist_findparentname(od->ssi.local, name); |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
4918 gname_utf8 = gname ? oscar_utf8_try_convert(gc->account, gname) : NULL; |
13592 | 4919 alias = aim_ssi_getalias(od->ssi.local, gname, name); |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
4920 alias_utf8 = alias ? oscar_utf8_try_convert(gc->account, alias) : NULL; |
8227 | 4921 b = gaim_find_buddy(gc->account, name); |
13592 | 4922 g_free(alias); |
8227 | 4923 |
4924 if (b) { | |
4925 /* Get server stored alias */ | |
4926 if (alias_utf8) { | |
4927 g_free(b->alias); | |
4928 b->alias = g_strdup(alias_utf8); | |
4929 } | |
4930 } else { | |
4931 b = gaim_buddy_new(gc->account, name, alias_utf8); | |
4932 | |
4933 if (!(g = gaim_find_group(gname_utf8 ? gname_utf8 : _("Orphans")))) { | |
4934 g = gaim_group_new(gname_utf8 ? gname_utf8 : _("Orphans")); | |
4935 gaim_blist_add_group(g, NULL); | |
4936 } | |
4937 | |
8660 | 4938 gaim_debug_info("oscar", |
9285 | 4939 "ssi: adding buddy %s to group %s to local list\n", name, gname_utf8 ? gname_utf8 : _("Orphans")); |
8227 | 4940 gaim_blist_add_buddy(b, NULL, g, NULL); |
4941 } | |
4942 g_free(gname_utf8); | |
4943 g_free(alias_utf8); | |
4944 | |
4945 return 1; | |
4946 } | |
4947 | |
13592 | 4948 static int gaim_ssi_authgiven(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
4949 GaimConnection *gc = od->gc; | |
4230 | 4950 va_list ap; |
4951 char *sn, *msg; | |
4236 | 4952 gchar *dialog_msg, *nombre; |
4230 | 4953 struct name_data *data; |
6695 | 4954 GaimBuddy *buddy; |
4230 | 4955 |
4956 va_start(ap, fr); | |
4957 sn = va_arg(ap, char *); | |
4958 msg = va_arg(ap, char *); | |
4959 va_end(ap); | |
4960 | |
8660 | 4961 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
4962 "ssi: %s has given you permission to add him to your buddy list\n", sn); |
4230 | 4963 |
4687 | 4964 buddy = gaim_find_buddy(gc->account, sn); |
9620 | 4965 if (buddy && (gaim_buddy_get_alias_only(buddy))) |
4966 nombre = g_strdup_printf("%s (%s)", sn, gaim_buddy_get_alias_only(buddy)); | |
4236 | 4967 else |
4968 nombre = g_strdup(sn); | |
4969 | |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
4970 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 | 4971 data = g_new(struct name_data, 1); |
4972 data->gc = gc; | |
4973 data->name = g_strdup(sn); | |
4974 data->nick = NULL; | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
4975 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
4976 gaim_request_yes_no(gc, NULL, _("Authorization Given"), dialog_msg, |
10116 | 4977 GAIM_DEFAULT_ACTION_NONE, data, |
7023 | 4978 G_CALLBACK(gaim_icq_buddyadd), |
5836 | 4979 G_CALLBACK(oscar_free_name_data)); |
4236 | 4980 |
4230 | 4981 g_free(dialog_msg); |
4236 | 4982 g_free(nombre); |
4230 | 4983 |
4984 return 1; | |
4985 } | |
4986 | |
13592 | 4987 static int gaim_ssi_authrequest(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
4988 GaimConnection *gc = od->gc; | |
4230 | 4989 va_list ap; |
11102
eac408c8900f
[gaim-migrate @ 13142]
Richard Laager <rlaager@wiktel.com>
parents:
11084
diff
changeset
|
4990 char *sn; |
eac408c8900f
[gaim-migrate @ 13142]
Richard Laager <rlaager@wiktel.com>
parents:
11084
diff
changeset
|
4991 char *msg; |
eac408c8900f
[gaim-migrate @ 13142]
Richard Laager <rlaager@wiktel.com>
parents:
11084
diff
changeset
|
4992 GaimAccount *account = gaim_connection_get_account(gc); |
eac408c8900f
[gaim-migrate @ 13142]
Richard Laager <rlaager@wiktel.com>
parents:
11084
diff
changeset
|
4993 gchar *nombre; |
11567
603a0e626332
[gaim-migrate @ 13834]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11537
diff
changeset
|
4994 gchar *reason = NULL; |
11102
eac408c8900f
[gaim-migrate @ 13142]
Richard Laager <rlaager@wiktel.com>
parents:
11084
diff
changeset
|
4995 gchar *dialog_msg; |
4230 | 4996 struct name_data *data; |
6695 | 4997 GaimBuddy *buddy; |
4230 | 4998 |
4999 va_start(ap, fr); | |
5000 sn = va_arg(ap, char *); | |
5001 msg = va_arg(ap, char *); | |
5002 va_end(ap); | |
5003 | |
8660 | 5004 gaim_debug_info("oscar", |
5219
e807abdcee83
[gaim-migrate @ 5589]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
5005 "ssi: received authorization request from %s\n", sn); |
4230 | 5006 |
11102
eac408c8900f
[gaim-migrate @ 13142]
Richard Laager <rlaager@wiktel.com>
parents:
11084
diff
changeset
|
5007 buddy = gaim_find_buddy(account, sn); |
9620 | 5008 if (buddy && (gaim_buddy_get_alias_only(buddy))) |
5009 nombre = g_strdup_printf("%s (%s)", sn, gaim_buddy_get_alias_only(buddy)); | |
4236 | 5010 else |
5011 nombre = g_strdup(sn); | |
5012 | |
11102
eac408c8900f
[gaim-migrate @ 13142]
Richard Laager <rlaager@wiktel.com>
parents:
11084
diff
changeset
|
5013 if (msg != NULL) |
eac408c8900f
[gaim-migrate @ 13142]
Richard Laager <rlaager@wiktel.com>
parents:
11084
diff
changeset
|
5014 reason = gaim_plugin_oscar_decode_im_part(account, sn, AIM_CHARSET_CUSTOM, 0x0000, msg, strlen(msg)); |
11567
603a0e626332
[gaim-migrate @ 13834]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11537
diff
changeset
|
5015 |
603a0e626332
[gaim-migrate @ 13834]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11537
diff
changeset
|
5016 if (reason == NULL) |
11102
eac408c8900f
[gaim-migrate @ 13142]
Richard Laager <rlaager@wiktel.com>
parents:
11084
diff
changeset
|
5017 reason = g_strdup(_("No reason given.")); |
eac408c8900f
[gaim-migrate @ 13142]
Richard Laager <rlaager@wiktel.com>
parents:
11084
diff
changeset
|
5018 |
10949 | 5019 dialog_msg = g_strdup_printf( |
13381
d1b29fb3b6d0
[gaim-migrate @ 15754]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13356
diff
changeset
|
5020 _("The user %s wants to add %s to their buddy list for the following reason:\n%s"), |
11102
eac408c8900f
[gaim-migrate @ 13142]
Richard Laager <rlaager@wiktel.com>
parents:
11084
diff
changeset
|
5021 nombre, gaim_account_get_username(account), reason); |
eac408c8900f
[gaim-migrate @ 13142]
Richard Laager <rlaager@wiktel.com>
parents:
11084
diff
changeset
|
5022 g_free(reason); |
10949 | 5023 |
4230 | 5024 data = g_new(struct name_data, 1); |
5025 data->gc = gc; | |
5026 data->name = g_strdup(sn); | |
5027 data->nick = NULL; | |
5498
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5028 |
cce2d7868c78
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5497
diff
changeset
|
5029 gaim_request_action(gc, NULL, _("Authorization Request"), dialog_msg, |
9972 | 5030 GAIM_DEFAULT_ACTION_NONE, data, 2, |
12603
e4e47871c373
[gaim-migrate @ 14938]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
5031 _("_Authorize"), G_CALLBACK(gaim_auth_grant), |
e4e47871c373
[gaim-migrate @ 14938]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
5032 _("_Deny"), G_CALLBACK(gaim_auth_dontgrant_msgprompt)); |
4236 | 5033 |
4230 | 5034 g_free(dialog_msg); |
4236 | 5035 g_free(nombre); |
4230 | 5036 |
5037 return 1; | |
5038 } | |
5039 | |
13592 | 5040 static int gaim_ssi_authreply(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
5041 GaimConnection *gc = od->gc; | |
4230 | 5042 va_list ap; |
5043 char *sn, *msg; | |
4236 | 5044 gchar *dialog_msg, *nombre; |
13234 | 5045 guint8 reply; |
6695 | 5046 GaimBuddy *buddy; |
4230 | 5047 |
5048 va_start(ap, fr); | |
5049 sn = va_arg(ap, char *); | |
13234 | 5050 reply = (guint8)va_arg(ap, int); |
4230 | 5051 msg = va_arg(ap, char *); |
5052 va_end(ap); | |
5053 | |
8660 | 5054 gaim_debug_info("oscar", |
10816
c94f40ffcafb
[gaim-migrate @ 12471]
Luke Schierer <lschiere@pidgin.im>
parents:
10812
diff
changeset
|
5055 "ssi: received authorization reply from %s. Reply is 0x%04hhx\n", sn, reply); |
4236 | 5056 |
4687 | 5057 buddy = gaim_find_buddy(gc->account, sn); |
9620 | 5058 if (buddy && (gaim_buddy_get_alias_only(buddy))) |
5059 nombre = g_strdup_printf("%s (%s)", sn, gaim_buddy_get_alias_only(buddy)); | |
4236 | 5060 else |
5061 nombre = g_strdup(sn); | |
5062 | |
4230 | 5063 if (reply) { |
5064 /* Granted */ | |
7023 | 5065 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
|
5066 gaim_notify_info(gc, NULL, _("Authorization Granted"), dialog_msg); |
4230 | 5067 } else { |
5068 /* Denied */ | |
7023 | 5069 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
|
5070 gaim_notify_info(gc, NULL, _("Authorization Denied"), dialog_msg); |
4230 | 5071 } |
5072 g_free(dialog_msg); | |
4236 | 5073 g_free(nombre); |
4230 | 5074 |
5075 return 1; | |
5076 } | |
5077 | |
13592 | 5078 static int gaim_ssi_gotadded(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
5079 GaimConnection *gc = od->gc; | |
4230 | 5080 va_list ap; |
5081 char *sn; | |
6695 | 5082 GaimBuddy *buddy; |
4230 | 5083 |
5084 va_start(ap, fr); | |
5085 sn = va_arg(ap, char *); | |
5086 va_end(ap); | |
5087 | |
4687 | 5088 buddy = gaim_find_buddy(gc->account, sn); |
13592 | 5089 gaim_debug_info("oscar", "ssi: %s added you to their buddy list\n", sn); |
9620 | 5090 gaim_account_notify_added(gc->account, NULL, sn, (buddy ? gaim_buddy_get_alias_only(buddy) : NULL), NULL); |
4230 | 5091 |
5092 return 1; | |
5093 } | |
2086 | 5094 |
5575 | 5095 static GList *oscar_chat_info(GaimConnection *gc) { |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5096 GList *m = NULL; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5097 struct proto_chat_entry *pce; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5098 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5099 pce = g_new0(struct proto_chat_entry, 1); |
9770 | 5100 pce->label = _("_Room:"); |
5234 | 5101 pce->identifier = "room"; |
10475 | 5102 pce->required = TRUE; |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5103 m = g_list_append(m, pce); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5104 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5105 pce = g_new0(struct proto_chat_entry, 1); |
7841 | 5106 pce->label = _("_Exchange:"); |
5234 | 5107 pce->identifier = "exchange"; |
10475 | 5108 pce->required = TRUE; |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5109 pce->is_int = TRUE; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5110 pce->min = 4; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5111 pce->max = 20; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5112 m = g_list_append(m, pce); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5113 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5114 return m; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5115 } |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5116 |
12412
a88ca6da0b38
[gaim-migrate @ 14719]
Richard Laager <rlaager@wiktel.com>
parents:
12393
diff
changeset
|
5117 static GHashTable *oscar_chat_info_defaults(GaimConnection *gc, const char *chat_name) |
9754 | 5118 { |
5119 GHashTable *defaults; | |
5120 | |
5121 defaults = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free); | |
5122 | |
5123 if (chat_name != NULL) | |
5124 g_hash_table_insert(defaults, "room", g_strdup(chat_name)); | |
5125 | |
5126 return defaults; | |
5127 } | |
5128 | |
13592 | 5129 static char * |
5130 oscar_get_chat_name(GHashTable *data) | |
5131 { | |
9917 | 5132 return g_strdup(g_hash_table_lookup(data, "room")); |
5133 } | |
5134 | |
13592 | 5135 static void |
5136 oscar_join_chat(GaimConnection *gc, GHashTable *data) | |
5137 { | |
8308 | 5138 OscarData *od = (OscarData *)gc->proto_data; |
13592 | 5139 FlapConnection *conn; |
5234 | 5140 char *name, *exchange; |
5141 | |
5142 name = g_hash_table_lookup(data, "room"); | |
5143 exchange = g_hash_table_lookup(data, "exchange"); | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5144 |
8308 | 5145 if ((name == NULL) || (*name == '\0')) { |
5146 gaim_notify_error(gc, NULL, _("Invalid chat name specified."), NULL); | |
5147 return; | |
5148 } | |
5149 | |
13592 | 5150 gaim_debug_info("oscar", "Attempting to join chat room %s.\n", name); |
5151 | |
5152 if ((conn = flap_connection_getbytype(od, SNAC_FAMILY_CHATNAV))) | |
5153 { | |
5154 gaim_debug_info("oscar", "chatnav exists, creating room\n"); | |
5155 aim_chatnav_createroom(od, conn, name, atoi(exchange)); | |
2086 | 5156 } else { |
5157 /* this gets tricky */ | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
5158 struct create_room *cr = g_new0(struct create_room, 1); |
13592 | 5159 gaim_debug_info("oscar", "chatnav does not exist, opening chatnav\n"); |
5234 | 5160 cr->exchange = atoi(exchange); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
5161 cr->name = g_strdup(name); |
4617 | 5162 od->create_rooms = g_slist_append(od->create_rooms, cr); |
13592 | 5163 aim_reqservice(od, SNAC_FAMILY_CHATNAV); |
5164 } | |
5165 } | |
5166 | |
5167 static void | |
5168 oscar_chat_invite(GaimConnection *gc, int id, const char *message, const char *name) | |
5169 { | |
8308 | 5170 OscarData *od = (OscarData *)gc->proto_data; |
5171 struct chat_connection *ccon = find_oscar_chat(gc, id); | |
10404 | 5172 |
5173 if (ccon == NULL) | |
2086 | 5174 return; |
10404 | 5175 |
13592 | 5176 aim_im_sendch2_chatinvite(od, name, message ? message : "", |
2086 | 5177 ccon->exchange, ccon->name, 0x0); |
5178 } | |
5179 | |
10458 | 5180 static void |
5181 oscar_chat_leave(GaimConnection *gc, int id) | |
5182 { | |
5183 GaimConversation *conv; | |
5184 struct chat_connection *cc; | |
5185 | |
5186 conv = gaim_find_chat(gc, id); | |
5187 | |
5188 g_return_if_fail(conv != NULL); | |
5189 | |
5190 gaim_debug_info("oscar", "Leaving chat room %s\n", conv->name); | |
5191 | |
5192 cc = find_oscar_chat(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(conv))); | |
5193 oscar_chat_kill(gc, cc); | |
2086 | 5194 } |
5195 | |
12216 | 5196 static int oscar_send_chat(GaimConnection *gc, int id, const char *message, GaimMessageFlags flags) { |
8219 | 5197 OscarData *od = (OscarData *)gc->proto_data; |
5198 GaimConversation *conv = NULL; | |
2086 | 5199 struct chat_connection *c = NULL; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5200 char *buf, *buf2; |
13234 | 5201 guint16 charset, charsubset; |
9807 | 5202 char *charsetstr = NULL; |
10111 | 5203 int len; |
8219 | 5204 |
5205 if (!(conv = gaim_find_chat(gc, id))) | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5206 return -EINVAL; |
2086 | 5207 |
8219 | 5208 if (!(c = find_oscar_chat_by_conv(gc, conv))) |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5209 return -EINVAL; |
2086 | 5210 |
8219 | 5211 buf = gaim_strdup_withhtml(message); |
5212 len = strlen(buf); | |
5213 | |
8962 | 5214 if (strstr(buf, "<IMG ")) |
5215 gaim_conversation_write(conv, "", | |
13226 | 5216 _("Your IM Image was not sent. " |
5217 "You cannot send IM Images in AIM chats."), | |
5218 GAIM_MESSAGE_ERROR, time(NULL)); | |
8962 | 5219 |
9830 | 5220 gaim_plugin_oscar_convert_to_best_encoding(gc, NULL, buf, &buf2, &len, &charset, &charsubset); |
8359 | 5221 if ((len > c->maxlen) || (len > c->maxvis)) { |
5222 g_free(buf2); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5223 return -E2BIG; |
8359 | 5224 } |
5225 | |
9831 | 5226 if (charset == AIM_CHARSET_ASCII) |
5227 charsetstr = "us-ascii"; | |
5228 else if (charset == AIM_CHARSET_UNICODE) | |
5229 charsetstr = "unicode-2-0"; | |
5230 else if (charset == AIM_CHARSET_CUSTOM) | |
5231 charsetstr = "iso-8859-1"; | |
13592 | 5232 aim_chat_send_im(od, c->conn, 0, buf2, len, charsetstr, "en"); |
8219 | 5233 g_free(buf2); |
8359 | 5234 |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5235 return 0; |
2086 | 5236 } |
5237 | |
10042 | 5238 static const char *oscar_list_icon(GaimAccount *a, GaimBuddy *b) |
5239 { | |
13654 | 5240 if ((b == NULL) || (b->name == NULL) || aim_sn_is_sms(b->name)) |
5241 { | |
9975 | 5242 if (a != NULL && aim_sn_is_icq(gaim_account_get_username(a))) |
4687 | 5243 return "icq"; |
5244 else | |
5245 return "aim"; | |
5246 } | |
5646
48c63ee49961
[gaim-migrate @ 6060]
Christian Hammond <chipx86@chipx86.com>
parents:
5638
diff
changeset
|
5247 |
13654 | 5248 if (aim_sn_is_icq(b->name)) |
4687 | 5249 return "icq"; |
5250 return "aim"; | |
5251 } | |
5252 | |
9972 | 5253 static void oscar_list_emblems(GaimBuddy *b, const char **se, const char **sw, const char **nw, const char **ne) |
4687 | 5254 { |
7334 | 5255 GaimConnection *gc = NULL; |
5256 OscarData *od = NULL; | |
10042 | 5257 GaimAccount *account = NULL; |
5258 GaimPresence *presence; | |
5259 GaimStatus *status; | |
5260 const char *status_id; | |
4687 | 5261 char *emblems[4] = {NULL,NULL,NULL,NULL}; |
5262 int i = 0; | |
7334 | 5263 aim_userinfo_t *userinfo = NULL; |
5264 | |
13654 | 5265 account = b->account; |
7334 | 5266 if (account != NULL) |
5267 gc = account->gc; | |
5268 if (gc != NULL) | |
5269 od = gc->proto_data; | |
7945 | 5270 if (od != NULL) |
13592 | 5271 userinfo = aim_locate_finduserinfo(od, b->name); |
4687 | 5272 |
10042 | 5273 presence = gaim_buddy_get_presence(b); |
5274 status = gaim_presence_get_active_status(presence); | |
5275 status_id = gaim_status_get_id(status); | |
5276 | |
5277 if (gaim_presence_is_online(presence) == FALSE) { | |
5131 | 5278 char *gname; |
13592 | 5279 if ((b->name) && (od) && (od->ssi.received_data) && |
5280 (gname = aim_ssi_itemlist_findparentname(od->ssi.local, b->name)) && | |
5281 (aim_ssi_waitingforauth(od->ssi.local, gname, b->name))) { | |
5131 | 5282 emblems[i++] = "notauthorized"; |
5283 } else { | |
5284 emblems[i++] = "offline"; | |
5285 } | |
5286 } | |
4916 | 5287 |
10042 | 5288 if (b->name && aim_sn_is_icq(b->name)) { |
5289 if (!strcmp(status_id, OSCAR_STATUS_ID_INVISIBLE)) | |
5290 emblems[i++] = "invisible"; | |
5291 else if (!strcmp(status_id, OSCAR_STATUS_ID_FREE4CHAT)) | |
4960 | 5292 emblems[i++] = "freeforchat"; |
10042 | 5293 else if (!strcmp(status_id, OSCAR_STATUS_ID_DND)) |
4960 | 5294 emblems[i++] = "dnd"; |
10042 | 5295 else if (!strcmp(status_id, OSCAR_STATUS_ID_NA)) |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12588
diff
changeset
|
5296 emblems[i++] = "unavailable"; |
10042 | 5297 else if (!strcmp(status_id, OSCAR_STATUS_ID_OCCUPIED)) |
4960 | 5298 emblems[i++] = "occupied"; |
10042 | 5299 else if (!strcmp(status_id, OSCAR_STATUS_ID_AWAY)) |
4766 | 5300 emblems[i++] = "away"; |
10042 | 5301 } else if (!strcmp(status_id, OSCAR_STATUS_ID_AWAY)) { |
5302 emblems[i++] = "away"; | |
5303 } | |
5304 | |
5305 if (userinfo != NULL ) { | |
5306 /* if (userinfo->flags & AIM_FLAG_UNCONFIRMED) | |
5307 emblems[i++] = "unconfirmed"; */ | |
11873
346bd669c8f2
[gaim-migrate @ 14164]
Luke Schierer <lschiere@pidgin.im>
parents:
11837
diff
changeset
|
5308 if ((i < 4) && userinfo->flags & AIM_FLAG_ADMINISTRATOR) |
10042 | 5309 emblems[i++] = "admin"; |
11873
346bd669c8f2
[gaim-migrate @ 14164]
Luke Schierer <lschiere@pidgin.im>
parents:
11837
diff
changeset
|
5310 if ((i < 4) && userinfo->flags & AIM_FLAG_AOL) |
10042 | 5311 emblems[i++] = "aol"; |
11873
346bd669c8f2
[gaim-migrate @ 14164]
Luke Schierer <lschiere@pidgin.im>
parents:
11837
diff
changeset
|
5312 if ((i < 4) && userinfo->flags & AIM_FLAG_WIRELESS) |
10042 | 5313 emblems[i++] = "wireless"; |
11873
346bd669c8f2
[gaim-migrate @ 14164]
Luke Schierer <lschiere@pidgin.im>
parents:
11837
diff
changeset
|
5314 if ((i < 4) && userinfo->flags & AIM_FLAG_ACTIVEBUDDY) |
10042 | 5315 emblems[i++] = "activebuddy"; |
5316 | |
13592 | 5317 if ((i < 4) && (userinfo->capabilities & OSCAR_CAPABILITY_HIPTOP)) |
7945 | 5318 emblems[i++] = "hiptop"; |
5319 | |
13592 | 5320 if ((i < 4) && (userinfo->capabilities & OSCAR_CAPABILITY_SECUREIM)) |
7334 | 5321 emblems[i++] = "secure"; |
10042 | 5322 } |
7334 | 5323 |
4687 | 5324 *se = emblems[0]; |
5325 *sw = emblems[1]; | |
5326 *nw = emblems[2]; | |
5327 *ne = emblems[3]; | |
5328 } | |
5329 | |
12970
ec9b92104904
[gaim-migrate @ 15323]
Richard Laager <rlaager@wiktel.com>
parents:
12948
diff
changeset
|
5330 static void oscar_tooltip_text(GaimBuddy *b, GString *str, gboolean full) { |
5575 | 5331 GaimConnection *gc = b->account->gc; |
7283 | 5332 OscarData *od = gc->proto_data; |
13592 | 5333 aim_userinfo_t *userinfo = aim_locate_finduserinfo(od, b->name); |
5131 | 5334 |
5335 if (GAIM_BUDDY_IS_ONLINE(b)) { | |
12189 | 5336 GaimPresence *presence; |
5337 GaimStatus *status; | |
5338 const char *message; | |
5339 | |
12948
563fb4f1e9fc
[gaim-migrate @ 15301]
Richard Laager <rlaager@wiktel.com>
parents:
12946
diff
changeset
|
5340 if (full) |
563fb4f1e9fc
[gaim-migrate @ 15301]
Richard Laager <rlaager@wiktel.com>
parents:
12946
diff
changeset
|
5341 oscar_string_append_info(gc, str, "\n", b, userinfo); |
7011 | 5342 |
12189 | 5343 presence = gaim_buddy_get_presence(b); |
5344 status = gaim_presence_get_active_status(presence); | |
5345 message = gaim_status_get_attr_string(status, "message"); | |
5346 | |
12433 | 5347 if (gaim_status_is_available(status)) |
5348 { | |
5349 if (message != NULL) | |
5350 { | |
12189 | 5351 /* Available status messages are plain text */ |
13592 | 5352 gchar *tmp; |
5353 tmp = g_markup_escape_text(message, -1); | |
13451 | 5354 g_string_append_printf(str, "\n<b>%s:</b> %s", _("Message"), tmp); |
5355 g_free(tmp); | |
12433 | 5356 } |
5357 } | |
5358 else | |
5359 { | |
5360 if (message != NULL) | |
5361 { | |
12189 | 5362 /* Away messages are HTML */ |
7091 | 5363 gchar *tmp1, *tmp2; |
12189 | 5364 tmp2 = gaim_markup_strip_html(message); |
10732
c4cb90065e1d
[gaim-migrate @ 12334]
Luke Schierer <lschiere@pidgin.im>
parents:
10715
diff
changeset
|
5365 tmp1 = g_markup_escape_text(tmp2, -1); |
7091 | 5366 g_free(tmp2); |
8700 | 5367 tmp2 = gaim_str_sub_away_formatters(tmp1, gaim_account_get_username(gaim_connection_get_account(gc))); |
8461 | 5368 g_free(tmp1); |
12946
a63227edcff0
[gaim-migrate @ 15299]
Richard Laager <rlaager@wiktel.com>
parents:
12943
diff
changeset
|
5369 g_string_append_printf(str, "\n<b>%s:</b> %s", _("Message"), tmp2); |
8700 | 5370 g_free(tmp2); |
5836 | 5371 } |
12433 | 5372 else |
5373 { | |
12946
a63227edcff0
[gaim-migrate @ 15299]
Richard Laager <rlaager@wiktel.com>
parents:
12943
diff
changeset
|
5374 g_string_append_printf(str, "\n<b>%s:</b> %s", _("Message"), _("<i>(retrieving)</i>")); |
12433 | 5375 } |
5131 | 5376 } |
8701 | 5377 } |
5131 | 5378 } |
5379 | |
10042 | 5380 static char *oscar_status_text(GaimBuddy *b) |
5381 { | |
5382 GaimConnection *gc; | |
12347 | 5383 GaimAccount *account; |
10042 | 5384 OscarData *od; |
12347 | 5385 const GaimPresence *presence; |
5386 const GaimStatus *status; | |
5387 const char *id; | |
5388 const char *message; | |
5167 | 5389 gchar *ret = NULL; |
5390 | |
10042 | 5391 gc = gaim_account_get_connection(gaim_buddy_get_account(b)); |
12347 | 5392 account = gaim_connection_get_account(gc); |
10042 | 5393 od = gc->proto_data; |
11248 | 5394 presence = gaim_buddy_get_presence(b); |
12347 | 5395 status = gaim_presence_get_active_status(presence); |
5396 id = gaim_status_get_id(status); | |
11248 | 5397 |
5398 if (!gaim_presence_is_online(presence)) | |
5399 { | |
13592 | 5400 char *gname = aim_ssi_itemlist_findparentname(od->ssi.local, b->name); |
5401 if (aim_ssi_waitingforauth(od->ssi.local, gname, b->name)) | |
5167 | 5402 ret = g_strdup(_("Not Authorized")); |
5403 else | |
5404 ret = g_strdup(_("Offline")); | |
5405 } | |
12365 | 5406 else if (gaim_status_is_available(status) && !strcmp(id, OSCAR_STATUS_ID_AVAILABLE)) |
12347 | 5407 { |
12365 | 5408 /* Available */ |
12347 | 5409 message = gaim_status_get_attr_string(status, "message"); |
5410 if (message != NULL) | |
5411 { | |
5412 ret = g_markup_escape_text(message, -1); | |
5413 gaim_util_chrreplace(ret, '\n', ' '); | |
5414 } | |
5415 } | |
12365 | 5416 else if (!gaim_status_is_available(status) && !strcmp(id, OSCAR_STATUS_ID_AWAY)) |
11248 | 5417 { |
12365 | 5418 /* Away */ |
12347 | 5419 message = gaim_status_get_attr_string(status, "message"); |
5420 if (message != NULL) | |
5421 { | |
5422 gchar *tmp1, *tmp2; | |
5423 tmp1 = gaim_markup_strip_html(message); | |
12361 | 5424 gaim_util_chrreplace(tmp1, '\n', ' '); |
12347 | 5425 tmp2 = g_markup_escape_text(tmp1, -1); |
5426 ret = gaim_str_sub_away_formatters(tmp2, gaim_account_get_username(account)); | |
5427 g_free(tmp1); | |
5428 g_free(tmp2); | |
5429 } | |
5430 else | |
5431 { | |
5432 ret = g_strdup(_("Away")); | |
11510 | 5433 } |
11248 | 5434 } |
5435 else | |
12347 | 5436 ret = g_strdup(gaim_status_get_name(status)); |
5167 | 5437 |
5438 return ret; | |
5439 } | |
5440 | |
5842 | 5441 |
13592 | 5442 static int oscar_icon_req(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { |
5443 GaimConnection *gc = od->gc; | |
5892 | 5444 va_list ap; |
13234 | 5445 guint16 type; |
5446 guint8 flags = 0, length = 0; | |
11159 | 5447 guchar *md5 = NULL; |
5892 | 5448 |
5842 | 5449 va_start(ap, fr); |
5450 type = va_arg(ap, int); | |
5892 | 5451 |
5452 switch(type) { | |
5453 case 0x0000: | |
5454 case 0x0001: { | |
5455 flags = va_arg(ap, int); | |
5456 length = va_arg(ap, int); | |
11159 | 5457 md5 = va_arg(ap, guchar *); |
5892 | 5458 |
5459 if (flags == 0x41) { | |
13592 | 5460 if (!flap_connection_getbytype(od, SNAC_FAMILY_BART) && !od->iconconnecting) { |
5892 | 5461 od->iconconnecting = TRUE; |
5462 od->set_icon = TRUE; | |
13592 | 5463 aim_reqservice(od, SNAC_FAMILY_BART); |
5892 | 5464 } else { |
6039 | 5465 struct stat st; |
11303
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11285
diff
changeset
|
5466 char *iconfile = gaim_buddy_icons_get_full_path(gaim_account_get_buddy_icon(gaim_connection_get_account(gc))); |
6039 | 5467 if (iconfile == NULL) { |
13592 | 5468 aim_ssi_delicon(od); |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
5469 } else if (!g_stat(iconfile, &st)) { |
11159 | 5470 guchar *buf = g_malloc(st.st_size); |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
5471 FILE *file = g_fopen(iconfile, "rb"); |
6039 | 5472 if (file) { |
9532 | 5473 /* XXX - Use g_file_get_contents()? */ |
6039 | 5474 fread(buf, 1, st.st_size, file); |
5475 fclose(file); | |
8660 | 5476 gaim_debug_info("oscar", |
10042 | 5477 "Uploading icon to icon server\n"); |
13592 | 5478 aim_bart_upload(od, buf, st.st_size); |
5892 | 5479 } else |
8660 | 5480 gaim_debug_error("oscar", |
10042 | 5481 "Can't open buddy icon file!\n"); |
6039 | 5482 g_free(buf); |
5483 } else { | |
8660 | 5484 gaim_debug_error("oscar", |
10042 | 5485 "Can't stat buddy icon file!\n"); |
5892 | 5486 } |
11303
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11285
diff
changeset
|
5487 g_free(iconfile); |
5892 | 5488 } |
8363 | 5489 } else if (flags == 0x81) { |
11303
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11285
diff
changeset
|
5490 char *iconfile = gaim_buddy_icons_get_full_path(gaim_account_get_buddy_icon(gaim_connection_get_account(gc))); |
8363 | 5491 if (iconfile == NULL) |
13592 | 5492 aim_ssi_delicon(od); |
11303
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11285
diff
changeset
|
5493 else { |
13592 | 5494 aim_ssi_seticon(od, md5, length); |
11303
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11285
diff
changeset
|
5495 g_free(iconfile); |
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11285
diff
changeset
|
5496 } |
8363 | 5497 } |
5892 | 5498 } break; |
5499 | |
5500 case 0x0002: { /* We just set an "available" message? */ | |
5501 } break; | |
5502 } | |
5503 | |
5842 | 5504 va_end(ap); |
5844 | 5505 |
5506 return 0; | |
5842 | 5507 } |
5892 | 5508 |
5575 | 5509 static void oscar_set_permit_deny(GaimConnection *gc) { |
5510 GaimAccount *account = gaim_connection_get_account(gc); | |
7283 | 5511 OscarData *od = (OscarData *)gc->proto_data; |
10866 | 5512 |
13592 | 5513 if (od->ssi.received_data) { |
8175 | 5514 switch (account->perm_deny) { |
5515 case GAIM_PRIVACY_ALLOW_ALL: | |
13592 | 5516 aim_ssi_setpermdeny(od, 0x01, 0xffffffff); |
8175 | 5517 break; |
5518 case GAIM_PRIVACY_ALLOW_BUDDYLIST: | |
13592 | 5519 aim_ssi_setpermdeny(od, 0x05, 0xffffffff); |
8175 | 5520 break; |
5521 case GAIM_PRIVACY_ALLOW_USERS: | |
13592 | 5522 aim_ssi_setpermdeny(od, 0x03, 0xffffffff); |
8175 | 5523 break; |
5524 case GAIM_PRIVACY_DENY_ALL: | |
13592 | 5525 aim_ssi_setpermdeny(od, 0x02, 0xffffffff); |
8175 | 5526 break; |
5527 case GAIM_PRIVACY_DENY_USERS: | |
13592 | 5528 aim_ssi_setpermdeny(od, 0x04, 0xffffffff); |
8175 | 5529 break; |
5530 default: | |
13592 | 5531 aim_ssi_setpermdeny(od, 0x01, 0xffffffff); |
8175 | 5532 break; |
5533 } | |
5534 } | |
2086 | 5535 } |
5536 | |
5575 | 5537 static void oscar_add_permit(GaimConnection *gc, const char *who) { |
7283 | 5538 OscarData *od = (OscarData *)gc->proto_data; |
8660 | 5539 gaim_debug_info("oscar", "ssi: About to add a permit\n"); |
13592 | 5540 if (od->ssi.received_data) |
5541 aim_ssi_addpermit(od, who); | |
2086 | 5542 } |
5543 | |
5575 | 5544 static void oscar_add_deny(GaimConnection *gc, const char *who) { |
7283 | 5545 OscarData *od = (OscarData *)gc->proto_data; |
8660 | 5546 gaim_debug_info("oscar", "ssi: About to add a deny\n"); |
13592 | 5547 if (od->ssi.received_data) |
5548 aim_ssi_adddeny(od, who); | |
2086 | 5549 } |
5550 | |
5575 | 5551 static void oscar_rem_permit(GaimConnection *gc, const char *who) { |
7283 | 5552 OscarData *od = (OscarData *)gc->proto_data; |
8660 | 5553 gaim_debug_info("oscar", "ssi: About to delete a permit\n"); |
13592 | 5554 if (od->ssi.received_data) |
5555 aim_ssi_delpermit(od, who); | |
2086 | 5556 } |
5557 | |
5575 | 5558 static void oscar_rem_deny(GaimConnection *gc, const char *who) { |
7283 | 5559 OscarData *od = (OscarData *)gc->proto_data; |
8660 | 5560 gaim_debug_info("oscar", "ssi: About to delete a deny\n"); |
13592 | 5561 if (od->ssi.received_data) |
5562 aim_ssi_deldeny(od, who); | |
2086 | 5563 } |
5564 | |
9975 | 5565 static GList * |
5566 oscar_status_types(GaimAccount *account) | |
2086 | 5567 { |
12662 | 5568 gboolean is_icq; |
9975 | 5569 GList *status_types = NULL; |
5570 GaimStatusType *type; | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
5571 |
9973 | 5572 g_return_val_if_fail(account != NULL, NULL); |
5573 | |
13007 | 5574 /* Used to flag some statuses as "user settable" or not */ |
12662 | 5575 is_icq = aim_sn_is_icq(gaim_account_get_username(account)); |
5576 | |
13007 | 5577 /* Common status types */ |
5578 /* Really the available message should only be settable for AIM accounts */ | |
5579 type = gaim_status_type_new_with_attrs(GAIM_STATUS_AVAILABLE, | |
5580 OSCAR_STATUS_ID_AVAILABLE, | |
5581 NULL, TRUE, TRUE, FALSE, | |
5582 "message", _("Message"), | |
5583 gaim_value_new(GAIM_TYPE_STRING), NULL); | |
5584 status_types = g_list_append(status_types, type); | |
5585 | |
5586 type = gaim_status_type_new_full(GAIM_STATUS_AVAILABLE, | |
5587 OSCAR_STATUS_ID_FREE4CHAT, | |
5588 _("Free For Chat"), TRUE, is_icq, FALSE); | |
5589 status_types = g_list_append(status_types, type); | |
9976 | 5590 |
10195 | 5591 type = gaim_status_type_new_with_attrs(GAIM_STATUS_AWAY, |
5592 OSCAR_STATUS_ID_AWAY, | |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12588
diff
changeset
|
5593 NULL, TRUE, TRUE, FALSE, |
10195 | 5594 "message", _("Message"), |
5595 gaim_value_new(GAIM_TYPE_STRING), NULL); | |
10042 | 5596 status_types = g_list_append(status_types, type); |
5597 | |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12588
diff
changeset
|
5598 type = gaim_status_type_new_full(GAIM_STATUS_INVISIBLE, |
10042 | 5599 OSCAR_STATUS_ID_INVISIBLE, |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12588
diff
changeset
|
5600 NULL, TRUE, TRUE, FALSE); |
10042 | 5601 status_types = g_list_append(status_types, type); |
5602 | |
5603 /* ICQ-specific status types */ | |
13007 | 5604 type = gaim_status_type_new_full(GAIM_STATUS_UNAVAILABLE, |
5605 OSCAR_STATUS_ID_OCCUPIED, | |
5606 _("Occupied"), TRUE, is_icq, FALSE); | |
5607 status_types = g_list_append(status_types, type); | |
5608 | |
5609 type = gaim_status_type_new_full(GAIM_STATUS_EXTENDED_AWAY, | |
5610 OSCAR_STATUS_ID_DND, | |
5611 _("Do Not Disturb"), TRUE, is_icq, FALSE); | |
5612 status_types = g_list_append(status_types, type); | |
5613 | |
5614 type = gaim_status_type_new_full(GAIM_STATUS_EXTENDED_AWAY, | |
5615 OSCAR_STATUS_ID_NA, | |
5616 _("Not Available"), TRUE, is_icq, FALSE); | |
5617 status_types = g_list_append(status_types, type); | |
12658 | 5618 |
5619 type = gaim_status_type_new_full(GAIM_STATUS_OFFLINE, | |
5620 OSCAR_STATUS_ID_OFFLINE, | |
5621 NULL, TRUE, TRUE, FALSE); | |
9976 | 5622 status_types = g_list_append(status_types, type); |
9975 | 5623 |
5624 return status_types; | |
4333 | 5625 } |
5626 | |
7172 | 5627 static void oscar_ssi_editcomment(struct name_data *data, const char *text) { |
8341 | 5628 GaimConnection *gc = data->gc; |
5629 OscarData *od = gc->proto_data; | |
7172 | 5630 GaimBuddy *b; |
5631 GaimGroup *g; | |
5632 | |
5633 if (!(b = gaim_find_buddy(gaim_connection_get_account(data->gc), data->name))) { | |
5634 oscar_free_name_data(data); | |
5635 return; | |
5636 } | |
5637 | |
12088 | 5638 if (!(g = gaim_buddy_get_group(b))) { |
7172 | 5639 oscar_free_name_data(data); |
5640 return; | |
5641 } | |
5642 | |
13592 | 5643 aim_ssi_editcomment(od, g->name, data->name, text); |
8341 | 5644 |
5645 if (!aim_sncmp(data->name, gc->account->username)) | |
5646 gaim_check_comment(od, text); | |
5647 | |
7172 | 5648 oscar_free_name_data(data); |
5649 } | |
5650 | |
9030 | 5651 static void oscar_buddycb_edit_comment(GaimBlistNode *node, gpointer ignore) { |
5652 | |
5653 GaimBuddy *buddy; | |
5654 GaimConnection *gc; | |
5655 OscarData *od; | |
5656 struct name_data *data; | |
7172 | 5657 GaimGroup *g; |
5658 char *comment; | |
5659 gchar *comment_utf8; | |
9631 | 5660 gchar *title; |
7172 | 5661 |
9030 | 5662 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); |
5663 | |
5664 buddy = (GaimBuddy *) node; | |
5665 gc = gaim_account_get_connection(buddy->account); | |
5666 od = gc->proto_data; | |
5667 | |
5668 data = g_new(struct name_data, 1); | |
5669 | |
12088 | 5670 if (!(g = gaim_buddy_get_group(buddy))) |
7172 | 5671 return; |
13592 | 5672 comment = aim_ssi_getcomment(od->ssi.local, g->name, buddy->name); |
12608
d13810de5bb3
[gaim-migrate @ 14944]
Richard Laager <rlaager@wiktel.com>
parents:
12603
diff
changeset
|
5673 comment_utf8 = comment ? oscar_utf8_try_convert(gc->account, comment) : NULL; |
7172 | 5674 |
5675 data->gc = gc; | |
9030 | 5676 data->name = g_strdup(buddy->name); |
7172 | 5677 data->nick = NULL; |
5678 | |
9631 | 5679 title = g_strdup_printf(_("Buddy Comment for %s"), data->name); |
5680 gaim_request_input(gc, title, _("Buddy Comment:"), NULL, | |
8697 | 5681 comment_utf8, TRUE, FALSE, NULL, |
7172 | 5682 _("OK"), G_CALLBACK(oscar_ssi_editcomment), |
5683 _("Cancel"), G_CALLBACK(oscar_free_name_data), | |
5684 data); | |
9631 | 5685 g_free(title); |
7172 | 5686 |
13592 | 5687 g_free(comment); |
7172 | 5688 g_free(comment_utf8); |
5689 } | |
5690 | |
13592 | 5691 static void |
5692 oscar_ask_directim_yes_cb(struct oscar_ask_directim_data *data) | |
5693 { | |
5694 peer_connection_propose(data->od, OSCAR_CAPABILITY_DIRECTIM, data->who); | |
5695 g_free(data->who); | |
5696 g_free(data); | |
5697 } | |
5698 | |
5699 static void | |
5700 oscar_ask_directim_no_cb(struct oscar_ask_directim_data *data) | |
5701 { | |
5702 g_free(data->who); | |
5703 g_free(data); | |
5704 } | |
5705 | |
5706 /* This is called from right-click menu on a buddy node. */ | |
5707 static void | |
5708 oscar_ask_directim(gpointer object, gpointer ignored) | |
5709 { | |
5710 GaimBlistNode *node; | |
5711 GaimBuddy *buddy; | |
5712 GaimConnection *gc; | |
5713 gchar *buf; | |
5714 struct oscar_ask_directim_data *data; | |
5715 | |
5716 node = object; | |
5717 | |
5718 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); | |
5719 | |
5720 buddy = (GaimBuddy *)node; | |
5721 gc = gaim_account_get_connection(buddy->account); | |
5722 | |
5723 data = g_new0(struct oscar_ask_directim_data, 1); | |
5724 data->who = g_strdup(buddy->name); | |
5725 data->od = gc->proto_data; | |
5726 buf = g_strdup_printf(_("You have selected to open a Direct IM connection with %s."), | |
5727 buddy->name); | |
5728 | |
5729 gaim_request_action(gc, NULL, buf, | |
5730 _("Because this reveals your IP address, it " | |
5731 "may be considered a security risk. Do you " | |
5732 "wish to continue?"), | |
5733 0, data, 2, | |
5734 _("_Connect"), G_CALLBACK(oscar_ask_directim_yes_cb), | |
5735 _("Cancel"), G_CALLBACK(oscar_ask_directim_no_cb)); | |
5736 g_free(buf); | |
5737 } | |
5738 | |
9030 | 5739 static GList *oscar_buddy_menu(GaimBuddy *buddy) { |
5740 | |
13605 | 5741 GaimConnection *gc; |
5742 OscarData *od; | |
5743 GList *m; | |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12918
diff
changeset
|
5744 GaimMenuAction *act; |
13605 | 5745 aim_userinfo_t *userinfo; |
5746 | |
5747 gc = gaim_account_get_connection(buddy->account); | |
5748 od = gc->proto_data; | |
5749 userinfo = aim_locate_finduserinfo(od, buddy->name); | |
5750 m = NULL; | |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12918
diff
changeset
|
5751 |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12918
diff
changeset
|
5752 act = gaim_menu_action_new(_("Edit Buddy Comment"), |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12918
diff
changeset
|
5753 GAIM_CALLBACK(oscar_buddycb_edit_comment), |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12918
diff
changeset
|
5754 NULL, NULL); |
9030 | 5755 m = g_list_append(m, act); |
7172 | 5756 |
4624 | 5757 #if 0 |
13605 | 5758 if (od->icq) |
5759 { | |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12918
diff
changeset
|
5760 act = gaim_menu_action_new(_("Get Status Msg"), |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12918
diff
changeset
|
5761 GAIM_CALLBACK(oscar_get_icqstatusmsg), |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12918
diff
changeset
|
5762 NULL, NULL); |
9030 | 5763 m = g_list_append(m, act); |
13605 | 5764 } |
4624 | 5765 #endif |
13605 | 5766 |
5767 if (userinfo && | |
5768 aim_sncmp(gaim_account_get_username(buddy->account), buddy->name) && | |
5769 GAIM_BUDDY_IS_ONLINE(buddy)) | |
5770 { | |
5771 if (userinfo->capabilities & OSCAR_CAPABILITY_DIRECTIM) | |
13592 | 5772 { |
13605 | 5773 act = gaim_menu_action_new(_("Direct IM"), |
5774 GAIM_CALLBACK(oscar_ask_directim), | |
5775 NULL, NULL); | |
5776 m = g_list_append(m, act); | |
5777 } | |
9466 | 5778 #if 0 |
13605 | 5779 /* TODO: This menu item should be added by the core */ |
5780 if (userinfo->capabilities & OSCAR_CAPABILITY_GETFILE) { | |
5781 act = gaim_menu_action_new(_("Get File"), | |
5782 GAIM_CALLBACK(oscar_ask_getfile), | |
5783 NULL, NULL); | |
5784 m = g_list_append(m, act); | |
5785 } | |
4826 | 5786 #endif |
13605 | 5787 } |
5788 | |
5789 if (od->ssi.received_data) | |
5790 { | |
5791 char *gname; | |
5792 gname = aim_ssi_itemlist_findparentname(od->ssi.local, buddy->name); | |
5793 if (gname && aim_ssi_waitingforauth(od->ssi.local, gname, buddy->name)) | |
5794 { | |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12918
diff
changeset
|
5795 act = gaim_menu_action_new(_("Re-request Authorization"), |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12918
diff
changeset
|
5796 GAIM_CALLBACK(gaim_auth_sendrequest_menu), |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12918
diff
changeset
|
5797 NULL, NULL); |
9030 | 5798 m = g_list_append(m, act); |
4333 | 5799 } |
4916 | 5800 } |
10157 | 5801 |
4333 | 5802 return m; |
5803 } | |
5804 | |
9030 | 5805 |
5806 static GList *oscar_blist_node_menu(GaimBlistNode *node) { | |
5807 if(GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
5808 return oscar_buddy_menu((GaimBuddy *) node); | |
5809 } else { | |
5810 return NULL; | |
5811 } | |
5812 } | |
5813 | |
10570 | 5814 static void |
5815 oscar_icq_privacy_opts(GaimConnection *gc, GaimRequestFields *fields) | |
5816 { | |
5817 OscarData *od = gc->proto_data; | |
5818 GaimAccount *account = gaim_connection_get_account(gc); | |
5819 GaimRequestField *f; | |
12652 | 5820 gboolean auth, web_aware; |
10570 | 5821 |
5822 f = gaim_request_fields_get_field(fields, "authorization"); | |
5823 auth = gaim_request_field_bool_get_value(f); | |
5824 | |
5825 f = gaim_request_fields_get_field(fields, "web_aware"); | |
5826 web_aware = gaim_request_field_bool_get_value(f); | |
5827 | |
5828 gaim_account_set_bool(account, "authorization", auth); | |
5829 gaim_account_set_bool(account, "web_aware", web_aware); | |
5830 | |
12652 | 5831 oscar_set_extendedstatus(gc); |
13592 | 5832 aim_icq_setsecurity(od, auth, web_aware); |
10570 | 5833 } |
5834 | |
5835 static void | |
5836 oscar_show_icq_privacy_opts(GaimPluginAction *action) | |
5837 { | |
5838 GaimConnection *gc = (GaimConnection *) action->context; | |
5839 GaimAccount *account = gaim_connection_get_account(gc); | |
5840 GaimRequestFields *fields; | |
5841 GaimRequestFieldGroup *g; | |
5842 GaimRequestField *f; | |
12652 | 5843 gboolean auth, web_aware; |
10570 | 5844 |
5845 auth = gaim_account_get_bool(account, "authorization", OSCAR_DEFAULT_AUTHORIZATION); | |
5846 web_aware = gaim_account_get_bool(account, "web_aware", OSCAR_DEFAULT_WEB_AWARE); | |
5847 | |
5848 fields = gaim_request_fields_new(); | |
5849 | |
5850 g = gaim_request_field_group_new(NULL); | |
5851 | |
5852 f = gaim_request_field_bool_new("authorization", _("Require authorization"), auth); | |
5853 gaim_request_field_group_add_field(g, f); | |
5854 | |
12617 | 5855 f = gaim_request_field_bool_new("web_aware", _("Web aware (enabling this will cause you to receive SPAM!)"), web_aware); |
10570 | 5856 gaim_request_field_group_add_field(g, f); |
5857 | |
5858 gaim_request_fields_add_group(fields, g); | |
5859 | |
5860 gaim_request_fields(gc, _("ICQ Privacy Options"), _("ICQ Privacy Options"), | |
5861 NULL, fields, | |
5862 _("OK"), G_CALLBACK(oscar_icq_privacy_opts), | |
5863 _("Cancel"), NULL, gc); | |
5864 } | |
9030 | 5865 |
5575 | 5866 static void oscar_format_screenname(GaimConnection *gc, const char *nick) { |
7283 | 5867 OscarData *od = gc->proto_data; |
5575 | 5868 if (!aim_sncmp(gaim_account_get_username(gaim_connection_get_account(gc)), nick)) { |
13592 | 5869 if (!flap_connection_getbytype(od, SNAC_FAMILY_ADMIN)) { |
4333 | 5870 od->setnick = TRUE; |
5871 od->newsn = g_strdup(nick); | |
13592 | 5872 aim_reqservice(od, SNAC_FAMILY_ADMIN); |
4333 | 5873 } else { |
13592 | 5874 aim_admin_setnick(od, flap_connection_getbytype(od, SNAC_FAMILY_ADMIN), nick); |
4333 | 5875 } |
5876 } else { | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
5877 gaim_notify_error(gc, NULL, _("The new formatting is invalid."), |
8152 | 5878 _("Screen name formatting can change only capitalization and whitespace.")); |
4333 | 5879 } |
5880 } | |
5881 | |
9015 | 5882 static void oscar_show_format_screenname(GaimPluginAction *action) |
4333 | 5883 { |
9015 | 5884 GaimConnection *gc = (GaimConnection *) action->context; |
8152 | 5885 gaim_request_input(gc, NULL, _("New screen name formatting:"), NULL, |
8697 | 5886 gaim_connection_get_display_name(gc), FALSE, FALSE, NULL, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
5887 _("OK"), G_CALLBACK(oscar_format_screenname), |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
5888 _("Cancel"), NULL, |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
5889 gc); |
4333 | 5890 } |
5891 | |
9015 | 5892 static void oscar_confirm_account(GaimPluginAction *action) |
4333 | 5893 { |
13592 | 5894 GaimConnection *gc; |
5895 OscarData *od; | |
5896 FlapConnection *conn; | |
5897 | |
5898 gc = (GaimConnection *)action->context; | |
5899 od = gc->proto_data; | |
5900 | |
5901 conn = flap_connection_getbytype(od, SNAC_FAMILY_ADMIN); | |
5902 if (conn != NULL) { | |
5903 aim_admin_reqconfirm(od, conn); | |
4333 | 5904 } else { |
5905 od->conf = TRUE; | |
13592 | 5906 aim_reqservice(od, SNAC_FAMILY_ADMIN); |
4333 | 5907 } |
5908 } | |
5909 | |
9015 | 5910 static void oscar_show_email(GaimPluginAction *action) |
4333 | 5911 { |
9015 | 5912 GaimConnection *gc = (GaimConnection *) action->context; |
7283 | 5913 OscarData *od = gc->proto_data; |
13592 | 5914 FlapConnection *conn = flap_connection_getbytype(od, SNAC_FAMILY_ADMIN); |
4333 | 5915 |
5916 if (conn) { | |
13592 | 5917 aim_admin_getinfo(od, conn, 0x11); |
4333 | 5918 } else { |
5919 od->reqemail = TRUE; | |
13592 | 5920 aim_reqservice(od, SNAC_FAMILY_ADMIN); |
4333 | 5921 } |
5922 } | |
5923 | |
5575 | 5924 static void oscar_change_email(GaimConnection *gc, const char *email) |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5925 { |
7283 | 5926 OscarData *od = gc->proto_data; |
13592 | 5927 FlapConnection *conn = flap_connection_getbytype(od, SNAC_FAMILY_ADMIN); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5928 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5929 if (conn) { |
13592 | 5930 aim_admin_setemail(od, conn, email); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5931 } else { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5932 od->setemail = TRUE; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5933 od->email = g_strdup(email); |
13592 | 5934 aim_reqservice(od, SNAC_FAMILY_ADMIN); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5935 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5936 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5937 |
9015 | 5938 static void oscar_show_change_email(GaimPluginAction *action) |
4333 | 5939 { |
9015 | 5940 GaimConnection *gc = (GaimConnection *) action->context; |
6035
8c44020a958e
[gaim-migrate @ 6485]
Christian Hammond <chipx86@chipx86.com>
parents:
6029
diff
changeset
|
5941 gaim_request_input(gc, NULL, _("Change Address To:"), NULL, NULL, |
8697 | 5942 FALSE, FALSE, NULL, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
5943 _("OK"), G_CALLBACK(oscar_change_email), |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
5944 _("Cancel"), NULL, |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
5945 gc); |
4333 | 5946 } |
5947 | |
9015 | 5948 static void oscar_show_awaitingauth(GaimPluginAction *action) |
4333 | 5949 { |
9015 | 5950 GaimConnection *gc = (GaimConnection *) action->context; |
7283 | 5951 OscarData *od = gc->proto_data; |
4333 | 5952 gchar *nombre, *text, *tmp; |
6695 | 5953 GaimBlistNode *gnode, *cnode, *bnode; |
4333 | 5954 int num=0; |
5955 | |
6873 | 5956 text = g_strdup(""); |
4333 | 5957 |
4785 | 5958 for (gnode = gaim_get_blist()->root; gnode; gnode = gnode->next) { |
6695 | 5959 GaimGroup *group = (GaimGroup *)gnode; |
4785 | 5960 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) |
5961 continue; | |
6695 | 5962 for (cnode = gnode->child; cnode; cnode = cnode->next) { |
5963 if(!GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
4785 | 5964 continue; |
6695 | 5965 for (bnode = cnode->child; bnode; bnode = bnode->next) { |
5966 GaimBuddy *buddy = (GaimBuddy *)bnode; | |
5967 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
5968 continue; | |
13592 | 5969 if (buddy->account == gc->account && aim_ssi_waitingforauth(od->ssi.local, group->name, buddy->name)) { |
9620 | 5970 if (gaim_buddy_get_alias_only(buddy)) |
5971 nombre = g_strdup_printf(" %s (%s)", buddy->name, gaim_buddy_get_alias_only(buddy)); | |
6695 | 5972 else |
5973 nombre = g_strdup_printf(" %s", buddy->name); | |
6873 | 5974 tmp = g_strdup_printf("%s%s<br>", text, nombre); |
6695 | 5975 g_free(text); |
5976 text = tmp; | |
5977 g_free(nombre); | |
5978 num++; | |
5979 } | |
4333 | 5980 } |
2979 | 5981 } |
4333 | 5982 } |
5983 | |
5984 if (!num) { | |
5985 g_free(text); | |
6873 | 5986 text = g_strdup(_("<i>you are not waiting for authorization</i>")); |
5987 } | |
5988 | |
5989 gaim_notify_formatted(gc, NULL, _("You are awaiting authorization from " | |
5990 "the following buddies"), _("You can re-request " | |
5991 "authorization from these buddies by " | |
5992 "right-clicking on them and selecting " | |
5993 "\"Re-request Authorization.\""), text, NULL, NULL); | |
4333 | 5994 g_free(text); |
2979 | 5995 } |
5996 | |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
5997 static void search_by_email_cb(GaimConnection *gc, const char *email) |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
5998 { |
8950 | 5999 OscarData *od = (OscarData *)gc->proto_data; |
6000 | |
13592 | 6001 aim_search_address(od, email); |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6002 } |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6003 |
9015 | 6004 static void oscar_show_find_email(GaimPluginAction *action) |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6005 { |
9015 | 6006 GaimConnection *gc = (GaimConnection *) action->context; |
13545
cfc2f7fcb3dd
[gaim-migrate @ 15922]
Richard Laager <rlaager@wiktel.com>
parents:
13477
diff
changeset
|
6007 gaim_request_input(gc, _("Find Buddy by E-Mail"), |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6008 _("Search for a buddy by e-mail address"), |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6009 _("Type the e-mail address of the buddy you are " |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6010 "searching for."), |
8697 | 6011 NULL, FALSE, FALSE, NULL, |
7080
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6012 _("Search"), G_CALLBACK(search_by_email_cb), |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6013 _("Cancel"), NULL, gc); |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6014 } |
fc9c74cfb306
[gaim-migrate @ 7645]
Christian Hammond <chipx86@chipx86.com>
parents:
7067
diff
changeset
|
6015 |
9015 | 6016 static void oscar_show_set_info(GaimPluginAction *action) |
7067
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
6017 { |
9015 | 6018 GaimConnection *gc = (GaimConnection *) action->context; |
7067
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
6019 gaim_account_request_change_user_info(gaim_connection_get_account(gc)); |
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
6020 } |
71e0da45abe6
[gaim-migrate @ 7631]
Christian Hammond <chipx86@chipx86.com>
parents:
7063
diff
changeset
|
6021 |
9015 | 6022 static void oscar_show_set_info_icqurl(GaimPluginAction *action) |
8576 | 6023 { |
9015 | 6024 GaimConnection *gc = (GaimConnection *) action->context; |
10240
95ca0db2d01d
[gaim-migrate @ 11377]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10209
diff
changeset
|
6025 gaim_notify_uri(gc, "http://www.icq.com/whitepages/user_details.php"); |
8576 | 6026 } |
6027 | |
9015 | 6028 static void oscar_change_pass(GaimPluginAction *action) |
7063
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
6029 { |
9015 | 6030 GaimConnection *gc = (GaimConnection *) action->context; |
7063
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
6031 gaim_account_request_change_password(gaim_connection_get_account(gc)); |
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
6032 } |
7fdac700deb1
[gaim-migrate @ 7627]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
6033 |
9015 | 6034 static void oscar_show_chpassurl(GaimPluginAction *action) |
4333 | 6035 { |
9015 | 6036 GaimConnection *gc = (GaimConnection *) action->context; |
7283 | 6037 OscarData *od = gc->proto_data; |
13592 | 6038 gchar *substituted = gaim_strreplace(od->authinfo->chpassurl, "%s", gaim_account_get_username(gaim_connection_get_account(gc))); |
10240
95ca0db2d01d
[gaim-migrate @ 11377]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10209
diff
changeset
|
6039 gaim_notify_uri(gc, substituted); |
5517 | 6040 g_free(substituted); |
4333 | 6041 } |
6042 | |
9015 | 6043 static void oscar_show_imforwardingurl(GaimPluginAction *action) |
7026 | 6044 { |
9015 | 6045 GaimConnection *gc = (GaimConnection *) action->context; |
10240
95ca0db2d01d
[gaim-migrate @ 11377]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10209
diff
changeset
|
6046 gaim_notify_uri(gc, "http://mymobile.aol.com/dbreg/register?action=imf&clientID=1"); |
7026 | 6047 } |
6048 | |
5842 | 6049 static void oscar_set_icon(GaimConnection *gc, const char *iconfile) |
6050 { | |
7283 | 6051 OscarData *od = gc->proto_data; |
5842 | 6052 FILE *file; |
6053 struct stat st; | |
5844 | 6054 |
6039 | 6055 if (iconfile == NULL) { |
13592 | 6056 aim_ssi_delicon(od); |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
6057 } else if (!g_stat(iconfile, &st)) { |
11159 | 6058 guchar *buf = g_malloc(st.st_size); |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10574
diff
changeset
|
6059 file = g_fopen(iconfile, "rb"); |
11404 | 6060 if (file) |
6061 { | |
6062 GaimCipher *cipher; | |
6063 GaimCipherContext *context; | |
11159 | 6064 guchar md5[16]; |
11404 | 6065 int len; |
6066 | |
9532 | 6067 /* XXX - Use g_file_get_contents()? */ |
11404 | 6068 len = fread(buf, 1, st.st_size, file); |
6039 | 6069 fclose(file); |
11404 | 6070 |
6071 cipher = gaim_ciphers_find_cipher("md5"); | |
6072 context = gaim_cipher_context_new(cipher, NULL); | |
6073 gaim_cipher_context_append(context, buf, len); | |
6074 gaim_cipher_context_digest(context, 16, md5, NULL); | |
6075 gaim_cipher_context_destroy(context); | |
6076 | |
13592 | 6077 aim_ssi_seticon(od, md5, 16); |
5842 | 6078 } else |
8660 | 6079 gaim_debug_error("oscar", |
5842 | 6080 "Can't open buddy icon file!\n"); |
6081 g_free(buf); | |
6082 } else | |
13592 | 6083 gaim_debug_error("oscar", "Can't stat buddy icon file!\n"); |
6084 } | |
6085 | |
6086 /** | |
6087 * Called by the Gaim core to determine whether or not we're | |
6088 * allowed to send a file to this user. | |
6089 */ | |
6090 static gboolean | |
6091 oscar_can_receive_file(GaimConnection *gc, const char *who) | |
6092 { | |
6093 OscarData *od; | |
6094 GaimAccount *account; | |
6095 | |
6096 od = gc->proto_data; | |
6097 account = gaim_connection_get_account(gc); | |
6098 | |
6099 if (od != NULL) | |
6100 { | |
6101 aim_userinfo_t *userinfo; | |
6102 userinfo = aim_locate_finduserinfo(od, who); | |
6103 | |
6104 /* | |
6105 * Don't allowing sending a file to a user that does not support | |
6106 * file transfer, and don't allow sending to ourselves. | |
6107 */ | |
6108 if ((userinfo != NULL) && | |
6109 (userinfo->capabilities & OSCAR_CAPABILITY_SENDFILE) && | |
6110 aim_sncmp(who, gaim_account_get_username(account))) | |
6111 { | |
6112 return TRUE; | |
6113 } | |
6114 } | |
6115 | |
6116 return FALSE; | |
6117 } | |
6118 | |
6119 static GaimXfer * | |
6120 oscar_new_xfer(GaimConnection *gc, const char *who) | |
6121 { | |
6122 GaimXfer *xfer; | |
6123 OscarData *od; | |
6124 GaimAccount *account; | |
6125 PeerConnection *conn; | |
6126 | |
6127 od = gc->proto_data; | |
6128 account = gaim_connection_get_account(gc); | |
6129 | |
6130 xfer = gaim_xfer_new(account, GAIM_XFER_SEND, who); | |
6131 gaim_xfer_ref(xfer); | |
6132 gaim_xfer_set_init_fnc(xfer, peer_oft_sendcb_init); | |
6133 gaim_xfer_set_cancel_send_fnc(xfer, peer_oft_cb_generic_cancel); | |
6134 gaim_xfer_set_request_denied_fnc(xfer, peer_oft_cb_generic_cancel); | |
6135 gaim_xfer_set_ack_fnc(xfer, peer_oft_sendcb_ack); | |
6136 | |
6137 conn = peer_connection_new(od, OSCAR_CAPABILITY_SENDFILE, who); | |
6138 conn->flags |= PEER_CONNECTION_FLAG_INITIATED_BY_ME; | |
6139 conn->flags |= PEER_CONNECTION_FLAG_APPROVED; | |
6140 aim_icbm_makecookie(conn->cookie); | |
6141 conn->xfer = xfer; | |
6142 xfer->data = conn; | |
6143 | |
6144 return xfer; | |
6145 } | |
6146 | |
6147 /* | |
6148 * Called by the Gaim core when the user indicates that a | |
6149 * file is to be sent to a special someone. | |
6150 */ | |
6151 static void | |
6152 oscar_send_file(GaimConnection *gc, const char *who, const char *file) | |
6153 { | |
6154 GaimXfer *xfer; | |
6155 | |
6156 xfer = oscar_new_xfer(gc, who); | |
6157 | |
6158 if (file != NULL) | |
6159 gaim_xfer_request_accepted(xfer, file); | |
6160 else | |
6161 gaim_xfer_request(xfer); | |
6162 } | |
6163 | |
6164 static GList * | |
6165 oscar_actions(GaimPlugin *plugin, gpointer context) | |
2086 | 6166 { |
9015 | 6167 GaimConnection *gc = (GaimConnection *) context; |
7283 | 6168 OscarData *od = gc->proto_data; |
4333 | 6169 GList *m = NULL; |
9015 | 6170 GaimPluginAction *act; |
6171 | |
6172 act = gaim_plugin_action_new(_("Set User Info..."), | |
6173 oscar_show_set_info); | |
6174 m = g_list_append(m, act); | |
4333 | 6175 |
10570 | 6176 if (od->icq) |
6177 { | |
9015 | 6178 act = gaim_plugin_action_new(_("Set User Info (URL)..."), |
6179 oscar_show_set_info_icqurl); | |
6180 m = g_list_append(m, act); | |
8576 | 6181 } |
6182 | |
9015 | 6183 act = gaim_plugin_action_new(_("Change Password..."), |
6184 oscar_change_pass); | |
6185 m = g_list_append(m, act); | |
4617 | 6186 |
13592 | 6187 if (od->authinfo->chpassurl != NULL) |
10570 | 6188 { |
9015 | 6189 act = gaim_plugin_action_new(_("Change Password (URL)"), |
6190 oscar_show_chpassurl); | |
6191 m = g_list_append(m, act); | |
6192 | |
6193 act = gaim_plugin_action_new(_("Configure IM Forwarding (URL)"), | |
6194 oscar_show_imforwardingurl); | |
6195 m = g_list_append(m, act); | |
7026 | 6196 } |
6197 | |
10570 | 6198 m = g_list_append(m, NULL); |
6199 | |
6200 if (od->icq) | |
6201 { | |
6202 /* ICQ actions */ | |
12652 | 6203 act = gaim_plugin_action_new(_("Set Privacy Options..."), |
10570 | 6204 oscar_show_icq_privacy_opts); |
6205 m = g_list_append(m, act); | |
6206 } | |
6207 else | |
6208 { | |
4617 | 6209 /* AIM actions */ |
9015 | 6210 act = gaim_plugin_action_new(_("Format Screen Name..."), |
6211 oscar_show_format_screenname); | |
6212 m = g_list_append(m, act); | |
6213 | |
6214 act = gaim_plugin_action_new(_("Confirm Account"), | |
6215 oscar_confirm_account); | |
6216 m = g_list_append(m, act); | |
6217 | |
13592 | 6218 act = gaim_plugin_action_new(_("Display Currently Registered E-Mail Address"), |
9015 | 6219 oscar_show_email); |
6220 m = g_list_append(m, act); | |
6221 | |
13592 | 6222 act = gaim_plugin_action_new(_("Change Currently Registered E-Mail Address..."), |
9015 | 6223 oscar_show_change_email); |
6224 m = g_list_append(m, act); | |
2086 | 6225 } |
4333 | 6226 |
6227 m = g_list_append(m, NULL); | |
6228 | |
9015 | 6229 act = gaim_plugin_action_new(_("Show Buddies Awaiting Authorization"), |
6230 oscar_show_awaitingauth); | |
6231 m = g_list_append(m, act); | |
4333 | 6232 |
2086 | 6233 m = g_list_append(m, NULL); |
4333 | 6234 |
13592 | 6235 act = gaim_plugin_action_new(_("Search for Buddy by E-Mail Address..."), |
9015 | 6236 oscar_show_find_email); |
6237 m = g_list_append(m, act); | |
4333 | 6238 |
8591 | 6239 #if 0 |
9015 | 6240 act = gaim_plugin_action_new(_("Search for Buddy by Information"), |
6241 show_find_info); | |
6242 m = g_list_append(m, act); | |
8591 | 6243 #endif |
2086 | 6244 |
6245 return m; | |
6246 } | |
6247 | |
5575 | 6248 static void oscar_change_passwd(GaimConnection *gc, const char *old, const char *new) |
2086 | 6249 { |
7283 | 6250 OscarData *od = gc->proto_data; |
4617 | 6251 |
6252 if (od->icq) { | |
13592 | 6253 aim_icq_changepasswd(od, new); |
2086 | 6254 } else { |
13592 | 6255 FlapConnection *conn; |
6256 conn = flap_connection_getbytype(od, SNAC_FAMILY_ADMIN); | |
4617 | 6257 if (conn) { |
13592 | 6258 aim_admin_changepasswd(od, conn, new, old); |
4617 | 6259 } else { |
6260 od->chpass = TRUE; | |
6261 od->oldp = g_strdup(old); | |
6262 od->newp = g_strdup(new); | |
13592 | 6263 aim_reqservice(od, SNAC_FAMILY_ADMIN); |
4617 | 6264 } |
2086 | 6265 } |
6266 } | |
6267 | |
13592 | 6268 static void |
6269 oscar_convo_closed(GaimConnection *gc, const char *who) | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6270 { |
13592 | 6271 OscarData *od; |
6272 PeerConnection *conn; | |
6273 | |
6274 od = gc->proto_data; | |
6275 conn = peer_connection_find_by_type(od, who, OSCAR_CAPABILITY_DIRECTIM); | |
6276 | |
6277 if (conn != NULL) | |
6278 { | |
6279 if (!conn->ready) | |
6280 aim_im_sendch2_cancel(conn); | |
6281 | |
13608 | 6282 peer_connection_destroy(conn, OSCAR_DISCONNECT_LOCAL_CLOSED); |
13592 | 6283 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6284 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
6285 |
9935 | 6286 static void |
12816 | 6287 recent_buddies_cb(const char *name, GaimPrefType type, |
6288 gconstpointer value, gpointer data) | |
9935 | 6289 { |
6290 GaimConnection *gc = data; | |
6291 OscarData *od = gc->proto_data; | |
13234 | 6292 guint32 presence; |
9935 | 6293 |
13592 | 6294 presence = aim_ssi_getpresence(od->ssi.local); |
9935 | 6295 |
6296 if (value) { | |
12486 | 6297 presence &= ~AIM_SSI_PRESENCE_FLAG_NORECENTBUDDIES; |
13592 | 6298 aim_ssi_setpresence(od, presence); |
9935 | 6299 } else { |
12486 | 6300 presence |= AIM_SSI_PRESENCE_FLAG_NORECENTBUDDIES; |
13592 | 6301 aim_ssi_setpresence(od, presence); |
6302 } | |
6303 } | |
6304 | |
6305 #ifdef USE_PRPL_PREFERENCES | |
6306 ppref = gaim_plugin_pref_new_with_name_and_label("/plugins/prpl/oscar/recent_buddies", _("Use recent buddies group")); | |
6307 gaim_plugin_pref_frame_add(frame, ppref); | |
6308 | |
6309 ppref = gaim_plugin_pref_new_with_name_and_label("/plugins/prpl/oscar/show_idle", _("Show how long you have been idle")); | |
6310 gaim_plugin_pref_frame_add(frame, ppref); | |
6311 #endif | |
9935 | 6312 |
11153 | 6313 static const char * |
6314 oscar_normalize(const GaimAccount *account, const char *str) | |
6315 { | |
6316 static char buf[BUF_LEN]; | |
6317 char *tmp1, *tmp2; | |
6318 int i, j; | |
6319 | |
6320 g_return_val_if_fail(str != NULL, NULL); | |
6321 | |
6322 strncpy(buf, str, BUF_LEN); | |
6323 for (i=0, j=0; buf[j]; i++, j++) | |
6324 { | |
6325 while (buf[j] == ' ') | |
6326 j++; | |
6327 buf[i] = buf[j]; | |
6328 } | |
6329 buf[i] = '\0'; | |
6330 | |
6331 tmp1 = g_utf8_strdown(buf, -1); | |
6332 tmp2 = g_utf8_normalize(tmp1, -1, G_NORMALIZE_DEFAULT); | |
6333 g_snprintf(buf, sizeof(buf), "%s", tmp2); | |
6334 g_free(tmp2); | |
6335 g_free(tmp1); | |
6336 | |
6337 return buf; | |
6338 } | |
6339 | |
13592 | 6340 static gboolean |
6341 oscar_offline_message(const GaimBuddy *buddy) | |
12645
fc28451f5d96
[gaim-migrate @ 14983]
Richard Laager <rlaager@wiktel.com>
parents:
12624
diff
changeset
|
6342 { |
fc28451f5d96
[gaim-migrate @ 14983]
Richard Laager <rlaager@wiktel.com>
parents:
12624
diff
changeset
|
6343 OscarData *od; |
fc28451f5d96
[gaim-migrate @ 14983]
Richard Laager <rlaager@wiktel.com>
parents:
12624
diff
changeset
|
6344 GaimAccount *account; |
fc28451f5d96
[gaim-migrate @ 14983]
Richard Laager <rlaager@wiktel.com>
parents:
12624
diff
changeset
|
6345 GaimConnection *gc; |
fc28451f5d96
[gaim-migrate @ 14983]
Richard Laager <rlaager@wiktel.com>
parents:
12624
diff
changeset
|
6346 |
fc28451f5d96
[gaim-migrate @ 14983]
Richard Laager <rlaager@wiktel.com>
parents:
12624
diff
changeset
|
6347 account = gaim_buddy_get_account(buddy); |
fc28451f5d96
[gaim-migrate @ 14983]
Richard Laager <rlaager@wiktel.com>
parents:
12624
diff
changeset
|
6348 gc = gaim_account_get_connection(account); |
fc28451f5d96
[gaim-migrate @ 14983]
Richard Laager <rlaager@wiktel.com>
parents:
12624
diff
changeset
|
6349 od = (OscarData *)gc->proto_data; |
fc28451f5d96
[gaim-migrate @ 14983]
Richard Laager <rlaager@wiktel.com>
parents:
12624
diff
changeset
|
6350 |
fc28451f5d96
[gaim-migrate @ 14983]
Richard Laager <rlaager@wiktel.com>
parents:
12624
diff
changeset
|
6351 return (od->icq && aim_sn_is_icq(gaim_account_get_username(account))); |
fc28451f5d96
[gaim-migrate @ 14983]
Richard Laager <rlaager@wiktel.com>
parents:
12624
diff
changeset
|
6352 } |
fc28451f5d96
[gaim-migrate @ 14983]
Richard Laager <rlaager@wiktel.com>
parents:
12624
diff
changeset
|
6353 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6354 static GaimPluginProtocolInfo prpl_info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6355 { |
9308 | 6356 OPT_PROTO_MAIL_CHECK | OPT_PROTO_IM_IMAGE, |
9475 | 6357 NULL, /* user_splits */ |
6358 NULL, /* protocol_options */ | |
10674 | 6359 {"jpeg,gif,bmp,ico", 48, 48, 50, 50, |
6360 GAIM_ICON_SCALE_SEND | GAIM_ICON_SCALE_DISPLAY}, /* icon_spec */ | |
9475 | 6361 oscar_list_icon, /* list_icon */ |
6362 oscar_list_emblems, /* list_emblems */ | |
6363 oscar_status_text, /* status_text */ | |
6364 oscar_tooltip_text, /* tooltip_text */ | |
9973 | 6365 oscar_status_types, /* status_types */ |
9475 | 6366 oscar_blist_node_menu, /* blist_node_menu */ |
6367 oscar_chat_info, /* chat_info */ | |
9754 | 6368 oscar_chat_info_defaults, /* chat_info_defaults */ |
9475 | 6369 oscar_login, /* login */ |
6370 oscar_close, /* close */ | |
6371 oscar_send_im, /* send_im */ | |
6372 oscar_set_info, /* set_info */ | |
6373 oscar_send_typing, /* send_typing */ | |
6374 oscar_get_info, /* get_info */ | |
9973 | 6375 oscar_set_status, /* set_status */ |
9475 | 6376 oscar_set_idle, /* set_idle */ |
6377 oscar_change_passwd, /* change_passwd */ | |
6378 oscar_add_buddy, /* add_buddy */ | |
10866 | 6379 NULL, /* add_buddies */ |
9475 | 6380 oscar_remove_buddy, /* remove_buddy */ |
10866 | 6381 NULL, /* remove_buddies */ |
9475 | 6382 oscar_add_permit, /* add_permit */ |
6383 oscar_add_deny, /* add_deny */ | |
6384 oscar_rem_permit, /* rem_permit */ | |
6385 oscar_rem_deny, /* rem_deny */ | |
6386 oscar_set_permit_deny, /* set_permit_deny */ | |
6387 oscar_join_chat, /* join_chat */ | |
6388 NULL, /* reject_chat */ | |
9973 | 6389 oscar_get_chat_name, /* get_chat_name */ |
9475 | 6390 oscar_chat_invite, /* chat_invite */ |
6391 oscar_chat_leave, /* chat_leave */ | |
6392 NULL, /* chat_whisper */ | |
6393 oscar_send_chat, /* chat_send */ | |
6394 oscar_keepalive, /* keepalive */ | |
6395 NULL, /* register_user */ | |
6396 NULL, /* get_cb_info */ | |
6397 NULL, /* get_cb_away */ | |
6398 oscar_alias_buddy, /* alias_buddy */ | |
6399 oscar_move_buddy, /* group_buddy */ | |
6400 oscar_rename_group, /* rename_group */ | |
6401 NULL, /* buddy_free */ | |
6402 oscar_convo_closed, /* convo_closed */ | |
11153 | 6403 oscar_normalize, /* normalize */ |
9475 | 6404 oscar_set_icon, /* set_buddy_icon */ |
6405 NULL, /* remove_group */ | |
6406 NULL, /* get_cb_real_name */ | |
6407 NULL, /* set_chat_topic */ | |
6408 NULL, /* find_blist_chat */ | |
6409 NULL, /* roomlist_get_list */ | |
6410 NULL, /* roomlist_cancel */ | |
6411 NULL, /* roomlist_expand_category */ | |
6412 oscar_can_receive_file, /* can_receive_file */ | |
12143
cbebda5f019c
[gaim-migrate @ 14444]
Richard Laager <rlaager@wiktel.com>
parents:
12088
diff
changeset
|
6413 oscar_send_file, /* send_file */ |
cbebda5f019c
[gaim-migrate @ 14444]
Richard Laager <rlaager@wiktel.com>
parents:
12088
diff
changeset
|
6414 oscar_new_xfer, /* new_xfer */ |
12645
fc28451f5d96
[gaim-migrate @ 14983]
Richard Laager <rlaager@wiktel.com>
parents:
12624
diff
changeset
|
6415 oscar_offline_message, /* offline_message */ |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12595
diff
changeset
|
6416 NULL, /* whiteboard_prpl_ops */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6417 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6418 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6419 static GaimPluginInfo info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6420 { |
9943 | 6421 GAIM_PLUGIN_MAGIC, |
6422 GAIM_MAJOR_VERSION, | |
6423 GAIM_MINOR_VERSION, | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6424 GAIM_PLUGIN_PROTOCOL, /**< type */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6425 NULL, /**< ui_requirement */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6426 0, /**< flags */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6427 NULL, /**< dependencies */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6428 GAIM_PRIORITY_DEFAULT, /**< priority */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6429 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6430 "prpl-oscar", /**< id */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6431 "AIM/ICQ", /**< name */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6432 VERSION, /**< version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6433 /** summary */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6434 N_("AIM/ICQ Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6435 /** description */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6436 N_("AIM/ICQ Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6437 NULL, /**< author */ |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6350
diff
changeset
|
6438 GAIM_WEBSITE, /**< homepage */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6439 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6440 NULL, /**< load */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6441 NULL, /**< unload */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6442 NULL, /**< destroy */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6443 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6444 NULL, /**< ui_info */ |
8993 | 6445 &prpl_info, /**< extra_info */ |
13311
f6f465b8d1c0
[gaim-migrate @ 15677]
Richard Laager <rlaager@wiktel.com>
parents:
13296
diff
changeset
|
6446 NULL, |
9015 | 6447 oscar_actions |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6448 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6449 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6450 static void |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5917
diff
changeset
|
6451 init_plugin(GaimPlugin *plugin) |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5197
diff
changeset
|
6452 { |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
6453 GaimAccountOption *option; |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5631
diff
changeset
|
6454 |
11338 | 6455 option = gaim_account_option_string_new(_("Auth host"), "server", OSCAR_DEFAULT_LOGIN_SERVER); |
9830 | 6456 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
6457 | |
11338 | 6458 option = gaim_account_option_int_new(_("Auth port"), "port", OSCAR_DEFAULT_LOGIN_PORT); |
9830 | 6459 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
6460 | |
6461 option = gaim_account_option_string_new(_("Encoding"), "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); | |
6462 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | |
13073 | 6463 |
13592 | 6464 /* TODO: Need to somehow invert this */ |
13071 | 6465 option = gaim_account_option_bool_new( |
13592 | 6466 _("Always use AIM/ICQ proxy server\n(slower, but does not reveal your IP address)"), "use_rv_proxy", |
13071 | 6467 OSCAR_DEFAULT_USE_RV_PROXY); |
6468 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | |
11338 | 6469 |
11369 | 6470 /* Preferences */ |
9935 | 6471 gaim_prefs_add_none("/plugins/prpl/oscar"); |
6472 gaim_prefs_add_bool("/plugins/prpl/oscar/recent_buddies", FALSE); | |
9942 | 6473 gaim_prefs_add_bool("/plugins/prpl/oscar/show_idle", FALSE); |
13311
f6f465b8d1c0
[gaim-migrate @ 15677]
Richard Laager <rlaager@wiktel.com>
parents:
13296
diff
changeset
|
6474 gaim_prefs_remove("/plugins/prpl/oscar/use_rv_proxy"); |
2086 | 6475 } |
6476 | |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5917
diff
changeset
|
6477 GAIM_INIT_PLUGIN(oscar, init_plugin, info); |