Mercurial > pidgin.yaz
annotate src/protocols/oscar/oscar.c @ 4819:815afc71c8e4
[gaim-migrate @ 5144]
On the one hand, rabbits not laying eggs is a conscious decision--it's not
that they can't, it's that they choose not to. But on the other hand,
the first hand makes no sense.
This should make reading ICQ info for people with non-ascii cruft not
crash Gaim and/or output ugly pango utf8 messages. I also make the ICQ
info strings internationalizationable.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Tue, 18 Mar 2003 05:52:22 +0000 |
parents | 22a7602ebe25 |
children | bfabc4a26fce |
rev | line source |
---|---|
2086 | 1 /* |
2 * gaim | |
3 * | |
4 * Some code copyright (C) 1998-1999, Mark Spencer <markster@marko.net> | |
5 * libfaim code copyright 1998, 1999 Adam Fritzler <afritz@auk.cx> | |
6 * | |
7 * This program is free software; you can redistribute it and/or modify | |
8 * it under the terms of the GNU General Public License as published by | |
9 * the Free Software Foundation; either version 2 of the License, or | |
10 * (at your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, | |
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 * GNU General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU General Public License | |
18 * along with this program; if not, write to the Free Software | |
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
20 * | |
21 */ | |
22 | |
23 #ifdef HAVE_CONFIG_H | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
24 #include <config.h> |
2086 | 25 #endif |
26 | |
3664 | 27 #include <sys/types.h> |
4617 | 28 /* this must happen before sys/socket.h or freebsd won't compile */ |
3664 | 29 |
3630 | 30 #ifndef _WIN32 |
2086 | 31 #include <netdb.h> |
32 #include <netinet/in.h> | |
33 #include <arpa/inet.h> | |
3630 | 34 #include <sys/socket.h> |
35 #include <unistd.h> | |
36 #endif | |
37 | |
38 #include <errno.h> | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
39 #include <ctype.h> |
2086 | 40 #include <string.h> |
41 #include <stdlib.h> | |
42 #include <stdio.h> | |
43 #include <time.h> | |
44 #include <sys/stat.h> | |
3630 | 45 #include <signal.h> |
46 | |
4608 | 47 #include "gaim.h" |
2086 | 48 #include "multi.h" |
49 #include "prpl.h" | |
4373
dcc6c130c6d9
[gaim-migrate @ 4639]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4366
diff
changeset
|
50 #include "core.h" |
2086 | 51 #include "aim.h" |
52 #include "proxy.h" | |
53 | |
3630 | 54 #ifdef _WIN32 |
55 #include "win32dep.h" | |
56 #endif | |
57 | |
2086 | 58 /* constants to identify proto_opts */ |
59 #define USEROPT_AUTH 0 | |
60 #define USEROPT_AUTHPORT 1 | |
61 | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
62 #define UC_AOL 0x02 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
63 #define UC_ADMIN 0x04 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
64 #define UC_UNCONFIRMED 0x08 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
65 #define UC_NORMAL 0x10 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
66 #define UC_AB 0x20 |
3079 | 67 #define UC_WIRELESS 0x40 |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
68 |
2086 | 69 #define AIMHASHDATA "http://gaim.sourceforge.net/aim_data.php3" |
70 | |
4249 | 71 static struct prpl *my_protocol = NULL; |
72 | |
3630 | 73 /* For win32 compatability */ |
74 G_MODULE_IMPORT GSList *connections; | |
75 G_MODULE_IMPORT int report_idle; | |
76 | |
4811 | 77 static int caps_aim = AIM_CAPS_CHAT | AIM_CAPS_BUDDYICON | AIM_CAPS_IMIMAGE | AIM_CAPS_SENDFILE | AIM_CAPS_INTEROPERATE; |
78 static int caps_icq = AIM_CAPS_BUDDYICON | AIM_CAPS_IMIMAGE | AIM_CAPS_SENDFILE | AIM_CAPS_ICQUTF8 | AIM_CAPS_INTEROPERATE; | |
3458 | 79 |
4665 | 80 static fu8_t features_aim[] = {0x01, 0x01, 0x01, 0x02}; |
81 static fu8_t features_icq[] = {0x01, 0x06}; | |
2086 | 82 |
83 struct oscar_data { | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
84 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
85 aim_conn_t *conn; |
2086 | 86 |
87 guint cnpa; | |
88 guint paspa; | |
3694 | 89 guint emlpa; |
4804 | 90 guint icopa; |
2086 | 91 |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
92 GSList *create_rooms; |
2086 | 93 |
94 gboolean conf; | |
95 gboolean reqemail; | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
96 gboolean setemail; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
97 char *email; |
2979 | 98 gboolean setnick; |
99 char *newsn; | |
2086 | 100 gboolean chpass; |
101 char *oldp; | |
102 char *newp; | |
103 | |
104 GSList *oscar_chats; | |
105 GSList *direct_ims; | |
3630 | 106 GSList *file_transfers; |
4738 | 107 GHashTable *buddyinfo; |
4804 | 108 GSList *requesticon; |
2086 | 109 |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
110 gboolean killme; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
111 gboolean icq; |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
112 GSList *evilhack; |
4804 | 113 guint icontimer; |
2993 | 114 |
115 struct { | |
4230 | 116 guint maxwatchers; /* max users who can watch you */ |
2993 | 117 guint maxbuddies; /* max users you can watch */ |
4230 | 118 guint maxgroups; /* max groups in server list */ |
2993 | 119 guint maxpermits; /* max users on permit list */ |
120 guint maxdenies; /* max users on deny list */ | |
121 guint maxsiglen; /* max size (bytes) of profile */ | |
122 guint maxawaymsglen; /* max size (bytes) of posted away message */ | |
123 } rights; | |
2086 | 124 }; |
125 | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
126 struct create_room { |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
127 char *name; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
128 int exchange; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
129 }; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
130 |
2086 | 131 struct chat_connection { |
132 char *name; | |
133 char *show; /* AOL did something funny to us */ | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
134 fu16_t exchange; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
135 fu16_t instance; |
2086 | 136 int fd; /* this is redundant since we have the conn below */ |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
137 aim_conn_t *conn; |
2086 | 138 int inpa; |
139 int id; | |
140 struct gaim_connection *gc; /* i hate this. */ | |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
141 struct gaim_conversation *cnv; /* bah. */ |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
142 int maxlen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
143 int maxvis; |
2086 | 144 }; |
145 | |
146 struct direct_im { | |
147 struct gaim_connection *gc; | |
148 char name[80]; | |
149 int watcher; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
150 aim_conn_t *conn; |
3008 | 151 gboolean connected; |
2086 | 152 }; |
153 | |
154 struct ask_direct { | |
155 struct gaim_connection *gc; | |
156 char *sn; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
157 char ip[64]; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
158 fu8_t cookie[8]; |
2086 | 159 }; |
160 | |
4617 | 161 /* BBB */ |
162 struct oscar_xfer_data { | |
163 fu8_t cookie[8]; | |
4656 | 164 gchar *clientip; |
165 gchar *clientip2; | |
4646 | 166 fu32_t modtime; |
167 fu32_t checksum; | |
3630 | 168 aim_conn_t *conn; |
4617 | 169 struct gaim_xfer *xfer; |
170 struct gaim_connection *gc; | |
3630 | 171 }; |
172 | |
4738 | 173 /* Various PRPL-specific buddy info that we want to keep track of */ |
174 struct buddyinfo { | |
175 time_t signon; | |
176 int caps; | |
177 gboolean typingnot; | |
178 | |
179 unsigned long ico_len; | |
180 unsigned long ico_csum; | |
181 time_t ico_time; | |
182 gboolean ico_need; | |
183 | |
184 unsigned long ico_me_len; | |
185 unsigned long ico_me_csum; | |
186 time_t ico_me_time; | |
187 gboolean ico_informed; | |
4804 | 188 |
189 fu16_t iconstrlen; | |
190 fu8_t iconstr[30]; | |
2086 | 191 }; |
192 | |
4230 | 193 struct name_data { |
3141 | 194 struct gaim_connection *gc; |
4230 | 195 gchar *name; |
3453 | 196 gchar *nick; |
3141 | 197 }; |
198 | |
4230 | 199 static void gaim_free_name_data(struct name_data *data) { |
200 g_free(data->name); | |
201 g_free(data->nick); | |
202 g_free(data); | |
203 } | |
204 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
205 static struct direct_im *find_direct_im(struct oscar_data *od, const char *who) { |
2086 | 206 GSList *d = od->direct_ims; |
207 struct direct_im *m = NULL; | |
208 | |
209 while (d) { | |
210 m = (struct direct_im *)d->data; | |
4355 | 211 if (!aim_sncmp(who, m->name)) |
4269 | 212 return m; |
2086 | 213 d = d->next; |
214 } | |
215 | |
4269 | 216 return NULL; |
2086 | 217 } |
218 | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
219 static char *extract_name(const char *name) { |
4121 | 220 char *tmp, *x; |
2086 | 221 int i, j; |
4120 | 222 |
223 if (!name) | |
4121 | 224 return NULL; |
225 | |
4120 | 226 x = strchr(name, '-'); |
4121 | 227 |
2086 | 228 if (!x) return NULL; |
229 x = strchr(++x, '-'); | |
230 if (!x) return NULL; | |
231 tmp = g_strdup(++x); | |
232 | |
233 for (i = 0, j = 0; x[i]; i++) { | |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
234 char hex[3]; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
235 if (x[i] != '%') { |
2086 | 236 tmp[j++] = x[i]; |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
237 continue; |
2086 | 238 } |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
239 strncpy(hex, x + ++i, 2); hex[2] = 0; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
240 i++; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
241 tmp[j++] = strtol(hex, NULL, 16); |
2086 | 242 } |
243 | |
244 tmp[j] = 0; | |
245 return tmp; | |
246 } | |
247 | |
248 static struct chat_connection *find_oscar_chat(struct gaim_connection *gc, int id) { | |
249 GSList *g = ((struct oscar_data *)gc->proto_data)->oscar_chats; | |
250 struct chat_connection *c = NULL; | |
251 | |
252 while (g) { | |
253 c = (struct chat_connection *)g->data; | |
254 if (c->id == id) | |
255 break; | |
256 g = g->next; | |
257 c = NULL; | |
258 } | |
259 | |
260 return c; | |
261 } | |
262 | |
263 static struct chat_connection *find_oscar_chat_by_conn(struct gaim_connection *gc, | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
264 aim_conn_t *conn) { |
2086 | 265 GSList *g = ((struct oscar_data *)gc->proto_data)->oscar_chats; |
266 struct chat_connection *c = NULL; | |
267 | |
268 while (g) { | |
269 c = (struct chat_connection *)g->data; | |
270 if (c->conn == conn) | |
271 break; | |
272 g = g->next; | |
273 c = NULL; | |
274 } | |
275 | |
276 return c; | |
277 } | |
278 | |
4656 | 279 /* All the libfaim->gaim callback functions */ |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
280 static int gaim_parse_auth_resp (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
281 static int gaim_parse_login (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
282 static int gaim_handle_redirect (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
283 static int gaim_info_change (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
284 static int gaim_account_confirm (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
285 static int gaim_parse_oncoming (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
286 static int gaim_parse_offgoing (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
287 static int gaim_parse_incoming_im(aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
288 static int gaim_parse_misses (aim_session_t *, aim_frame_t *, ...); |
3212 | 289 static int gaim_parse_clientauto (aim_session_t *, aim_frame_t *, ...); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
290 static int gaim_parse_user_info (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
291 static int gaim_parse_motd (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
292 static int gaim_chatnav_info (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
293 static int gaim_chat_join (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
294 static int gaim_chat_leave (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
295 static int gaim_chat_info_update (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
296 static int gaim_chat_incoming_msg(aim_session_t *, aim_frame_t *, ...); |
3694 | 297 static int gaim_email_parseupdate(aim_session_t *, aim_frame_t *, ...); |
4804 | 298 static int gaim_icon_error (aim_session_t *, aim_frame_t *, ...); |
299 static int gaim_icon_parseicon (aim_session_t *, aim_frame_t *, ...); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
300 static int gaim_parse_msgack (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
301 static int gaim_parse_ratechange (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
302 static int gaim_parse_evilnotify (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
303 static int gaim_parse_searcherror(aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
304 static int gaim_parse_searchreply(aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
305 static int gaim_bosrights (aim_session_t *, aim_frame_t *, ...); |
4649 | 306 static int gaim_connerr (aim_session_t *, aim_frame_t *, ...); |
3952 | 307 static int conninitdone_admin (aim_session_t *, aim_frame_t *, ...); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
308 static int conninitdone_bos (aim_session_t *, aim_frame_t *, ...); |
3952 | 309 static int conninitdone_chatnav (aim_session_t *, aim_frame_t *, ...); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
310 static int conninitdone_chat (aim_session_t *, aim_frame_t *, ...); |
3694 | 311 static int conninitdone_email (aim_session_t *, aim_frame_t *, ...); |
4804 | 312 static int conninitdone_icon (aim_session_t *, aim_frame_t *, ...); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
313 static int gaim_parse_msgerr (aim_session_t *, aim_frame_t *, ...); |
3595 | 314 static int gaim_parse_mtn (aim_session_t *, aim_frame_t *, ...); |
2993 | 315 static int gaim_parse_locaterights(aim_session_t *, aim_frame_t *, ...); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
316 static int gaim_parse_buddyrights(aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
317 static int gaim_parse_locerr (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
318 static int gaim_icbm_param_info (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
319 static int gaim_parse_genericerr (aim_session_t *, aim_frame_t *, ...); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
320 static int gaim_memrequest (aim_session_t *, aim_frame_t *, ...); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
321 static int gaim_selfinfo (aim_session_t *, aim_frame_t *, ...); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
322 static int gaim_offlinemsg (aim_session_t *, aim_frame_t *, ...); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
323 static int gaim_offlinemsgdone (aim_session_t *, aim_frame_t *, ...); |
4759 | 324 static int gaim_icqalias (aim_session_t *, aim_frame_t *, ...); |
4624 | 325 static int gaim_icqinfo (aim_session_t *, aim_frame_t *, ...); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
326 static int gaim_popup (aim_session_t *, aim_frame_t *, ...); |
4230 | 327 #ifndef NOSSI |
4642 | 328 static int gaim_ssi_parseerr (aim_session_t *, aim_frame_t *, ...); |
2991 | 329 static int gaim_ssi_parserights (aim_session_t *, aim_frame_t *, ...); |
330 static int gaim_ssi_parselist (aim_session_t *, aim_frame_t *, ...); | |
4230 | 331 static int gaim_ssi_parseack (aim_session_t *, aim_frame_t *, ...); |
332 static int gaim_ssi_authgiven (aim_session_t *, aim_frame_t *, ...); | |
333 static int gaim_ssi_authrequest (aim_session_t *, aim_frame_t *, ...); | |
334 static int gaim_ssi_authreply (aim_session_t *, aim_frame_t *, ...); | |
335 static int gaim_ssi_gotadded (aim_session_t *, aim_frame_t *, ...); | |
336 #endif | |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
337 |
4656 | 338 /* for DirectIM/image transfer */ |
4617 | 339 static int gaim_odc_initiate (aim_session_t *, aim_frame_t *, ...); |
340 static int gaim_odc_incoming (aim_session_t *, aim_frame_t *, ...); | |
341 static int gaim_odc_typing (aim_session_t *, aim_frame_t *, ...); | |
342 static int gaim_update_ui (aim_session_t *, aim_frame_t *, ...); | |
3630 | 343 |
4656 | 344 /* for file transfer */ |
345 static int oscar_sendfile_estblsh(aim_session_t *, aim_frame_t *, ...); | |
346 static int oscar_sendfile_prompt (aim_session_t *, aim_frame_t *, ...); | |
347 static int oscar_sendfile_ack (aim_session_t *, aim_frame_t *, ...); | |
348 static int oscar_sendfile_done (aim_session_t *, aim_frame_t *, ...); | |
349 | |
4804 | 350 /* for icons */ |
351 static gboolean gaim_icon_timerfunc(gpointer data); | |
352 | |
4151 | 353 static fu32_t check_encoding(const char *utf8); |
354 static fu32_t parse_encoding(const char *enc); | |
355 | |
2086 | 356 static char *msgerrreason[] = { |
4056 | 357 N_("Invalid error"), |
358 N_("Invalid SNAC"), | |
359 N_("Rate to host"), | |
360 N_("Rate to client"), | |
361 N_("Not logged in"), | |
362 N_("Service unavailable"), | |
363 N_("Service not defined"), | |
364 N_("Obsolete SNAC"), | |
365 N_("Not supported by host"), | |
366 N_("Not supported by client"), | |
367 N_("Refused by client"), | |
368 N_("Reply too big"), | |
369 N_("Responses lost"), | |
370 N_("Request denied"), | |
371 N_("Busted SNAC payload"), | |
372 N_("Insufficient rights"), | |
373 N_("In local permit/deny"), | |
374 N_("Too evil (sender)"), | |
375 N_("Too evil (receiver)"), | |
376 N_("User temporarily unavailable"), | |
377 N_("No match"), | |
378 N_("List overflow"), | |
379 N_("Request ambiguous"), | |
380 N_("Queue full"), | |
381 N_("Not while on AOL") | |
2086 | 382 }; |
383 static int msgerrreasonlen = 25; | |
384 | |
4617 | 385 static void gaim_odc_disconnect(aim_session_t *sess, aim_conn_t *conn) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
386 struct gaim_connection *gc = sess->aux_data; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
387 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
388 struct gaim_conversation *cnv; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
389 struct direct_im *dim; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
390 char *sn; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
391 char buf[256]; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
392 |
4617 | 393 sn = g_strdup(aim_odc_getsn(conn)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
394 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
395 debug_printf("%s disconnected Direct IM.\n", sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
396 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
397 dim = find_direct_im(od, sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
398 od->direct_ims = g_slist_remove(od->direct_ims, dim); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
399 gaim_input_remove(dim->watcher); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
400 |
3008 | 401 if (dim->connected) |
402 g_snprintf(buf, sizeof buf, _("Direct IM with %s closed"), sn); | |
403 else | |
404 g_snprintf(buf, sizeof buf, _("Direct IM with %s failed"), sn); | |
405 | |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
406 if ((cnv = gaim_find_conversation(sn))) |
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
407 gaim_conversation_write(cnv, NULL, buf, -1, WFLAG_SYSTEM, time(NULL)); |
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
408 |
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
409 gaim_conversation_update_progress(cnv, 100); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
410 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
411 g_free(dim); /* I guess? I don't see it anywhere else... -- mid */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
412 g_free(sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
413 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
414 return; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
415 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
416 |
4617 | 417 static void oscar_callback(gpointer data, gint source, GaimInputCondition condition) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
418 aim_conn_t *conn = (aim_conn_t *)data; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
419 aim_session_t *sess = aim_conn_getsess(conn); |
2086 | 420 struct gaim_connection *gc = sess ? sess->aux_data : NULL; |
4617 | 421 struct oscar_data *od; |
2086 | 422 |
423 if (!gc) { | |
424 /* gc is null. we return, else we seg SIGSEG on next line. */ | |
425 debug_printf("oscar callback for closed connection (1).\n"); | |
426 return; | |
427 } | |
428 | |
4617 | 429 od = (struct oscar_data *)gc->proto_data; |
2086 | 430 |
431 if (!g_slist_find(connections, gc)) { | |
432 /* oh boy. this is probably bad. i guess the only thing we | |
433 * can really do is return? */ | |
434 debug_printf("oscar callback for closed connection (2).\n"); | |
435 return; | |
436 } | |
437 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
438 if (condition & GAIM_INPUT_READ) { |
4617 | 439 if (conn->type == AIM_CONN_TYPE_LISTENER) { |
440 debug_printf("got information on rendezvous listener\n"); | |
441 if (aim_handlerendconnect(od->sess, conn) < 0) { | |
442 debug_printf("connection error (rendezvous listener)\n"); | |
443 aim_conn_kill(od->sess, &conn); | |
2086 | 444 } |
445 } else { | |
4617 | 446 if (aim_get_command(od->sess, conn) >= 0) { |
447 aim_rxdispatch(od->sess); | |
448 if (od->killme) | |
2086 | 449 signoff(gc); |
450 } else { | |
451 if ((conn->type == AIM_CONN_TYPE_BOS) || | |
4617 | 452 !(aim_getconn_type(od->sess, AIM_CONN_TYPE_BOS))) { |
4236 | 453 debug_printf("major connection error\n"); |
3074 | 454 hide_login_progress_error(gc, _("Disconnected.")); |
2086 | 455 signoff(gc); |
456 } else if (conn->type == AIM_CONN_TYPE_CHAT) { | |
457 struct chat_connection *c = find_oscar_chat_by_conn(gc, conn); | |
458 char buf[BUF_LONG]; | |
459 debug_printf("disconnected from chat room %s\n", c->name); | |
460 c->conn = NULL; | |
461 if (c->inpa > 0) | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
462 gaim_input_remove(c->inpa); |
2086 | 463 c->inpa = 0; |
464 c->fd = -1; | |
4617 | 465 aim_conn_kill(od->sess, &conn); |
3574 | 466 snprintf(buf, sizeof(buf), _("You have been disconnected from chat room %s."), c->name); |
3427 | 467 do_error_dialog(buf, NULL, GAIM_ERROR); |
2086 | 468 } else if (conn->type == AIM_CONN_TYPE_CHATNAV) { |
4617 | 469 if (od->cnpa > 0) |
470 gaim_input_remove(od->cnpa); | |
471 od->cnpa = 0; | |
2086 | 472 debug_printf("removing chatnav input watcher\n"); |
4617 | 473 while (od->create_rooms) { |
474 struct create_room *cr = od->create_rooms->data; | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
475 g_free(cr->name); |
4617 | 476 od->create_rooms = |
477 g_slist_remove(od->create_rooms, cr); | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
478 g_free(cr); |
3427 | 479 do_error_dialog(_("Chat is currently unavailable"), NULL, GAIM_ERROR); |
2086 | 480 } |
4617 | 481 aim_conn_kill(od->sess, &conn); |
2086 | 482 } else if (conn->type == AIM_CONN_TYPE_AUTH) { |
4617 | 483 if (od->paspa > 0) |
484 gaim_input_remove(od->paspa); | |
485 od->paspa = 0; | |
2086 | 486 debug_printf("removing authconn input watcher\n"); |
4617 | 487 aim_conn_kill(od->sess, &conn); |
3694 | 488 } else if (conn->type == AIM_CONN_TYPE_EMAIL) { |
4617 | 489 if (od->emlpa > 0) |
490 gaim_input_remove(od->emlpa); | |
491 od->emlpa = 0; | |
3694 | 492 debug_printf("removing email input watcher\n"); |
4617 | 493 aim_conn_kill(od->sess, &conn); |
4804 | 494 } else if (conn->type == AIM_CONN_TYPE_ICON) { |
495 if (od->icopa > 0) | |
496 gaim_input_remove(od->icopa); | |
497 od->icopa = 0; | |
498 debug_printf("removing icon input watcher\n"); | |
499 aim_conn_kill(od->sess, &conn); | |
2086 | 500 } else if (conn->type == AIM_CONN_TYPE_RENDEZVOUS) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
501 if (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM) |
4617 | 502 gaim_odc_disconnect(od->sess, conn); |
503 aim_conn_kill(od->sess, &conn); | |
2086 | 504 } else { |
4194 | 505 debug_printf("holy crap! generic connection error! %hu\n", |
2086 | 506 conn->type); |
4617 | 507 aim_conn_kill(od->sess, &conn); |
2086 | 508 } |
509 } | |
510 } | |
511 } | |
512 } | |
513 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
514 static void oscar_debug(aim_session_t *sess, int level, const char *format, va_list va) { |
2086 | 515 char *s = g_strdup_vprintf(format, va); |
516 char buf[256]; | |
517 char *t; | |
518 struct gaim_connection *gc = sess->aux_data; | |
519 | |
520 g_snprintf(buf, sizeof(buf), "%s %d: ", gc->username, level); | |
521 t = g_strconcat(buf, s, NULL); | |
522 debug_printf(t); | |
523 if (t[strlen(t)-1] != '\n') | |
524 debug_printf("\n"); | |
525 g_free(t); | |
526 g_free(s); | |
527 } | |
528 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
529 static void oscar_login_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 530 { |
531 struct gaim_connection *gc = data; | |
4617 | 532 struct oscar_data *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
533 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
534 aim_conn_t *conn; |
2086 | 535 |
536 if (!g_slist_find(connections, gc)) { | |
537 close(source); | |
538 return; | |
539 } | |
540 | |
4617 | 541 od = gc->proto_data; |
542 sess = od->sess; | |
2086 | 543 conn = aim_getconn_type_all(sess, AIM_CONN_TYPE_AUTH); |
4366 | 544 |
545 conn->fd = source; | |
2086 | 546 |
547 if (source < 0) { | |
548 hide_login_progress(gc, _("Couldn't connect to host")); | |
549 signoff(gc); | |
550 return; | |
551 } | |
552 | |
553 aim_conn_completeconnect(sess, conn); | |
4617 | 554 gc->inpa = gaim_input_add(conn->fd, GAIM_INPUT_READ, oscar_callback, conn); |
4236 | 555 debug_printf("Password sent, waiting for response\n"); |
2086 | 556 } |
557 | |
4491 | 558 static void oscar_login(struct gaim_account *account) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
559 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
560 aim_conn_t *conn; |
2086 | 561 char buf[256]; |
4491 | 562 struct gaim_connection *gc = new_gaim_conn(account); |
4617 | 563 struct oscar_data *od = gc->proto_data = g_new0(struct oscar_data, 1); |
2086 | 564 |
4491 | 565 if (isdigit(*account->username)) { |
4617 | 566 od->icq = TRUE; |
3064 | 567 gc->password[8] = 0; |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
568 } else { |
2918
4df759d607f3
[gaim-migrate @ 2931]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2916
diff
changeset
|
569 gc->flags |= OPT_CONN_HTML; |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
570 gc->flags |= OPT_CONN_AUTO_RESP; |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
571 } |
4738 | 572 od->buddyinfo = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); |
2086 | 573 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
574 sess = g_new0(aim_session_t, 1); |
2086 | 575 |
576 aim_session_init(sess, AIM_SESS_FLAGS_NONBLOCKCONNECT, 0); | |
577 aim_setdebuggingcb(sess, oscar_debug); | |
578 | |
579 /* we need an immediate queue because we don't use a while-loop to | |
580 * see if things need to be sent. */ | |
581 aim_tx_setenqueue(sess, AIM_TX_IMMEDIATE, NULL); | |
4617 | 582 od->sess = sess; |
2086 | 583 sess->aux_data = gc; |
584 | |
585 conn = aim_newconn(sess, AIM_CONN_TYPE_AUTH, NULL); | |
586 if (conn == NULL) { | |
4236 | 587 debug_printf("internal connection error\n"); |
2086 | 588 hide_login_progress(gc, _("Unable to login to AIM")); |
589 signoff(gc); | |
590 return; | |
591 } | |
592 | |
593 g_snprintf(buf, sizeof(buf), _("Signon: %s"), gc->username); | |
594 set_login_progress(gc, 2, buf); | |
595 | |
4649 | 596 aim_conn_addhandler(sess, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2086 | 597 aim_conn_addhandler(sess, conn, 0x0017, 0x0007, gaim_parse_login, 0); |
598 aim_conn_addhandler(sess, conn, 0x0017, 0x0003, gaim_parse_auth_resp, 0); | |
599 | |
600 conn->status |= AIM_CONN_STATUS_INPROGRESS; | |
4634 | 601 if (proxy_connect(account, account->proto_opt[USEROPT_AUTH][0] ? |
4491 | 602 account->proto_opt[USEROPT_AUTH] : FAIM_LOGIN_SERVER, |
603 account->proto_opt[USEROPT_AUTHPORT][0] ? | |
604 atoi(account->proto_opt[USEROPT_AUTHPORT]) : FAIM_LOGIN_PORT, | |
605 oscar_login_connect, gc) < 0) { | |
2086 | 606 hide_login_progress(gc, _("Couldn't connect to host")); |
607 signoff(gc); | |
608 return; | |
609 } | |
610 aim_request_login(sess, conn, gc->username); | |
611 } | |
612 | |
613 static void oscar_close(struct gaim_connection *gc) { | |
4617 | 614 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
615 | |
616 while (od->oscar_chats) { | |
617 struct chat_connection *n = od->oscar_chats->data; | |
2086 | 618 if (n->inpa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
619 gaim_input_remove(n->inpa); |
2086 | 620 g_free(n->name); |
621 g_free(n->show); | |
4617 | 622 od->oscar_chats = g_slist_remove(od->oscar_chats, n); |
2086 | 623 g_free(n); |
624 } | |
4617 | 625 while (od->direct_ims) { |
626 struct direct_im *n = od->direct_ims->data; | |
2086 | 627 if (n->watcher > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
628 gaim_input_remove(n->watcher); |
4617 | 629 od->direct_ims = g_slist_remove(od->direct_ims, n); |
2086 | 630 g_free(n); |
631 } | |
4617 | 632 /* BBB */ |
633 while (od->file_transfers) { | |
634 struct gaim_xfer *xfer; | |
635 xfer = (struct gaim_xfer *)od->file_transfers->data; | |
636 gaim_xfer_destroy(xfer); | |
3630 | 637 } |
4804 | 638 while (od->requesticon) { |
639 char *sn = od->requesticon->data; | |
640 od->requesticon = g_slist_remove(od->requesticon, sn); | |
641 free(sn); | |
642 } | |
4738 | 643 g_hash_table_destroy(od->buddyinfo); |
4617 | 644 while (od->evilhack) { |
645 g_free(od->evilhack->data); | |
646 od->evilhack = g_slist_remove(od->evilhack, od->evilhack->data); | |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
647 } |
4617 | 648 while (od->create_rooms) { |
649 struct create_room *cr = od->create_rooms->data; | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
650 g_free(cr->name); |
4617 | 651 od->create_rooms = g_slist_remove(od->create_rooms, cr); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
652 g_free(cr); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
653 } |
4617 | 654 if (od->email) |
655 g_free(od->email); | |
656 if (od->newp) | |
657 g_free(od->newp); | |
658 if (od->oldp) | |
659 g_free(od->oldp); | |
2086 | 660 if (gc->inpa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
661 gaim_input_remove(gc->inpa); |
4617 | 662 if (od->cnpa > 0) |
663 gaim_input_remove(od->cnpa); | |
664 if (od->paspa > 0) | |
665 gaim_input_remove(od->paspa); | |
666 if (od->emlpa > 0) | |
667 gaim_input_remove(od->emlpa); | |
4804 | 668 if (od->icopa > 0) |
669 gaim_input_remove(od->icopa); | |
4617 | 670 aim_session_kill(od->sess); |
671 g_free(od->sess); | |
672 od->sess = NULL; | |
2086 | 673 g_free(gc->proto_data); |
674 gc->proto_data = NULL; | |
4236 | 675 debug_printf("Signed off.\n"); |
2086 | 676 } |
677 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
678 static void oscar_bos_connect(gpointer data, gint source, GaimInputCondition cond) { |
2086 | 679 struct gaim_connection *gc = data; |
4617 | 680 struct oscar_data *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
681 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
682 aim_conn_t *bosconn; |
2086 | 683 |
684 if (!g_slist_find(connections, gc)) { | |
685 close(source); | |
686 return; | |
687 } | |
688 | |
4617 | 689 od = gc->proto_data; |
690 sess = od->sess; | |
691 bosconn = od->conn; | |
4366 | 692 bosconn->fd = source; |
2086 | 693 |
694 if (source < 0) { | |
695 hide_login_progress(gc, _("Could Not Connect")); | |
696 signoff(gc); | |
697 return; | |
698 } | |
699 | |
700 aim_conn_completeconnect(sess, bosconn); | |
4617 | 701 gc->inpa = gaim_input_add(bosconn->fd, GAIM_INPUT_READ, oscar_callback, bosconn); |
2086 | 702 set_login_progress(gc, 4, _("Connection established, cookie sent")); |
703 } | |
704 | |
4617 | 705 /* BBB */ |
4656 | 706 /* |
707 * This little area in oscar.c is the nexus of file transfer code, | |
708 * so I wrote a little explanation of what happens. I am such a | |
709 * ninja. | |
710 * | |
711 * The series of events for a file send is: | |
712 * -Create xfer and call gaim_xfer_request (this happens in oscar_ask_sendfile) | |
713 * -User chooses a file and oscar_xfer_init is called. It establishs a | |
714 * listening socket, then asks the remote user to connect to us (and | |
715 * gives them the file name, port, IP, etc.) | |
716 * -They connect to us and we send them an AIM_CB_OFT_PROMPT (this happens | |
717 * in oscar_sendfile_estblsh) | |
718 * -They send us an AIM_CB_OFT_ACK and then we start sending data | |
719 * -When we finish, they send us an AIM_CB_OFT_DONE and they close the | |
720 * connection. | |
721 * -We get drunk because file transfer kicks ass. | |
722 * | |
723 * The series of events for a file receive is: | |
724 * -Create xfer and call gaim_xfer request (this happens in incomingim_chan2) | |
725 * -Gaim user selects file to name and location to save file to and | |
726 * oscar_xfer_init is called | |
727 * -It connects to the remote user using the IP they gave us earlier | |
728 * -After connecting, they send us an AIM_CB_OFT_PROMPT. In reply, we send | |
729 * them an AIM_CB_OFT_ACK. | |
730 * -They begin to send us lots of raw data. | |
731 * -When they finish sending data we send an AIM_CB_OFT_DONE and then close | |
732 * the connectionn. | |
733 */ | |
734 static void oscar_sendfile_connected(gpointer data, gint source, GaimInputCondition condition); | |
735 | |
736 /* XXX - This function is pretty ugly */ | |
737 static void | |
738 oscar_xfer_init(struct gaim_xfer *xfer) | |
739 { | |
740 struct gaim_connection *gc; | |
741 struct oscar_data *od; | |
742 struct oscar_xfer_data *xfer_data; | |
743 | |
744 debug_printf("in oscar_xfer_init\n"); | |
745 if (!(xfer_data = xfer->data)) | |
746 return; | |
747 if (!(gc = xfer_data->gc)) | |
748 return; | |
749 if (!(od = gc->proto_data)) | |
750 return; | |
751 | |
752 if (gaim_xfer_get_type(xfer) == GAIM_XFER_SEND) { | |
753 int i; | |
754 char ip[4]; | |
755 gchar **ipsplit; | |
756 | |
757 if (xfer->local_ip) { | |
758 ipsplit = g_strsplit(xfer->local_ip, ".", 4); | |
759 for (i=0; ipsplit[i]; i++) | |
760 ip[i] = atoi(ipsplit[i]); | |
761 g_strfreev(ipsplit); | |
762 } else { | |
763 memset(ip, 0x00, 4); | |
764 } | |
765 | |
766 xfer->filename = g_path_get_basename(xfer->local_filename); | |
767 xfer_data->checksum = aim_oft_checksum_file(xfer->local_filename); | |
768 | |
769 /* | |
770 * First try the port specified earlier (5190). If that fails, try a | |
771 * few random ports. Maybe we need a way to tell libfaim to listen | |
772 * for multiple connections on one listener socket. | |
773 */ | |
774 xfer_data->conn = aim_sendfile_listen(od->sess, xfer_data->cookie, ip, xfer->local_port); | |
775 for (i=0; (i<5 && !xfer_data->conn); i++) { | |
776 xfer->local_port = (rand() % (65535-1024)) + 1024; | |
777 xfer_data->conn = aim_sendfile_listen(od->sess, xfer_data->cookie, ip, xfer->local_port); | |
778 } | |
779 debug_printf("port is %d, ip is %hhd.%hhd.%hhd.%hhd\n", xfer->local_port, ip[0], ip[1], ip[2], ip[3]); | |
780 if (xfer_data->conn) { | |
781 xfer->watcher = gaim_input_add(xfer_data->conn->fd, GAIM_INPUT_READ, oscar_callback, xfer_data->conn); | |
782 aim_im_sendch2_sendfile_ask(od->sess, xfer_data->cookie, xfer->who, ip, xfer->local_port, xfer->filename, 1, xfer->size); | |
783 aim_conn_addhandler(od->sess, xfer_data->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_ESTABLISHED, oscar_sendfile_estblsh, 0); | |
784 } else { | |
785 do_error_dialog(_("File Transfer Aborted"), _("Unable to establish listener socket."), GAIM_ERROR); | |
786 /* XXX - The below line causes a crash because the transfer is canceled before the "Ok" callback on the file selection thing exists, I think */ | |
4675
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
787 /* gaim_xfer_cancel_remote(xfer); */ |
4656 | 788 } |
789 } else if (gaim_xfer_get_type(xfer) == GAIM_XFER_RECEIVE) { | |
790 xfer_data->conn = aim_newconn(od->sess, AIM_CONN_TYPE_RENDEZVOUS, NULL); | |
791 if (xfer_data->conn) { | |
792 xfer_data->conn->subtype = AIM_CONN_SUBTYPE_OFT_SENDFILE; | |
793 aim_conn_addhandler(od->sess, xfer_data->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_PROMPT, oscar_sendfile_prompt, 0); | |
794 xfer_data->conn->fd = xfer->fd = proxy_connect(gc->account, xfer->remote_ip, xfer->remote_port, oscar_sendfile_connected, xfer); | |
795 if (xfer->fd == -1) { | |
796 do_error_dialog(_("File Transfer Aborted"), _("Unable to establish file descriptor."), GAIM_ERROR); | |
4675
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
797 /* gaim_xfer_cancel_remote(xfer); */ |
4656 | 798 } |
799 } else { | |
800 do_error_dialog(_("File Transfer Aborted"), _("Unable to create new connection."), GAIM_ERROR); | |
4675
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
801 /* gaim_xfer_cancel_remote(xfer); */ |
4656 | 802 /* Try a different port? Ask them to connect to us? */ |
803 } | |
804 | |
805 } | |
806 } | |
807 | |
808 static void | |
809 oscar_xfer_start(struct gaim_xfer *xfer) | |
810 { | |
811 /* struct gaim_connection *gc; | |
812 struct oscar_data *od; | |
813 struct oscar_xfer_data *xfer_data; | |
814 | |
815 if (!(xfer_data = xfer->data)) | |
816 return; | |
817 if (!(gc = xfer_data->gc)) | |
818 return; | |
819 if (!(od = gc->proto_data)) | |
820 return; | |
821 | |
822 od = xfer_data->od; | |
823 */ | |
824 debug_printf("AAA - in oscar_xfer_start\n"); | |
825 | |
826 /* I'm pretty sure we don't need to do jack here. Nor Jill. */ | |
827 } | |
828 | |
829 static void | |
830 oscar_xfer_end(struct gaim_xfer *xfer) | |
831 { | |
832 struct gaim_connection *gc; | |
833 struct oscar_data *od; | |
834 struct oscar_xfer_data *xfer_data; | |
835 | |
836 debug_printf("AAA - in oscar_xfer_end\n"); | |
837 if (!(xfer_data = xfer->data)) | |
838 return; | |
839 | |
840 if (gaim_xfer_get_type(xfer) == GAIM_XFER_RECEIVE) | |
841 aim_oft_sendheader(xfer_data->conn->sessv, xfer_data->conn, AIM_CB_OFT_DONE, xfer_data->cookie, xfer->filename, 1, 1, xfer->size, xfer->size, xfer_data->modtime, xfer_data->checksum, 0x02, xfer->size, xfer_data->checksum); | |
842 | |
843 g_free(xfer_data->clientip); | |
844 g_free(xfer_data->clientip2); | |
845 | |
846 if ((gc = xfer_data->gc)) { | |
847 if ((od = gc->proto_data)) | |
848 od->file_transfers = g_slist_remove(od->file_transfers, xfer); | |
849 } | |
850 | |
851 g_free(xfer_data); | |
852 xfer->data = NULL; | |
853 } | |
854 | |
855 static void | |
4675
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
856 oscar_xfer_cancel_send(struct gaim_xfer *xfer) |
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
857 { |
4763 | 858 struct gaim_connection *gc; |
859 struct oscar_data *od; | |
860 struct oscar_xfer_data *xfer_data; | |
861 aim_conn_t *conn; | |
862 | |
863 debug_printf("AAA - in oscar_xfer_cancel_send\n"); | |
864 if (!(xfer_data = xfer->data)) | |
865 return; | |
866 | |
867 if ((conn = xfer_data->conn)) { | |
868 aim_session_t *sess; | |
869 if ((sess = conn->sessv)) | |
870 if (xfer_data->cookie && xfer->who) | |
871 aim_im_sendch2_sendfile_cancel(sess, xfer_data->cookie, xfer->who, AIM_CAPS_SENDFILE); | |
872 } | |
873 | |
874 g_free(xfer_data->clientip); | |
875 g_free(xfer_data->clientip2); | |
876 | |
877 if ((gc = xfer_data->gc)) | |
878 if ((od = gc->proto_data)) | |
879 od->file_transfers = g_slist_remove(od->file_transfers, xfer); | |
880 | |
881 g_free(xfer_data); | |
882 xfer->data = NULL; | |
4675
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
883 } |
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
884 |
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
885 static void |
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
886 oscar_xfer_cancel_recv(struct gaim_xfer *xfer) |
4656 | 887 { |
888 struct gaim_connection *gc; | |
889 struct oscar_data *od; | |
890 struct oscar_xfer_data *xfer_data; | |
891 aim_conn_t *conn; | |
892 | |
4763 | 893 debug_printf("AAA - in oscar_xfer_cancel_recv\n"); |
4656 | 894 if (!(xfer_data = xfer->data)) |
895 return; | |
896 | |
897 if ((conn = xfer_data->conn)) { | |
898 aim_session_t *sess; | |
899 if ((sess = conn->sessv)) | |
900 if (xfer_data->cookie && xfer->who) | |
901 aim_im_sendch2_sendfile_cancel(sess, xfer_data->cookie, xfer->who, AIM_CAPS_SENDFILE); | |
902 } | |
903 | |
904 g_free(xfer_data->clientip); | |
905 g_free(xfer_data->clientip2); | |
906 | |
907 if ((gc = xfer_data->gc)) | |
908 if ((od = gc->proto_data)) | |
909 od->file_transfers = g_slist_remove(od->file_transfers, xfer); | |
910 | |
911 g_free(xfer_data); | |
912 xfer->data = NULL; | |
913 } | |
914 | |
915 static void | |
916 oscar_xfer_ack(struct gaim_xfer *xfer, const char *buffer, size_t size) | |
917 { | |
918 struct oscar_xfer_data *xfer_data; | |
919 | |
920 if (!(xfer_data = xfer->data)) | |
921 return; | |
922 | |
923 if (gaim_xfer_get_type(xfer) == GAIM_XFER_SEND) { | |
924 /* | |
925 * If we're done sending, intercept the socket from the core ft code | |
926 * and wait for the other guy to send the "done" OFT packet. | |
927 */ | |
928 if (gaim_xfer_get_bytes_remaining(xfer) <= 0) { | |
929 gaim_input_remove(xfer->watcher); | |
930 xfer->watcher = gaim_input_add(xfer->fd, GAIM_INPUT_READ, oscar_callback, xfer_data->conn); | |
931 xfer->fd = 0; | |
932 gaim_xfer_set_completed(xfer, TRUE); | |
933 } | |
934 } else if (gaim_xfer_get_type(xfer) == GAIM_XFER_RECEIVE) { | |
935 /* Update our rolling checksum */ | |
936 /* xfer_data->checksum = aim_oft_checksum_chunk(buffer, size, xfer_data->checksum); */ | |
937 } | |
938 } | |
939 | |
940 static struct gaim_xfer * | |
941 oscar_find_xfer_by_cookie(GSList *fts, const char *ck) | |
942 { | |
943 struct gaim_xfer *xfer; | |
944 struct oscar_xfer_data *data; | |
945 | |
946 while (fts) { | |
947 xfer = fts->data; | |
948 data = xfer->data; | |
949 | |
950 if (data && !strcmp(data->cookie, ck)) | |
951 return xfer; | |
952 | |
953 fts = g_slist_next(fts); | |
954 } | |
955 | |
956 return NULL; | |
957 } | |
958 | |
959 static struct gaim_xfer * | |
960 oscar_find_xfer_by_conn(GSList *fts, aim_conn_t *conn) | |
961 { | |
962 struct gaim_xfer *xfer; | |
963 struct oscar_xfer_data *data; | |
964 | |
965 while (fts) { | |
966 xfer = fts->data; | |
967 data = xfer->data; | |
968 | |
969 if (data && (conn == data->conn)) | |
970 return xfer; | |
971 | |
972 fts = g_slist_next(fts); | |
973 } | |
974 | |
975 return NULL; | |
976 } | |
977 | |
4617 | 978 static void oscar_ask_sendfile(struct gaim_connection *gc, char *destsn) { |
3630 | 979 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
3752 | 980 |
4617 | 981 /* You want to send a file to someone else, you're so generous */ |
982 struct gaim_xfer *xfer; | |
983 struct oscar_xfer_data *xfer_data; | |
984 | |
985 /* Create the oscar-specific data */ | |
986 xfer_data = g_malloc0(sizeof(struct oscar_xfer_data)); | |
987 xfer_data->gc = gc; | |
988 | |
989 /* Build the file transfer handle */ | |
990 xfer = gaim_xfer_new(gc->account, GAIM_XFER_SEND, destsn); | |
991 xfer_data->xfer = xfer; | |
992 xfer->data = xfer_data; | |
993 | |
994 /* Set the info about the incoming file */ | |
4650 | 995 if (od && od->sess) { |
4617 | 996 aim_conn_t *conn; |
4650 | 997 if ((conn = aim_conn_findbygroup(od->sess, 0x0004))) |
998 xfer->local_ip = gaim_getip_from_fd(conn->fd); | |
4617 | 999 } |
1000 xfer->local_port = 5190; | |
1001 | |
1002 /* Setup our I/O op functions */ | |
1003 gaim_xfer_set_init_fnc(xfer, oscar_xfer_init); | |
1004 gaim_xfer_set_start_fnc(xfer, oscar_xfer_start); | |
1005 gaim_xfer_set_end_fnc(xfer, oscar_xfer_end); | |
4675
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
1006 gaim_xfer_set_cancel_send_fnc(xfer, oscar_xfer_cancel_send); |
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
1007 gaim_xfer_set_cancel_recv_fnc(xfer, oscar_xfer_cancel_recv); |
4656 | 1008 gaim_xfer_set_ack_fnc(xfer, oscar_xfer_ack); |
4617 | 1009 |
1010 /* Keep track of this transfer for later */ | |
1011 od->file_transfers = g_slist_append(od->file_transfers, xfer); | |
1012 | |
1013 /* Now perform the request */ | |
1014 gaim_xfer_request(xfer); | |
3630 | 1015 } |
1016 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1017 static int gaim_parse_auth_resp(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 1018 va_list ap; |
2704 | 1019 struct aim_authresp_info *info; |
4452 | 1020 int i, rc; |
1021 char *host; int port; | |
4491 | 1022 struct gaim_account *account; |
2704 | 1023 aim_conn_t *bosconn; |
2086 | 1024 |
1025 struct gaim_connection *gc = sess->aux_data; | |
1026 struct oscar_data *od = gc->proto_data; | |
4491 | 1027 account = gc->account; |
1028 port = account->proto_opt[USEROPT_AUTHPORT][0] ? | |
1029 atoi(account->proto_opt[USEROPT_AUTHPORT]) : FAIM_LOGIN_PORT, | |
2086 | 1030 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1031 va_start(ap, fr); |
2704 | 1032 info = va_arg(ap, struct aim_authresp_info *); |
2086 | 1033 va_end(ap); |
1034 | |
2704 | 1035 debug_printf("inside auth_resp (Screen name: %s)\n", info->sn); |
1036 | |
4293 | 1037 if (info->errorcode || !info->bosip || !info->cookielen || !info->cookie) { |
4056 | 1038 char buf[256]; |
2704 | 1039 switch (info->errorcode) { |
2086 | 1040 case 0x05: |
1041 /* Incorrect nick/password */ | |
1042 hide_login_progress(gc, _("Incorrect nickname or password.")); | |
1043 break; | |
1044 case 0x11: | |
1045 /* Suspended account */ | |
1046 hide_login_progress(gc, _("Your account is currently suspended.")); | |
1047 break; | |
3498 | 1048 case 0x14: |
1049 /* service temporarily unavailable */ | |
1050 hide_login_progress(gc, _("The AOL Instant Messenger service is temporarily unavailable.")); | |
1051 break; | |
2086 | 1052 case 0x18: |
1053 /* connecting too frequently */ | |
1054 hide_login_progress(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.")); | |
1055 break; | |
1056 case 0x1c: | |
1057 /* client too old */ | |
4056 | 1058 g_snprintf(buf, sizeof(buf), _("The client version you are using is too old. Please upgrade at %s"), WEBSITE); |
1059 hide_login_progress(gc, buf); | |
2086 | 1060 break; |
1061 default: | |
1062 hide_login_progress(gc, _("Authentication Failed")); | |
1063 break; | |
1064 } | |
4194 | 1065 debug_printf("Login Error Code 0x%04hx\n", info->errorcode); |
2704 | 1066 debug_printf("Error URL: %s\n", info->errorurl); |
2086 | 1067 od->killme = TRUE; |
1068 return 1; | |
1069 } | |
1070 | |
1071 | |
4194 | 1072 debug_printf("Reg status: %hu\n", info->regstatus); |
2704 | 1073 if (info->email) { |
1074 debug_printf("Email: %s\n", info->email); | |
2086 | 1075 } else { |
1076 debug_printf("Email is NULL\n"); | |
1077 } | |
2704 | 1078 debug_printf("BOSIP: %s\n", info->bosip); |
2086 | 1079 debug_printf("Closing auth connection...\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1080 aim_conn_kill(sess, &fr->conn); |
2086 | 1081 |
1082 bosconn = aim_newconn(sess, AIM_CONN_TYPE_BOS, NULL); | |
1083 if (bosconn == NULL) { | |
1084 hide_login_progress(gc, _("Internal Error")); | |
1085 od->killme = TRUE; | |
1086 return 0; | |
1087 } | |
1088 | |
4649 | 1089 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 1090 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_bos, 0); |
2086 | 1091 aim_conn_addhandler(sess, bosconn, 0x0009, 0x0003, gaim_bosrights, 0); |
1092 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ACK, AIM_CB_ACK_ACK, NULL, 0); | |
1093 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_REDIRECT, gaim_handle_redirect, 0); | |
2993 | 1094 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_RIGHTSINFO, gaim_parse_locaterights, 0); |
2086 | 1095 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_RIGHTSINFO, gaim_parse_buddyrights, 0); |
1096 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_ONCOMING, gaim_parse_oncoming, 0); | |
1097 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_OFFGOING, gaim_parse_offgoing, 0); | |
1098 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_INCOMING, gaim_parse_incoming_im, 0); | |
1099 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_ERROR, gaim_parse_locerr, 0); | |
1100 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_MISSEDCALL, gaim_parse_misses, 0); | |
3212 | 1101 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_CLIENTAUTORESP, gaim_parse_clientauto, 0); |
2086 | 1102 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_RATECHANGE, gaim_parse_ratechange, 0); |
1103 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_EVIL, gaim_parse_evilnotify, 0); | |
1104 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOK, AIM_CB_LOK_ERROR, gaim_parse_searcherror, 0); | |
1105 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOK, 0x0003, gaim_parse_searchreply, 0); | |
1106 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ERROR, gaim_parse_msgerr, 0); | |
3595 | 1107 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_MTN, gaim_parse_mtn, 0); |
2086 | 1108 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_USERINFO, gaim_parse_user_info, 0); |
1109 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ACK, gaim_parse_msgack, 0); | |
1110 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_MOTD, gaim_parse_motd, 0); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
1111 aim_conn_addhandler(sess, bosconn, 0x0004, 0x0005, gaim_icbm_param_info, 0); |
2086 | 1112 aim_conn_addhandler(sess, bosconn, 0x0001, 0x0001, gaim_parse_genericerr, 0); |
1113 aim_conn_addhandler(sess, bosconn, 0x0003, 0x0001, gaim_parse_genericerr, 0); | |
1114 aim_conn_addhandler(sess, bosconn, 0x0009, 0x0001, gaim_parse_genericerr, 0); | |
1115 aim_conn_addhandler(sess, bosconn, 0x0001, 0x001f, gaim_memrequest, 0); | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
1116 aim_conn_addhandler(sess, bosconn, 0x0001, 0x000f, gaim_selfinfo, 0); |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
1117 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_OFFLINEMSG, gaim_offlinemsg, 0); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
1118 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_OFFLINEMSGCOMPLETE, gaim_offlinemsgdone, 0); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
1119 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_POP, 0x0002, gaim_popup, 0); |
4759 | 1120 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_ALIAS, gaim_icqalias, 0); |
4624 | 1121 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_INFO, gaim_icqinfo, 0); |
4230 | 1122 #ifndef NOSSI |
4642 | 1123 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_ERROR, gaim_ssi_parseerr, 0); |
2991 | 1124 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RIGHTSINFO, gaim_ssi_parserights, 0); |
1125 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_LIST, gaim_ssi_parselist, 0); | |
1126 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_NOLIST, gaim_ssi_parselist, 0); | |
4230 | 1127 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_SRVACK, gaim_ssi_parseack, 0); |
1128 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RECVAUTH, gaim_ssi_authgiven, 0); | |
1129 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RECVAUTHREQ, gaim_ssi_authrequest, 0); | |
1130 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RECVAUTHREP, gaim_ssi_authreply, 0); | |
1131 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_ADDED, gaim_ssi_gotadded, 0); | |
1132 #endif | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
1133 |
2086 | 1134 ((struct oscar_data *)gc->proto_data)->conn = bosconn; |
2704 | 1135 for (i = 0; i < (int)strlen(info->bosip); i++) { |
1136 if (info->bosip[i] == ':') { | |
1137 port = atoi(&(info->bosip[i+1])); | |
2086 | 1138 break; |
1139 } | |
1140 } | |
2704 | 1141 host = g_strndup(info->bosip, i); |
2086 | 1142 bosconn->status |= AIM_CONN_STATUS_INPROGRESS; |
4634 | 1143 rc = proxy_connect(gc->account, host, port, oscar_bos_connect, gc); |
2086 | 1144 g_free(host); |
4366 | 1145 if (rc < 0) { |
2086 | 1146 hide_login_progress(gc, _("Could Not Connect")); |
1147 od->killme = TRUE; | |
1148 return 0; | |
1149 } | |
4293 | 1150 aim_sendcookie(sess, bosconn, info->cookielen, info->cookie); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1151 gaim_input_remove(gc->inpa); |
2704 | 1152 |
2086 | 1153 return 1; |
1154 } | |
1155 | |
1156 struct pieceofcrap { | |
1157 struct gaim_connection *gc; | |
1158 unsigned long offset; | |
1159 unsigned long len; | |
1160 char *modname; | |
1161 int fd; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1162 aim_conn_t *conn; |
2086 | 1163 unsigned int inpa; |
1164 }; | |
1165 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1166 static void damn_you(gpointer data, gint source, GaimInputCondition c) |
2086 | 1167 { |
1168 struct pieceofcrap *pos = data; | |
1169 struct oscar_data *od = pos->gc->proto_data; | |
1170 char in = '\0'; | |
1171 int x = 0; | |
1172 unsigned char m[17]; | |
1173 | |
1174 while (read(pos->fd, &in, 1) == 1) { | |
1175 if (in == '\n') | |
1176 x++; | |
1177 else if (in != '\r') | |
1178 x = 0; | |
1179 if (x == 2) | |
1180 break; | |
1181 in = '\0'; | |
1182 } | |
1183 if (in != '\n') { | |
4056 | 1184 char buf[256]; |
1185 g_snprintf(buf, sizeof(buf), _("You may be disconnected shortly. You may want to use TOC until " | |
1186 "this is fixed. Check %s for updates."), WEBSITE); | |
3427 | 1187 do_error_dialog(_("Gaim was Unable to get a valid AIM login hash."), |
4056 | 1188 buf, GAIM_WARNING); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1189 gaim_input_remove(pos->inpa); |
2086 | 1190 close(pos->fd); |
1191 g_free(pos); | |
1192 return; | |
1193 } | |
1194 read(pos->fd, m, 16); | |
1195 m[16] = '\0'; | |
1196 debug_printf("Sending hash: "); | |
1197 for (x = 0; x < 16; x++) | |
4194 | 1198 debug_printf("%02hhx ", (unsigned char)m[x]); |
2086 | 1199 debug_printf("\n"); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1200 gaim_input_remove(pos->inpa); |
2086 | 1201 close(pos->fd); |
1202 aim_sendmemblock(od->sess, pos->conn, 0, 16, m, AIM_SENDMEMBLOCK_FLAG_ISHASH); | |
1203 g_free(pos); | |
1204 } | |
1205 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1206 static void straight_to_hell(gpointer data, gint source, GaimInputCondition cond) { |
2086 | 1207 struct pieceofcrap *pos = data; |
1208 char buf[BUF_LONG]; | |
1209 | |
4366 | 1210 pos->fd = source; |
1211 | |
2086 | 1212 if (source < 0) { |
4056 | 1213 char buf[256]; |
1214 g_snprintf(buf, sizeof(buf), _("You may be disconnected shortly. You may want to use TOC until " | |
1215 "this is fixed. Check %s for updates."), WEBSITE); | |
3427 | 1216 do_error_dialog(_("Gaim was Unable to get a valid AIM login hash."), |
4056 | 1217 buf, GAIM_WARNING); |
2086 | 1218 if (pos->modname) |
1219 g_free(pos->modname); | |
1220 g_free(pos); | |
1221 return; | |
1222 } | |
1223 | |
1224 g_snprintf(buf, sizeof(buf), "GET " AIMHASHDATA | |
1225 "?offset=%ld&len=%ld&modname=%s HTTP/1.0\n\n", | |
1226 pos->offset, pos->len, pos->modname ? pos->modname : ""); | |
1227 write(pos->fd, buf, strlen(buf)); | |
1228 if (pos->modname) | |
1229 g_free(pos->modname); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1230 pos->inpa = gaim_input_add(pos->fd, GAIM_INPUT_READ, damn_you, pos); |
2086 | 1231 return; |
1232 } | |
1233 | |
1234 /* size of icbmui.ocm, the largest module in AIM 3.5 */ | |
1235 #define AIM_MAX_FILE_SIZE 98304 | |
1236 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1237 int gaim_memrequest(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 1238 va_list ap; |
1239 struct pieceofcrap *pos; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1240 fu32_t offset, len; |
2086 | 1241 char *modname; |
1242 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1243 va_start(ap, fr); |
4200 | 1244 offset = va_arg(ap, fu32_t); |
1245 len = va_arg(ap, fu32_t); | |
2086 | 1246 modname = va_arg(ap, char *); |
1247 va_end(ap); | |
1248 | |
4194 | 1249 debug_printf("offset: %lu, len: %lu, file: %s\n", offset, len, (modname ? modname : "aim.exe")); |
2086 | 1250 if (len == 0) { |
1251 debug_printf("len is 0, hashing NULL\n"); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1252 aim_sendmemblock(sess, fr->conn, offset, len, NULL, |
2086 | 1253 AIM_SENDMEMBLOCK_FLAG_ISREQUEST); |
1254 return 1; | |
1255 } | |
1256 /* uncomment this when you're convinced it's right. remember, it's been wrong before. | |
1257 if (offset > AIM_MAX_FILE_SIZE || len > AIM_MAX_FILE_SIZE) { | |
1258 char *buf; | |
1259 int i = 8; | |
1260 if (modname) | |
1261 i += strlen(modname); | |
1262 buf = g_malloc(i); | |
1263 i = 0; | |
1264 if (modname) { | |
1265 memcpy(buf, modname, strlen(modname)); | |
1266 i += strlen(modname); | |
1267 } | |
1268 buf[i++] = offset & 0xff; | |
1269 buf[i++] = (offset >> 8) & 0xff; | |
1270 buf[i++] = (offset >> 16) & 0xff; | |
1271 buf[i++] = (offset >> 24) & 0xff; | |
1272 buf[i++] = len & 0xff; | |
1273 buf[i++] = (len >> 8) & 0xff; | |
1274 buf[i++] = (len >> 16) & 0xff; | |
1275 buf[i++] = (len >> 24) & 0xff; | |
1276 debug_printf("len + offset is invalid, hashing request\n"); | |
1277 aim_sendmemblock(sess, command->conn, offset, i, buf, AIM_SENDMEMBLOCK_FLAG_ISREQUEST); | |
1278 g_free(buf); | |
1279 return 1; | |
1280 } | |
1281 */ | |
1282 | |
1283 pos = g_new0(struct pieceofcrap, 1); | |
1284 pos->gc = sess->aux_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1285 pos->conn = fr->conn; |
2086 | 1286 |
1287 pos->offset = offset; | |
1288 pos->len = len; | |
1289 pos->modname = modname ? g_strdup(modname) : NULL; | |
1290 | |
4634 | 1291 if (proxy_connect(pos->gc->account, "gaim.sourceforge.net", 80, straight_to_hell, pos) != 0) { |
4056 | 1292 char buf[256]; |
2086 | 1293 if (pos->modname) |
1294 g_free(pos->modname); | |
1295 g_free(pos); | |
4056 | 1296 g_snprintf(buf, sizeof(buf), _("You may be disconnected shortly. You may want to use TOC until " |
1297 "this is fixed. Check %s for updates."), WEBSITE); | |
4452 | 1298 do_error_dialog(_("Gaim was Unable to get a valid login hash."), |
4056 | 1299 buf, GAIM_WARNING); |
2086 | 1300 } |
1301 | |
1302 return 1; | |
1303 } | |
1304 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1305 static int gaim_parse_login(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 1306 char *key; |
1307 va_list ap; | |
1308 struct gaim_connection *gc = sess->aux_data; | |
4617 | 1309 struct oscar_data *od = gc->proto_data; |
2086 | 1310 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1311 va_start(ap, fr); |
2086 | 1312 key = va_arg(ap, char *); |
1313 va_end(ap); | |
1314 | |
4617 | 1315 if (od->icq) { |
3458 | 1316 struct client_info_s info = CLIENTINFO_ICQ_KNOWNGOOD; |
1317 aim_send_login(sess, fr->conn, gc->username, gc->password, &info, key); | |
1318 } else { | |
1319 #if 0 | |
1320 struct client_info_s info = {"gaim", 4, 1, 2010, "us", "en", 0x0004, 0x0000, 0x04b}; | |
1321 #endif | |
1322 struct client_info_s info = CLIENTINFO_AIM_KNOWNGOOD; | |
1323 aim_send_login(sess, fr->conn, gc->username, gc->password, &info, key); | |
1324 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1325 |
2086 | 1326 return 1; |
1327 } | |
1328 | |
2675 | 1329 static int conninitdone_chat(aim_session_t *sess, aim_frame_t *fr, ...) { |
2647 | 1330 struct gaim_connection *gc = sess->aux_data; |
1331 struct chat_connection *chatcon; | |
1332 static int id = 1; | |
1333 | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1334 aim_conn_addhandler(sess, fr->conn, 0x000e, 0x0001, gaim_parse_genericerr, 0); |
2675 | 1335 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERJOIN, gaim_chat_join, 0); |
1336 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERLEAVE, gaim_chat_leave, 0); | |
1337 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_ROOMINFOUPDATE, gaim_chat_info_update, 0); | |
1338 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_INCOMINGMSG, gaim_chat_incoming_msg, 0); | |
1339 | |
2672 | 1340 aim_clientready(sess, fr->conn); |
2675 | 1341 |
2647 | 1342 chatcon = find_oscar_chat_by_conn(gc, fr->conn); |
1343 chatcon->id = id; | |
1344 chatcon->cnv = serv_got_joined_chat(gc, id++, chatcon->show); | |
1345 | |
1346 return 1; | |
1347 } | |
1348 | |
2675 | 1349 static int conninitdone_chatnav(aim_session_t *sess, aim_frame_t *fr, ...) { |
1350 | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1351 aim_conn_addhandler(sess, fr->conn, 0x000d, 0x0001, gaim_parse_genericerr, 0); |
2647 | 1352 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CTN, AIM_CB_CTN_INFO, gaim_chatnav_info, 0); |
2675 | 1353 |
1354 aim_clientready(sess, fr->conn); | |
1355 | |
1356 aim_chatnav_reqrights(sess, fr->conn); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1357 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1358 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1359 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1360 |
3694 | 1361 static int conninitdone_email(aim_session_t *sess, aim_frame_t *fr, ...) { |
1362 | |
1363 aim_conn_addhandler(sess, fr->conn, 0x0018, 0x0001, gaim_parse_genericerr, 0); | |
1364 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_EML, AIM_CB_EML_MAILSTATUS, gaim_email_parseupdate, 0); | |
1365 | |
1366 aim_email_sendcookies(sess, fr->conn); | |
1367 aim_email_activate(sess, fr->conn); | |
1368 aim_clientready(sess, fr->conn); | |
1369 | |
1370 return 1; | |
1371 } | |
1372 | |
4804 | 1373 static int conninitdone_icon(aim_session_t *sess, aim_frame_t *fr, ...) { |
1374 struct gaim_connection *gc = sess->aux_data; | |
1375 struct oscar_data *od = gc->proto_data; | |
1376 | |
1377 aim_conn_addhandler(sess, fr->conn, 0x0018, 0x0001, gaim_parse_genericerr, 0); | |
1378 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ICO, AIM_CB_ICO_ERROR, gaim_icon_error, 0); | |
1379 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_ICO, AIM_CB_ICO_RESPONSE, gaim_icon_parseicon, 0); | |
1380 | |
1381 aim_clientready(sess, fr->conn); | |
1382 | |
1383 if (od->icontimer) | |
1384 g_source_remove(od->icontimer); | |
1385 od->icontimer = g_timeout_add(100, gaim_icon_timerfunc, gc); | |
1386 | |
1387 return 1; | |
1388 } | |
1389 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1390 static void oscar_chatnav_connect(gpointer data, gint source, GaimInputCondition cond) { |
2086 | 1391 struct gaim_connection *gc = data; |
4617 | 1392 struct oscar_data *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1393 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1394 aim_conn_t *tstconn; |
2086 | 1395 |
1396 if (!g_slist_find(connections, gc)) { | |
1397 close(source); | |
1398 return; | |
1399 } | |
1400 | |
4617 | 1401 od = gc->proto_data; |
1402 sess = od->sess; | |
2086 | 1403 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_CHATNAV); |
4366 | 1404 tstconn->fd = source; |
2086 | 1405 |
1406 if (source < 0) { | |
1407 aim_conn_kill(sess, &tstconn); | |
1408 debug_printf("unable to connect to chatnav server\n"); | |
1409 return; | |
1410 } | |
1411 | |
1412 aim_conn_completeconnect(sess, tstconn); | |
4617 | 1413 od->cnpa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); |
2086 | 1414 debug_printf("chatnav: connected\n"); |
1415 } | |
1416 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1417 static void oscar_auth_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 1418 { |
1419 struct gaim_connection *gc = data; | |
4617 | 1420 struct oscar_data *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1421 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1422 aim_conn_t *tstconn; |
2086 | 1423 |
1424 if (!g_slist_find(connections, gc)) { | |
1425 close(source); | |
1426 return; | |
1427 } | |
1428 | |
4617 | 1429 od = gc->proto_data; |
1430 sess = od->sess; | |
2086 | 1431 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_AUTH); |
4366 | 1432 tstconn->fd = source; |
2086 | 1433 |
1434 if (source < 0) { | |
1435 aim_conn_kill(sess, &tstconn); | |
1436 debug_printf("unable to connect to authorizer\n"); | |
1437 return; | |
1438 } | |
1439 | |
1440 aim_conn_completeconnect(sess, tstconn); | |
4617 | 1441 od->paspa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); |
2086 | 1442 debug_printf("chatnav: connected\n"); |
1443 } | |
1444 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1445 static void oscar_chat_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 1446 { |
1447 struct chat_connection *ccon = data; | |
1448 struct gaim_connection *gc = ccon->gc; | |
4617 | 1449 struct oscar_data *od; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1450 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1451 aim_conn_t *tstconn; |
2086 | 1452 |
1453 if (!g_slist_find(connections, gc)) { | |
1454 close(source); | |
1455 g_free(ccon->show); | |
1456 g_free(ccon->name); | |
1457 g_free(ccon); | |
1458 return; | |
1459 } | |
1460 | |
4617 | 1461 od = gc->proto_data; |
1462 sess = od->sess; | |
2086 | 1463 tstconn = ccon->conn; |
4366 | 1464 tstconn->fd = source; |
2086 | 1465 |
1466 if (source < 0) { | |
1467 aim_conn_kill(sess, &tstconn); | |
1468 g_free(ccon->show); | |
1469 g_free(ccon->name); | |
1470 g_free(ccon); | |
1471 return; | |
1472 } | |
1473 | |
1474 aim_conn_completeconnect(sess, ccon->conn); | |
4617 | 1475 ccon->inpa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); |
1476 od->oscar_chats = g_slist_append(od->oscar_chats, ccon); | |
2086 | 1477 } |
1478 | |
3694 | 1479 static void oscar_email_connect(gpointer data, gint source, GaimInputCondition cond) { |
1480 struct gaim_connection *gc = data; | |
4617 | 1481 struct oscar_data *od; |
3694 | 1482 aim_session_t *sess; |
1483 aim_conn_t *tstconn; | |
1484 | |
1485 if (!g_slist_find(connections, gc)) { | |
1486 close(source); | |
1487 return; | |
1488 } | |
1489 | |
4617 | 1490 od = gc->proto_data; |
1491 sess = od->sess; | |
3694 | 1492 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_EMAIL); |
4366 | 1493 tstconn->fd = source; |
3694 | 1494 |
1495 if (source < 0) { | |
1496 aim_conn_kill(sess, &tstconn); | |
1497 debug_printf("unable to connect to email server\n"); | |
1498 return; | |
1499 } | |
1500 | |
1501 aim_conn_completeconnect(sess, tstconn); | |
4617 | 1502 od->emlpa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); |
3694 | 1503 debug_printf("email: connected\n"); |
1504 } | |
1505 | |
4804 | 1506 static void oscar_icon_connect(gpointer data, gint source, GaimInputCondition cond) { |
1507 struct gaim_connection *gc = data; | |
1508 struct oscar_data *od; | |
1509 aim_session_t *sess; | |
1510 aim_conn_t *tstconn; | |
1511 | |
1512 if (!g_slist_find(connections, gc)) { | |
1513 close(source); | |
1514 return; | |
1515 } | |
1516 | |
1517 od = gc->proto_data; | |
1518 sess = od->sess; | |
1519 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_ICON); | |
1520 tstconn->fd = source; | |
1521 | |
1522 if (source < 0) { | |
1523 aim_conn_kill(sess, &tstconn); | |
1524 debug_printf("unable to connect to icon server\n"); | |
1525 return; | |
1526 } | |
1527 | |
1528 aim_conn_completeconnect(sess, tstconn); | |
1529 od->icopa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); | |
1530 debug_printf("icon: connected\n"); | |
1531 } | |
1532 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1533 /* Hrmph. I don't know how to make this look better. --mid */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1534 static int gaim_handle_redirect(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 1535 va_list ap; |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1536 struct aim_redirect_data *redir; |
2086 | 1537 struct gaim_connection *gc = sess->aux_data; |
4491 | 1538 struct gaim_account *account = gc->account; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1539 aim_conn_t *tstconn; |
4452 | 1540 int i; |
2086 | 1541 char *host; |
1542 int port; | |
1543 | |
4491 | 1544 port = account->proto_opt[USEROPT_AUTHPORT][0] ? |
1545 atoi(account->proto_opt[USEROPT_AUTHPORT]) : FAIM_LOGIN_PORT, | |
2086 | 1546 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1547 va_start(ap, fr); |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1548 redir = va_arg(ap, struct aim_redirect_data *); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1549 va_end(ap); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1550 |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1551 for (i = 0; i < (int)strlen(redir->ip); i++) { |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1552 if (redir->ip[i] == ':') { |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1553 port = atoi(&(redir->ip[i+1])); |
2086 | 1554 break; |
1555 } | |
1556 } | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1557 host = g_strndup(redir->ip, i); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1558 |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1559 switch(redir->group) { |
2086 | 1560 case 0x7: /* Authorizer */ |
1561 debug_printf("Reconnecting with authorizor...\n"); | |
1562 tstconn = aim_newconn(sess, AIM_CONN_TYPE_AUTH, NULL); | |
1563 if (tstconn == NULL) { | |
1564 debug_printf("unable to reconnect with authorizer\n"); | |
1565 g_free(host); | |
1566 return 1; | |
1567 } | |
4649 | 1568 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 1569 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_admin, 0); |
2086 | 1570 aim_conn_addhandler(sess, tstconn, 0x0007, 0x0003, gaim_info_change, 0); |
1571 aim_conn_addhandler(sess, tstconn, 0x0007, 0x0005, gaim_info_change, 0); | |
1572 aim_conn_addhandler(sess, tstconn, 0x0007, 0x0007, gaim_account_confirm, 0); | |
1573 | |
1574 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
4634 | 1575 if (proxy_connect(account, host, port, oscar_auth_connect, gc) != 0) { |
2086 | 1576 aim_conn_kill(sess, &tstconn); |
1577 debug_printf("unable to reconnect with authorizer\n"); | |
1578 g_free(host); | |
1579 return 1; | |
1580 } | |
4293 | 1581 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
4194 | 1582 break; |
1583 | |
2086 | 1584 case 0xd: /* ChatNav */ |
1585 tstconn = aim_newconn(sess, AIM_CONN_TYPE_CHATNAV, NULL); | |
1586 if (tstconn == NULL) { | |
1587 debug_printf("unable to connect to chatnav server\n"); | |
1588 g_free(host); | |
1589 return 1; | |
1590 } | |
4649 | 1591 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 1592 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_chatnav, 0); |
2086 | 1593 |
1594 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
4634 | 1595 if (proxy_connect(account, host, port, oscar_chatnav_connect, gc) != 0) { |
2086 | 1596 aim_conn_kill(sess, &tstconn); |
1597 debug_printf("unable to connect to chatnav server\n"); | |
1598 g_free(host); | |
1599 return 1; | |
1600 } | |
4293 | 1601 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
4194 | 1602 break; |
1603 | |
1604 case 0xe: { /* Chat */ | |
2086 | 1605 struct chat_connection *ccon; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1606 |
2086 | 1607 tstconn = aim_newconn(sess, AIM_CONN_TYPE_CHAT, NULL); |
1608 if (tstconn == NULL) { | |
1609 debug_printf("unable to connect to chat server\n"); | |
1610 g_free(host); | |
1611 return 1; | |
1612 } | |
1613 | |
4649 | 1614 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
2675 | 1615 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_chat, 0); |
1616 | |
2086 | 1617 ccon = g_new0(struct chat_connection, 1); |
1618 ccon->conn = tstconn; | |
1619 ccon->gc = gc; | |
1620 ccon->fd = -1; | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1621 ccon->name = g_strdup(redir->chat.room); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1622 ccon->exchange = redir->chat.exchange; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1623 ccon->instance = redir->chat.instance; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1624 ccon->show = extract_name(redir->chat.room); |
4634 | 1625 |
2086 | 1626 ccon->conn->status |= AIM_CONN_STATUS_INPROGRESS; |
4634 | 1627 if (proxy_connect(account, host, port, oscar_chat_connect, ccon) != 0) { |
2086 | 1628 aim_conn_kill(sess, &tstconn); |
1629 debug_printf("unable to connect to chat server\n"); | |
1630 g_free(host); | |
1631 g_free(ccon->show); | |
1632 g_free(ccon->name); | |
1633 g_free(ccon); | |
1634 return 1; | |
1635 } | |
4293 | 1636 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
4194 | 1637 debug_printf("Connected to chat room %s exchange %hu\n", ccon->name, ccon->exchange); |
1638 } break; | |
3694 | 1639 |
4804 | 1640 case 0x0010: { /* icon */ |
1641 if (!(tstconn = aim_newconn(sess, AIM_CONN_TYPE_ICON, NULL))) { | |
1642 debug_printf("unable to connect to icon server\n"); | |
1643 g_free(host); | |
1644 return 1; | |
1645 } | |
1646 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); | |
1647 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_icon, 0); | |
1648 | |
1649 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
1650 if (proxy_connect(account, host, port, oscar_icon_connect, gc) != 0) { | |
1651 aim_conn_kill(sess, &tstconn); | |
1652 debug_printf("unable to connect to icon server\n"); | |
1653 g_free(host); | |
1654 return 1; | |
1655 } | |
1656 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); | |
1657 } break; | |
1658 | |
3694 | 1659 case 0x0018: { /* email */ |
1660 if (!(tstconn = aim_newconn(sess, AIM_CONN_TYPE_EMAIL, NULL))) { | |
1661 debug_printf("unable to connect to email server\n"); | |
1662 g_free(host); | |
1663 return 1; | |
1664 } | |
4649 | 1665 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, gaim_connerr, 0); |
3694 | 1666 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_email, 0); |
1667 | |
1668 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
4634 | 1669 if (proxy_connect(account, host, port, oscar_email_connect, gc) != 0) { |
3694 | 1670 aim_conn_kill(sess, &tstconn); |
1671 debug_printf("unable to connect to email server\n"); | |
1672 g_free(host); | |
1673 return 1; | |
1674 } | |
4293 | 1675 aim_sendcookie(sess, tstconn, redir->cookielen, redir->cookie); |
3694 | 1676 } break; |
1677 | |
2086 | 1678 default: /* huh? */ |
4194 | 1679 debug_printf("got redirect for unknown service 0x%04hx\n", redir->group); |
2086 | 1680 break; |
1681 } | |
1682 | |
1683 g_free(host); | |
1684 return 1; | |
1685 } | |
1686 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1687 static int gaim_parse_oncoming(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 1688 struct gaim_connection *gc = sess->aux_data; |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
1689 struct oscar_data *od = gc->proto_data; |
4738 | 1690 struct buddyinfo *bi; |
2993 | 1691 time_t time_idle = 0, signon = 0; |
1692 int type = 0; | |
1693 int caps = 0; | |
2086 | 1694 va_list ap; |
4738 | 1695 aim_userinfo_t *info; |
4194 | 1696 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1697 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
1698 info = va_arg(ap, aim_userinfo_t *); |
2086 | 1699 va_end(ap); |
1700 | |
2993 | 1701 if (info->present & AIM_USERINFO_PRESENT_CAPABILITIES) |
1702 caps = info->capabilities; | |
3267 | 1703 if (info->flags & AIM_FLAG_ACTIVEBUDDY) |
1704 type |= UC_AB; | |
1705 | |
4766 | 1706 if (info->present & AIM_USERINFO_PRESENT_FLAGS) { |
1707 if (info->flags & AIM_FLAG_UNCONFIRMED) | |
1708 type |= UC_UNCONFIRMED; | |
1709 if (info->flags & AIM_FLAG_ADMINISTRATOR) | |
1710 type |= UC_ADMIN; | |
1711 if (info->flags & AIM_FLAG_AOL) | |
1712 type |= UC_AOL; | |
1713 if (info->flags & AIM_FLAG_FREE) | |
1714 type |= UC_NORMAL; | |
1715 if (info->flags & AIM_FLAG_AWAY) | |
1716 type |= UC_UNAVAILABLE; | |
1717 if (info->flags & AIM_FLAG_WIRELESS) | |
1718 type |= UC_WIRELESS; | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
1719 } |
2993 | 1720 if (info->present & AIM_USERINFO_PRESENT_ICQEXTSTATUS) { |
3595 | 1721 type = (info->icqinfo.status << 16); |
3013 | 1722 if (!(info->icqinfo.status & AIM_ICQ_STATE_CHAT) && |
1723 (info->icqinfo.status != AIM_ICQ_STATE_NORMAL)) { | |
2993 | 1724 type |= UC_UNAVAILABLE; |
3013 | 1725 } |
2993 | 1726 } |
1727 | |
1728 if (caps & AIM_CAPS_ICQ) | |
1729 caps ^= AIM_CAPS_ICQ; | |
1730 | |
1731 if (info->present & AIM_USERINFO_PRESENT_IDLE) { | |
2086 | 1732 time(&time_idle); |
1733 time_idle -= info->idletime*60; | |
2993 | 1734 } |
1735 | |
1736 if (info->present & AIM_USERINFO_PRESENT_SESSIONLEN) | |
1737 signon = time(NULL) - info->sessionlen; | |
2086 | 1738 |
4269 | 1739 if (!aim_sncmp(gc->username, info->sn)) |
2305
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
1740 g_snprintf(gc->displayname, sizeof(gc->displayname), "%s", info->sn); |
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
1741 |
4738 | 1742 bi = g_hash_table_lookup(od->buddyinfo, normalize(info->sn)); |
1743 if (!bi) { | |
1744 bi = g_new0(struct buddyinfo, 1); | |
1745 g_hash_table_insert(od->buddyinfo, g_strdup(normalize(info->sn)), bi); | |
1746 } | |
1747 bi->signon = info->onlinesince ? info->onlinesince : (info->sessionlen + time(NULL)); | |
1748 bi->caps = caps; | |
4739 | 1749 bi->typingnot = FALSE; |
1750 bi->ico_informed = FALSE; | |
4732 | 1751 |
4804 | 1752 /* Server stored icon stuff */ |
1753 if (info->iconstrlen) { | |
1754 od->requesticon = g_slist_append(od->requesticon, strdup(normalize(info->sn))); | |
1755 if (od->icontimer) | |
1756 g_source_remove(od->icontimer); | |
1757 od->icontimer = g_timeout_add(500, gaim_icon_timerfunc, gc); | |
4807 | 1758 memcpy(bi->iconstr, info->iconstr, info->iconstrlen); |
4804 | 1759 } |
1760 bi->iconstrlen = info->iconstrlen; | |
1761 | |
2993 | 1762 serv_got_update(gc, info->sn, 1, info->warnlevel/10, signon, |
4732 | 1763 time_idle, type); |
2086 | 1764 |
1765 return 1; | |
1766 } | |
1767 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1768 static int gaim_parse_offgoing(aim_session_t *sess, aim_frame_t *fr, ...) { |
4739 | 1769 struct gaim_connection *gc = sess->aux_data; |
2086 | 1770 va_list ap; |
4739 | 1771 aim_userinfo_t *info; |
2086 | 1772 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1773 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
1774 info = va_arg(ap, aim_userinfo_t *); |
2086 | 1775 va_end(ap); |
1776 | |
4732 | 1777 serv_got_update(gc, info->sn, 0, 0, 0, 0, 0); |
2086 | 1778 |
1779 return 1; | |
1780 } | |
1781 | |
3730 | 1782 static void cancel_direct_im(struct ask_direct *d) { |
2086 | 1783 debug_printf("Freeing DirectIM prompts.\n"); |
1784 | |
1785 g_free(d->sn); | |
1786 g_free(d); | |
1787 } | |
1788 | |
4617 | 1789 static void oscar_odc_callback(gpointer data, gint source, GaimInputCondition condition) { |
2086 | 1790 struct direct_im *dim = data; |
1791 struct gaim_connection *gc = dim->gc; | |
1792 struct oscar_data *od = gc->proto_data; | |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
1793 struct gaim_conversation *cnv; |
2086 | 1794 char buf[256]; |
3008 | 1795 struct sockaddr name; |
1796 socklen_t name_len = 1; | |
1797 | |
2086 | 1798 if (!g_slist_find(connections, gc)) { |
1799 g_free(dim); | |
1800 return; | |
1801 } | |
1802 | |
1803 if (source < 0) { | |
1804 g_free(dim); | |
1805 return; | |
1806 } | |
1807 | |
4366 | 1808 dim->conn->fd = source; |
2086 | 1809 aim_conn_completeconnect(od->sess, dim->conn); |
4491 | 1810 if (!(cnv = gaim_find_conversation(dim->name))) |
1811 cnv = gaim_conversation_new(GAIM_CONV_IM, dim->gc->account, dim->name); | |
3008 | 1812 |
1813 /* This is the best way to see if we're connected or not */ | |
1814 if (getpeername(source, &name, &name_len) == 0) { | |
1815 g_snprintf(buf, sizeof buf, _("Direct IM with %s established"), dim->name); | |
1816 dim->connected = TRUE; | |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
1817 gaim_conversation_write(cnv, NULL, buf, -1, WFLAG_SYSTEM, time(NULL)); |
3008 | 1818 } |
2086 | 1819 od->direct_ims = g_slist_append(od->direct_ims, dim); |
3008 | 1820 |
4617 | 1821 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, oscar_callback, dim->conn); |
2086 | 1822 } |
1823 | |
4617 | 1824 /* BBB */ |
3952 | 1825 /* |
4617 | 1826 * This is called after a remote AIM user has connected to us. We |
1827 * want to do some voodoo with the socket file descriptors, add a | |
1828 * callback or two, and then send the AIM_CB_OFT_PROMPT. | |
3952 | 1829 */ |
4656 | 1830 static int oscar_sendfile_estblsh(aim_session_t *sess, aim_frame_t *fr, ...) { |
3630 | 1831 struct gaim_connection *gc = sess->aux_data; |
1832 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
4617 | 1833 struct gaim_xfer *xfer; |
1834 struct oscar_xfer_data *xfer_data; | |
3630 | 1835 va_list ap; |
1836 aim_conn_t *conn, *listenerconn; | |
4656 | 1837 |
1838 debug_printf("AAA - in oscar_sendfile_estblsh\n"); | |
3630 | 1839 va_start(ap, fr); |
1840 conn = va_arg(ap, aim_conn_t *); | |
1841 listenerconn = va_arg(ap, aim_conn_t *); | |
1842 va_end(ap); | |
1843 | |
4617 | 1844 if (!(xfer = oscar_find_xfer_by_conn(od->file_transfers, listenerconn))) |
1845 return 1; | |
1846 | |
1847 if (!(xfer_data = xfer->data)) | |
1848 return 1; | |
1849 | |
3630 | 1850 /* Stop watching listener conn; watch transfer conn instead */ |
4617 | 1851 gaim_input_remove(xfer->watcher); |
3630 | 1852 aim_conn_kill(sess, &listenerconn); |
1853 | |
4617 | 1854 xfer_data->conn = conn; |
1855 xfer->fd = xfer_data->conn->fd; | |
1856 | |
1857 aim_conn_addhandler(sess, xfer_data->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_ACK, oscar_sendfile_ack, 0); | |
1858 aim_conn_addhandler(sess, xfer_data->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DONE, oscar_sendfile_done, 0); | |
1859 xfer->watcher = gaim_input_add(xfer_data->conn->fd, GAIM_INPUT_READ, oscar_callback, xfer_data->conn); | |
1860 | |
1861 /* Inform the other user that we are connected and ready to transfer */ | |
4646 | 1862 aim_oft_sendheader(sess, xfer_data->conn, AIM_CB_OFT_PROMPT, NULL, xfer->filename, 0, 1, xfer->size, xfer->size, time(NULL), xfer_data->checksum, 0x02, 0, 0); |
3630 | 1863 |
1864 return 0; | |
1865 } | |
1866 | |
3952 | 1867 /* |
4617 | 1868 * This is the gaim callback passed to proxy_connect when connecting to another AIM |
1869 * user in order to transfer a file. | |
3952 | 1870 */ |
4617 | 1871 static void oscar_sendfile_connected(gpointer data, gint source, GaimInputCondition condition) { |
1872 struct gaim_connection *gc; | |
1873 struct gaim_xfer *xfer; | |
1874 struct oscar_xfer_data *xfer_data; | |
4656 | 1875 |
1876 debug_printf("AAA - in oscar_sendfile_connected\n"); | |
4617 | 1877 if (!(xfer = data)) |
1878 return; | |
1879 if (!(xfer_data = xfer->data)) | |
1880 return; | |
1881 if (!(gc = xfer_data->gc)) | |
3630 | 1882 return; |
4617 | 1883 if (source < 0) |
1884 return; | |
1885 | |
1886 xfer->fd = source; | |
1887 xfer_data->conn->fd = source; | |
1888 | |
1889 aim_conn_completeconnect(xfer_data->conn->sessv, xfer_data->conn); | |
1890 xfer->watcher = gaim_input_add(xfer->fd, GAIM_INPUT_READ, oscar_callback, xfer_data->conn); | |
1891 | |
1892 /* Inform the other user that we are connected and ready to transfer */ | |
1893 aim_im_sendch2_sendfile_accept(xfer_data->conn->sessv, xfer_data->cookie, xfer->who, AIM_CAPS_SENDFILE); | |
1894 | |
1895 return; | |
3630 | 1896 } |
1897 | |
3952 | 1898 /* |
4617 | 1899 * This is called when a buddy sends us some file info. This happens when they |
1900 * are sending a file to you, and you have just established a connection to them. | |
4650 | 1901 * You should send them the exact same info except use the real cookie. We also |
4617 | 1902 * get like totally ready to like, receive the file, kay? |
3952 | 1903 */ |
4617 | 1904 static int oscar_sendfile_prompt(aim_session_t *sess, aim_frame_t *fr, ...) { |
1905 struct gaim_connection *gc = sess->aux_data; | |
1906 struct oscar_data *od = gc->proto_data; | |
1907 struct gaim_xfer *xfer; | |
1908 struct oscar_xfer_data *xfer_data; | |
1909 va_list ap; | |
1910 aim_conn_t *conn; | |
1911 fu8_t *cookie; | |
1912 struct aim_fileheader_t *fh; | |
4656 | 1913 |
1914 debug_printf("AAA - in oscar_sendfile_prompt\n"); | |
4617 | 1915 va_start(ap, fr); |
1916 conn = va_arg(ap, aim_conn_t *); | |
1917 cookie = va_arg(ap, fu8_t *); | |
1918 fh = va_arg(ap, struct aim_fileheader_t *); | |
1919 va_end(ap); | |
1920 | |
1921 if (!(xfer = oscar_find_xfer_by_conn(od->file_transfers, conn))) | |
1922 return 1; | |
1923 | |
1924 if (!(xfer_data = xfer->data)) | |
1925 return 1; | |
1926 | |
1927 /* Jot down some data we'll need later */ | |
1928 xfer_data->modtime = fh->modtime; | |
1929 xfer_data->checksum = fh->checksum; | |
1930 | |
1931 /* We want to stop listening with a normal thingy */ | |
1932 gaim_input_remove(xfer->watcher); | |
1933 xfer->watcher = 0; | |
1934 | |
1935 /* XXX - convert the name from UTF-8 to UCS-2 if necessary, and pass the encoding to the call below */ | |
4646 | 1936 aim_oft_sendheader(xfer_data->conn->sessv, xfer_data->conn, AIM_CB_OFT_ACK, xfer_data->cookie, xfer->filename, 0, 1, xfer->size, xfer->size, fh->modtime, fh->checksum, 0x02, 0, 0); |
4617 | 1937 gaim_xfer_start(xfer, xfer->fd, NULL, 0); |
1938 | |
1939 return 0; | |
3630 | 1940 } |
1941 | |
3952 | 1942 /* |
4657 | 1943 * We are sending a file to someone else. They have just acknowledged our |
4617 | 1944 * prompt, so we want to start sending data like there's no tomorrow. |
3952 | 1945 */ |
4617 | 1946 static int oscar_sendfile_ack(aim_session_t *sess, aim_frame_t *fr, ...) { |
1947 struct gaim_connection *gc = sess->aux_data; | |
1948 struct oscar_data *od = gc->proto_data; | |
1949 struct gaim_xfer *xfer; | |
1950 va_list ap; | |
1951 aim_conn_t *conn; | |
1952 fu8_t *cookie; | |
1953 struct aim_fileheader_t *fh; | |
4656 | 1954 |
1955 debug_printf("AAA - in oscar_sendfile_ack\n"); | |
4617 | 1956 va_start(ap, fr); |
1957 conn = va_arg(ap, aim_conn_t *); | |
1958 cookie = va_arg(ap, fu8_t *); | |
1959 fh = va_arg(ap, struct aim_fileheader_t *); | |
1960 va_end(ap); | |
1961 | |
1962 if (!(xfer = oscar_find_xfer_by_cookie(od->file_transfers, cookie))) | |
1963 return 1; | |
1964 | |
4656 | 1965 /* We want to stop listening with a normal thingy */ |
1966 gaim_input_remove(xfer->watcher); | |
1967 xfer->watcher = 0; | |
1968 | |
4617 | 1969 gaim_xfer_start(xfer, xfer->fd, NULL, 0); |
1970 | |
1971 return 0; | |
3630 | 1972 } |
4617 | 1973 |
1974 /* | |
1975 * We just sent a file to someone. They said they got it and everything, | |
1976 * so we can close our direct connection and what not. | |
1977 */ | |
1978 static int oscar_sendfile_done(aim_session_t *sess, aim_frame_t *fr, ...) { | |
1979 struct gaim_connection *gc = sess->aux_data; | |
1980 struct oscar_data *od = gc->proto_data; | |
1981 struct gaim_xfer *xfer; | |
1982 va_list ap; | |
1983 aim_conn_t *conn; | |
1984 fu8_t *cookie; | |
1985 struct aim_fileheader_t *fh; | |
4656 | 1986 |
1987 debug_printf("AAA - in oscar_sendfile_done\n"); | |
4617 | 1988 va_start(ap, fr); |
1989 conn = va_arg(ap, aim_conn_t *); | |
1990 cookie = va_arg(ap, fu8_t *); | |
1991 fh = va_arg(ap, struct aim_fileheader_t *); | |
1992 va_end(ap); | |
1993 | |
1994 if (!(xfer = oscar_find_xfer_by_conn(od->file_transfers, conn))) | |
1995 return 1; | |
1996 | |
4656 | 1997 xfer->fd = conn->fd; |
4617 | 1998 gaim_xfer_end(xfer); |
1999 | |
2000 return 0; | |
2001 } | |
3630 | 2002 |
4244 | 2003 static void accept_direct_im(struct ask_direct *d) { |
2086 | 2004 struct gaim_connection *gc = d->gc; |
4244 | 2005 struct oscar_data *od; |
2086 | 2006 struct direct_im *dim; |
2945 | 2007 char *host; int port = 4443; |
4366 | 2008 int i, rc; |
2086 | 2009 |
4244 | 2010 if (!g_slist_find(connections, gc)) { |
2011 cancel_direct_im(d); | |
2012 return; | |
2013 } | |
2014 | |
2015 od = (struct oscar_data *)gc->proto_data; | |
2086 | 2016 debug_printf("Accepted DirectIM.\n"); |
2017 | |
2018 dim = find_direct_im(od, d->sn); | |
2019 if (dim) { | |
3730 | 2020 cancel_direct_im(d); /* 40 */ |
4244 | 2021 return; |
2086 | 2022 } |
2023 dim = g_new0(struct direct_im, 1); | |
2024 dim->gc = d->gc; | |
2025 g_snprintf(dim->name, sizeof dim->name, "%s", d->sn); | |
2026 | |
4617 | 2027 dim->conn = aim_odc_connect(od->sess, d->sn, NULL, d->cookie); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2028 if (!dim->conn) { |
2086 | 2029 g_free(dim); |
3730 | 2030 cancel_direct_im(d); |
4244 | 2031 return; |
2086 | 2032 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2033 |
2086 | 2034 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, |
4617 | 2035 gaim_odc_incoming, 0); |
2086 | 2036 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, |
4617 | 2037 gaim_odc_typing, 0); |
3033 | 2038 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER, |
2993 | 2039 gaim_update_ui, 0); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2040 for (i = 0; i < (int)strlen(d->ip); i++) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2041 if (d->ip[i] == ':') { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2042 port = atoi(&(d->ip[i+1])); |
2086 | 2043 break; |
2044 } | |
2045 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2046 host = g_strndup(d->ip, i); |
2086 | 2047 dim->conn->status |= AIM_CONN_STATUS_INPROGRESS; |
4634 | 2048 rc = proxy_connect(gc->account, host, port, oscar_odc_callback, dim); |
2086 | 2049 g_free(host); |
4366 | 2050 if (rc < 0) { |
2086 | 2051 aim_conn_kill(od->sess, &dim->conn); |
2052 g_free(dim); | |
3730 | 2053 cancel_direct_im(d); |
4244 | 2054 return; |
2086 | 2055 } |
2056 | |
3730 | 2057 cancel_direct_im(d); |
2086 | 2058 |
4244 | 2059 return; |
2086 | 2060 } |
2061 | |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2062 static int incomingim_chan1(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch1_args *args) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2063 struct gaim_connection *gc = sess->aux_data; |
3600 | 2064 struct oscar_data *od = gc->proto_data; |
4738 | 2065 char *tmp; |
2273
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
2066 int flags = 0; |
3659 | 2067 int convlen; |
2068 GError *err = NULL; | |
4738 | 2069 struct buddyinfo *bi; |
2070 | |
2071 bi = g_hash_table_lookup(od->buddyinfo, normalize(userinfo->sn)); | |
2072 if (!bi) { | |
2073 bi = g_new0(struct buddyinfo, 1); | |
2074 g_hash_table_insert(od->buddyinfo, g_strdup(normalize(userinfo->sn)), bi); | |
2075 } | |
2273
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
2076 |
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
2077 if (args->icbmflags & AIM_IMFLAGS_AWAY) |
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
2078 flags |= IM_FLAG_AWAY; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2079 |
4738 | 2080 if (args->icbmflags & AIM_IMFLAGS_TYPINGNOT) |
2081 bi->typingnot = TRUE; | |
2082 else | |
2083 bi->typingnot = FALSE; | |
2084 | |
4380 | 2085 if ((args->icbmflags & AIM_IMFLAGS_HASICON) && (args->iconlen) && (args->iconsum) && (args->iconstamp)) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2086 debug_printf("%s has an icon\n", userinfo->sn); |
4738 | 2087 if ((args->iconlen != bi->ico_len) || (args->iconsum != bi->ico_csum) || (args->iconstamp != bi->ico_time)) { |
2088 bi->ico_need = TRUE; | |
2089 bi->ico_len = args->iconlen; | |
2090 bi->ico_csum = args->iconsum; | |
2091 bi->ico_time = args->iconstamp; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2092 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2093 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2094 |
4491 | 2095 if (gc->account->iconfile[0] && (args->icbmflags & AIM_IMFLAGS_BUDDYREQ)) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2096 FILE *file; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2097 struct stat st; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2098 |
4491 | 2099 if (!stat(gc->account->iconfile, &st)) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2100 char *buf = g_malloc(st.st_size); |
4491 | 2101 file = fopen(gc->account->iconfile, "rb"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2102 if (file) { |
2603
24664768a739
[gaim-migrate @ 2616]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2597
diff
changeset
|
2103 int len = fread(buf, 1, st.st_size, file); |
4194 | 2104 debug_printf("Sending buddy icon to %s (%d bytes, %lu reported)\n", |
4617 | 2105 userinfo->sn, len, st.st_size); |
2106 aim_im_sendch2_icon(sess, userinfo->sn, buf, st.st_size, | |
2107 st.st_mtime, aimutil_iconsum(buf, st.st_size)); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2108 fclose(file); |
2336
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
2109 } else |
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
2110 debug_printf("Can't open buddy icon file!\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2111 g_free(buf); |
2336
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
2112 } else |
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
2113 debug_printf("Can't stat buddy icon file!\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2114 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2115 |
4662 | 2116 debug_printf("Character set is %hu %hu\n", args->charset, args->charsubset); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2117 if (args->icbmflags & AIM_IMFLAGS_UNICODE) { |
3722 | 2118 /* This message is marked as UNICODE, so we have to |
2119 * convert it to utf-8 before handing it to the gaim core. | |
2120 * This conversion should *never* fail, if it does it | |
2121 * means that either the incoming ICBM is corrupted or | |
4662 | 2122 * there is something we don't understand about it. |
2123 * For the record, AIM Unicode is big-endian UCS-2 */ | |
2124 | |
2125 debug_printf("Received UNICODE IM\n"); | |
4121 | 2126 |
2127 if (!args->msg || !args->msglen) | |
2128 return 1; | |
4641 | 2129 |
3659 | 2130 tmp = g_convert(args->msg, args->msglen, "UTF-8", "UCS-2BE", NULL, &convlen, &err); |
2131 if (err) { | |
2132 debug_printf("Unicode IM conversion: %s\n", err->message); | |
2133 tmp = strdup(_("(There was an error receiving this message)")); | |
4800 | 2134 g_error_free(err); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2135 } |
3722 | 2136 } else { |
3850 | 2137 /* This will get executed for both AIM_IMFLAGS_ISO_8859_1 and |
3722 | 2138 * unflagged messages, which are ASCII. That's OK because |
2139 * ASCII is a strict subset of ISO-8859-1; this should | |
2140 * help with compatibility with old, broken versions of | |
2141 * gaim (everything before 0.60) and other broken clients | |
2142 * that will happily send ISO-8859-1 without marking it as | |
2143 * such */ | |
4662 | 2144 if (args->icbmflags & AIM_IMFLAGS_ISO_8859_1) |
4194 | 2145 debug_printf("Received ISO-8859-1 IM\n"); |
4121 | 2146 |
2147 if (!args->msg || !args->msglen) | |
2148 return 1; | |
2149 | |
3659 | 2150 tmp = g_convert(args->msg, args->msglen, "UTF-8", "ISO-8859-1", NULL, &convlen, &err); |
2151 if (err) { | |
2152 debug_printf("ISO-8859-1 IM conversion: %s\n", err->message); | |
2153 tmp = strdup(_("(There was an error receiving this message)")); | |
4800 | 2154 g_error_free(err); |
3659 | 2155 } |
3642 | 2156 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2157 |
4333 | 2158 /* strip_linefeed(tmp); */ |
2856
b1e300a85678
[gaim-migrate @ 2869]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2833
diff
changeset
|
2159 serv_got_im(gc, userinfo->sn, tmp, flags, time(NULL), -1); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2160 g_free(tmp); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2161 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2162 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2163 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2164 |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2165 static int incomingim_chan2(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2166 struct gaim_connection *gc = sess->aux_data; |
4617 | 2167 struct oscar_data *od = gc->proto_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2168 |
4121 | 2169 if (!args) |
2170 return 0; | |
4194 | 2171 |
4617 | 2172 debug_printf("rendezvous with %s, status is %hu\n", userinfo->sn, args->status); |
2869 | 2173 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2174 if (args->reqclass & AIM_CAPS_CHAT) { |
4121 | 2175 char *name; |
4120 | 2176 int *exch; |
4121 | 2177 GList *m = NULL; |
4120 | 2178 |
4121 | 2179 if (!args->info.chat.roominfo.name || !args->info.chat.roominfo.exchange || !args->msg) |
2180 return 1; | |
2181 name = extract_name(args->info.chat.roominfo.name); | |
4120 | 2182 exch = g_new0(int, 1); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2183 m = g_list_append(m, g_strdup(name ? name : args->info.chat.roominfo.name)); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2184 *exch = args->info.chat.roominfo.exchange; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2185 m = g_list_append(m, exch); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2186 serv_got_chat_invite(gc, |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2187 name ? name : args->info.chat.roominfo.name, |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2188 userinfo->sn, |
2869 | 2189 (char *)args->msg, |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2190 m); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2191 if (name) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2192 g_free(name); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2193 } else if (args->reqclass & AIM_CAPS_SENDFILE) { |
4617 | 2194 /* BBB */ |
2195 if (args->status == AIM_RENDEZVOUS_PROPOSE) { | |
2196 /* Someone wants to send a file (or files) to us */ | |
2197 struct gaim_xfer *xfer; | |
2198 struct oscar_xfer_data *xfer_data; | |
2199 | |
2200 if (!args->cookie || !args->verifiedip || !args->port || | |
2201 !args->info.sendfile.filename || !args->info.sendfile.totsize || | |
4656 | 2202 !args->info.sendfile.totfiles || !args->reqclass) { |
2203 debug_printf("%s tried to send you a file with incomplete information.\n", userinfo->sn); | |
4617 | 2204 return 1; |
4656 | 2205 } |
4617 | 2206 |
2207 if (args->info.sendfile.subtype == AIM_OFT_SUBTYPE_SEND_DIR) { | |
2208 /* last char of the ft req is a star, they are sending us a | |
2209 * directory -- remove the star and trailing slash so we dont save | |
2210 * directories that look like 'dirname\*' -- arl */ | |
2211 char *tmp = strrchr(args->info.sendfile.filename, '\\'); | |
2212 if (tmp && (tmp[1] == '*')) { | |
2213 tmp[0] = '\0'; | |
2214 } | |
2215 } | |
2216 | |
2217 /* Setup the oscar-specific transfer xfer_data */ | |
2218 xfer_data = g_malloc0(sizeof(struct oscar_xfer_data)); | |
2219 xfer_data->gc = gc; | |
2220 memcpy(xfer_data->cookie, args->cookie, 8); | |
2221 | |
2222 /* Build the file transfer handle */ | |
2223 xfer = gaim_xfer_new(gc->account, GAIM_XFER_RECEIVE, userinfo->sn); | |
2224 xfer_data->xfer = xfer; | |
2225 xfer->data = xfer_data; | |
2226 | |
2227 /* Set the info about the incoming file */ | |
2228 gaim_xfer_set_filename(xfer, args->info.sendfile.filename); | |
2229 gaim_xfer_set_size(xfer, args->info.sendfile.totsize); | |
2230 xfer->remote_port = args->port; | |
4650 | 2231 xfer->remote_ip = g_strdup(args->verifiedip); |
2232 if (args->clientip) | |
2233 xfer_data->clientip = g_strdup(args->clientip); | |
2234 if (args->clientip2) | |
2235 xfer_data->clientip2 = g_strdup(args->clientip2); | |
4617 | 2236 |
2237 /* Setup our I/O op functions */ | |
2238 gaim_xfer_set_init_fnc(xfer, oscar_xfer_init); | |
2239 gaim_xfer_set_start_fnc(xfer, oscar_xfer_start); | |
2240 gaim_xfer_set_end_fnc(xfer, oscar_xfer_end); | |
4675
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
2241 gaim_xfer_set_cancel_send_fnc(xfer, oscar_xfer_cancel_send); |
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
2242 gaim_xfer_set_cancel_recv_fnc(xfer, oscar_xfer_cancel_recv); |
4617 | 2243 gaim_xfer_set_ack_fnc(xfer, oscar_xfer_ack); |
2244 | |
2245 /* | |
2246 * XXX - Should do something with args->msg, args->encoding, and args->language | |
2247 * probably make it apply to all ch2 messages. | |
3752 | 2248 */ |
4617 | 2249 |
2250 /* Keep track of this transfer for later */ | |
2251 od->file_transfers = g_slist_append(od->file_transfers, xfer); | |
2252 | |
2253 /* Now perform the request */ | |
2254 gaim_xfer_request(xfer); | |
2255 } else if (args->status == AIM_RENDEZVOUS_CANCEL) { | |
2256 /* The other user wants to cancel a file transfer */ | |
2257 struct gaim_xfer *xfer; | |
2258 debug_printf("AAA - File transfer canceled by remote user\n"); | |
2259 if ((xfer = oscar_find_xfer_by_cookie(od->file_transfers, args->cookie))) | |
4675
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
2260 gaim_xfer_cancel_remote(xfer); |
4617 | 2261 } else if (args->status == AIM_RENDEZVOUS_ACCEPT) { |
2262 /* | |
2263 * This gets sent by the receiver of a file | |
2264 * as they connect directly to us. If we don't | |
2265 * get this, then maybe a third party connected | |
2266 * to us, and we shouldn't send them anything. | |
2267 */ | |
2268 } else { | |
2269 debug_printf("unknown rendezvous status!\n"); | |
3630 | 2270 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2271 } else if (args->reqclass & AIM_CAPS_GETFILE) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2272 } else if (args->reqclass & AIM_CAPS_VOICE) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2273 } else if (args->reqclass & AIM_CAPS_BUDDYICON) { |
4799 | 2274 set_icon_data(gc, userinfo->sn, args->info.icon.icon, |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2275 args->info.icon.length); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2276 } else if (args->reqclass & AIM_CAPS_IMIMAGE) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2277 struct ask_direct *d = g_new0(struct ask_direct, 1); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2278 char buf[256]; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2279 |
4212 | 2280 if (!args->verifiedip) { |
4650 | 2281 debug_printf("directim kill blocked (%s)\n", userinfo->sn); |
2282 return 1; | |
4212 | 2283 } |
2284 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2285 debug_printf("%s received direct im request from %s (%s)\n", |
2869 | 2286 gc->username, userinfo->sn, args->verifiedip); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2287 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2288 d->gc = gc; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2289 d->sn = g_strdup(userinfo->sn); |
2869 | 2290 strncpy(d->ip, args->verifiedip, sizeof(d->ip)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2291 memcpy(d->cookie, args->cookie, 8); |
4650 | 2292 g_snprintf(buf, sizeof buf, _("%s has just asked to directly connect to %s"), userinfo->sn, gc->username); |
4249 | 2293 do_ask_dialog(buf, _("This requires a direct connection between the two computers and is necessary for IM Images. Because your IP address will be revealed, this may be considered a privacy risk."), d, _("Connect"), accept_direct_im, _("Cancel"), cancel_direct_im, my_protocol->plug ? my_protocol->plug->handle : NULL, FALSE); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2294 } else { |
4194 | 2295 debug_printf("Unknown reqclass %hu\n", args->reqclass); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2296 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2297 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2298 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2299 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2300 |
3453 | 2301 /* |
4230 | 2302 * Authorization Functions |
2303 * Most of these are callbacks from dialogs. They're used by both | |
2304 * methods of authorization (SSI and old-school channel 4 ICBM) | |
3453 | 2305 */ |
4269 | 2306 /* When you ask other people for authorization */ |
4337 | 2307 static void gaim_auth_request(struct name_data *data, char *msg) { |
4230 | 2308 struct gaim_connection *gc = data->gc; |
4244 | 2309 |
2310 if (g_slist_find(connections, gc)) { | |
2311 struct oscar_data *od = gc->proto_data; | |
4687 | 2312 struct buddy *buddy = gaim_find_buddy(gc->account, data->name); |
2313 struct group *group = gaim_find_buddys_group(buddy); | |
4244 | 2314 if (buddy && group) { |
2315 debug_printf("ssi: adding buddy %s to group %s\n", buddy->name, group->name); | |
4337 | 2316 aim_ssi_sendauthrequest(od->sess, od->conn, data->name, msg ? msg : _("Please authorize me so I can add you to my buddy list.")); |
4269 | 2317 if (!aim_ssi_itemlist_finditem(od->sess->ssi.local, group->name, buddy->name, AIM_SSI_TYPE_BUDDY)) |
4687 | 2318 aim_ssi_addbuddy(od->sess, od->conn, buddy->name, group->name, gaim_get_buddy_alias_only(buddy), NULL, NULL, 1); |
4244 | 2319 } |
4230 | 2320 } |
4337 | 2321 } |
2322 | |
2323 static void gaim_auth_request_msgprompt(struct name_data *data) { | |
2324 do_prompt_dialog(_("Authorization Request Message:"), _("Please authorize me!"), data, gaim_auth_request, gaim_free_name_data); | |
4230 | 2325 } |
2326 | |
2327 static void gaim_auth_dontrequest(struct name_data *data) { | |
4244 | 2328 struct gaim_connection *gc = data->gc; |
2329 | |
2330 if (g_slist_find(connections, gc)) { | |
2331 /* struct oscar_data *od = gc->proto_data; */ | |
2332 /* XXX - Take the buddy out of our buddy list */ | |
2333 } | |
2334 | |
4230 | 2335 gaim_free_name_data(data); |
2336 } | |
2337 | |
4269 | 2338 static void gaim_auth_sendrequest(struct gaim_connection *gc, char *name) { |
2339 struct name_data *data = g_new(struct name_data, 1); | |
2340 struct buddy *buddy; | |
2341 gchar *dialog_msg, *nombre; | |
2342 | |
4687 | 2343 buddy = gaim_find_buddy(gc->account, name); |
2344 if (buddy && (gaim_get_buddy_alias_only(buddy))) | |
2345 nombre = g_strdup_printf("%s (%s)", name, gaim_get_buddy_alias_only(buddy)); | |
4269 | 2346 else |
2347 nombre = g_strdup(name); | |
2348 | |
2349 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); | |
2350 data->gc = gc; | |
2351 data->name = g_strdup(name); | |
2352 data->nick = NULL; | |
4337 | 2353 do_ask_dialog(_("Request Authorization"), dialog_msg, data, _("Request Authorization"), gaim_auth_request_msgprompt, _("Cancel"), gaim_auth_dontrequest, my_protocol->plug ? my_protocol->plug->handle : NULL, FALSE); |
4269 | 2354 |
2355 g_free(dialog_msg); | |
2356 g_free(nombre); | |
2357 } | |
2358 | |
4230 | 2359 /* When other people ask you for authorization */ |
2360 static void gaim_auth_grant(struct name_data *data) { | |
2361 struct gaim_connection *gc = data->gc; | |
4244 | 2362 |
2363 if (g_slist_find(connections, gc)) { | |
2364 struct oscar_data *od = gc->proto_data; | |
4236 | 2365 #ifdef NOSSI |
4244 | 2366 struct buddy *buddy; |
2367 gchar message; | |
2368 message = 0; | |
4687 | 2369 buddy = gaim_find_buddy(gc->account, data->name); |
4617 | 2370 aim_im_sendch4(od->sess, data->name, AIM_ICQMSG_AUTHGRANTED, &message); |
4687 | 2371 show_got_added(gc, NULL, data->name, (buddy ? gaim_get_buddy_alias_only(buddy) : NULL), NULL); |
4230 | 2372 #else |
4244 | 2373 aim_ssi_sendauthreply(od->sess, od->conn, data->name, 0x01, NULL); |
4230 | 2374 #endif |
4244 | 2375 } |
2376 | |
4230 | 2377 gaim_free_name_data(data); |
3141 | 2378 } |
2379 | |
4230 | 2380 /* When other people ask you for authorization */ |
4337 | 2381 static void gaim_auth_dontgrant(struct name_data *data, char *msg) { |
4230 | 2382 struct gaim_connection *gc = data->gc; |
4244 | 2383 |
2384 if (g_slist_find(connections, gc)) { | |
2385 struct oscar_data *od = gc->proto_data; | |
4230 | 2386 #ifdef NOSSI |
4617 | 2387 aim_im_sendch4(od->sess, data->name, AIM_ICQMSG_AUTHDENIED, msg ? msg : _("No reason given.")); |
4230 | 2388 #else |
4337 | 2389 aim_ssi_sendauthreply(od->sess, od->conn, data->name, 0x00, msg ? msg : _("No reason given.")); |
4230 | 2390 #endif |
4244 | 2391 } |
4337 | 2392 } |
2393 | |
2394 static void gaim_auth_dontgrant_msgprompt(struct name_data *data) { | |
2395 do_prompt_dialog(_("Authorization Denied Message:"), _("No reason given."), data, gaim_auth_dontgrant, gaim_free_name_data); | |
3141 | 2396 } |
2397 | |
4230 | 2398 /* When someone sends you contacts */ |
2399 static void gaim_icq_contactadd(struct name_data *data) { | |
2400 struct gaim_connection *gc = data->gc; | |
4244 | 2401 |
2402 if (g_slist_find(connections, gc)) { | |
2403 show_add_buddy(gc, data->name, NULL, data->nick); | |
2404 } | |
2405 | |
4230 | 2406 gaim_free_name_data(data); |
3453 | 2407 } |
2408 | |
4075 | 2409 static int incomingim_chan4(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch4_args *args, time_t t) { |
3141 | 2410 struct gaim_connection *gc = sess->aux_data; |
4076 | 2411 gchar **msg1, **msg2; |
2412 GError *err = NULL; | |
2413 int i; | |
2414 | |
4121 | 2415 if (!args->type || !args->msg || !args->uin) |
2416 return 1; | |
4194 | 2417 |
2418 debug_printf("Received a channel 4 message of type 0x%02hhx.\n", args->type); | |
4076 | 2419 |
2420 /* Split up the message at the delimeter character, then convert each string to UTF-8 */ | |
4173 | 2421 msg1 = g_strsplit(args->msg, "\376", 0); |
4194 | 2422 msg2 = (gchar **)g_malloc(10*sizeof(gchar *)); /* XXX - 10 is a guess */ |
4076 | 2423 for (i=0; msg1[i]; i++) { |
2424 strip_linefeed(msg1[i]); | |
2425 msg2[i] = g_convert(msg1[i], strlen(msg1[i]), "UTF-8", "ISO-8859-1", NULL, NULL, &err); | |
4800 | 2426 if (err) { |
4076 | 2427 debug_printf("Error converting a string from ISO-8859-1 to UTF-8 in oscar ICBM channel 4 parsing\n"); |
4800 | 2428 g_error_free(err); |
2429 } | |
4076 | 2430 } |
2431 msg2[i] = NULL; | |
2432 | |
3952 | 2433 switch (args->type) { |
4173 | 2434 case 0x01: { /* MacICQ message or basic offline message */ |
4076 | 2435 if (i >= 1) { |
2436 gchar *uin = g_strdup_printf("%lu", args->uin); | |
2437 if (t) { /* This is an offline message */ | |
2438 /* I think this timestamp is in UTC, or something */ | |
2439 serv_got_im(gc, uin, msg2[0], 0, t, -1); | |
2440 } else { /* This is a message from MacICQ/Miranda */ | |
2441 serv_got_im(gc, uin, msg2[0], 0, time(NULL), -1); | |
2442 } | |
2443 g_free(uin); | |
4075 | 2444 } |
3316 | 2445 } break; |
2446 | |
4173 | 2447 case 0x04: { /* Someone sent you a URL */ |
4076 | 2448 if (i >= 2) { |
2449 gchar *uin = g_strdup_printf("%lu", args->uin); | |
2450 gchar *message = g_strdup_printf("<A HREF=\"%s\">%s</A>", msg2[1], msg2[0]); | |
3453 | 2451 serv_got_im(gc, uin, message, 0, time(NULL), -1); |
2452 g_free(uin); | |
2453 g_free(message); | |
2454 } | |
2455 } break; | |
2456 | |
4173 | 2457 case 0x06: { /* Someone requested authorization */ |
4076 | 2458 if (i >= 6) { |
4230 | 2459 struct name_data *data = g_new(struct name_data, 1); |
4337 | 2460 gchar *dialog_msg = g_strdup_printf(_("The user %lu wants to add you to their buddy list for the following reason:\n%s"), args->uin, msg2[5] ? msg2[5] : _("No reason given.")); |
4076 | 2461 debug_printf("Received an authorization request from UIN %lu\n", args->uin); |
2462 data->gc = gc; | |
4230 | 2463 data->name = g_strdup_printf("%lu", args->uin); |
2464 data->nick = NULL; | |
4337 | 2465 do_ask_dialog(_("Authorization Request"), dialog_msg, data, _("Authorize"), gaim_auth_grant, _("Deny"), gaim_auth_dontgrant_msgprompt, my_protocol->plug ? my_protocol->plug->handle : NULL, FALSE); |
4076 | 2466 g_free(dialog_msg); |
2467 } | |
3141 | 2468 } break; |
2469 | |
4173 | 2470 case 0x07: { /* Someone has denied you authorization */ |
4076 | 2471 if (i >= 1) { |
4194 | 2472 gchar *dialog_msg = g_strdup_printf(_("The user %lu has denied your request to add them to your contact list for the following reason:\n%s"), args->uin, msg2[0] ? msg2[0] : _("No reason given.")); |
4230 | 2473 do_error_dialog(_("ICQ authorization denied."), dialog_msg, GAIM_INFO); |
4076 | 2474 g_free(dialog_msg); |
2475 } | |
3141 | 2476 } break; |
2477 | |
4173 | 2478 case 0x08: { /* Someone has granted you authorization */ |
4194 | 2479 gchar *dialog_msg = g_strdup_printf(_("The user %lu has granted your request to add them to your contact list."), args->uin); |
3427 | 2480 do_error_dialog("ICQ authorization accepted.", dialog_msg, GAIM_INFO); |
3141 | 2481 g_free(dialog_msg); |
2482 } break; | |
2483 | |
4333 | 2484 case 0x09: { /* Message from the Godly ICQ server itself, I think */ |
2485 if (i >= 5) { | |
2486 gchar *dialog_msg = g_strdup_printf(_("You have received a special message\n\nFrom: %s [%s]\n%s"), msg2[0], msg2[3], msg2[5]); | |
2487 do_error_dialog("ICQ Server Message", dialog_msg, GAIM_INFO); | |
2488 g_free(dialog_msg); | |
2489 } | |
2490 } break; | |
2491 | |
4173 | 2492 case 0x0d: { /* Someone has sent you a pager message from http://www.icq.com/your_uin */ |
4076 | 2493 if (i >= 6) { |
4194 | 2494 gchar *dialog_msg = g_strdup_printf(_("You have received an ICQ page\n\nFrom: %s [%s]\n%s"), msg2[0], msg2[3], msg2[5]); |
4076 | 2495 do_error_dialog("ICQ Page", dialog_msg, GAIM_INFO); |
2496 g_free(dialog_msg); | |
2497 } | |
4075 | 2498 } break; |
2499 | |
4173 | 2500 case 0x0e: { /* Someone has emailed you at your_uin@pager.icq.com */ |
4076 | 2501 if (i >= 6) { |
4308 | 2502 gchar *dialog_msg = g_strdup_printf(_("You have received an ICQ email from %s [%s]\n\nMessage is:\n%s"), msg2[0], msg2[3], msg2[5]); |
4076 | 2503 do_error_dialog("ICQ Email", dialog_msg, GAIM_INFO); |
2504 g_free(dialog_msg); | |
2505 } | |
4075 | 2506 } break; |
2507 | |
4173 | 2508 case 0x12: { |
3141 | 2509 /* Ack for authorizing/denying someone. Or possibly an ack for sending any system notice */ |
4173 | 2510 /* Someone added you to their contact list? */ |
3141 | 2511 } break; |
2512 | |
4173 | 2513 case 0x13: { /* Someone has sent you some ICQ contacts */ |
3453 | 2514 int i, num; |
2515 gchar **text; | |
4173 | 2516 text = g_strsplit(args->msg, "\376", 0); |
3453 | 2517 if (text) { |
2518 num = 0; | |
2519 for (i=0; i<strlen(text[0]); i++) | |
2520 num = num*10 + text[0][i]-48; | |
2521 for (i=0; i<num; i++) { | |
4230 | 2522 struct name_data *data = g_new(struct name_data, 1); |
3730 | 2523 gchar *message = g_strdup_printf(_("ICQ user %lu has sent you a contact: %s (%s)"), args->uin, text[i*2+2], text[i*2+1]); |
3453 | 2524 data->gc = gc; |
4790 | 2525 data->name = g_strdup(text[i*2+1]); |
2526 data->nick = g_strdup(text[i*2+2]); | |
4249 | 2527 do_ask_dialog(message, _("Do you want to add this contact to your Buddy List?"), data, _("Add"), gaim_icq_contactadd, _("Decline"), gaim_free_name_data, my_protocol->plug ? my_protocol->plug->handle : NULL, FALSE); |
3453 | 2528 g_free(message); |
2529 } | |
2530 g_strfreev(text); | |
2531 } | |
2532 } break; | |
2533 | |
4173 | 2534 case 0x1a: { /* Someone has sent you a greeting card or requested contacts? */ |
3453 | 2535 /* This is boring and silly. */ |
2536 } break; | |
2537 | |
3141 | 2538 default: { |
4194 | 2539 debug_printf("Received a channel 4 message of unknown type (type 0x%02hhx).\n", args->type); |
3141 | 2540 } break; |
2541 } | |
2542 | |
4076 | 2543 g_strfreev(msg1); |
2544 g_strfreev(msg2); | |
2545 | |
3141 | 2546 return 1; |
2547 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2548 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2549 static int gaim_parse_incoming_im(aim_session_t *sess, aim_frame_t *fr, ...) { |
4200 | 2550 fu16_t channel; |
2551 int ret = 0; | |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2552 aim_userinfo_t *userinfo; |
2086 | 2553 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2554 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2555 va_start(ap, fr); |
4200 | 2556 channel = (fu16_t)va_arg(ap, unsigned int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2557 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 2558 |
3141 | 2559 switch (channel) { |
2560 case 1: { /* standard message */ | |
2561 struct aim_incomingim_ch1_args *args; | |
2562 args = va_arg(ap, struct aim_incomingim_ch1_args *); | |
2563 ret = incomingim_chan1(sess, fr->conn, userinfo, args); | |
2564 } break; | |
2565 | |
2566 case 2: { /* rendevous */ | |
2567 struct aim_incomingim_ch2_args *args; | |
2568 args = va_arg(ap, struct aim_incomingim_ch2_args *); | |
2569 ret = incomingim_chan2(sess, fr->conn, userinfo, args); | |
2570 } break; | |
2571 | |
2572 case 4: { /* ICQ */ | |
2573 struct aim_incomingim_ch4_args *args; | |
2574 args = va_arg(ap, struct aim_incomingim_ch4_args *); | |
4075 | 2575 ret = incomingim_chan4(sess, fr->conn, userinfo, args, 0); |
3141 | 2576 } break; |
2577 | |
2578 default: { | |
4194 | 2579 debug_printf("ICBM received on unsupported channel (channel 0x%04hx).", channel); |
3141 | 2580 } break; |
2086 | 2581 } |
2582 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2583 va_end(ap); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2584 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2585 return ret; |
2086 | 2586 } |
2587 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2588 static int gaim_parse_misses(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2589 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2590 fu16_t chan, nummissed, reason; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2591 aim_userinfo_t *userinfo; |
2086 | 2592 char buf[1024]; |
2593 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2594 va_start(ap, fr); |
4200 | 2595 chan = (fu16_t)va_arg(ap, unsigned int); |
2596 userinfo = va_arg(ap, aim_userinfo_t *); | |
2597 nummissed = (fu16_t)va_arg(ap, unsigned int); | |
2598 reason = (fu16_t)va_arg(ap, unsigned int); | |
2086 | 2599 va_end(ap); |
2600 | |
2601 switch(reason) { | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2602 case 0: |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2603 /* Invalid (0) */ |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2604 g_snprintf(buf, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2605 sizeof(buf), |
4276 | 2606 ngettext( |
2607 "You missed %hu message from %s because it was invalid.", | |
2608 "You missed %hu messages from %s because they were invalid.", | |
2609 nummissed), | |
4282 | 2610 nummissed, |
2611 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2612 break; |
2086 | 2613 case 1: |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2614 /* Message too large */ |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2615 g_snprintf(buf, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2616 sizeof(buf), |
4276 | 2617 ngettext( |
2618 "You missed %hu message from %s because it was too large.", | |
2619 "You missed %hu messages from %s because they were too large.", | |
2620 nummissed), | |
4282 | 2621 nummissed, |
2622 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2623 break; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2624 case 2: |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2625 /* Rate exceeded */ |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2626 g_snprintf(buf, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2627 sizeof(buf), |
4276 | 2628 ngettext( |
2629 "You missed %hu message from %s because the rate limit has been exceeded.", | |
2630 "You missed %hu messages from %s because the rate limit has been exceeded.", | |
2631 nummissed), | |
4282 | 2632 nummissed, |
2633 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2634 break; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2635 case 3: |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2636 /* Evil Sender */ |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2637 g_snprintf(buf, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2638 sizeof(buf), |
4276 | 2639 ngettext( |
2640 "You missed %hu message from %s because he/she was too evil.", | |
2641 "You missed %hu messages from %s because he/she was too evil.", | |
2642 nummissed), | |
4282 | 2643 nummissed, |
2644 userinfo->sn); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2645 break; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2646 case 4: |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2647 /* Evil Receiver */ |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2648 g_snprintf(buf, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2649 sizeof(buf), |
4276 | 2650 ngettext( |
2651 "You missed %hu message from %s because you are too evil.", | |
2652 "You missed %hu messages from %s because you are too evil.", | |
2653 nummissed), | |
4282 | 2654 nummissed, |
2655 userinfo->sn); | |
2086 | 2656 break; |
2657 default: | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2658 g_snprintf(buf, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2659 sizeof(buf), |
4276 | 2660 ngettext( |
2661 "You missed %hu message from %s for an unknown reason.", | |
2662 "You missed %hu messages from %s for an unknown reason.", | |
2663 nummissed), | |
4282 | 2664 nummissed, |
2665 userinfo->sn); | |
2086 | 2666 break; |
2667 } | |
3427 | 2668 do_error_dialog(buf, NULL, GAIM_ERROR); |
2086 | 2669 |
2670 return 1; | |
2671 } | |
2672 | |
3212 | 2673 static char *gaim_icq_status(int state) { |
2674 /* Make a cute little string that shows the status of the dude or dudet */ | |
2675 if (state & AIM_ICQ_STATE_CHAT) | |
4342 | 2676 return g_strdup_printf(_("Free For Chat")); |
3212 | 2677 else if (state & AIM_ICQ_STATE_DND) |
4342 | 2678 return g_strdup_printf(_("Do Not Disturb")); |
3212 | 2679 else if (state & AIM_ICQ_STATE_OUT) |
4342 | 2680 return g_strdup_printf(_("Not Available")); |
3212 | 2681 else if (state & AIM_ICQ_STATE_BUSY) |
4342 | 2682 return g_strdup_printf(_("Occupied")); |
3212 | 2683 else if (state & AIM_ICQ_STATE_AWAY) |
4342 | 2684 return g_strdup_printf(_("Away")); |
3212 | 2685 else if (state & AIM_ICQ_STATE_WEBAWARE) |
4342 | 2686 return g_strdup_printf(_("Web Aware")); |
3212 | 2687 else if (state & AIM_ICQ_STATE_INVISIBLE) |
4342 | 2688 return g_strdup_printf(_("Invisible")); |
3212 | 2689 else |
4342 | 2690 return g_strdup_printf(_("Online")); |
3212 | 2691 } |
2692 | |
4194 | 2693 static int gaim_parse_clientauto_ch2(aim_session_t *sess, const char *who, fu16_t reason, const char *cookie) { |
3630 | 2694 struct gaim_connection *gc = sess->aux_data; |
4617 | 2695 struct oscar_data *od = gc->proto_data; |
2696 | |
2697 /* BBB */ | |
3630 | 2698 switch (reason) { |
4151 | 2699 case 3: { /* Decline sendfile. */ |
4617 | 2700 struct gaim_xfer *xfer; |
2701 debug_printf("AAA - Other user declined file transfer\n"); | |
2702 if ((xfer = oscar_find_xfer_by_cookie(od->file_transfers, cookie))) | |
4675
3145c5c45877
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4666
diff
changeset
|
2703 gaim_xfer_cancel_remote(xfer); |
4151 | 2704 } break; |
2705 | |
2706 default: { | |
4194 | 2707 debug_printf("Received an unknown rendezvous client auto-response from %s. Type 0x%04hx\n", who, reason); |
4151 | 2708 } |
3630 | 2709 |
2710 } | |
2711 | |
2712 return 0; | |
2713 } | |
2714 | |
4194 | 2715 static int gaim_parse_clientauto_ch4(aim_session_t *sess, char *who, fu16_t reason, fu32_t state, char *msg) { |
4151 | 2716 struct gaim_connection *gc = sess->aux_data; |
2717 | |
2718 switch(reason) { | |
2719 case 0x0003: { /* Reply from an ICQ status message request */ | |
2720 char *status_msg = gaim_icq_status(state); | |
2721 char *dialog_msg, **splitmsg; | |
2722 struct oscar_data *od = gc->proto_data; | |
2723 GSList *l = od->evilhack; | |
2724 gboolean evilhack = FALSE; | |
2725 | |
2726 /* Split at (carriage return/newline)'s, then rejoin later with BRs between. */ | |
2727 splitmsg = g_strsplit(msg, "\r\n", 0); | |
2728 | |
2729 /* If who is in od->evilhack, then we're just getting the away message, otherwise this | |
2730 * will just get appended to the info box (which is already showing). */ | |
2731 while (l) { | |
2732 char *x = l->data; | |
2733 if (!strcmp(x, normalize(who))) { | |
2734 evilhack = TRUE; | |
2735 g_free(x); | |
2736 od->evilhack = g_slist_remove(od->evilhack, x); | |
2737 break; | |
2738 } | |
2739 l = l->next; | |
2740 } | |
2741 | |
2742 if (evilhack) | |
4344 | 2743 dialog_msg = g_strdup_printf(_("<B>UIN:</B> %s<BR><B>Status:</B> %s<HR>%s"), who, status_msg, g_strjoinv("<BR>", splitmsg)); |
4151 | 2744 else |
4344 | 2745 dialog_msg = g_strdup_printf(_("<B>Status:</B> %s<HR>%s"), status_msg, g_strjoinv("<BR>", splitmsg)); |
4151 | 2746 g_show_info_text(gc, who, 2, dialog_msg, NULL); |
2747 | |
2748 g_free(status_msg); | |
2749 g_free(dialog_msg); | |
2750 g_strfreev(splitmsg); | |
2751 } break; | |
2752 | |
2753 default: { | |
4194 | 2754 debug_printf("Received an unknown client auto-response from %s. Type 0x%04hx\n", who, reason); |
4151 | 2755 } break; |
2756 } /* end of switch */ | |
2757 | |
2758 return 0; | |
2759 } | |
2760 | |
3212 | 2761 static int gaim_parse_clientauto(aim_session_t *sess, aim_frame_t *fr, ...) { |
2762 va_list ap; | |
2763 fu16_t chan, reason; | |
2764 char *who; | |
2765 | |
2766 va_start(ap, fr); | |
4200 | 2767 chan = (fu16_t)va_arg(ap, unsigned int); |
3212 | 2768 who = va_arg(ap, char *); |
4200 | 2769 reason = (fu16_t)va_arg(ap, unsigned int); |
3212 | 2770 |
3952 | 2771 if (chan == 0x0002) { /* File transfer declined */ |
3630 | 2772 char *cookie = va_arg(ap, char *); |
4151 | 2773 return gaim_parse_clientauto_ch2(sess, who, reason, cookie); |
3952 | 2774 } else if (chan == 0x0004) { /* ICQ message */ |
4200 | 2775 fu32_t state = 0; |
4151 | 2776 char *msg = NULL; |
2777 if (reason == 0x0003) { | |
4200 | 2778 state = va_arg(ap, fu32_t); |
4151 | 2779 msg = va_arg(ap, char *); |
2780 } | |
2781 return gaim_parse_clientauto_ch4(sess, who, reason, state, msg); | |
2782 } | |
3952 | 2783 |
3212 | 2784 va_end(ap); |
2785 | |
2786 return 1; | |
2787 } | |
2788 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2789 static int gaim_parse_genericerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2790 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2791 fu16_t reason; |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
2792 char *m; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2793 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2794 va_start(ap, fr); |
4199 | 2795 reason = (fu16_t) va_arg(ap, unsigned int); |
2086 | 2796 va_end(ap); |
2797 | |
4194 | 2798 debug_printf("snac threw error (reason 0x%04hx: %s)\n", reason, |
2086 | 2799 (reason < msgerrreasonlen) ? msgerrreason[reason] : "unknown"); |
2800 | |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
2801 m = g_strdup_printf(_("SNAC threw error: %s\n"), |
4056 | 2802 reason < msgerrreasonlen ? gettext(msgerrreason[reason]) : _("Unknown error")); |
3427 | 2803 do_error_dialog(m, NULL, GAIM_ERROR); |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
2804 g_free(m); |
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
2805 |
2086 | 2806 return 1; |
2807 } | |
2808 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2809 static int gaim_parse_msgerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
4617 | 2810 #if 0 |
3752 | 2811 struct gaim_connection *gc = sess->aux_data; |
4617 | 2812 struct oscar_data *od = gc->proto_data; |
2813 struct gaim_xfer *xfer; | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
2814 #endif |
4617 | 2815 va_list ap; |
2816 fu16_t reason; | |
2817 char *data, *buf; | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
2818 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2819 va_start(ap, fr); |
4617 | 2820 reason = (fu16_t)va_arg(ap, unsigned int); |
3752 | 2821 data = va_arg(ap, char *); |
2086 | 2822 va_end(ap); |
2823 | |
4617 | 2824 debug_printf("Message error with data %s and reason %hu\n", data, reason); |
2825 | |
2826 /* BBB */ | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
2827 #if 0 |
4617 | 2828 /* If this was a file transfer request, data is a cookie */ |
2829 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
|
2830 gaim_xfer_cancel_remote(xfer); |
3630 | 2831 return 1; |
2832 } | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
2833 #endif |
3630 | 2834 |
4617 | 2835 /* Data is assumed to be the destination sn */ |
2836 buf = g_strdup_printf(_("Your message to %s did not get sent:"), data); | |
4342 | 2837 do_error_dialog(buf, (reason < msgerrreasonlen) ? gettext(msgerrreason[reason]) : _("No reason given."), GAIM_ERROR); |
4617 | 2838 g_free(buf); |
2086 | 2839 |
2840 return 1; | |
2841 } | |
2842 | |
3595 | 2843 static int gaim_parse_mtn(aim_session_t *sess, aim_frame_t *fr, ...) { |
2844 struct gaim_connection *gc = sess->aux_data; | |
2845 va_list ap; | |
2846 fu16_t type1, type2; | |
2847 char *sn; | |
2848 | |
2849 va_start(ap, fr); | |
4199 | 2850 type1 = (fu16_t) va_arg(ap, unsigned int); |
3595 | 2851 sn = va_arg(ap, char *); |
4199 | 2852 type2 = (fu16_t) va_arg(ap, unsigned int); |
3595 | 2853 va_end(ap); |
2854 | |
2855 switch (type2) { | |
2856 case 0x0000: { /* Text has been cleared */ | |
2857 serv_got_typing_stopped(gc, sn); | |
2858 } break; | |
2859 | |
2860 case 0x0001: { /* Paused typing */ | |
3768 | 2861 serv_got_typing(gc, sn, 0, TYPED); |
3595 | 2862 } break; |
2863 | |
2864 case 0x0002: { /* Typing */ | |
3768 | 2865 serv_got_typing(gc, sn, 0, TYPING); |
3595 | 2866 } break; |
2867 | |
2868 default: { | |
4624 | 2869 printf("Received unknown typing notification message from %s. Type1 is 0x%04x and type2 is 0x%04hx.\n", sn, type1, type2); |
3595 | 2870 } break; |
2871 } | |
2872 | |
2873 return 1; | |
2874 } | |
2875 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2876 static int gaim_parse_locerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2877 va_list ap; |
2878 char *destn; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2879 fu16_t reason; |
2086 | 2880 char buf[1024]; |
2881 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2882 va_start(ap, fr); |
4199 | 2883 reason = (fu16_t) va_arg(ap, unsigned int); |
2086 | 2884 destn = va_arg(ap, char *); |
2885 va_end(ap); | |
2886 | |
3574 | 2887 snprintf(buf, sizeof(buf), _("User information for %s unavailable:"), destn); |
4342 | 2888 do_error_dialog(buf, (reason < msgerrreasonlen) ? gettext(msgerrreason[reason]) : _("No reason given."), GAIM_ERROR); |
2086 | 2889 |
2890 return 1; | |
2891 } | |
2892 | |
2893 static char *images(int flags) { | |
2894 static char buf[1024]; | |
3101 | 2895 g_snprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s", |
2679 | 2896 (flags & AIM_FLAG_ACTIVEBUDDY) ? "<IMG SRC=\"ab_icon.gif\">" : "", |
2086 | 2897 (flags & AIM_FLAG_UNCONFIRMED) ? "<IMG SRC=\"dt_icon.gif\">" : "", |
2898 (flags & AIM_FLAG_AOL) ? "<IMG SRC=\"aol_icon.gif\">" : "", | |
3101 | 2899 (flags & AIM_FLAG_ICQ) ? "<IMG SRC=\"icq_icon.gif\">" : "", |
2086 | 2900 (flags & AIM_FLAG_ADMINISTRATOR) ? "<IMG SRC=\"admin_icon.gif\">" : "", |
3079 | 2901 (flags & AIM_FLAG_FREE) ? "<IMG SRC=\"free_icon.gif\">" : "", |
2902 (flags & AIM_FLAG_WIRELESS) ? "<IMG SRC=\"wireless_icon.gif\">" : ""); | |
2086 | 2903 return buf; |
2904 } | |
2905 | |
3101 | 2906 |
2920 | 2907 static char *caps_string(guint caps) |
2908 { | |
2909 static char buf[512], *tmp; | |
2910 int count = 0, i = 0; | |
2911 guint bit = 1; | |
4742 | 2912 |
2913 if (!caps) { | |
4744 | 2914 return NULL; |
4743 | 2915 } else while (bit <= 0x20000) { |
2920 | 2916 if (bit & caps) { |
2917 switch (bit) { | |
2918 case 0x1: | |
2919 tmp = _("Buddy Icon"); | |
2920 break; | |
2921 case 0x2: | |
2922 tmp = _("Voice"); | |
2923 break; | |
2924 case 0x4: | |
2925 tmp = _("IM Image"); | |
2926 break; | |
2927 case 0x8: | |
2928 tmp = _("Chat"); | |
2929 break; | |
2930 case 0x10: | |
2931 tmp = _("Get File"); | |
2932 break; | |
2933 case 0x20: | |
2934 tmp = _("Send File"); | |
2935 break; | |
2936 case 0x40: | |
2937 case 0x200: | |
2938 tmp = _("Games"); | |
2939 break; | |
2940 case 0x80: | |
2941 tmp = _("Stocks"); | |
2942 break; | |
2943 case 0x100: | |
2944 tmp = _("Send Buddy List"); | |
2945 break; | |
2946 case 0x400: | |
2947 tmp = _("EveryBuddy Bug"); | |
2948 break; | |
2949 case 0x800: | |
2950 tmp = _("AP User"); | |
2951 break; | |
2952 case 0x1000: | |
2953 tmp = _("ICQ RTF"); | |
2954 break; | |
2955 case 0x2000: | |
2956 tmp = _("Nihilist"); | |
2957 break; | |
2958 case 0x4000: | |
2959 tmp = _("ICQ Server Relay"); | |
2960 break; | |
2961 case 0x8000: | |
2962 tmp = _("ICQ Unknown"); | |
2963 break; | |
2964 case 0x10000: | |
2965 tmp = _("Trillian Encryption"); | |
2966 break; | |
4742 | 2967 case 0x20000: |
2968 tmp = _("ICQ UTF8"); | |
2969 break; | |
2920 | 2970 default: |
2971 tmp = NULL; | |
2972 break; | |
2973 } | |
2974 if (tmp) | |
2975 i += g_snprintf(buf + i, sizeof(buf) - i, "%s%s", (count ? ", " : ""), | |
2976 tmp); | |
2977 count++; | |
2978 } | |
2979 bit <<= 1; | |
2980 } | |
4744 | 2981 return buf; |
2920 | 2982 } |
2983 | |
4732 | 2984 static char *oscar_tooltip_text(struct buddy *b) { |
4738 | 2985 struct gaim_connection *gc = b->account->gc; |
2986 struct oscar_data *od = gc->proto_data; | |
2987 struct buddyinfo *bi = g_hash_table_lookup(od->buddyinfo, normalize(b->name)); | |
2988 | |
4744 | 2989 if (bi) { |
2990 char *caps = caps_string(bi->caps); | |
4798 | 2991 char *tstr = sec_to_text(time(NULL) - bi->signon); |
2992 return g_strdup_printf(_("<b>Logged In:</b> %s%s%s"), | |
2993 tstr, | |
4744 | 2994 caps ? _("\n<b>Capabilities:</b> ") : "", caps ? caps : ""); |
2995 } else { | |
4738 | 2996 return NULL; |
4744 | 2997 } |
4732 | 2998 } |
2999 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3000 static int gaim_parse_user_info(aim_session_t *sess, aim_frame_t *fr, ...) { |
4791 | 3001 struct gaim_connection *gc = sess->aux_data; |
3002 struct oscar_data *od = gc->proto_data; | |
3003 char header[BUF_LONG]; | |
3004 GSList *l = od->evilhack; | |
3005 gboolean evilhack = FALSE; | |
3006 gchar *membersince = NULL, *onlinesince = NULL, *idle = NULL; | |
3007 fu32_t flags; | |
3008 va_list ap; | |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3009 aim_userinfo_t *info; |
4791 | 3010 fu16_t infotype; |
4151 | 3011 char *text_enc = NULL, *text = NULL, *utf8 = NULL; |
3012 int text_len; | |
2086 | 3013 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3014 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3015 info = va_arg(ap, aim_userinfo_t *); |
4199 | 3016 infotype = (fu16_t) va_arg(ap, unsigned int); |
4151 | 3017 text_enc = va_arg(ap, char *); |
3018 text = va_arg(ap, char *); | |
3019 text_len = va_arg(ap, int); | |
2086 | 3020 va_end(ap); |
3021 | |
4151 | 3022 if (text_len > 0) { |
3023 flags = parse_encoding (text_enc); | |
3024 switch (flags) { | |
3025 case 0: | |
4159 | 3026 utf8 = g_strndup(text, text_len); |
4151 | 3027 break; |
4166 | 3028 case AIM_IMFLAGS_ISO_8859_1: |
3029 utf8 = g_convert(text, text_len, "UTF-8", "ISO-8859-1", NULL, NULL, NULL); | |
3030 break; | |
4151 | 3031 case AIM_IMFLAGS_UNICODE: |
3032 utf8 = g_convert(text, text_len, "UTF-8", "UCS-2BE", NULL, NULL, NULL); | |
3033 break; | |
3034 default: | |
4791 | 3035 utf8 = g_strdup(_("<i>Unable to display information because it was sent in an unknown encoding.</i>")); |
4194 | 3036 debug_printf("Encountered an unknown encoding while parsing userinfo\n"); |
4151 | 3037 } |
3038 } | |
3039 | |
2993 | 3040 if (info->present & AIM_USERINFO_PRESENT_ONLINESINCE) { |
4791 | 3041 onlinesince = g_strdup_printf("Online Since : <b>%s</b><br>\n", |
2993 | 3042 asctime(localtime(&info->onlinesince))); |
3043 } | |
3044 | |
3045 if (info->present & AIM_USERINFO_PRESENT_MEMBERSINCE) { | |
4791 | 3046 membersince = g_strdup_printf("Member Since : <b>%s</b><br>\n", |
2993 | 3047 asctime(localtime(&info->membersince))); |
3048 } | |
3049 | |
3050 if (info->present & AIM_USERINFO_PRESENT_IDLE) { | |
4426 | 3051 gchar *itime = sec_to_text(info->idletime*60); |
4791 | 3052 idle = g_strdup_printf("Idle : <b>%s</b>", itime); |
4426 | 3053 g_free(itime); |
2993 | 3054 } else |
4791 | 3055 idle = g_strdup("Idle: <b>Active</b>"); |
2993 | 3056 |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3057 g_snprintf(header, sizeof header, |
4791 | 3058 _("Username : <b>%s</b> %s <br>\n" |
3059 "Warning Level : <b>%d %%</b><br>\n" | |
2086 | 3060 "%s" |
2993 | 3061 "%s" |
4344 | 3062 "%s\n" |
4791 | 3063 "<hr>\n"), |
2086 | 3064 info->sn, images(info->flags), |
3065 info->warnlevel/10, | |
2993 | 3066 onlinesince ? onlinesince : "", |
3067 membersince ? membersince : "", | |
3068 idle ? idle : ""); | |
3069 | |
3070 g_free(onlinesince); | |
3071 g_free(membersince); | |
3072 g_free(idle); | |
2773
a0fd8f91e294
[gaim-migrate @ 2786]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2768
diff
changeset
|
3073 |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3074 while (l) { |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3075 char *x = l->data; |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3076 if (!strcmp(x, normalize(info->sn))) { |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3077 evilhack = TRUE; |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3078 g_free(x); |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3079 od->evilhack = g_slist_remove(od->evilhack, x); |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3080 break; |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3081 } |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3082 l = l->next; |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3083 } |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3084 |
2920 | 3085 if (infotype == AIM_GETINFO_AWAYMESSAGE) { |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3086 if (evilhack) { |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3087 g_show_info_text(gc, info->sn, 2, |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3088 header, |
4151 | 3089 (utf8 && *utf8) ? away_subs(utf8, gc->username) : |
4207 | 3090 _("<i>User has no away message</i>"), NULL); |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3091 } else { |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3092 g_show_info_text(gc, info->sn, 0, |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3093 header, |
4151 | 3094 (utf8 && *utf8) ? away_subs(utf8, gc->username) : NULL, |
4791 | 3095 (utf8 && *utf8) ? "<hr>" : NULL, |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3096 NULL); |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3097 } |
2920 | 3098 } else if (infotype == AIM_GETINFO_CAPABILITIES) { |
3099 g_show_info_text(gc, info->sn, 2, | |
3100 header, | |
3101 "<i>", _("Client Capabilities: "), | |
3102 caps_string(info->capabilities), | |
3103 "</i>", | |
3104 NULL); | |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3105 } else { |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3106 g_show_info_text(gc, info->sn, 1, |
4151 | 3107 (utf8 && *utf8) ? away_subs(utf8, gc->username) : |
3108 _("<i>No Information Provided</i>"), | |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3109 NULL); |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3110 } |
2086 | 3111 |
4151 | 3112 g_free(utf8); |
3113 | |
2086 | 3114 return 1; |
3115 } | |
3116 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3117 static int gaim_parse_motd(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3118 char *msg; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3119 fu16_t id; |
2086 | 3120 va_list ap; |
3121 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3122 va_start(ap, fr); |
4199 | 3123 id = (fu16_t) va_arg(ap, unsigned int); |
2086 | 3124 msg = va_arg(ap, char *); |
3125 va_end(ap); | |
3126 | |
4194 | 3127 debug_printf("MOTD: %s (%hu)\n", msg ? msg : "Unknown", id); |
2092
59b0377d18aa
[gaim-migrate @ 2102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
3128 if (id < 4) |
3427 | 3129 do_error_dialog(_("Your AIM connection may be lost."), NULL, GAIM_WARNING); |
2086 | 3130 |
3131 return 1; | |
3132 } | |
3133 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3134 static int gaim_chatnav_info(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3135 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3136 fu16_t type; |
2086 | 3137 struct gaim_connection *gc = sess->aux_data; |
4617 | 3138 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
2086 | 3139 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3140 va_start(ap, fr); |
4199 | 3141 type = (fu16_t) va_arg(ap, unsigned int); |
2086 | 3142 |
3143 switch(type) { | |
3144 case 0x0002: { | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3145 fu8_t maxrooms; |
2086 | 3146 struct aim_chat_exchangeinfo *exchanges; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3147 int exchangecount, i; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3148 |
4199 | 3149 maxrooms = (fu8_t) va_arg(ap, unsigned int); |
2086 | 3150 exchangecount = va_arg(ap, int); |
3151 exchanges = va_arg(ap, struct aim_chat_exchangeinfo *); | |
3152 | |
3153 debug_printf("chat info: Chat Rights:\n"); | |
4194 | 3154 debug_printf("chat info: \tMax Concurrent Rooms: %hhd\n", maxrooms); |
2086 | 3155 debug_printf("chat info: \tExchange List: (%d total)\n", exchangecount); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3156 for (i = 0; i < exchangecount; i++) |
4194 | 3157 debug_printf("chat info: \t\t%hu %s\n", exchanges[i].number, exchanges[i].name ? exchanges[i].name : ""); |
4617 | 3158 while (od->create_rooms) { |
3159 struct create_room *cr = od->create_rooms->data; | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
3160 debug_printf("creating room %s\n", cr->name); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
3161 aim_chatnav_createroom(sess, fr->conn, cr->name, cr->exchange); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
3162 g_free(cr->name); |
4617 | 3163 od->create_rooms = g_slist_remove(od->create_rooms, cr); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
3164 g_free(cr); |
2086 | 3165 } |
3166 } | |
3167 break; | |
3168 case 0x0008: { | |
3169 char *fqcn, *name, *ck; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3170 fu16_t instance, flags, maxmsglen, maxoccupancy, unknown, exchange; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3171 fu8_t createperms; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3172 fu32_t createtime; |
2086 | 3173 |
3174 fqcn = va_arg(ap, char *); | |
4200 | 3175 instance = (fu16_t)va_arg(ap, unsigned int); |
3176 exchange = (fu16_t)va_arg(ap, unsigned int); | |
3177 flags = (fu16_t)va_arg(ap, unsigned int); | |
3178 createtime = va_arg(ap, fu32_t); | |
3179 maxmsglen = (fu16_t)va_arg(ap, unsigned int); | |
3180 maxoccupancy = (fu16_t)va_arg(ap, unsigned int); | |
3181 createperms = (fu8_t)va_arg(ap, unsigned int); | |
3182 unknown = (fu16_t)va_arg(ap, unsigned int); | |
3183 name = va_arg(ap, char *); | |
3184 ck = va_arg(ap, char *); | |
4194 | 3185 |
3186 debug_printf("created room: %s %hu %hu %hu %lu %hu %hu %hhu %hu %s %s\n", | |
2086 | 3187 fqcn, |
3188 exchange, instance, flags, | |
3189 createtime, | |
3190 maxmsglen, maxoccupancy, createperms, unknown, | |
3191 name, ck); | |
4617 | 3192 aim_chat_join(od->sess, od->conn, exchange, ck, instance); |
2086 | 3193 } |
3194 break; | |
3195 default: | |
4194 | 3196 debug_printf("chatnav info: unknown type (%04hx)\n", type); |
2086 | 3197 break; |
3198 } | |
4194 | 3199 |
3200 va_end(ap); | |
3201 | |
2086 | 3202 return 1; |
3203 } | |
3204 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3205 static int gaim_chat_join(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3206 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3207 int count, i; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3208 aim_userinfo_t *info; |
2086 | 3209 struct gaim_connection *g = sess->aux_data; |
3210 | |
3211 struct chat_connection *c = NULL; | |
3212 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3213 va_start(ap, fr); |
2086 | 3214 count = va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3215 info = va_arg(ap, aim_userinfo_t *); |
2086 | 3216 va_end(ap); |
3217 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3218 c = find_oscar_chat_by_conn(g, fr->conn); |
2086 | 3219 if (!c) |
3220 return 1; | |
3221 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3222 for (i = 0; i < count; i++) |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
3223 gaim_chat_add_user(GAIM_CHAT(c->cnv), info[i].sn, NULL); |
2086 | 3224 |
3225 return 1; | |
3226 } | |
3227 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3228 static int gaim_chat_leave(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3229 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3230 int count, i; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3231 aim_userinfo_t *info; |
2086 | 3232 struct gaim_connection *g = sess->aux_data; |
3233 | |
3234 struct chat_connection *c = NULL; | |
3235 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3236 va_start(ap, fr); |
2086 | 3237 count = va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3238 info = va_arg(ap, aim_userinfo_t *); |
2086 | 3239 va_end(ap); |
3240 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3241 c = find_oscar_chat_by_conn(g, fr->conn); |
2086 | 3242 if (!c) |
3243 return 1; | |
3244 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3245 for (i = 0; i < count; i++) |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
3246 gaim_chat_remove_user(GAIM_CHAT(c->cnv), info[i].sn, NULL); |
2086 | 3247 |
3248 return 1; | |
3249 } | |
3250 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3251 static int gaim_chat_info_update(aim_session_t *sess, aim_frame_t *fr, ...) { |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3252 va_list ap; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3253 aim_userinfo_t *userinfo; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3254 struct aim_chat_roominfo *roominfo; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3255 char *roomname; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3256 int usercount; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3257 char *roomdesc; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3258 fu16_t unknown_c9, unknown_d2, unknown_d5, maxmsglen, maxvisiblemsglen; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3259 fu32_t creationtime; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3260 struct gaim_connection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3261 struct chat_connection *ccon = find_oscar_chat_by_conn(gc, fr->conn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3262 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3263 va_start(ap, fr); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3264 roominfo = va_arg(ap, struct aim_chat_roominfo *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3265 roomname = va_arg(ap, char *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3266 usercount= va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3267 userinfo = va_arg(ap, aim_userinfo_t *); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3268 roomdesc = va_arg(ap, char *); |
4200 | 3269 unknown_c9 = (fu16_t)va_arg(ap, unsigned int); |
3270 creationtime = va_arg(ap, fu32_t); | |
3271 maxmsglen = (fu16_t)va_arg(ap, unsigned int); | |
3272 unknown_d2 = (fu16_t)va_arg(ap, unsigned int); | |
3273 unknown_d5 = (fu16_t)va_arg(ap, unsigned int); | |
3274 maxvisiblemsglen = (fu16_t)va_arg(ap, unsigned int); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3275 va_end(ap); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3276 |
4194 | 3277 debug_printf("inside chat_info_update (maxmsglen = %hu, maxvislen = %hu)\n", |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3278 maxmsglen, maxvisiblemsglen); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3279 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3280 ccon->maxlen = maxmsglen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3281 ccon->maxvis = maxvisiblemsglen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3282 |
2086 | 3283 return 1; |
3284 } | |
3285 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3286 static int gaim_chat_incoming_msg(aim_session_t *sess, aim_frame_t *fr, ...) { |
4269 | 3287 struct gaim_connection *gc = sess->aux_data; |
2086 | 3288 va_list ap; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3289 aim_userinfo_t *info; |
2086 | 3290 char *msg; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3291 struct chat_connection *ccon = find_oscar_chat_by_conn(gc, fr->conn); |
2086 | 3292 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3293 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3294 info = va_arg(ap, aim_userinfo_t *); |
4194 | 3295 msg = va_arg(ap, char *); |
3296 va_end(ap); | |
2086 | 3297 |
4269 | 3298 serv_got_chat_in(gc, ccon->id, info->sn, 0, msg, time((time_t)NULL)); |
2086 | 3299 |
3300 return 1; | |
3301 } | |
3302 | |
3694 | 3303 static int gaim_email_parseupdate(aim_session_t *sess, aim_frame_t *fr, ...) { |
3304 va_list ap; | |
3305 struct gaim_connection *gc = sess->aux_data; | |
3306 struct aim_emailinfo *emailinfo; | |
3725 | 3307 int havenewmail; |
3694 | 3308 |
3309 va_start(ap, fr); | |
3310 emailinfo = va_arg(ap, struct aim_emailinfo *); | |
3725 | 3311 havenewmail = va_arg(ap, int); |
3694 | 3312 va_end(ap); |
3313 | |
3725 | 3314 if (emailinfo) { |
3315 if (emailinfo->unread) { | |
3316 if (havenewmail) | |
3317 connection_has_mail(gc, emailinfo->nummsgs ? emailinfo->nummsgs : -1, NULL, NULL, emailinfo->url); | |
3318 } else | |
3694 | 3319 connection_has_mail(gc, 0, NULL, NULL, emailinfo->url); |
3320 } | |
3321 | |
3322 return 1; | |
3323 } | |
3324 | |
4804 | 3325 static int gaim_icon_error(aim_session_t *sess, aim_frame_t *fr, ...) { |
3326 struct gaim_connection *gc = sess->aux_data; | |
3327 struct oscar_data *od = gc->proto_data; | |
3328 char *sn; | |
3329 | |
3330 sn = od->requesticon->data; | |
3331 debug_printf("removing %s from hash table\n", sn); | |
3332 od->requesticon = g_slist_remove(od->requesticon, sn); | |
3333 free(sn); | |
3334 | |
3335 if (od->icontimer) | |
3336 g_source_remove(od->icontimer); | |
3337 od->icontimer = g_timeout_add(500, gaim_icon_timerfunc, gc); | |
3338 | |
3339 return 1; | |
3340 } | |
3341 | |
3342 static int gaim_icon_parseicon(aim_session_t *sess, aim_frame_t *fr, ...) { | |
3343 struct gaim_connection *gc = sess->aux_data; | |
3344 struct oscar_data *od = gc->proto_data; | |
3345 GSList *cur; | |
3346 va_list ap; | |
3347 char *sn; | |
3348 fu8_t *iconstr, *icon; | |
3349 fu16_t iconstrlen, iconlen; | |
3350 | |
3351 va_start(ap, fr); | |
3352 sn = va_arg(ap, char *); | |
3353 iconstr = va_arg(ap, fu8_t *); | |
3354 iconstrlen = va_arg(ap, int); | |
3355 icon = va_arg(ap, fu8_t *); | |
3356 iconlen = va_arg(ap, int); | |
3357 va_end(ap); | |
3358 | |
3359 if (iconlen > 0) | |
3360 set_icon_data(gc, sn, icon, iconlen); | |
3361 | |
3362 cur = od->requesticon; | |
3363 while (cur) { | |
3364 char *cursn = cur->data; | |
3365 if (!aim_sncmp(cursn, sn)) { | |
3366 od->requesticon = g_slist_remove(od->requesticon, cursn); | |
3367 free(cursn); | |
3368 cur = od->requesticon; | |
3369 } else | |
3370 cur = cur->next; | |
3371 } | |
3372 | |
3373 if (od->icontimer) | |
3374 g_source_remove(od->icontimer); | |
3375 od->icontimer = g_timeout_add(250, gaim_icon_timerfunc, gc); | |
3376 | |
3377 return 1; | |
3378 } | |
3379 | |
3380 static gboolean gaim_icon_timerfunc(gpointer data) { | |
3381 struct gaim_connection *gc = data; | |
3382 struct oscar_data *od = gc->proto_data; | |
3383 struct buddy *b; | |
3384 struct buddyinfo *bi; | |
3385 aim_conn_t *conn; | |
3386 char *buddy_icon; | |
3387 | |
3388 if (!od->requesticon) { | |
3389 debug_printf("no more icons to request\n"); | |
3390 return FALSE; | |
3391 } | |
3392 | |
3393 conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_ICON); | |
3394 if (!conn) { | |
3395 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_ICON); | |
3396 return FALSE; | |
3397 } | |
3398 | |
3399 bi = g_hash_table_lookup(od->buddyinfo, (char *)od->requesticon->data); | |
3400 b = gaim_find_buddy(gc->account, (char *)od->requesticon->data); | |
3401 buddy_icon = gaim_buddy_get_setting(b, "buddy_icon"); | |
3402 if (bi && (bi->iconstrlen > 0) && !buddy_icon) { | |
3403 aim_icon_requesticon(od->sess, od->requesticon->data, bi->iconstr, bi->iconstrlen); | |
3404 return FALSE; | |
3405 } else { | |
3406 char *sn = od->requesticon->data; | |
3407 od->requesticon = g_slist_remove(od->requesticon, sn); | |
3408 free(sn); | |
3409 } | |
3410 free(buddy_icon); | |
3411 | |
3412 return TRUE; | |
3413 } | |
3414 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3415 /* |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3416 * 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
|
3417 */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3418 static int gaim_parse_msgack(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3419 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3420 fu16_t type; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3421 char *sn; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3422 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3423 va_start(ap, fr); |
4199 | 3424 type = (fu16_t) va_arg(ap, unsigned int); |
2086 | 3425 sn = va_arg(ap, char *); |
3426 va_end(ap); | |
3427 | |
3428 debug_printf("Sent message to %s.\n", sn); | |
3429 | |
3430 return 1; | |
3431 } | |
3432 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3433 static int gaim_parse_ratechange(aim_session_t *sess, aim_frame_t *fr, ...) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3434 static const char *codes[5] = { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3435 "invalid", |
4194 | 3436 "change", |
3437 "warning", | |
3438 "limit", | |
3439 "limit cleared", | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3440 }; |
2086 | 3441 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3442 fu16_t code, rateclass; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3443 fu32_t windowsize, clear, alert, limit, disconnect, currentavg, maxavg; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3444 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3445 va_start(ap, fr); |
4200 | 3446 code = (fu16_t)va_arg(ap, unsigned int); |
3447 rateclass= (fu16_t)va_arg(ap, unsigned int); | |
3448 windowsize = va_arg(ap, fu32_t); | |
3449 clear = va_arg(ap, fu32_t); | |
3450 alert = va_arg(ap, fu32_t); | |
3451 limit = va_arg(ap, fu32_t); | |
3452 disconnect = va_arg(ap, fu32_t); | |
3453 currentavg = va_arg(ap, fu32_t); | |
3454 maxavg = va_arg(ap, fu32_t); | |
2086 | 3455 va_end(ap); |
3456 | |
4194 | 3457 debug_printf("rate %s (param ID 0x%04hx): curavg = %lu, maxavg = %lu, alert at %lu, " |
3458 "clear warning at %lu, limit at %lu, disconnect at %lu (window size = %lu)\n", | |
2086 | 3459 (code < 5) ? codes[code] : codes[0], |
3460 rateclass, | |
3461 currentavg, maxavg, | |
3462 alert, clear, | |
3463 limit, disconnect, | |
3464 windowsize); | |
3465 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3466 /* XXX fix these values */ |
2086 | 3467 if (code == AIM_RATE_CODE_CHANGE) { |
3468 if (currentavg >= clear) | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3469 aim_conn_setlatency(fr->conn, 0); |
2086 | 3470 } else if (code == AIM_RATE_CODE_WARNING) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3471 aim_conn_setlatency(fr->conn, windowsize/4); |
2909
48ec70928d7f
[gaim-migrate @ 2922]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2906
diff
changeset
|
3472 } else if (code == AIM_RATE_CODE_LIMIT) { |
3427 | 3473 do_error_dialog(_("Rate limiting error."), |
3474 _("The last message was not sent because you are over the rate limit. " | |
3475 "Please wait 10 seconds and try again."), GAIM_ERROR); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3476 aim_conn_setlatency(fr->conn, windowsize/2); |
2086 | 3477 } else if (code == AIM_RATE_CODE_CLEARLIMIT) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3478 aim_conn_setlatency(fr->conn, 0); |
2086 | 3479 } |
3480 | |
3481 return 1; | |
3482 } | |
3483 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3484 static int gaim_parse_evilnotify(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3485 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3486 fu16_t newevil; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3487 aim_userinfo_t *userinfo; |
2086 | 3488 struct gaim_connection *gc = sess->aux_data; |
3489 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3490 va_start(ap, fr); |
4199 | 3491 newevil = (fu16_t) va_arg(ap, unsigned int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
3492 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 3493 va_end(ap); |
3494 | |
3495 serv_got_eviled(gc, (userinfo && userinfo->sn[0]) ? userinfo->sn : NULL, newevil / 10); | |
3496 | |
3497 return 1; | |
3498 } | |
3499 | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3500 static int gaim_selfinfo(aim_session_t *sess, aim_frame_t *fr, ...) { |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3501 va_list ap; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3502 aim_userinfo_t *info; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3503 struct gaim_connection *gc = sess->aux_data; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3504 |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3505 va_start(ap, fr); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3506 info = va_arg(ap, aim_userinfo_t *); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3507 va_end(ap); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3508 |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3509 gc->evil = info->warnlevel/10; |
2698
e80f4b4f840f
[gaim-migrate @ 2711]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2689
diff
changeset
|
3510 /* gc->correction_time = (info->onlinesince - gc->login_time); */ |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3511 |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3512 return 1; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3513 } |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
3514 |
4649 | 3515 static int gaim_connerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
3516 struct gaim_connection *gc = sess->aux_data; | |
4666 | 3517 struct oscar_data *od = gc->proto_data; |
4649 | 3518 va_list ap; |
3519 fu16_t code; | |
3520 char *msg; | |
3521 | |
3522 va_start(ap, fr); | |
3523 code = (fu16_t)va_arg(ap, int); | |
3524 msg = va_arg(ap, char *); | |
3525 va_end(ap); | |
3526 | |
3527 debug_printf("Disconnected. Code is 0x%04x and msg is %s\n", code, msg); | |
3528 if ((fr) && (fr->conn) && (fr->conn->type == AIM_CONN_TYPE_BOS)) { | |
4651 | 3529 if (code == 0x0001) { |
4652 | 3530 hide_login_progress_error(gc, _("You have been disconnected because you have signed on with this screen name at another location.")); |
4651 | 3531 } else { |
4652 | 3532 hide_login_progress_error(gc, _("You have been signed off for an unknown reason.")); |
4651 | 3533 } |
4666 | 3534 od->killme = TRUE; |
4649 | 3535 } |
3536 | |
3537 return 1; | |
3538 } | |
3539 | |
2675 | 3540 static int conninitdone_bos(aim_session_t *sess, aim_frame_t *fr, ...) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3541 |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3542 aim_reqpersonalinfo(sess, fr->conn); |
4230 | 3543 |
3544 #ifndef NOSSI | |
3545 debug_printf("ssi: requesting ssi list\n"); | |
3546 aim_ssi_reqrights(sess, fr->conn); | |
3547 aim_ssi_reqdata(sess, fr->conn, sess->ssi.timestamp, sess->ssi.numitems); | |
3548 #endif | |
3549 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3550 aim_bos_reqlocaterights(sess, fr->conn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3551 aim_bos_reqbuddyrights(sess, fr->conn); |
4617 | 3552 aim_im_reqparams(sess); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3553 aim_bos_reqrights(sess, fr->conn); |
4230 | 3554 |
3555 #ifdef NOSSI | |
3556 aim_bos_setgroupperm(sess, fr->conn, AIM_FLAG_ALLUSERS); | |
3557 aim_bos_setprivacyflags(sess, fr->conn, AIM_PRIVFLAGS_ALLOWIDLE | AIM_PRIVFLAGS_ALLOWMEMBERSINCE); | |
3558 #endif | |
2086 | 3559 |
3560 return 1; | |
3561 } | |
3562 | |
2675 | 3563 static int conninitdone_admin(aim_session_t *sess, aim_frame_t *fr, ...) { |
2647 | 3564 struct gaim_connection *gc = sess->aux_data; |
3565 struct oscar_data *od = gc->proto_data; | |
3566 | |
2672 | 3567 aim_clientready(sess, fr->conn); |
2675 | 3568 debug_printf("connected to admin\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3569 |
2647 | 3570 if (od->chpass) { |
3571 debug_printf("changing password\n"); | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3572 aim_admin_changepasswd(sess, fr->conn, od->newp, od->oldp); |
2647 | 3573 g_free(od->oldp); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3574 od->oldp = NULL; |
2647 | 3575 g_free(od->newp); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3576 od->newp = NULL; |
2647 | 3577 od->chpass = FALSE; |
3578 } | |
2979 | 3579 if (od->setnick) { |
3580 debug_printf("formatting screenname\n"); | |
3581 aim_admin_setnick(sess, fr->conn, od->newsn); | |
3582 g_free(od->newsn); | |
3583 od->newsn = NULL; | |
3584 od->setnick = FALSE; | |
3585 } | |
2647 | 3586 if (od->conf) { |
3587 debug_printf("confirming account\n"); | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3588 aim_admin_reqconfirm(sess, fr->conn); |
2647 | 3589 od->conf = FALSE; |
3590 } | |
3591 if (od->reqemail) { | |
3592 debug_printf("requesting email\n"); | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3593 aim_admin_getinfo(sess, fr->conn, 0x0011); |
2647 | 3594 od->reqemail = FALSE; |
3595 } | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3596 if (od->setemail) { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3597 debug_printf("setting email\n"); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3598 aim_admin_setemail(sess, fr->conn, od->email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3599 g_free(od->email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3600 od->setemail = FALSE; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3601 } |
2647 | 3602 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3603 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3604 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3605 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3606 static int gaim_icbm_param_info(aim_session_t *sess, aim_frame_t *fr, ...) { |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3607 struct aim_icbmparameters *params; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3608 va_list ap; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3609 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3610 va_start(ap, fr); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3611 params = va_arg(ap, struct aim_icbmparameters *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3612 va_end(ap); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3613 |
4194 | 3614 /* XXX - evidently this crashes on solaris. i have no clue why |
3615 debug_printf("ICBM Parameters: maxchannel = %hu, default flags = 0x%08lx, max msg len = %hu, " | |
3616 "max sender evil = %f, max receiver evil = %f, min msg interval = %lu\n", | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3617 params->maxchan, params->flags, params->maxmsglen, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3618 ((float)params->maxsenderwarn)/10.0, ((float)params->maxrecverwarn)/10.0, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3619 params->minmsginterval); |
2427
5bc3b39fc0a5
[gaim-migrate @ 2440]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2421
diff
changeset
|
3620 */ |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3621 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3622 /* Maybe senderwarn and recverwarn should be user preferences... */ |
3595 | 3623 params->flags = 0x0000000b; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3624 params->maxmsglen = 8000; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3625 params->minmsginterval = 0; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3626 |
4617 | 3627 aim_im_setparams(sess, params); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3628 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3629 return 1; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3630 } |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3631 |
2993 | 3632 static int gaim_parse_locaterights(aim_session_t *sess, aim_frame_t *fr, ...) |
3633 { | |
3634 va_list ap; | |
3635 fu16_t maxsiglen; | |
3636 struct gaim_connection *gc = sess->aux_data; | |
4617 | 3637 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
4151 | 3638 char *unicode; |
3639 int unicode_len; | |
3640 fu32_t flags; | |
2993 | 3641 |
3642 va_start(ap, fr); | |
4199 | 3643 maxsiglen = (fu16_t) va_arg(ap, int); |
2993 | 3644 va_end(ap); |
3645 | |
3646 debug_printf("locate rights: max sig len = %d\n", maxsiglen); | |
3647 | |
4617 | 3648 od->rights.maxsiglen = od->rights.maxawaymsglen = (guint)maxsiglen; |
3649 | |
3650 if (od->icq) | |
4151 | 3651 aim_bos_setprofile(sess, fr->conn, NULL, NULL, 0, NULL, NULL, 0, caps_icq); |
3652 else { | |
4491 | 3653 flags = check_encoding (gc->account->user_info); |
4151 | 3654 |
3655 if (flags == 0) { | |
4600 | 3656 aim_bos_setprofile(sess, fr->conn, "us-ascii", gc->account->user_info, |
4491 | 3657 strlen(gc->account->user_info), NULL, NULL, 0, caps_aim); |
4151 | 3658 } else { |
4491 | 3659 unicode = g_convert (gc->account->user_info, strlen(gc->account->user_info), |
4151 | 3660 "UCS-2BE", "UTF-8", NULL, &unicode_len, NULL); |
3661 aim_bos_setprofile(sess, fr->conn, "unicode-2-0", unicode, unicode_len, | |
3662 NULL, NULL, 0, caps_aim); | |
3663 g_free(unicode); | |
3664 } | |
3665 } | |
2993 | 3666 |
3667 return 1; | |
3668 } | |
3669 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3670 static int gaim_parse_buddyrights(aim_session_t *sess, aim_frame_t *fr, ...) { |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3671 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3672 fu16_t maxbuddies, maxwatchers; |
2993 | 3673 struct gaim_connection *gc = sess->aux_data; |
4617 | 3674 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3675 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3676 va_start(ap, fr); |
4199 | 3677 maxbuddies = (fu16_t) va_arg(ap, unsigned int); |
3678 maxwatchers = (fu16_t) va_arg(ap, unsigned int); | |
2086 | 3679 va_end(ap); |
3680 | |
4194 | 3681 debug_printf("buddy list rights: Max buddies = %hu / Max watchers = %hu\n", maxbuddies, maxwatchers); |
2086 | 3682 |
4617 | 3683 od->rights.maxbuddies = (guint)maxbuddies; |
3684 od->rights.maxwatchers = (guint)maxwatchers; | |
2993 | 3685 |
2086 | 3686 return 1; |
3687 } | |
3688 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3689 static int gaim_bosrights(aim_session_t *sess, aim_frame_t *fr, ...) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3690 fu16_t maxpermits, maxdenies; |
2086 | 3691 va_list ap; |
2993 | 3692 struct gaim_connection *gc = sess->aux_data; |
4617 | 3693 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
2086 | 3694 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3695 va_start(ap, fr); |
4199 | 3696 maxpermits = (fu16_t) va_arg(ap, unsigned int); |
3697 maxdenies = (fu16_t) va_arg(ap, unsigned int); | |
2086 | 3698 va_end(ap); |
3699 | |
4194 | 3700 debug_printf("BOS rights: Max permit = %hu / Max deny = %hu\n", maxpermits, maxdenies); |
2086 | 3701 |
4617 | 3702 od->rights.maxpermits = (guint)maxpermits; |
3703 od->rights.maxdenies = (guint)maxdenies; | |
2993 | 3704 |
3705 account_online(gc); | |
3706 serv_finish_login(gc); | |
3707 | |
3708 debug_printf("buddy list loaded\n"); | |
3709 | |
2672 | 3710 aim_clientready(sess, fr->conn); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3711 |
4617 | 3712 /* XXX - Should call aim_bos_setidle with 0x0000 */ |
3713 | |
4664 | 3714 if (od->icq) { |
3715 aim_icq_reqofflinemsgs(sess); | |
3716 aim_icq_hideip(sess); | |
3717 } | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3718 |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3719 aim_reqservice(sess, fr->conn, AIM_CONN_TYPE_CHATNAV); |
4102 | 3720 if (sess->authinfo->email) |
3721 aim_reqservice(sess, fr->conn, AIM_CONN_TYPE_EMAIL); | |
2086 | 3722 |
3723 return 1; | |
3724 } | |
3725 | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3726 static int gaim_offlinemsg(aim_session_t *sess, aim_frame_t *fr, ...) { |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3727 va_list ap; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3728 struct aim_icq_offlinemsg *msg; |
4075 | 3729 struct aim_incomingim_ch4_args args; |
3730 time_t t; | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3731 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3732 va_start(ap, fr); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3733 msg = va_arg(ap, struct aim_icq_offlinemsg *); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3734 va_end(ap); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3735 |
4075 | 3736 debug_printf("Received offline message. Converting to channel 4 ICBM...\n"); |
3737 args.uin = msg->sender; | |
3738 args.type = msg->type; | |
4173 | 3739 args.flags = msg->flags; |
4076 | 3740 args.msglen = msg->msglen; |
4075 | 3741 args.msg = msg->msg; |
3742 t = get_time(msg->year, msg->month, msg->day, msg->hour, msg->minute, 0); | |
3743 incomingim_chan4(sess, fr->conn, NULL, &args, t); | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3744 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3745 return 1; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3746 } |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3747 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3748 static int gaim_offlinemsgdone(aim_session_t *sess, aim_frame_t *fr, ...) |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3749 { |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3750 aim_icq_ackofflinemsgs(sess); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3751 return 1; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3752 } |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3753 |
4624 | 3754 static int gaim_icqinfo(aim_session_t *sess, aim_frame_t *fr, ...) |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3755 { |
2773
a0fd8f91e294
[gaim-migrate @ 2786]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2768
diff
changeset
|
3756 struct gaim_connection *gc = sess->aux_data; |
4819 | 3757 gchar *buf, *tmp, *utf8; |
4624 | 3758 gchar who[16]; |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3759 va_list ap; |
4151 | 3760 struct aim_icq_info *info; |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3761 |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3762 va_start(ap, fr); |
4151 | 3763 info = va_arg(ap, struct aim_icq_info *); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3764 va_end(ap); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3765 |
4664 | 3766 if (!info->uin) |
3767 return 0; | |
3768 | |
4151 | 3769 g_snprintf(who, sizeof(who), "%lu", info->uin); |
4819 | 3770 buf = g_strdup_printf(_("<b>UIN:</b> %s"), who); |
3771 if (info->nick && info->nick[0] && (utf8 = gaim_try_conv_to_utf8(info->nick))) { | |
3772 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Nick:"), "</b> ", utf8, NULL); g_free(tmp); g_free(utf8); | |
3773 } | |
3774 if (info->first && info->first[0] && (utf8 = gaim_try_conv_to_utf8(info->first))) { | |
3775 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("First Name:"), "</b> ", utf8, NULL); g_free(tmp); g_free(utf8); | |
3776 } | |
3777 if (info->last && info->last[0] && (utf8 = gaim_try_conv_to_utf8(info->last))) { | |
3778 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Last Name:"), "</b> ", utf8, NULL); g_free(tmp); g_free(utf8); | |
3779 } | |
3780 if (info->email && info->email[0] && (utf8 = gaim_try_conv_to_utf8(info->email))) { | |
3781 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Email Address:"), "</b> <a href=\"mailto:", utf8, "\">", utf8, "</a>", NULL); g_free(tmp); g_free(utf8); | |
4625 | 3782 } |
3783 if (info->numaddresses && info->email2) { | |
3784 int i; | |
3785 for (i = 0; i < info->numaddresses; i++) { | |
4819 | 3786 if (info->email2[i] && info->email2[i][0] && (utf8 = gaim_try_conv_to_utf8(info->email2[i]))) { |
3787 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Email Address:"), "</b> <a href=\"mailto:", utf8, "\">", utf8, "</a>", NULL); g_free(tmp); g_free(utf8); | |
4643 | 3788 } |
4625 | 3789 } |
4624 | 3790 } |
4819 | 3791 if (info->mobile && info->mobile[0] && (utf8 = gaim_try_conv_to_utf8(info->mobile))) { |
3792 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Mobile Phone:"), "</b> ", utf8, NULL); g_free(tmp); g_free(utf8); | |
4625 | 3793 } |
3794 if (info->gender) { | |
4819 | 3795 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Gender:"), "</b> ", info->gender==1 ? _("Female") : _("Male"), NULL); g_free(tmp); |
4151 | 3796 } |
4624 | 3797 if (info->birthyear || info->birthmonth || info->birthday) { |
4627 | 3798 char date[30]; |
3799 struct tm tm; | |
3800 tm.tm_mday = (int)info->birthday; | |
3801 tm.tm_mon = (int)info->birthmonth-1; | |
3802 tm.tm_year = (int)info->birthyear-1900; | |
4628 | 3803 strftime(date, sizeof(date), "%x", &tm); |
4819 | 3804 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Birthday:"), "</b> ", date, NULL); g_free(tmp); |
4151 | 3805 } |
4624 | 3806 if (info->age) { |
3807 char age[5]; | |
3808 snprintf(age, sizeof(age), "%hhd", info->age); | |
4819 | 3809 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Age:"), "</b> ", age, NULL); g_free(tmp); |
3810 } | |
3811 if (info->personalwebpage && info->personalwebpage[0] && (utf8 = gaim_try_conv_to_utf8(info->personalwebpage))) { | |
3812 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Personal Web Page:"), "</b> <a href=\"", utf8, "\">", utf8, "</a>", NULL); g_free(tmp); g_free(utf8); | |
3813 } | |
3814 if (info->info && info->info[0] && (utf8 = gaim_try_conv_to_utf8(info->info))) { | |
3815 tmp = buf; buf = g_strconcat(tmp, "<hr><b>", _("Additional Information:"), "</b><br>", utf8, NULL); g_free(tmp); g_free(utf8); | |
4624 | 3816 } |
3817 tmp = buf; buf = g_strconcat(tmp, "<hr>\n", NULL); g_free(tmp); | |
4641 | 3818 if ((info->homeaddr && (info->homeaddr[0])) || (info->homecity && info->homecity[0]) || (info->homestate && info->homestate[0]) || (info->homezip && info->homezip[0])) { |
4819 | 3819 tmp = buf; buf = g_strconcat(tmp, "<b>", _("Home Address:"), "</b>", NULL); g_free(tmp); |
3820 if (info->homeaddr && info->homeaddr[0] && (utf8 = gaim_try_conv_to_utf8(info->homeaddr))) { | |
3821 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Address:"), "</b> ", utf8, NULL); g_free(tmp); g_free(utf8); | |
4624 | 3822 } |
4819 | 3823 if (info->homecity && info->homecity[0] && (utf8 = gaim_try_conv_to_utf8(info->homecity))) { |
3824 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("City:"), "</b> ", utf8, NULL); g_free(tmp); g_free(utf8); | |
4624 | 3825 } |
4819 | 3826 if (info->homestate && info->homestate[0] && (utf8 = gaim_try_conv_to_utf8(info->homestate))) { |
3827 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("State:"), "</b> ", utf8, NULL); g_free(tmp); g_free(utf8); | |
4624 | 3828 } |
4819 | 3829 if (info->homezip && info->homezip[0] && (utf8 = gaim_try_conv_to_utf8(info->homezip))) { |
3830 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Zip Code:"), "</b> ", utf8, NULL); g_free(tmp); g_free(utf8); | |
4624 | 3831 } |
3832 tmp = buf; buf = g_strconcat(tmp, "\n<hr>\n", NULL); g_free(tmp); | |
4151 | 3833 } |
4641 | 3834 if ((info->workaddr && info->workaddr[0]) || (info->workcity && info->workcity[0]) || (info->workstate && info->workstate[0]) || (info->workzip && info->workzip[0])) { |
4819 | 3835 tmp = buf; buf = g_strconcat(tmp, "<b>", _("Work Address:"), "</b>", NULL); g_free(tmp); |
3836 if (info->workaddr && info->workaddr[0] && (utf8 = gaim_try_conv_to_utf8(info->workaddr))) { | |
3837 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Address:"), "</b> ", utf8, NULL); g_free(tmp); g_free(utf8); | |
4624 | 3838 } |
4819 | 3839 if (info->workcity && info->workcity[0] && (utf8 = gaim_try_conv_to_utf8(info->workcity))) { |
3840 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("City:"), "</b> ", utf8, NULL); g_free(tmp); g_free(utf8); | |
4624 | 3841 } |
4819 | 3842 if (info->workstate && info->workstate[0] && (utf8 = gaim_try_conv_to_utf8(info->workstate))) { |
3843 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("State:"), "</b> ", utf8, NULL); g_free(tmp); g_free(utf8); | |
4624 | 3844 } |
4819 | 3845 if (info->workzip && info->workzip[0] && (utf8 = gaim_try_conv_to_utf8(info->workzip))) { |
3846 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Zip Code:"), "</b> ", utf8, NULL); g_free(tmp); g_free(utf8); | |
4624 | 3847 } |
3848 tmp = buf; buf = g_strconcat(tmp, "\n<hr>\n", NULL); g_free(tmp); | |
3849 } | |
4641 | 3850 if ((info->workcompany && info->workcompany[0]) || (info->workdivision && info->workdivision[0]) || (info->workposition && info->workposition[0]) || (info->workwebpage && info->workwebpage[0])) { |
4819 | 3851 tmp = buf; buf = g_strconcat(tmp, "<b>", _("Work Information:"), "</b>", NULL); g_free(tmp); |
3852 if (info->workcompany && info->workcompany[0] && (utf8 = gaim_try_conv_to_utf8(info->workcompany))) { | |
3853 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Company:"), "</b> ", utf8, NULL); g_free(tmp); g_free(utf8); | |
4624 | 3854 } |
4819 | 3855 if (info->workdivision && info->workdivision[0] && (utf8 = gaim_try_conv_to_utf8(info->workdivision))) { |
3856 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Division:"), "</b> ", utf8, NULL); g_free(tmp); g_free(utf8); | |
4624 | 3857 } |
4819 | 3858 if (info->workposition && info->workposition[0] && (utf8 = gaim_try_conv_to_utf8(info->workposition))) { |
3859 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Position:"), "</b> ", utf8, NULL); g_free(tmp); g_free(utf8); | |
4624 | 3860 } |
4819 | 3861 if (info->workwebpage && info->workwebpage[0] && (utf8 = gaim_try_conv_to_utf8(info->workwebpage))) { |
3862 tmp = buf; buf = g_strconcat(tmp, "\n<br><b>", _("Web Page:"), "</b> <a href=\"", utf8, "\">", utf8, "</a>", NULL); g_free(tmp); g_free(utf8); | |
4624 | 3863 } |
3864 tmp = buf; buf = g_strconcat(tmp, "\n<hr>\n", NULL); g_free(tmp); | |
4151 | 3865 } |
3866 | |
3867 g_show_info_text(gc, who, 2, buf, NULL); | |
3868 g_free(buf); | |
3869 | |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3870 return 1; |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3871 } |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3872 |
4759 | 3873 static int gaim_icqalias(aim_session_t *sess, aim_frame_t *fr, ...) |
3874 { | |
3875 struct gaim_connection *gc = sess->aux_data; | |
3876 gchar who[16]; | |
3877 struct buddy *b; | |
3878 va_list ap; | |
3879 struct aim_icq_info *info; | |
3880 | |
3881 va_start(ap, fr); | |
3882 info = va_arg(ap, struct aim_icq_info *); | |
3883 va_end(ap); | |
3884 | |
3885 if (info->uin && info->nick && info->nick[0]) { | |
3886 g_snprintf(who, sizeof(who), "%lu", info->uin); | |
3887 serv_got_alias(gc, who, info->nick); | |
3888 if ((b = gaim_find_buddy(gc->account, who))) { | |
3889 gaim_buddy_set_setting(b, "servernick", info->nick); | |
3890 gaim_blist_save(); | |
3891 } | |
3892 } | |
3893 | |
3894 return 1; | |
3895 } | |
3896 | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3897 static int gaim_popup(aim_session_t *sess, aim_frame_t *fr, ...) |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3898 { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3899 char *msg, *url; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3900 fu16_t wid, hei, delay; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3901 va_list ap; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3902 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3903 va_start(ap, fr); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3904 msg = va_arg(ap, char *); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3905 url = va_arg(ap, char *); |
4199 | 3906 wid = (fu16_t) va_arg(ap, int); |
3907 hei = (fu16_t) va_arg(ap, int); | |
3908 delay = (fu16_t) va_arg(ap, int); | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3909 va_end(ap); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3910 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3911 serv_got_popup(msg, url, wid, hei); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3912 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3913 return 1; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3914 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3915 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3916 static int gaim_parse_searchreply(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3917 va_list ap; |
3918 char *address, *SNs; | |
3919 int i, num; | |
3920 char *buf; | |
3921 int at = 0, len; | |
3922 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3923 va_start(ap, fr); |
2086 | 3924 address = va_arg(ap, char *); |
3925 num = va_arg(ap, int); | |
3926 SNs = va_arg(ap, char *); | |
3927 va_end(ap); | |
3928 | |
3929 len = num * (MAXSNLEN + 1) + 1024; | |
3930 buf = g_malloc(len); | |
3931 at += g_snprintf(buf + at, len - at, "<B>%s has the following screen names:</B><BR>", address); | |
3932 for (i = 0; i < num; i++) | |
3933 at += g_snprintf(buf + at, len - at, "%s<BR>", &SNs[i * (MAXSNLEN + 1)]); | |
3212 | 3934 g_show_info_text(NULL, NULL, 2, buf, NULL); |
2086 | 3935 g_free(buf); |
3936 | |
3937 return 1; | |
3938 } | |
3939 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3940 static int gaim_parse_searcherror(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3941 va_list ap; |
3942 char *address; | |
3943 char buf[BUF_LONG]; | |
3944 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3945 va_start(ap, fr); |
2086 | 3946 address = va_arg(ap, char *); |
3947 va_end(ap); | |
3948 | |
3949 g_snprintf(buf, sizeof(buf), "No results found for email address %s", address); | |
3427 | 3950 do_error_dialog(buf, NULL, GAIM_ERROR); |
2086 | 3951 |
3952 return 1; | |
3953 } | |
3954 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3955 static int gaim_account_confirm(aim_session_t *sess, aim_frame_t *fr, ...) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3956 fu16_t status; |
2086 | 3957 va_list ap; |
3958 char msg[256]; | |
3959 struct gaim_connection *gc = sess->aux_data; | |
3960 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3961 va_start(ap, fr); |
4199 | 3962 status = (fu16_t) va_arg(ap, unsigned int); /* status code of confirmation request */ |
2086 | 3963 va_end(ap); |
3964 | |
3965 debug_printf("account confirmation returned status 0x%04x (%s)\n", status, | |
3912 | 3966 status ? "unknown" : "email sent"); |
3967 if (!status) { | |
2086 | 3968 g_snprintf(msg, sizeof(msg), "You should receive an email asking to confirm %s.", |
3969 gc->username); | |
4056 | 3970 do_error_dialog(_("Account Confirmation Requested"), msg, GAIM_INFO); |
2086 | 3971 } |
3972 | |
3973 return 1; | |
3974 } | |
3975 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3976 static int gaim_info_change(aim_session_t *sess, aim_frame_t *fr, ...) { |
3912 | 3977 struct gaim_connection *gc = sess->aux_data; |
2086 | 3978 va_list ap; |
3912 | 3979 fu16_t perms, err; |
3980 char *url, *sn, *email; | |
3981 int change; | |
2086 | 3982 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3983 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3984 change = va_arg(ap, int); |
4199 | 3985 perms = (fu16_t) va_arg(ap, unsigned int); |
3986 err = (fu16_t) va_arg(ap, unsigned int); | |
3912 | 3987 url = va_arg(ap, char *); |
3988 sn = va_arg(ap, char *); | |
3989 email = va_arg(ap, char *); | |
2086 | 3990 va_end(ap); |
3991 | |
3912 | 3992 debug_printf("account info: because of %s, perms=0x%04x, err=0x%04x, url=%s, sn=%s, email=%s\n", |
3993 change ? "change" : "request", perms, err, url, sn, email); | |
3994 | |
3995 if (err && url) { | |
3996 char *dialog_msg; | |
3997 char *dialog_top = g_strdup_printf(_("Error Changing Account Info")); | |
3998 switch (err) { | |
3999 case 0x0001: { | |
4000 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name differs from the original."), err); | |
4001 } break; | |
4002 case 0x0006: { | |
4003 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name ends in a space."), err); | |
4004 } break; | |
4005 case 0x000b: { | |
4006 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name is too long."), err); | |
4007 } break; | |
4008 case 0x001d: { | |
4009 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to change email address because there is already a request pending for this screen name."), err); | |
4010 } break; | |
4011 case 0x0021: { | |
4012 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to change email address because the given address has too many screen names associated with it."), err); | |
4013 } break; | |
4014 case 0x0023: { | |
4015 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to change email address because the given address is invalid."), err); | |
4016 } break; | |
4017 default: { | |
4018 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unknown error."), err); | |
4019 } break; | |
4020 } | |
4021 do_error_dialog(dialog_top, dialog_msg, GAIM_ERROR); | |
4022 g_free(dialog_top); | |
4023 g_free(dialog_msg); | |
4024 return 1; | |
4025 } | |
4026 | |
4027 if (sn) { | |
4585 | 4028 char *dialog_msg = g_strdup_printf(_("Your screen name is currently formatted as follows:\n%s"), sn); |
4056 | 4029 do_error_dialog(_("Account Info"), dialog_msg, GAIM_INFO); |
3912 | 4030 g_free(dialog_msg); |
4031 } | |
4032 | |
4033 if (email) { | |
4034 char *dialog_msg = g_strdup_printf(_("The email address for %s is %s"), gc->username, email); | |
4056 | 4035 do_error_dialog(_("Account Info"), dialog_msg, GAIM_INFO); |
3912 | 4036 g_free(dialog_msg); |
2086 | 4037 } |
4038 | |
4039 return 1; | |
4040 } | |
4041 | |
4042 static void oscar_keepalive(struct gaim_connection *gc) { | |
4617 | 4043 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
4044 aim_flap_nop(od->sess, od->conn); | |
2086 | 4045 } |
4046 | |
3001 | 4047 static int oscar_send_typing(struct gaim_connection *gc, char *name, int typing) { |
4617 | 4048 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
4049 struct direct_im *dim = find_direct_im(od, name); | |
3595 | 4050 if (dim) |
4617 | 4051 aim_odc_send_typing(od->sess, dim->conn, typing); |
3595 | 4052 else { |
4738 | 4053 struct buddyinfo *bi = g_hash_table_lookup(od->buddyinfo, normalize(name)); |
4054 if (bi && bi->typingnot) { | |
3596 | 4055 if (typing == TYPING) |
4617 | 4056 aim_im_sendmtn(od->sess, 0x0001, name, 0x0002); |
3596 | 4057 else if (typing == TYPED) |
4617 | 4058 aim_im_sendmtn(od->sess, 0x0001, name, 0x0001); |
3595 | 4059 else |
4617 | 4060 aim_im_sendmtn(od->sess, 0x0001, name, 0x0000); |
3595 | 4061 } |
4062 } | |
2993 | 4063 return 0; |
4064 } | |
3048 | 4065 static void oscar_ask_direct_im(struct gaim_connection *gc, char *name); |
2993 | 4066 |
3033 | 4067 static int oscar_send_im(struct gaim_connection *gc, char *name, char *message, int len, int imflags) { |
4617 | 4068 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
4069 struct direct_im *dim = find_direct_im(od, name); | |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
4070 int ret = 0; |
3659 | 4071 GError *err = NULL; |
3458 | 4072 |
2086 | 4073 if (dim) { |
3009 | 4074 if (dim->connected) { /* If we're not connected yet, send through server */ |
4617 | 4075 /* XXX - The last parameter below is the encoding. Let Paco-Paco do something with it. */ |
4076 ret = aim_odc_send_im(od->sess, dim->conn, message, len == -1 ? strlen(message) : len, 0); | |
3009 | 4077 if (ret == 0) |
4078 return 1; | |
4079 else return ret; | |
4080 } | |
3008 | 4081 debug_printf("Direct IM pending, but not connected; sending through server\n"); |
3044 | 4082 } else if (len != -1) { |
4083 /* Trying to send an IM image outside of a direct connection. */ | |
4084 oscar_ask_direct_im(gc, name); | |
4085 return -ENOTCONN; | |
4086 } | |
4738 | 4087 |
3008 | 4088 if (imflags & IM_FLAG_AWAY) { |
4617 | 4089 ret = aim_im_sendch1(od->sess, name, AIM_IMFLAGS_AWAY, message); |
2086 | 4090 } else { |
4738 | 4091 struct buddyinfo *bi; |
3008 | 4092 struct aim_sendimext_args args; |
4093 struct stat st; | |
4151 | 4094 int len; |
4269 | 4095 |
4738 | 4096 bi = g_hash_table_lookup(od->buddyinfo, normalize(name)); |
4097 if (!bi) { | |
4098 bi = g_new0(struct buddyinfo, 1); | |
4099 g_hash_table_insert(od->buddyinfo, g_strdup(normalize(name)), bi); | |
4100 } | |
4101 | |
3008 | 4102 args.flags = AIM_IMFLAGS_ACK | AIM_IMFLAGS_CUSTOMFEATURES; |
4665 | 4103 if (od->icq) { |
4104 args.features = features_icq; | |
4105 args.featureslen = sizeof(features_icq); | |
3008 | 4106 args.flags |= AIM_IMFLAGS_OFFLINE; |
4665 | 4107 } else { |
4108 args.features = features_aim; | |
4109 args.featureslen = sizeof(features_aim); | |
4110 } | |
4269 | 4111 |
4738 | 4112 if (bi->ico_need) { |
4113 debug_printf("Sending buddy icon request with message\n"); | |
3008 | 4114 args.flags |= AIM_IMFLAGS_BUDDYREQ; |
4738 | 4115 bi->ico_need = FALSE; |
3008 | 4116 } |
4269 | 4117 |
4491 | 4118 if (gc->account->iconfile[0] && !stat(gc->account->iconfile, &st)) { |
4119 FILE *file = fopen(gc->account->iconfile, "r"); | |
3008 | 4120 if (file) { |
4121 char *buf = g_malloc(st.st_size); | |
4122 fread(buf, 1, st.st_size, file); | |
4269 | 4123 |
3008 | 4124 args.iconlen = st.st_size; |
4617 | 4125 args.iconsum = aimutil_iconsum(buf, st.st_size); |
3008 | 4126 args.iconstamp = st.st_mtime; |
4127 | |
4738 | 4128 if ((args.iconlen != bi->ico_me_len) || (args.iconsum != bi->ico_me_csum) || (args.iconstamp != bi->ico_me_time)) |
4129 bi->ico_informed = FALSE; | |
4130 | |
4131 if (!bi->ico_informed) { | |
4132 debug_printf("Claiming to have a buddy icon\n"); | |
4133 args.flags |= AIM_IMFLAGS_HASICON; | |
4134 bi->ico_me_len = args.iconlen; | |
4135 bi->ico_me_csum = args.iconsum; | |
4136 bi->ico_me_time = args.iconstamp; | |
4137 bi->ico_informed = TRUE; | |
4138 } | |
4139 | |
3008 | 4140 |
4141 fclose(file); | |
4142 g_free(buf); | |
2086 | 4143 } |
4144 } | |
4269 | 4145 |
3008 | 4146 args.destsn = name; |
4269 | 4147 |
3642 | 4148 len = strlen(message); |
4151 | 4149 args.flags |= check_encoding(message); |
3642 | 4150 if (args.flags & AIM_IMFLAGS_UNICODE) { |
4194 | 4151 debug_printf("Sending Unicode IM\n"); |
4662 | 4152 args.charset = 0x0002; |
4665 | 4153 args.charsubset = 0x0000; |
3659 | 4154 args.msg = g_convert(message, len, "UCS-2BE", "UTF-8", NULL, &len, &err); |
4155 if (err) { | |
4156 debug_printf("Error converting a unicode message: %s\n", err->message); | |
4157 debug_printf("This really shouldn't happen!\n"); | |
4158 /* We really shouldn't try to send the | |
4159 * IM now, but I'm not sure what to do */ | |
4800 | 4160 g_error_free(err); |
3659 | 4161 } |
3850 | 4162 } else if (args.flags & AIM_IMFLAGS_ISO_8859_1) { |
4194 | 4163 debug_printf("Sending ISO-8859-1 IM\n"); |
4662 | 4164 args.charset = 0x0003; |
4665 | 4165 args.charsubset = 0x0000; |
3659 | 4166 args.msg = g_convert(message, len, "ISO-8859-1", "UTF-8", NULL, &len, &err); |
4167 if (err) { | |
4168 debug_printf("conversion error: %s\n", err->message); | |
3642 | 4169 debug_printf("Someone tell Ethan his 8859-1 detection is wrong\n"); |
4170 args.flags ^= AIM_IMFLAGS_ISO_8859_1 | AIM_IMFLAGS_UNICODE; | |
4171 len = strlen(message); | |
4800 | 4172 g_error_free(err); |
3659 | 4173 args.msg = g_convert(message, len, "UCS-2BE", "UTF8", NULL, &len, &err); |
4174 if (err) { | |
4194 | 4175 debug_printf("Error in unicode fallback: %s\n", err->message); |
4800 | 4176 g_error_free(err); |
3659 | 4177 } |
3642 | 4178 } |
4179 } else { | |
4662 | 4180 args.charset = 0x0000; |
4181 args.charsubset = 0x0000; | |
3642 | 4182 args.msg = message; |
4183 } | |
4184 args.msglen = len; | |
4269 | 4185 |
4617 | 4186 ret = aim_im_sendch1_ext(od->sess, &args); |
2086 | 4187 } |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
4188 if (ret >= 0) |
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
4189 return 1; |
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
4190 return ret; |
2086 | 4191 } |
4192 | |
4193 static void oscar_get_info(struct gaim_connection *g, char *name) { | |
4617 | 4194 struct oscar_data *od = (struct oscar_data *)g->proto_data; |
4195 if (od->icq) | |
4624 | 4196 aim_icq_getallinfo(od->sess, name); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
4197 else |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4198 /* people want the away message on the top, so we get the away message |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4199 * first and then get the regular info, since it's too difficult to |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4200 * insert in the middle. i hate people. */ |
4617 | 4201 aim_getinfo(od->sess, od->conn, name, AIM_GETINFO_AWAYMESSAGE); |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4202 } |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4203 |
3212 | 4204 static void oscar_get_away(struct gaim_connection *g, char *who) { |
4617 | 4205 struct oscar_data *od = (struct oscar_data *)g->proto_data; |
4206 if (od->icq) { | |
4687 | 4207 struct buddy *budlight = gaim_find_buddy(g->account, who); |
3212 | 4208 if (budlight) |
3595 | 4209 if ((budlight->uc & 0xffff0000) >> 16) |
4687 | 4210 aim_im_sendch2_geticqaway(od->sess, who, (budlight->uc & 0xffff0000) >> 16); |
3212 | 4211 else |
4212 debug_printf("Error: The user %s has no status message, therefore not requesting.\n", who); | |
4213 else | |
4214 debug_printf("Error: Could not find %s in local contact list, therefore unable to request status message.\n", who); | |
4215 } else | |
4617 | 4216 aim_getinfo(od->sess, od->conn, who, AIM_GETINFO_GENERALINFO); |
2086 | 4217 } |
4218 | |
4617 | 4219 #if 0 |
2920 | 4220 static void oscar_get_caps(struct gaim_connection *g, char *name) { |
4617 | 4221 struct oscar_data *od = (struct oscar_data *)g->proto_data; |
4222 aim_getinfo(od->sess, od->conn, name, AIM_GETINFO_CAPABILITIES); | |
2920 | 4223 } |
4617 | 4224 #endif |
2920 | 4225 |
3466 | 4226 static void oscar_set_dir(struct gaim_connection *g, const char *first, const char *middle, const char *last, |
4227 const char *maiden, const char *city, const char *state, const char *country, int web) { | |
4617 | 4228 /* XXX - some of these things are wrong, but i'm lazy */ |
4229 struct oscar_data *od = (struct oscar_data *)g->proto_data; | |
4230 aim_setdirectoryinfo(od->sess, od->conn, first, middle, last, | |
2086 | 4231 maiden, NULL, NULL, city, state, NULL, 0, web); |
4232 } | |
4233 | |
4234 | |
4235 static void oscar_set_idle(struct gaim_connection *g, int time) { | |
4617 | 4236 struct oscar_data *od = (struct oscar_data *)g->proto_data; |
4237 aim_bos_setidle(od->sess, od->conn, time); | |
2086 | 4238 } |
4239 | |
4240 static void oscar_set_info(struct gaim_connection *g, char *info) { | |
4617 | 4241 struct oscar_data *od = (struct oscar_data *)g->proto_data; |
4151 | 4242 gchar *inforeal, *unicode; |
4243 fu32_t flags; | |
4244 int unicode_len; | |
2993 | 4245 |
4617 | 4246 if (od->rights.maxsiglen == 0) |
3427 | 4247 do_error_dialog(_("Unable to set AIM profile."), |
4248 _("You have probably requested to set your profile before the login procedure completed. " | |
4249 "Your profile remains unset; try setting it again when you are fully connected."), GAIM_ERROR); | |
2993 | 4250 |
4617 | 4251 if (strlen(info) > od->rights.maxsiglen) { |
2993 | 4252 gchar *errstr; |
4253 | |
3427 | 4254 errstr = g_strdup_printf(_("The maximum profile length of %d bytes has been exceeded. " |
4617 | 4255 "Gaim has truncated and set it."), od->rights.maxsiglen); |
3427 | 4256 do_error_dialog("Profile too long.", errstr, GAIM_WARNING); |
2993 | 4257 |
4258 g_free(errstr); | |
4259 } | |
4260 | |
4617 | 4261 inforeal = g_strndup(info, od->rights.maxsiglen); |
4262 | |
4263 if (od->icq) | |
4264 aim_bos_setprofile(od->sess, od->conn, NULL, NULL, 0, NULL, NULL, 0, caps_icq); | |
4151 | 4265 else { |
4266 flags = check_encoding(inforeal); | |
4267 | |
4268 if (flags == 0) { | |
4617 | 4269 aim_bos_setprofile(od->sess, od->conn, "us-ascii", inforeal, strlen (inforeal), |
4151 | 4270 NULL, NULL, 0, caps_aim); |
4271 } else { | |
4272 unicode = g_convert (inforeal, strlen(inforeal), "UCS-2BE", "UTF-8", NULL, | |
4273 &unicode_len, NULL); | |
4617 | 4274 aim_bos_setprofile(od->sess, od->conn, "unicode-2-0", unicode, unicode_len, |
4151 | 4275 NULL, NULL, 0, caps_aim); |
4276 g_free(unicode); | |
4277 } | |
4278 } | |
2993 | 4279 g_free(inforeal); |
4280 | |
4281 return; | |
2086 | 4282 } |
4283 | |
2993 | 4284 static void oscar_set_away_aim(struct gaim_connection *gc, struct oscar_data *od, const char *message) |
4285 { | |
4151 | 4286 fu32_t flags; |
4287 char *unicode; | |
4288 int unicode_len; | |
2993 | 4289 |
4290 if (od->rights.maxawaymsglen == 0) | |
3427 | 4291 do_error_dialog(_("Unable to set AIM away message."), |
4292 _("You have probably requested to set your away message before the login procedure completed. " | |
4293 "You remain in a \"present\" state; try setting it again when you are fully connected."), GAIM_ERROR); | |
4294 | |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4295 if (gc->away) { |
2993 | 4296 g_free(gc->away); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4297 gc->away = NULL; |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4298 } |
2993 | 4299 |
4300 if (!message) { | |
4151 | 4301 aim_bos_setprofile(od->sess, od->conn, NULL, NULL, 0, NULL, "", 0, caps_aim); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4302 return; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4303 } |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4304 |
2993 | 4305 if (strlen(message) > od->rights.maxawaymsglen) { |
4306 gchar *errstr; | |
4307 | |
3427 | 4308 errstr = g_strdup_printf(_("The away message length of %d bytes has been exceeded. " |
4309 "Gaim has truncated it and set you away."), od->rights.maxawaymsglen); | |
4310 do_error_dialog("Away message too long.", errstr, GAIM_WARNING); | |
2993 | 4311 g_free(errstr); |
4312 } | |
4313 | |
4314 gc->away = g_strndup(message, od->rights.maxawaymsglen); | |
4151 | 4315 flags = check_encoding(message); |
4316 | |
4317 if (flags == 0) { | |
4318 aim_bos_setprofile(od->sess, od->conn, NULL, NULL, 0, "us-ascii", gc->away, strlen(gc->away), | |
4319 caps_aim); | |
4320 } else { | |
4321 unicode = g_convert(message, strlen(message), "UCS-2BE", "UTF-8", NULL, &unicode_len, NULL); | |
4322 aim_bos_setprofile(od->sess, od->conn, NULL, NULL, 0, "unicode-2-0", unicode, unicode_len, | |
4323 caps_aim); | |
4324 g_free(unicode); | |
4325 } | |
2993 | 4326 |
4327 return; | |
4328 } | |
4329 | |
4330 static void oscar_set_away_icq(struct gaim_connection *gc, struct oscar_data *od, const char *state, const char *message) | |
4331 { | |
4332 | |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4333 if (gc->away) { |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4334 g_free(gc->away); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4335 gc->away = NULL; |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4336 } |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4337 |
4342 | 4338 if (strcmp(state, _("Invisible"))) { |
4491 | 4339 if (aim_ssi_getpermdeny(od->sess->ssi.local) != gc->account->permdeny) |
4340 aim_ssi_setpermdeny(od->sess, od->conn, gc->account->permdeny, | |
4349 | 4341 0xffffffff); |
4491 | 4342 gc->account->permdeny = 4; |
4342 | 4343 } else { |
4344 if (aim_ssi_getpermdeny(od->sess->ssi.local) != 0x03) | |
4345 aim_ssi_setpermdeny(od->sess, od->conn, 0x03, 0xffffffff); | |
4491 | 4346 gc->account->permdeny = 3; |
4342 | 4347 } |
4348 | |
4349 if (!strcmp(state, _("Online"))) | |
2866
6d62d4520460
[gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2865
diff
changeset
|
4350 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_NORMAL); |
4342 | 4351 else if (!strcmp(state, _("Away"))) { |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4352 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_AWAY); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4353 gc->away = g_strdup(""); |
4342 | 4354 } else if (!strcmp(state, _("Do Not Disturb"))) { |
3212 | 4355 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_DND | AIM_ICQ_STATE_BUSY); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4356 gc->away = g_strdup(""); |
4342 | 4357 } else if (!strcmp(state, _("Not Available"))) { |
3101 | 4358 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_OUT | AIM_ICQ_STATE_AWAY); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4359 gc->away = g_strdup(""); |
4342 | 4360 } else if (!strcmp(state, _("Occupied"))) { |
3212 | 4361 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_BUSY); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4362 gc->away = g_strdup(""); |
4342 | 4363 } else if (!strcmp(state, _("Free For Chat"))) { |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4364 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_CHAT); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4365 gc->away = g_strdup(""); |
4342 | 4366 } else if (!strcmp(state, _("Invisible"))) { |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4367 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_INVISIBLE); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4368 gc->away = g_strdup(""); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4369 } else if (!strcmp(state, GAIM_AWAY_CUSTOM)) { |
2998 | 4370 if (message) { |
3101 | 4371 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_OUT | AIM_ICQ_STATE_AWAY); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4102
diff
changeset
|
4372 gc->away = g_strdup(""); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4373 } else { |
2866
6d62d4520460
[gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2865
diff
changeset
|
4374 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_NORMAL); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4375 } |
2086 | 4376 } |
2993 | 4377 |
4378 return; | |
4379 } | |
4380 | |
4381 static void oscar_set_away(struct gaim_connection *gc, char *state, char *message) | |
4382 { | |
4383 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
4384 | |
4385 if (od->icq) | |
4386 oscar_set_away_icq(gc, od, state, message); | |
4387 else | |
4388 oscar_set_away_aim(gc, od, message); | |
4389 | |
4390 return; | |
2086 | 4391 } |
4392 | |
4230 | 4393 static void oscar_warn(struct gaim_connection *gc, char *name, int anon) { |
4617 | 4394 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
4395 aim_im_warn(od->sess, od->conn, name, anon ? AIM_WARN_ANON : 0); | |
2086 | 4396 } |
4397 | |
4230 | 4398 static void oscar_dir_search(struct gaim_connection *gc, const char *first, const char *middle, const char *last, |
3466 | 4399 const char *maiden, const char *city, const char *state, const char *country, const char *email) { |
4617 | 4400 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
2086 | 4401 if (strlen(email)) |
4617 | 4402 aim_usersearch_address(od->sess, od->conn, email); |
2086 | 4403 } |
4404 | |
4230 | 4405 static void oscar_add_buddy(struct gaim_connection *gc, const char *name) { |
4406 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
4407 #ifdef NOSSI | |
4408 aim_add_buddy(od->sess, od->conn, name); | |
4409 #else | |
4410 if ((od->sess->ssi.received_data) && !(aim_ssi_itemlist_exists(od->sess->ssi.local, name))) { | |
4687 | 4411 struct buddy *buddy = gaim_find_buddy(gc->account, name); |
4412 struct group *group = gaim_find_buddys_group(buddy); | |
4230 | 4413 if (buddy && group) { |
4414 debug_printf("ssi: adding buddy %s to group %s\n", name, group->name); | |
4687 | 4415 aim_ssi_addbuddy(od->sess, od->conn, buddy->name, group->name, gaim_get_buddy_alias_only(buddy), NULL, NULL, 0); |
4230 | 4416 } |
4417 } | |
4418 #endif | |
4759 | 4419 if (od->icq) |
4420 aim_icq_getalias(od->sess, name); | |
4230 | 4421 } |
4422 | |
4423 static void oscar_add_buddies(struct gaim_connection *gc, GList *buddies) { | |
4424 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
4425 #ifdef NOSSI | |
4426 char buf[MSG_LEN]; | |
4427 int n=0; | |
4428 while (buddies) { | |
4429 if (n > MSG_LEN - 18) { | |
4430 aim_bos_setbuddylist(od->sess, od->conn, buf); | |
4431 n = 0; | |
3092 | 4432 } |
4230 | 4433 n += g_snprintf(buf + n, sizeof(buf) - n, "%s&", (char *)buddies->data); |
4434 buddies = buddies->next; | |
4435 } | |
4436 aim_bos_setbuddylist(od->sess, od->conn, buf); | |
4437 #else | |
4438 if (od->sess->ssi.received_data) { | |
4439 while (buddies) { | |
4687 | 4440 struct buddy *buddy = gaim_find_buddy(gc->account, (const char *)buddies->data); |
4441 struct group *group = gaim_find_buddys_group(buddy); | |
4230 | 4442 if (buddy && group) { |
4443 debug_printf("ssi: adding buddy %s to group %s\n", (const char *)buddies->data, group->name); | |
4687 | 4444 aim_ssi_addbuddy(od->sess, od->conn, buddy->name, group->name, gaim_get_buddy_alias_only(buddy), NULL, NULL, 0); |
4230 | 4445 } |
4446 buddies = buddies->next; | |
4447 } | |
4448 } | |
4449 #endif | |
4450 } | |
4451 | |
4452 static void oscar_remove_buddy(struct gaim_connection *gc, char *name, char *group) { | |
4453 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
4454 #ifdef NOSSI | |
4455 aim_remove_buddy(od->sess, od->conn, name); | |
4456 #else | |
4457 if (od->sess->ssi.received_data) { | |
4458 debug_printf("ssi: deleting buddy %s from group %s\n", name, group); | |
4459 aim_ssi_delbuddy(od->sess, od->conn, name, group); | |
4460 } | |
4461 #endif | |
4462 } | |
4463 | |
4464 static void oscar_remove_buddies(struct gaim_connection *gc, GList *buddies, const char *group) { | |
4465 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
4466 #ifdef NOSSI | |
4467 GList *cur; | |
4468 for (cur=buddies; cur; cur=cur->next) | |
4469 aim_remove_buddy(od->sess, od->conn, cur->data); | |
4470 #else | |
4471 if (od->sess->ssi.received_data) { | |
3092 | 4472 while (buddies) { |
4230 | 4473 debug_printf("ssi: deleting buddy %s from group %s\n", (char *)buddies->data, group); |
4474 aim_ssi_delbuddy(od->sess, od->conn, buddies->data, group); | |
3092 | 4475 buddies = buddies->next; |
4476 } | |
4230 | 4477 } |
4478 #endif | |
4479 } | |
4480 | |
4481 #ifndef NOSSI | |
4269 | 4482 static void oscar_move_buddy(struct gaim_connection *gc, const char *name, const char *old_group, const char *new_group) { |
4483 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
4303 | 4484 if (od->sess->ssi.received_data && strcmp(old_group, new_group)) { |
4269 | 4485 debug_printf("ssi: moving buddy %s from group %s to group %s\n", name, old_group, new_group); |
4486 aim_ssi_movebuddy(od->sess, od->conn, old_group, new_group, name); | |
4487 } | |
4488 } | |
4489 | |
4490 static void oscar_alias_buddy(struct gaim_connection *gc, const char *name, const char *alias) { | |
4491 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
4492 if (od->sess->ssi.received_data) { | |
4493 char *gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, name); | |
4494 if (gname) { | |
4495 debug_printf("ssi: changing the alias for buddy %s to %s\n", name, alias); | |
4496 aim_ssi_aliasbuddy(od->sess, od->conn, gname, name, alias); | |
4497 } | |
4498 } | |
4499 } | |
4500 | |
4230 | 4501 static void oscar_rename_group(struct gaim_connection *g, const char *old_group, const char *new_group, GList *members) { |
4502 struct oscar_data *od = (struct oscar_data *)g->proto_data; | |
4503 | |
4504 if (od->sess->ssi.received_data) { | |
4505 if (aim_ssi_itemlist_finditem(od->sess->ssi.local, new_group, NULL, AIM_SSI_TYPE_GROUP)) { | |
4506 oscar_remove_buddies(g, members, old_group); | |
4507 oscar_add_buddies(g, members); | |
4508 debug_printf("ssi: moved all buddies from group %s to %s\n", old_group, new_group); | |
4509 } else { | |
4510 aim_ssi_rename_group(od->sess, od->conn, old_group, new_group); | |
4511 debug_printf("ssi: renamed group %s to %s\n", old_group, new_group); | |
2995 | 4512 } |
4513 } | |
4514 } | |
4515 | |
4642 | 4516 static int gaim_ssi_parseerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
4517 struct gaim_connection *gc = sess->aux_data; | |
4518 struct oscar_data *od = gc->proto_data; | |
4519 va_list ap; | |
4520 fu16_t reason; | |
4521 | |
4522 va_start(ap, fr); | |
4523 reason = (fu16_t)va_arg(ap, unsigned int); | |
4524 va_end(ap); | |
4525 | |
4526 debug_printf("ssi: SNAC error %hu\n", reason); | |
4527 | |
4528 if (reason == 0x0005) { | |
4529 do_error_dialog(_("Unable To Retrive Buddy List"), _("Gaim was temporarily unable to retrive your buddy list from the AIM servers. Your buddy list is not lost, and will probably become available in a few hours."), GAIM_ERROR); | |
4530 } | |
4531 | |
4532 /* Activate SSI */ | |
4533 /* Sending the enable causes other people to be able to see you, and you to see them */ | |
4534 /* Make sure your privacy setting/invisibility is set how you want it before this! */ | |
4535 debug_printf("ssi: activating server-stored buddy list\n"); | |
4536 aim_ssi_enable(od->sess); | |
4537 | |
4538 return 1; | |
4539 } | |
4540 | |
2991 | 4541 static int gaim_ssi_parserights(aim_session_t *sess, aim_frame_t *fr, ...) { |
4230 | 4542 struct gaim_connection *gc = sess->aux_data; |
4543 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
4544 int numtypes, i; | |
4545 fu16_t *maxitems; | |
2991 | 4546 va_list ap; |
4547 | |
4548 va_start(ap, fr); | |
4230 | 4549 numtypes = va_arg(ap, int); |
4550 maxitems = va_arg(ap, fu16_t *); | |
2991 | 4551 va_end(ap); |
4552 | |
4230 | 4553 debug_printf("ssi rights:"); |
4554 for (i=0; i<numtypes; i++) | |
4617 | 4555 debug_printf(" max type 0x%04x=%hd,", i, maxitems[i]); |
4317 | 4556 debug_printf("\n"); |
4230 | 4557 |
4558 if (numtypes >= 0) | |
4559 od->rights.maxbuddies = maxitems[0]; | |
4560 if (numtypes >= 1) | |
4561 od->rights.maxgroups = maxitems[1]; | |
4562 if (numtypes >= 2) | |
4563 od->rights.maxpermits = maxitems[2]; | |
4564 if (numtypes >= 3) | |
4565 od->rights.maxdenies = maxitems[3]; | |
2991 | 4566 |
4567 return 1; | |
4568 } | |
4569 | |
4570 static int gaim_ssi_parselist(aim_session_t *sess, aim_frame_t *fr, ...) { | |
4571 struct gaim_connection *gc = sess->aux_data; | |
4230 | 4572 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
2995 | 4573 struct aim_ssi_item *curitem; |
2991 | 4574 int tmp; |
4778 | 4575 gboolean export = FALSE; |
4617 | 4576 /* XXX - use these? |
4230 | 4577 va_list ap; |
4578 | |
4579 va_start(ap, fr); | |
4580 fmtver = (fu16_t)va_arg(ap, int); | |
4581 numitems = (fu16_t)va_arg(ap, int); | |
4582 items = va_arg(ap, struct aim_ssi_item); | |
4583 timestamp = va_arg(ap, fu32_t); | |
4584 va_end(ap); */ | |
2991 | 4585 |
4586 debug_printf("ssi: syncing local list and server list\n"); | |
4587 | |
4588 /* Clean the buddy list */ | |
4779 | 4589 aim_ssi_cleanlist(sess, fr->conn); |
2991 | 4590 |
4591 /* Add from server list to local list */ | |
4230 | 4592 for (curitem=sess->ssi.local; curitem; curitem=curitem->next) { |
2991 | 4593 switch (curitem->type) { |
4230 | 4594 case 0x0000: { /* Buddy */ |
4251 | 4595 if (curitem->name) { |
4292 | 4596 char *gname = aim_ssi_itemlist_findparentname(sess->ssi.local, curitem->name); |
4458 | 4597 char *gname_utf8 = gaim_try_conv_to_utf8(gname); |
4282 | 4598 char *alias = aim_ssi_getalias(sess->ssi.local, gname, curitem->name); |
4458 | 4599 char *alias_utf8 = gaim_try_conv_to_utf8(alias); |
4687 | 4600 struct buddy *buddy = gaim_find_buddy(gc->account, curitem->name); |
4458 | 4601 /* Should gname be freed here? -- elb */ |
4754 | 4602 /* Not with the current code, but that might be cleaner -- med */ |
4458 | 4603 free(alias); |
4282 | 4604 if (buddy) { |
4292 | 4605 /* Get server stored alias */ |
4705 | 4606 if (alias_utf8) { |
4607 g_free(buddy->alias); | |
4608 buddy->alias = g_strdup(alias_utf8); | |
4609 } | |
4282 | 4610 } else { |
4687 | 4611 struct group *g; |
4612 buddy = gaim_buddy_new(gc->account, curitem->name, alias_utf8); | |
4613 | |
4754 | 4614 if (!(g = gaim_find_group(gname_utf8 ? gname_utf8 : _("Orphans")))) { |
4687 | 4615 g = gaim_group_new(gname_utf8 ? gname_utf8 : _("Orphans")); |
4754 | 4616 gaim_blist_add_group(g, NULL); |
4617 } | |
4687 | 4618 |
4251 | 4619 debug_printf("ssi: adding buddy %s to group %s to local list\n", curitem->name, gname); |
4687 | 4620 gaim_blist_add_buddy(buddy, g, NULL); |
4778 | 4621 export = TRUE; |
4251 | 4622 } |
4458 | 4623 free(gname_utf8); |
4624 free(alias_utf8); | |
2991 | 4625 } |
4230 | 4626 } break; |
4627 | |
4628 case 0x0001: { /* Group */ | |
4282 | 4629 /* Shouldn't add empty groups */ |
4230 | 4630 } break; |
4631 | |
4632 case 0x0002: { /* Permit buddy */ | |
2991 | 4633 if (curitem->name) { |
4230 | 4634 /* if (!find_permdeny_by_name(gc->permit, curitem->name)) { AAA */ |
2991 | 4635 GSList *list; |
4491 | 4636 for (list=gc->account->permit; (list && aim_sncmp(curitem->name, list->data)); list=list->next); |
2991 | 4637 if (!list) { |
2995 | 4638 debug_printf("ssi: adding permit buddy %s to local list\n", curitem->name); |
4491 | 4639 gaim_privacy_permit_add(gc->account, curitem->name); |
2991 | 4640 build_allow_list(); |
4778 | 4641 export = TRUE; |
2991 | 4642 } |
4643 } | |
4230 | 4644 } break; |
4645 | |
4646 case 0x0003: { /* Deny buddy */ | |
2991 | 4647 if (curitem->name) { |
4648 GSList *list; | |
4491 | 4649 for (list=gc->account->deny; (list && aim_sncmp(curitem->name, list->data)); list=list->next); |
2991 | 4650 if (!list) { |
2995 | 4651 debug_printf("ssi: adding deny buddy %s to local list\n", curitem->name); |
4491 | 4652 gaim_privacy_deny_add(gc->account, curitem->name); |
2991 | 4653 build_block_list(); |
4778 | 4654 export = TRUE; |
2991 | 4655 } |
4656 } | |
4230 | 4657 } break; |
4658 | |
4659 case 0x0004: { /* Permit/deny setting */ | |
2991 | 4660 if (curitem->data) { |
4661 fu8_t permdeny; | |
4491 | 4662 if ((permdeny = aim_ssi_getpermdeny(sess->ssi.local)) && (permdeny != gc->account->permdeny)) { |
4663 debug_printf("ssi: changing permdeny from %d to %hhu\n", gc->account->permdeny, permdeny); | |
4664 gc->account->permdeny = permdeny; | |
4665 if (od->icq && gc->account->permdeny == 0x03) { | |
4342 | 4666 serv_set_away(gc, "Invisible", ""); |
4667 } | |
4778 | 4668 export = TRUE; |
2991 | 4669 } |
4670 } | |
4230 | 4671 } break; |
4672 | |
4673 case 0x0005: { /* Presence setting */ | |
3109 | 4674 /* We don't want to change Gaim's setting because it applies to all accounts */ |
4230 | 4675 } break; |
2991 | 4676 } /* End of switch on curitem->type */ |
4677 } /* End of for loop */ | |
4230 | 4678 |
4679 /* If changes were made, then flush buddy list to file */ | |
4778 | 4680 if (export) |
4349 | 4681 gaim_blist_save(); |
2991 | 4682 |
4759 | 4683 { /* Add from local list to server list */ |
4684 GaimBlistNode *gnode, *bnode; | |
4685 struct group *group; | |
4686 struct buddy *buddy; | |
4687 struct gaim_buddy_list *blist; | |
3017 | 4688 GSList *cur; |
4689 | |
2991 | 4690 /* Buddies */ |
4759 | 4691 if ((blist = gaim_get_blist())) |
4692 for (gnode = blist->root; gnode; gnode = gnode->next) { | |
4693 group = (struct group *)gnode; | |
4694 for (bnode = gnode->child; bnode; bnode = bnode->next) { | |
4695 buddy = (struct buddy *)bnode; | |
4696 if (buddy->account == gc->account) { | |
4697 gchar *servernick = gaim_buddy_get_setting(buddy, "servernick"); | |
4698 if (servernick) { | |
4699 serv_got_alias(gc, buddy->name, servernick); | |
4700 g_free(servernick); | |
4701 } | |
4702 if (aim_ssi_itemlist_exists(sess->ssi.local, buddy->name)) { | |
4703 /* Store local alias on server */ | |
4704 char *alias = aim_ssi_getalias(sess->ssi.local, group->name, buddy->name); | |
4783 | 4705 if (!alias && buddy->alias && strlen(buddy->alias)) |
4759 | 4706 aim_ssi_aliasbuddy(sess, od->conn, group->name, buddy->name, buddy->alias); |
4707 free(alias); | |
4708 } else { | |
4709 debug_printf("ssi: adding buddy %s from local list to server list\n", buddy->name); | |
4710 aim_ssi_addbuddy(sess, od->conn, buddy->name, group->name, gaim_get_buddy_alias_only(buddy), NULL, NULL, 0); | |
4711 } | |
4349 | 4712 } |
4230 | 4713 } |
4292 | 4714 } |
2991 | 4715 /* Permit list */ |
4491 | 4716 if (gc->account->permit) { |
4717 for (cur=gc->account->permit; cur; cur=cur->next) | |
4230 | 4718 if (!aim_ssi_itemlist_finditem(sess->ssi.local, NULL, cur->data, AIM_SSI_TYPE_PERMIT)) { |
4719 debug_printf("ssi: adding permit %s from local list to server list\n", (char *)cur->data); | |
4292 | 4720 aim_ssi_addpermit(sess, od->conn, cur->data); |
4230 | 4721 } |
2991 | 4722 } |
4723 | |
4724 /* Deny list */ | |
4491 | 4725 if (gc->account->deny) { |
4726 for (cur=gc->account->deny; cur; cur=cur->next) | |
4230 | 4727 if (!aim_ssi_itemlist_finditem(sess->ssi.local, NULL, cur->data, AIM_SSI_TYPE_DENY)) { |
4728 debug_printf("ssi: adding deny %s from local list to server list\n", (char *)cur->data); | |
4292 | 4729 aim_ssi_adddeny(sess, od->conn, cur->data); |
4230 | 4730 } |
2991 | 4731 } |
3109 | 4732 /* Presence settings (idle time visibility) */ |
4230 | 4733 if ((tmp = aim_ssi_getpresence(sess->ssi.local)) != 0xFFFFFFFF) |
3109 | 4734 if (report_idle && !(tmp & 0x400)) |
4735 aim_ssi_setpresence(sess, fr->conn, tmp | 0x400); | |
4778 | 4736 } /* end adding buddies from local list to server list */ |
4737 | |
4738 { /* Check for maximum number of buddies */ | |
4785 | 4739 GaimBlistNode *gnode,*bnode; |
4740 tmp = 0; | |
4741 for(gnode = gaim_get_blist()->root; gnode; gnode = gnode->next) { | |
4742 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
4743 continue; | |
4744 for(bnode = gnode->child; bnode; bnode = bnode->next) { | |
4745 struct buddy *b = (struct buddy *)bnode; | |
4746 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
4747 continue; | |
4491 | 4748 if(b->account == gc->account) |
4349 | 4749 tmp++; |
4750 } | |
3214 | 4751 } |
4770 | 4752 |
4230 | 4753 if (tmp > od->rights.maxbuddies) { |
3210 | 4754 char *dialog_msg = g_strdup_printf(_("The maximum number of buddies allowed in your buddy list is %d, and you have %d." |
4755 " Until you are below the limit, some buddies will not show up as online."), | |
4230 | 4756 od->rights.maxbuddies, tmp); |
4642 | 4757 do_error_dialog(_("Maximum buddy list length exceeded."), dialog_msg, GAIM_WARNING); |
3210 | 4758 g_free(dialog_msg); |
4759 } | |
4778 | 4760 } |
4785 | 4761 |
4342 | 4762 /* Activate SSI */ |
4763 /* Sending the enable causes other people to be able to see you, and you to see them */ | |
4764 /* Make sure your privacy setting/invisibility is set how you want it before this! */ | |
4765 debug_printf("ssi: activating server-stored buddy list\n"); | |
4642 | 4766 aim_ssi_enable(sess); |
4342 | 4767 |
2991 | 4768 return 1; |
2086 | 4769 } |
4230 | 4770 |
4771 static int gaim_ssi_parseack(aim_session_t *sess, aim_frame_t *fr, ...) { | |
4772 struct gaim_connection *gc = sess->aux_data; | |
4773 va_list ap; | |
4774 struct aim_ssi_tmp *retval; | |
4775 | |
4776 va_start(ap, fr); | |
4777 retval = va_arg(ap, struct aim_ssi_tmp *); | |
4778 va_end(ap); | |
4779 | |
4780 while (retval) { | |
4781 debug_printf("ssi: status is 0x%04hx for a 0x%04hx action with name %s\n", retval->ack, retval->action, retval->item ? retval->item->name : "no item"); | |
4782 | |
4783 if (retval->ack != 0xffff) | |
4784 switch (retval->ack) { | |
4785 case 0x0000: { /* added successfully */ | |
4786 } break; | |
4787 | |
4788 case 0x000e: { /* contact requires authorization */ | |
4269 | 4789 if (retval->action == AIM_CB_SSI_ADD) |
4790 gaim_auth_sendrequest(gc, retval->name); | |
4230 | 4791 } break; |
4792 | |
4793 default: { /* La la la */ | |
4794 debug_printf("ssi: Action 0x%04hx was unsuccessful with error 0x%04hx\n", retval->action, retval->ack); | |
4795 /* Should remove buddy from local list and give an error message? */ | |
4796 } break; | |
4797 } | |
4798 | |
4799 retval = retval->next; | |
4800 } | |
4801 | |
4802 return 1; | |
4803 } | |
4804 | |
4805 static int gaim_ssi_authgiven(aim_session_t *sess, aim_frame_t *fr, ...) { | |
4806 struct gaim_connection *gc = sess->aux_data; | |
4807 va_list ap; | |
4808 char *sn, *msg; | |
4236 | 4809 gchar *dialog_msg, *nombre; |
4230 | 4810 struct name_data *data; |
4236 | 4811 struct buddy *buddy; |
4230 | 4812 |
4813 va_start(ap, fr); | |
4814 sn = va_arg(ap, char *); | |
4815 msg = va_arg(ap, char *); | |
4816 va_end(ap); | |
4817 | |
4818 debug_printf("ssi: %s has given you permission to add him to your buddy list\n", sn); | |
4819 | |
4687 | 4820 buddy = gaim_find_buddy(gc->account, sn); |
4821 if (buddy && (gaim_get_buddy_alias_only(buddy))) | |
4822 nombre = g_strdup_printf("%s (%s)", sn, gaim_get_buddy_alias_only(buddy)); | |
4236 | 4823 else |
4824 nombre = g_strdup(sn); | |
4825 | |
4826 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 | 4827 data = g_new(struct name_data, 1); |
4828 data->gc = gc; | |
4829 data->name = g_strdup(sn); | |
4830 data->nick = NULL; | |
4249 | 4831 do_ask_dialog(_("Authorization Given"), dialog_msg, data, _("Yes"), gaim_icq_contactadd, _("No"), gaim_free_name_data, my_protocol->plug ? my_protocol->plug->handle : NULL, FALSE); |
4236 | 4832 |
4230 | 4833 g_free(dialog_msg); |
4236 | 4834 g_free(nombre); |
4230 | 4835 |
4836 return 1; | |
4837 } | |
4838 | |
4839 static int gaim_ssi_authrequest(aim_session_t *sess, aim_frame_t *fr, ...) { | |
4840 struct gaim_connection *gc = sess->aux_data; | |
4841 va_list ap; | |
4842 char *sn, *msg; | |
4236 | 4843 gchar *dialog_msg, *nombre; |
4230 | 4844 struct name_data *data; |
4236 | 4845 struct buddy *buddy; |
4230 | 4846 |
4847 va_start(ap, fr); | |
4848 sn = va_arg(ap, char *); | |
4849 msg = va_arg(ap, char *); | |
4850 va_end(ap); | |
4851 | |
4852 debug_printf("ssi: received authorization request from %s\n", sn); | |
4853 | |
4687 | 4854 buddy = gaim_find_buddy(gc->account, sn); |
4855 if (buddy && (gaim_get_buddy_alias_only(buddy))) | |
4856 nombre = g_strdup_printf("%s (%s)", sn, gaim_get_buddy_alias_only(buddy)); | |
4236 | 4857 else |
4858 nombre = g_strdup(sn); | |
4859 | |
4337 | 4860 dialog_msg = g_strdup_printf(_("The user %s wants to add you to their buddy list for the following reason:\n%s"), nombre, msg ? msg : _("No reason given.")); |
4230 | 4861 data = g_new(struct name_data, 1); |
4862 data->gc = gc; | |
4863 data->name = g_strdup(sn); | |
4864 data->nick = NULL; | |
4337 | 4865 do_ask_dialog(_("Authorization Request"), dialog_msg, data, _("Authorize"), gaim_auth_grant, _("Deny"), gaim_auth_dontgrant_msgprompt, my_protocol->plug ? my_protocol->plug->handle : NULL, FALSE); |
4236 | 4866 |
4230 | 4867 g_free(dialog_msg); |
4236 | 4868 g_free(nombre); |
4230 | 4869 |
4870 return 1; | |
4871 } | |
4872 | |
4873 static int gaim_ssi_authreply(aim_session_t *sess, aim_frame_t *fr, ...) { | |
4236 | 4874 struct gaim_connection *gc = sess->aux_data; |
4230 | 4875 va_list ap; |
4876 char *sn, *msg; | |
4236 | 4877 gchar *dialog_msg, *nombre; |
4230 | 4878 fu8_t reply; |
4236 | 4879 struct buddy *buddy; |
4230 | 4880 |
4881 va_start(ap, fr); | |
4882 sn = va_arg(ap, char *); | |
4883 reply = (fu8_t)va_arg(ap, int); | |
4884 msg = va_arg(ap, char *); | |
4885 va_end(ap); | |
4886 | |
4236 | 4887 debug_printf("ssi: received authorization reply from %s. Reply is 0x%04hhx\n", sn, reply); |
4888 | |
4687 | 4889 buddy = gaim_find_buddy(gc->account, sn); |
4890 if (buddy && (gaim_get_buddy_alias_only(buddy))) | |
4891 nombre = g_strdup_printf("%s (%s)", sn, gaim_get_buddy_alias_only(buddy)); | |
4236 | 4892 else |
4893 nombre = g_strdup(sn); | |
4894 | |
4230 | 4895 if (reply) { |
4896 /* Granted */ | |
4236 | 4897 dialog_msg = g_strdup_printf(_("The user %s has granted your request to add them to your contact list."), nombre); |
4230 | 4898 do_error_dialog(_("Authorization Granted"), dialog_msg, GAIM_INFO); |
4899 } else { | |
4900 /* Denied */ | |
4236 | 4901 dialog_msg = g_strdup_printf(_("The user %s has denied your request to add them to your contact list for the following reason:\n%s"), nombre, msg ? msg : _("No reason given.")); |
4230 | 4902 do_error_dialog(_("Authorization Denied"), dialog_msg, GAIM_INFO); |
4903 } | |
4904 g_free(dialog_msg); | |
4236 | 4905 g_free(nombre); |
4230 | 4906 |
4907 return 1; | |
4908 } | |
4909 | |
4910 static int gaim_ssi_gotadded(aim_session_t *sess, aim_frame_t *fr, ...) { | |
4911 struct gaim_connection *gc = sess->aux_data; | |
4912 va_list ap; | |
4913 char *sn; | |
4236 | 4914 struct buddy *buddy; |
4230 | 4915 |
4916 va_start(ap, fr); | |
4917 sn = va_arg(ap, char *); | |
4918 va_end(ap); | |
4919 | |
4687 | 4920 buddy = gaim_find_buddy(gc->account, sn); |
4230 | 4921 debug_printf("ssi: %s added you to their buddy list\n", sn); |
4687 | 4922 show_got_added(gc, NULL, sn, (buddy ? gaim_get_buddy_alias_only(buddy) : NULL), NULL); |
4230 | 4923 |
4924 return 1; | |
4925 } | |
4269 | 4926 #endif |
2086 | 4927 |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4928 static GList *oscar_chat_info(struct gaim_connection *gc) { |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4929 GList *m = NULL; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4930 struct proto_chat_entry *pce; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4931 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4932 pce = g_new0(struct proto_chat_entry, 1); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4933 pce->label = _("Join what group:"); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4934 m = g_list_append(m, pce); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4935 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4936 pce = g_new0(struct proto_chat_entry, 1); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4937 pce->label = _("Exchange:"); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4938 pce->is_int = TRUE; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4939 pce->min = 4; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4940 pce->max = 20; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4941 m = g_list_append(m, pce); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4942 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4943 return m; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4944 } |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4945 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4946 static void oscar_join_chat(struct gaim_connection *g, GList *data) { |
4617 | 4947 struct oscar_data *od = (struct oscar_data *)g->proto_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4948 aim_conn_t *cur; |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4949 char *name; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4950 int *exchange; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4951 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4952 if (!data || !data->next) |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4953 return; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4954 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4955 name = data->data; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4956 exchange = data->next->data; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4957 |
2086 | 4958 debug_printf("Attempting to join chat room %s.\n", name); |
4617 | 4959 if ((cur = aim_getconn_type(od->sess, AIM_CONN_TYPE_CHATNAV))) { |
2086 | 4960 debug_printf("chatnav exists, creating room\n"); |
4617 | 4961 aim_chatnav_createroom(od->sess, cur, name, *exchange); |
2086 | 4962 } else { |
4963 /* this gets tricky */ | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
4964 struct create_room *cr = g_new0(struct create_room, 1); |
2086 | 4965 debug_printf("chatnav does not exist, opening chatnav\n"); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
4966 cr->exchange = *exchange; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
4967 cr->name = g_strdup(name); |
4617 | 4968 od->create_rooms = g_slist_append(od->create_rooms, cr); |
4969 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_CHATNAV); | |
2086 | 4970 } |
4971 } | |
4972 | |
3466 | 4973 static void oscar_chat_invite(struct gaim_connection *g, int id, const char *message, const char *name) { |
4617 | 4974 struct oscar_data *od = (struct oscar_data *)g->proto_data; |
2086 | 4975 struct chat_connection *ccon = find_oscar_chat(g, id); |
4976 | |
4977 if (!ccon) | |
4978 return; | |
4979 | |
4617 | 4980 aim_chat_invite(od->sess, od->conn, name, message ? message : "", |
2086 | 4981 ccon->exchange, ccon->name, 0x0); |
4982 } | |
4983 | |
4984 static void oscar_chat_leave(struct gaim_connection *g, int id) { | |
4617 | 4985 struct oscar_data *od = g ? (struct oscar_data *)g->proto_data : NULL; |
2086 | 4986 GSList *bcs = g->buddy_chats; |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
4987 struct gaim_conversation *b = NULL; |
2086 | 4988 struct chat_connection *c = NULL; |
4989 int count = 0; | |
4990 | |
4991 while (bcs) { | |
4992 count++; | |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
4993 b = (struct gaim_conversation *)bcs->data; |
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
4994 if (id == gaim_chat_get_id(GAIM_CHAT(b))) |
2086 | 4995 break; |
4996 bcs = bcs->next; | |
4997 b = NULL; | |
4998 } | |
4999 | |
5000 if (!b) | |
5001 return; | |
5002 | |
5003 debug_printf("Attempting to leave room %s (currently in %d rooms)\n", b->name, count); | |
5004 | |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
5005 c = find_oscar_chat(g, gaim_chat_get_id(GAIM_CHAT(b))); |
2086 | 5006 if (c != NULL) { |
4617 | 5007 if (od) |
5008 od->oscar_chats = g_slist_remove(od->oscar_chats, c); | |
2086 | 5009 if (c->inpa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
5010 gaim_input_remove(c->inpa); |
4617 | 5011 if (g && od->sess) |
5012 aim_conn_kill(od->sess, &c->conn); | |
2086 | 5013 g_free(c->name); |
5014 g_free(c->show); | |
5015 g_free(c); | |
5016 } | |
5017 /* we do this because with Oscar it doesn't tell us we left */ | |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
5018 serv_got_chat_left(g, gaim_chat_get_id(GAIM_CHAT(b))); |
2086 | 5019 } |
5020 | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5021 static int oscar_chat_send(struct gaim_connection *g, int id, char *message) { |
4617 | 5022 struct oscar_data *od = (struct oscar_data *)g->proto_data; |
2086 | 5023 GSList *bcs = g->buddy_chats; |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
5024 struct gaim_conversation *b = NULL; |
2086 | 5025 struct chat_connection *c = NULL; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5026 char *buf, *buf2; |
2086 | 5027 int i, j; |
5028 | |
5029 while (bcs) { | |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
5030 b = (struct gaim_conversation *)bcs->data; |
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
5031 if (id == gaim_chat_get_id(GAIM_CHAT(b))) |
2086 | 5032 break; |
5033 bcs = bcs->next; | |
5034 b = NULL; | |
5035 } | |
5036 if (!b) | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5037 return -EINVAL; |
2086 | 5038 |
4617 | 5039 bcs = od->oscar_chats; |
2086 | 5040 while (bcs) { |
5041 c = (struct chat_connection *)bcs->data; | |
5042 if (b == c->cnv) | |
5043 break; | |
5044 bcs = bcs->next; | |
5045 c = NULL; | |
5046 } | |
5047 if (!c) | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5048 return -EINVAL; |
2086 | 5049 |
5050 buf = g_malloc(strlen(message) * 4 + 1); | |
5051 for (i = 0, j = 0; i < strlen(message); i++) { | |
5052 if (message[i] == '\n') { | |
5053 buf[j++] = '<'; | |
5054 buf[j++] = 'B'; | |
5055 buf[j++] = 'R'; | |
5056 buf[j++] = '>'; | |
5057 } else { | |
5058 buf[j++] = message[i]; | |
5059 } | |
5060 } | |
5061 buf[j] = '\0'; | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5062 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5063 if (strlen(buf) > c->maxlen) |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5064 return -E2BIG; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5065 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5066 buf2 = strip_html(buf); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5067 if (strlen(buf2) > c->maxvis) { |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5068 g_free(buf2); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5069 return -E2BIG; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5070 } |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5071 g_free(buf2); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5072 |
4617 | 5073 aim_chat_send_im(od->sess, c->conn, 0, buf, strlen(buf)); |
2086 | 5074 g_free(buf); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
5075 return 0; |
2086 | 5076 } |
5077 | |
4687 | 5078 static const char *oscar_list_icon(struct gaim_account *a, struct buddy *b) { |
4766 | 5079 if (!b || (b && b->name && b->name[0] == '+')) { |
4687 | 5080 if (isdigit(a->username[0])) |
5081 return "icq"; | |
5082 else | |
5083 return "aim"; | |
5084 } | |
5085 | |
5086 if (isdigit(b->name[0])) | |
5087 return "icq"; | |
5088 return "aim"; | |
5089 } | |
5090 | |
4690 | 5091 static void oscar_list_emblems(struct buddy *b, char **se, char **sw, char **nw, char **ne) |
4687 | 5092 { |
5093 char *emblems[4] = {NULL,NULL,NULL,NULL}; | |
5094 int i = 0; | |
5095 | |
4766 | 5096 if (b->name && (b->uc & 0xffff0000) && isdigit(b->name[0])) { |
5097 /* int uc = b->uc >> 16; | |
5098 if (uc & AIM_ICQ_STATE_INVISIBLE) | |
5099 emblems[i++] = "icq_invisible"; | |
5100 else if (uc & AIM_ICQ_STATE_CHAT) | |
5101 emblems[i++] = "icq_chat"; | |
5102 else if (uc & AIM_ICQ_STATE_DND) | |
5103 emblems[i++] = "icq_dnd"; | |
5104 else if (uc & AIM_ICQ_STATE_OUT) | |
5105 emblems[i++] = "icq_out"; | |
5106 else if (uc & AIM_ICQ_STATE_BUSY) | |
5107 emblems[i++] = "icq_busy"; | |
5108 else if (uc & AIM_ICQ_STATE_AWAY) | |
5109 emblems[i++] = "icq_away"; | |
5110 */ | |
5111 if (b->uc & UC_UNAVAILABLE) | |
5112 emblems[i++] = "away"; | |
5113 } else { | |
5114 if (b->uc & UC_UNAVAILABLE) | |
5115 emblems[i++] = "away"; | |
5116 } | |
4687 | 5117 if (b->uc & UC_WIRELESS) |
5118 emblems[i++] = "wireless"; | |
5119 if (b->uc & UC_AOL) | |
5120 emblems[i++] = "aol"; | |
5121 if (b->uc & UC_ADMIN) | |
5122 emblems[i++] = "admin"; | |
5123 if (b->uc & UC_AB && i < 4) | |
5124 emblems[i++] = "activebuddy"; | |
4766 | 5125 /* if (b->uc & UC_UNCONFIRMED && i < 4) |
5126 emblems[i++] = "unconfirmed"; */ | |
4687 | 5127 *se = emblems[0]; |
5128 *sw = emblems[1]; | |
5129 *nw = emblems[2]; | |
5130 *ne = emblems[3]; | |
5131 } | |
5132 | |
3952 | 5133 /* |
4617 | 5134 * We have just established a socket with the other dude, so set up some handlers. |
3952 | 5135 */ |
4617 | 5136 static int gaim_odc_initiate(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 5137 struct gaim_connection *gc = sess->aux_data; |
5138 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
5139 struct gaim_conversation *cnv; |
2086 | 5140 struct direct_im *dim; |
5141 char buf[256]; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5142 char *sn; |
4617 | 5143 va_list ap; |
5144 aim_conn_t *newconn, *listenerconn; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5145 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5146 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5147 newconn = va_arg(ap, aim_conn_t *); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5148 listenerconn = va_arg(ap, aim_conn_t *); |
2086 | 5149 va_end(ap); |
5150 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5151 aim_conn_close(listenerconn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5152 aim_conn_kill(sess, &listenerconn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5153 |
4617 | 5154 sn = g_strdup(aim_odc_getsn(newconn)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5155 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5156 debug_printf("DirectIM: initiate success to %s\n", sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5157 dim = find_direct_im(od, sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5158 |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
5159 if (!(cnv = gaim_find_conversation(sn))) |
4491 | 5160 cnv = gaim_conversation_new(GAIM_CONV_IM, dim->gc->account, sn); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
5161 gaim_input_remove(dim->watcher); |
2086 | 5162 dim->conn = newconn; |
4617 | 5163 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, oscar_callback, dim->conn); |
3008 | 5164 dim->connected = TRUE; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5165 g_snprintf(buf, sizeof buf, _("Direct IM with %s established"), sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5166 g_free(sn); |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
5167 gaim_conversation_write(cnv, NULL, buf, -1, WFLAG_SYSTEM, time(NULL)); |
2086 | 5168 |
4617 | 5169 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, gaim_odc_incoming, 0); |
5170 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, gaim_odc_typing, 0); | |
5171 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER, gaim_update_ui, 0); | |
5172 | |
2993 | 5173 return 1; |
5174 } | |
5175 | |
5176 static int gaim_update_ui(aim_session_t *sess, aim_frame_t *fr, ...) { | |
5177 va_list ap; | |
5178 char *sn; | |
5179 double percent; | |
5180 struct gaim_connection *gc = sess->aux_data; | |
5181 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
5182 struct gaim_conversation *c; |
2993 | 5183 struct direct_im *dim; |
5184 | |
5185 va_start(ap, fr); | |
5186 sn = va_arg(ap, char *); | |
5187 percent = va_arg(ap, double); | |
5188 va_end(ap); | |
5189 | |
2994 | 5190 if (!(dim = find_direct_im(od, sn))) |
5191 return 1; | |
3059 | 5192 if (dim->watcher) { |
5193 gaim_input_remove(dim->watcher); /* Otherwise, the callback will callback */ | |
5194 dim->watcher = 0; | |
5195 } | |
3044 | 5196 while (gtk_events_pending()) |
5197 gtk_main_iteration(); | |
5198 | |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
5199 if ((c = gaim_find_conversation(sn))) |
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4358
diff
changeset
|
5200 gaim_conversation_update_progress(c, percent); |
2993 | 5201 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, |
5202 oscar_callback, dim->conn); | |
2086 | 5203 |
5204 return 1; | |
5205 } | |
5206 | |
4617 | 5207 static int gaim_odc_incoming(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 5208 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5209 char *msg, *sn; |
3952 | 5210 int len, encoding; |
2086 | 5211 struct gaim_connection *gc = sess->aux_data; |
5212 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5213 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5214 sn = va_arg(ap, char *); |
2086 | 5215 msg = va_arg(ap, char *); |
2993 | 5216 len = va_arg(ap, int); |
3952 | 5217 encoding = va_arg(ap, int); |
2086 | 5218 va_end(ap); |
5219 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5220 debug_printf("Got DirectIM message from %s\n", sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5221 |
4617 | 5222 /* XXX - I imagine Paco-Paco will want to do some voodoo with the encoding here */ |
2993 | 5223 serv_got_im(gc, sn, msg, 0, time(NULL), len); |
2086 | 5224 |
5225 return 1; | |
5226 } | |
5227 | |
4617 | 5228 static int gaim_odc_typing(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 5229 va_list ap; |
5230 char *sn; | |
2993 | 5231 int typing; |
5232 struct gaim_connection *gc = sess->aux_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5233 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5234 va_start(ap, fr); |
2086 | 5235 sn = va_arg(ap, char *); |
2993 | 5236 typing = va_arg(ap, int); |
2086 | 5237 va_end(ap); |
5238 | |
2993 | 5239 if (typing) { |
5240 /* I had to leave this. It's just too funny. It reminds me of my sister. */ | |
5241 debug_printf("ohmigod! %s has started typing (DirectIM). He's going to send you a message! *squeal*\n", sn); | |
4342 | 5242 serv_got_typing(gc, sn, 0, TYPING); |
2993 | 5243 } else |
4342 | 5244 serv_got_typing_stopped(gc, sn); |
2086 | 5245 return 1; |
5246 } | |
5247 | |
5248 struct ask_do_dir_im { | |
5249 char *who; | |
5250 struct gaim_connection *gc; | |
5251 }; | |
5252 | |
3730 | 5253 static void oscar_cancel_direct_im(struct ask_do_dir_im *data) { |
2086 | 5254 g_free(data); |
5255 } | |
5256 | |
3730 | 5257 static void oscar_direct_im(struct ask_do_dir_im *data) { |
2086 | 5258 struct gaim_connection *gc = data->gc; |
4244 | 5259 struct oscar_data *od; |
2086 | 5260 struct direct_im *dim; |
5261 | |
4244 | 5262 if (!g_slist_find(connections, gc)) { |
5263 g_free(data); | |
5264 return; | |
5265 } | |
5266 | |
5267 od = (struct oscar_data *)gc->proto_data; | |
5268 | |
2086 | 5269 dim = find_direct_im(od, data->who); |
5270 if (dim) { | |
3008 | 5271 if (!(dim->connected)) { /* We'll free the old, unconnected dim, and start over */ |
5272 od->direct_ims = g_slist_remove(od->direct_ims, dim); | |
5273 gaim_input_remove(dim->watcher); | |
5274 g_free(dim); | |
5275 debug_printf("Gave up on old direct IM, trying again\n"); | |
5276 } else { | |
3427 | 5277 do_error_dialog("DirectIM already open.", NULL, GAIM_ERROR); |
4244 | 5278 g_free(data); |
3008 | 5279 return; |
5280 } | |
2086 | 5281 } |
5282 dim = g_new0(struct direct_im, 1); | |
5283 dim->gc = gc; | |
5284 g_snprintf(dim->name, sizeof dim->name, "%s", data->who); | |
5285 | |
4617 | 5286 dim->conn = aim_odc_initiate(od->sess, data->who); |
2086 | 5287 if (dim->conn != NULL) { |
5288 od->direct_ims = g_slist_append(od->direct_ims, dim); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
5289 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, |
2086 | 5290 oscar_callback, dim->conn); |
4617 | 5291 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIM_ESTABLISHED, |
5292 gaim_odc_initiate, 0); | |
2086 | 5293 } else { |
3427 | 5294 do_error_dialog(_("Unable to open Direct IM"), NULL, GAIM_ERROR); |
2086 | 5295 g_free(dim); |
5296 } | |
4244 | 5297 |
5298 g_free(data); | |
2086 | 5299 } |
5300 | |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
5301 static void oscar_ask_direct_im(struct gaim_connection *gc, gchar *who) { |
2086 | 5302 char buf[BUF_LONG]; |
5303 struct ask_do_dir_im *data = g_new0(struct ask_do_dir_im, 1); | |
5304 data->who = who; | |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
5305 data->gc = gc; |
3730 | 5306 g_snprintf(buf, sizeof(buf), _("You have selected to open a Direct IM connection with %s."), who); |
4249 | 5307 do_ask_dialog(buf, _("Because this reveals your IP address, it may be considered a privacy risk. Do you wish to continue?"), data, _("Connect"), oscar_direct_im, _("Cancel"), oscar_cancel_direct_im, my_protocol->plug ? my_protocol->plug->handle : NULL, FALSE); |
2086 | 5308 } |
5309 | |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
5310 static void oscar_get_away_msg(struct gaim_connection *gc, char *who) { |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
5311 struct oscar_data *od = gc->proto_data; |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
5312 od->evilhack = g_slist_append(od->evilhack, g_strdup(normalize(who))); |
3212 | 5313 if (od->icq) { |
4687 | 5314 struct buddy *budlight = gaim_find_buddy(gc->account, who); |
3212 | 5315 if (budlight) |
4687 | 5316 if ((budlight->uc >> 16) & (AIM_ICQ_STATE_AWAY || AIM_ICQ_STATE_DND || AIM_ICQ_STATE_OUT || AIM_ICQ_STATE_BUSY || AIM_ICQ_STATE_CHAT)) { |
3595 | 5317 char *state_msg = gaim_icq_status((budlight->uc & 0xffff0000) >> 16); |
4344 | 5318 char *dialog_msg = g_strdup_printf(_("<B>UIN:</B> %s<BR><B>Status:</B> %s<HR><I>Remote client does not support sending status messages.</I><BR>"), who, state_msg); |
3212 | 5319 g_show_info_text(gc, who, 2, dialog_msg, NULL); |
5320 free(state_msg); | |
5321 free(dialog_msg); | |
5322 } | |
5323 else { | |
3595 | 5324 char *state_msg = gaim_icq_status((budlight->uc & 0xffff0000) >> 16); |
4344 | 5325 char *dialog_msg = g_strdup_printf(_("<B>UIN:</B> %s<BR><B>Status:</B> %s<HR><I>User has no status message.</I><BR>"), who, state_msg); |
3212 | 5326 g_show_info_text(gc, who, 2, dialog_msg, NULL); |
5327 free(state_msg); | |
5328 free(dialog_msg); | |
5329 } | |
5330 else | |
3427 | 5331 do_error_dialog("Could not find contact in local list, therefore unable to request status message.\n", NULL, GAIM_ERROR); |
3212 | 5332 } else |
5333 oscar_get_info(gc, who); | |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
5334 } |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
5335 |
2086 | 5336 static void oscar_set_permit_deny(struct gaim_connection *gc) { |
5337 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
4230 | 5338 #ifdef NOSSI |
4770 | 5339 GSList *list, *g = gaim_blist_groups(), *g1; |
4230 | 5340 char buf[MAXMSGLEN]; |
5341 int at; | |
5342 | |
4491 | 5343 switch(gc->account->permdeny) { |
4687 | 5344 case 1: |
4230 | 5345 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_DENYADD, gc->username); |
5346 break; | |
5347 case 2: | |
5348 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_PERMITADD, gc->username); | |
5349 break; | |
5350 case 3: | |
4642 | 5351 list = gc->account->permit; |
4230 | 5352 at = 0; |
5353 while (list) { | |
5354 at += g_snprintf(buf + at, sizeof(buf) - at, "%s&", (char *)list->data); | |
5355 list = list->next; | |
5356 } | |
5357 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_PERMITADD, buf); | |
5358 break; | |
5359 case 4: | |
4642 | 5360 list = gc->account->deny; |
4230 | 5361 at = 0; |
5362 while (list) { | |
5363 at += g_snprintf(buf + at, sizeof(buf) - at, "%s&", (char *)list->data); | |
5364 list = list->next; | |
5365 } | |
5366 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_DENYADD, buf); | |
5367 break; | |
5368 case 5: | |
4770 | 5369 g1 = g; |
4230 | 5370 at = 0; |
4770 | 5371 while (g1) { |
5372 list = gaim_blist_members((struct group *)g->data); | |
5373 GSList list1 = list; | |
5374 while (list1) { | |
5375 struct buddy *b = list1->data; | |
4491 | 5376 if(b->account == gc->account) |
4349 | 5377 at += g_snprintf(buf + at, sizeof(buf) - at, "%s&", b->name); |
4770 | 5378 list1 = list1->next; |
2995 | 5379 } |
4770 | 5380 g_slist_free(list); |
5381 g1 = g1->next; | |
4349 | 5382 } |
4770 | 5383 g_slist_free(g); |
4230 | 5384 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_PERMITADD, buf); |
5385 break; | |
5386 default: | |
5387 break; | |
2086 | 5388 } |
4230 | 5389 signoff_blocked(gc); |
5390 #else | |
5391 if (od->sess->ssi.received_data) | |
4491 | 5392 aim_ssi_setpermdeny(od->sess, od->conn, gc->account->permdeny, 0xffffffff); |
4230 | 5393 #endif |
2086 | 5394 } |
5395 | |
4349 | 5396 static void oscar_add_permit(struct gaim_connection *gc, const char *who) { |
4269 | 5397 #ifdef NOSSI |
4491 | 5398 if (gc->account->permdeny == 3) |
4269 | 5399 oscar_set_permit_deny(gc); |
5400 #else | |
2991 | 5401 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
4230 | 5402 debug_printf("ssi: About to add a permit\n"); |
5403 if (od->sess->ssi.received_data) | |
5404 aim_ssi_addpermit(od->sess, od->conn, who); | |
5405 #endif | |
2086 | 5406 } |
5407 | |
4349 | 5408 static void oscar_add_deny(struct gaim_connection *gc, const char *who) { |
4269 | 5409 #ifdef NOSSI |
4491 | 5410 if (gc->account->permdeny == 4) |
4269 | 5411 oscar_set_permit_deny(gc); |
5412 #else | |
2991 | 5413 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
4230 | 5414 debug_printf("ssi: About to add a deny\n"); |
5415 if (od->sess->ssi.received_data) | |
5416 aim_ssi_adddeny(od->sess, od->conn, who); | |
5417 #endif | |
2086 | 5418 } |
5419 | |
4349 | 5420 static void oscar_rem_permit(struct gaim_connection *gc, const char *who) { |
4269 | 5421 #ifdef NOSSI |
4491 | 5422 if (gc->account->permdeny == 3) |
4269 | 5423 oscar_set_permit_deny(gc); |
5424 #else | |
2991 | 5425 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
4230 | 5426 debug_printf("ssi: About to delete a permit\n"); |
5427 if (od->sess->ssi.received_data) | |
5428 aim_ssi_delpermit(od->sess, od->conn, who); | |
5429 #endif | |
2086 | 5430 } |
5431 | |
4349 | 5432 static void oscar_rem_deny(struct gaim_connection *gc, const char *who) { |
4269 | 5433 #ifdef NOSSI |
4491 | 5434 if (gc->account->permdeny == 4) |
4269 | 5435 oscar_set_permit_deny(gc); |
5436 #else | |
2991 | 5437 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
4230 | 5438 debug_printf("ssi: About to delete a deny\n"); |
5439 if (od->sess->ssi.received_data) | |
5440 aim_ssi_deldeny(od->sess, od->conn, who); | |
5441 #endif | |
2086 | 5442 } |
5443 | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
5444 static GList *oscar_away_states(struct gaim_connection *gc) |
2086 | 5445 { |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
5446 struct oscar_data *od = gc->proto_data; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
5447 GList *m = NULL; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
5448 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
5449 if (!od->icq) |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
5450 return g_list_append(m, GAIM_AWAY_CUSTOM); |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
5451 |
4333 | 5452 m = g_list_append(m, _("Online")); |
5453 m = g_list_append(m, _("Away")); | |
5454 m = g_list_append(m, _("Do Not Disturb")); | |
5455 m = g_list_append(m, _("Not Available")); | |
5456 m = g_list_append(m, _("Occupied")); | |
5457 m = g_list_append(m, _("Free For Chat")); | |
5458 m = g_list_append(m, _("Invisible")); | |
5459 | |
5460 return m; | |
5461 } | |
5462 | |
5463 static GList *oscar_buddy_menu(struct gaim_connection *gc, char *who) { | |
5464 struct oscar_data *od = gc->proto_data; | |
5465 GList *m = NULL; | |
5466 struct proto_buddy_menu *pbm; | |
5467 | |
5468 if (od->icq) { | |
4624 | 5469 #if 0 |
4333 | 5470 pbm = g_new0(struct proto_buddy_menu, 1); |
5471 pbm->label = _("Get Status Msg"); | |
5472 pbm->callback = oscar_get_away_msg; | |
5473 pbm->gc = gc; | |
5474 m = g_list_append(m, pbm); | |
4624 | 5475 #endif |
4333 | 5476 } else { |
4687 | 5477 struct buddy *b = gaim_find_buddy(gc->account, who); |
4356 | 5478 |
5479 if (!b || (b->uc & UC_UNAVAILABLE)) { | |
5480 pbm = g_new0(struct proto_buddy_menu, 1); | |
5481 pbm->label = _("Get Away Msg"); | |
5482 pbm->callback = oscar_get_away_msg; | |
5483 pbm->gc = gc; | |
5484 m = g_list_append(m, pbm); | |
5485 } | |
4333 | 5486 |
5487 if (aim_sncmp(gc->username, who)) { | |
5488 pbm = g_new0(struct proto_buddy_menu, 1); | |
5489 pbm->label = _("Direct IM"); | |
5490 pbm->callback = oscar_ask_direct_im; | |
5491 pbm->gc = gc; | |
5492 m = g_list_append(m, pbm); | |
4650 | 5493 |
4333 | 5494 pbm = g_new0(struct proto_buddy_menu, 1); |
5495 pbm->label = _("Send File"); | |
4617 | 5496 pbm->callback = oscar_ask_sendfile; |
4333 | 5497 pbm->gc = gc; |
5498 m = g_list_append(m, pbm); | |
5499 } | |
5500 } | |
5501 | |
4617 | 5502 #if 0 |
4333 | 5503 pbm = g_new0(struct proto_buddy_menu, 1); |
5504 pbm->label = _("Get Capabilities"); | |
5505 pbm->callback = oscar_get_caps; | |
5506 pbm->gc = gc; | |
5507 m = g_list_append(m, pbm); | |
4617 | 5508 #endif |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
5509 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
5510 return m; |
2086 | 5511 } |
5512 | |
4333 | 5513 static GList *oscar_edit_buddy_menu(struct gaim_connection *gc, char *who) |
5514 { | |
5515 struct oscar_data *od = gc->proto_data; | |
5516 GList *m = NULL; | |
5517 struct proto_buddy_menu *pbm; | |
5518 | |
5519 if (od->icq) { | |
5520 pbm = g_new0(struct proto_buddy_menu, 1); | |
5521 pbm->label = _("Get Info"); | |
5522 pbm->callback = oscar_get_info; | |
5523 pbm->gc = gc; | |
5524 m = g_list_append(m, pbm); | |
5525 } | |
5526 | |
5527 if (od->sess->ssi.received_data) { | |
5528 char *gname = aim_ssi_itemlist_findparentname(od->sess->ssi.local, who); | |
5529 if (gname && aim_ssi_waitingforauth(od->sess->ssi.local, gname, who)) { | |
5530 pbm = g_new0(struct proto_buddy_menu, 1); | |
5531 pbm->label = _("Re-request Authorization"); | |
5532 pbm->callback = gaim_auth_sendrequest; | |
5533 pbm->gc = gc; | |
5534 m = g_list_append(m, pbm); | |
5535 } | |
5536 } | |
5537 | |
5538 return m; | |
5539 } | |
5540 | |
5541 static void oscar_format_screenname(struct gaim_connection *gc, char *nick) { | |
5542 struct oscar_data *od = gc->proto_data; | |
5543 if (!aim_sncmp(gc->username, nick)) { | |
5544 if (!aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH)) { | |
5545 od->setnick = TRUE; | |
5546 od->newsn = g_strdup(nick); | |
5547 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
5548 } else { | |
5549 aim_admin_setnick(od->sess, aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH), nick); | |
5550 } | |
5551 } else { | |
5552 do_error_dialog(_("The new formatting is invalid."), | |
5553 _("Screenname formatting can change only capitalization and whitespace."), GAIM_ERROR); | |
5554 } | |
5555 } | |
5556 | |
5557 static void oscar_show_format_screenname(struct gaim_connection *gc) | |
5558 { | |
5559 do_prompt_dialog(_("New screenname formatting:"), gc->displayname, gc, oscar_format_screenname, NULL); | |
5560 } | |
5561 | |
5562 static void oscar_confirm_account(struct gaim_connection *gc) | |
5563 { | |
5564 struct oscar_data *od = gc->proto_data; | |
5565 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); | |
5566 | |
5567 if (conn) { | |
5568 aim_admin_reqconfirm(od->sess, conn); | |
5569 } else { | |
5570 od->conf = TRUE; | |
5571 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
5572 } | |
5573 } | |
5574 | |
5575 static void oscar_show_email(struct gaim_connection *gc) | |
5576 { | |
5577 struct oscar_data *od = gc->proto_data; | |
5578 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); | |
5579 | |
5580 if (conn) { | |
5581 aim_admin_getinfo(od->sess, conn, 0x11); | |
5582 } else { | |
5583 od->reqemail = TRUE; | |
5584 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
5585 } | |
5586 } | |
5587 | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5588 static void oscar_change_email(struct gaim_connection *gc, char *email) |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5589 { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5590 struct oscar_data *od = gc->proto_data; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5591 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5592 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5593 if (conn) { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5594 aim_admin_setemail(od->sess, conn, email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5595 } else { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5596 od->setemail = TRUE; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5597 od->email = g_strdup(email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5598 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5599 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5600 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
5601 |
4333 | 5602 static void oscar_show_change_email(struct gaim_connection *gc) |
5603 { | |
5604 do_prompt_dialog(_("Change Address To: "), NULL, gc, oscar_change_email, NULL); | |
5605 } | |
5606 | |
5607 static void oscar_show_awaitingauth(struct gaim_connection *gc) | |
5608 { | |
2979 | 5609 struct oscar_data *od = gc->proto_data; |
4333 | 5610 gchar *nombre, *text, *tmp; |
4785 | 5611 GaimBlistNode *gnode,*bnode; |
4333 | 5612 int num=0; |
5613 | |
5614 text = g_strdup(_("You are awaiting authorization from the following buddies:<BR>")); | |
5615 | |
4785 | 5616 for (gnode = gaim_get_blist()->root; gnode; gnode = gnode->next) { |
5617 struct group *group = (struct group *)gnode; | |
5618 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
5619 continue; | |
5620 for (bnode = gnode->child; bnode; bnode = bnode->next) { | |
5621 struct buddy *buddy = (struct buddy *)bnode; | |
5622 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
5623 continue; | |
4491 | 5624 if (buddy->account == gc->account && aim_ssi_waitingforauth(od->sess->ssi.local, group->name, buddy->name)) { |
4687 | 5625 if (gaim_get_buddy_alias_only(buddy)) |
5626 nombre = g_strdup_printf(" %s (%s)", buddy->name, gaim_get_buddy_alias_only(buddy)); | |
4333 | 5627 else |
4337 | 5628 nombre = g_strdup_printf(" %s", buddy->name); |
4333 | 5629 tmp = g_strdup_printf("%s<BR>%s", text, nombre); |
5630 g_free(text); | |
5631 text = tmp; | |
5632 g_free(nombre); | |
5633 num++; | |
5634 } | |
2979 | 5635 } |
4333 | 5636 } |
5637 | |
5638 if (!num) { | |
5639 tmp = g_strdup_printf("%s<BR>%s", text, _("<i>you are not waiting for authorization</i>")); | |
5640 g_free(text); | |
5641 text = tmp; | |
2979 | 5642 } |
4333 | 5643 |
5644 tmp = g_strdup_printf(_("%s<BR><BR>You can re-request authorization from these buddies by right-clicking on them in the \"Edit Buddies\" pane and selecting \"Re-request authorization.\""), text); | |
5645 g_free(text); | |
5646 text = tmp; | |
5647 g_show_info_text(gc, gc->username, 2, text, NULL); | |
5648 g_free(text); | |
2979 | 5649 } |
5650 | |
4333 | 5651 static void oscar_show_chpassurl(struct gaim_connection *gc) |
5652 { | |
5653 struct oscar_data *od = gc->proto_data; | |
5654 open_url(NULL, od->sess->authinfo->chpassurl); | |
5655 } | |
5656 | |
5657 static GList *oscar_actions(struct gaim_connection *gc) | |
2086 | 5658 { |
5659 struct oscar_data *od = gc->proto_data; | |
4333 | 5660 struct proto_actions_menu *pam; |
5661 GList *m = NULL; | |
5662 | |
5663 pam = g_new0(struct proto_actions_menu, 1); | |
5664 pam->label = _("Set User Info"); | |
5665 pam->callback = show_set_info; | |
5666 pam->gc = gc; | |
5667 m = g_list_append(m, pam); | |
5668 | |
4617 | 5669 if ((od->sess->authinfo->regstatus == 0x0003) || (od->icq)) { |
4333 | 5670 pam = g_new0(struct proto_actions_menu, 1); |
5671 pam->label = _("Change Password"); | |
5672 pam->callback = show_change_passwd; | |
5673 pam->gc = gc; | |
5674 m = g_list_append(m, pam); | |
4617 | 5675 } |
5676 | |
5677 if (od->sess->authinfo->chpassurl) { | |
5678 pam = g_new0(struct proto_actions_menu, 1); | |
5679 pam->label = _("Change Password (URL)"); | |
5680 pam->callback = oscar_show_chpassurl; | |
5681 pam->gc = gc; | |
5682 m = g_list_append(m, pam); | |
5683 } | |
5684 | |
5685 if (od->sess->authinfo->regstatus == 0x0003) { | |
5686 /* AIM actions */ | |
5687 m = g_list_append(m, NULL); | |
4333 | 5688 |
5689 pam = g_new0(struct proto_actions_menu, 1); | |
5690 pam->label = _("Format Screenname"); | |
5691 pam->callback = oscar_show_format_screenname; | |
5692 pam->gc = gc; | |
5693 m = g_list_append(m, pam); | |
5694 | |
5695 pam = g_new0(struct proto_actions_menu, 1); | |
5696 pam->label = _("Confirm Account"); | |
5697 pam->callback = oscar_confirm_account; | |
5698 pam->gc = gc; | |
5699 m = g_list_append(m, pam); | |
5700 | |
5701 pam = g_new0(struct proto_actions_menu, 1); | |
5702 pam->label = _("Display Current Registered Address"); | |
5703 pam->callback = oscar_show_email; | |
5704 pam->gc = gc; | |
5705 m = g_list_append(m, pam); | |
5706 | |
5707 pam = g_new0(struct proto_actions_menu, 1); | |
5708 pam->label = _("Change Current Registered Address"); | |
5709 pam->callback = oscar_show_change_email; | |
5710 pam->gc = gc; | |
5711 m = g_list_append(m, pam); | |
2086 | 5712 } |
4333 | 5713 |
5714 m = g_list_append(m, NULL); | |
5715 | |
5716 pam = g_new0(struct proto_actions_menu, 1); | |
5717 pam->label = _("Show Buddies Awaiting Authorization"); | |
5718 pam->callback = oscar_show_awaitingauth; | |
5719 pam->gc = gc; | |
5720 m = g_list_append(m, pam); | |
5721 | |
2086 | 5722 m = g_list_append(m, NULL); |
4333 | 5723 |
5724 pam = g_new0(struct proto_actions_menu, 1); | |
5725 pam->label = _("Search for Buddy by Email"); | |
5726 pam->callback = show_find_email; | |
5727 pam->gc = gc; | |
5728 m = g_list_append(m, pam); | |
5729 | |
4336 | 5730 /* pam = g_new0(struct proto_actions_menu, 1); |
4333 | 5731 pam->label = _("Search for Buddy by Information"); |
5732 pam->callback = show_find_info; | |
5733 pam->gc = gc; | |
4336 | 5734 m = g_list_append(m, pam); */ |
2086 | 5735 |
5736 return m; | |
5737 } | |
5738 | |
3466 | 5739 static void oscar_change_passwd(struct gaim_connection *gc, const char *old, const char *new) |
2086 | 5740 { |
5741 struct oscar_data *od = gc->proto_data; | |
4617 | 5742 |
5743 if (od->icq) { | |
5744 aim_icq_changepasswd(od->sess, new); | |
2086 | 5745 } else { |
4617 | 5746 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); |
5747 if (conn) { | |
5748 aim_admin_changepasswd(od->sess, conn, new, old); | |
5749 } else { | |
5750 od->chpass = TRUE; | |
5751 od->oldp = g_strdup(old); | |
5752 od->newp = g_strdup(new); | |
5753 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
5754 } | |
2086 | 5755 } |
5756 } | |
5757 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5758 static void oscar_convo_closed(struct gaim_connection *gc, char *who) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5759 { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5760 struct oscar_data *od = gc->proto_data; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5761 struct direct_im *dim = find_direct_im(od, who); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5762 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5763 if (!dim) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5764 return; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5765 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5766 od->direct_ims = g_slist_remove(od->direct_ims, dim); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5767 gaim_input_remove(dim->watcher); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5768 aim_conn_kill(od->sess, &dim->conn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5769 g_free(dim); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5770 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5771 |
4151 | 5772 static fu32_t check_encoding(const char *utf8) |
5773 { | |
5774 int i = 0; | |
5775 fu32_t encodingflag = 0; | |
5776 | |
5777 /* Determine how we can send this message. Per the | |
5778 * warnings elsewhere in this file, these little | |
5779 * checks determine the simplest encoding we can use | |
5780 * for a given message send using it. */ | |
5781 while (utf8[i]) { | |
5782 if ((unsigned char)utf8[i] > 0x7f) { | |
5783 /* not ASCII! */ | |
5784 encodingflag = AIM_IMFLAGS_ISO_8859_1; | |
5785 break; | |
5786 } | |
5787 i++; | |
5788 } | |
5789 while (utf8[i]) { | |
5790 /* ISO-8859-1 is 0x00-0xbf in the first byte | |
5791 * followed by 0xc0-0xc3 in the second */ | |
5792 if ((unsigned char)utf8[i] < 0x80) { | |
5793 i++; | |
5794 continue; | |
5795 } else if (((unsigned char)utf8[i] & 0xfc) == 0xc0 && | |
5796 ((unsigned char)utf8[i + 1] & 0xc0) == 0x80) { | |
5797 i += 2; | |
5798 continue; | |
5799 } | |
5800 encodingflag = AIM_IMFLAGS_UNICODE; | |
5801 break; | |
5802 } | |
5803 | |
5804 return encodingflag; | |
5805 } | |
5806 | |
5807 static fu32_t parse_encoding(const char *enc) | |
5808 { | |
5809 char *charset; | |
5810 | |
5811 /* If anything goes wrong, fall back on ASCII and print a message */ | |
4643 | 5812 if (enc == NULL) { |
5813 debug_printf("Encoding was null, that's odd\n"); | |
5814 return 0; | |
5815 } | |
4151 | 5816 charset = strstr(enc, "charset="); |
5817 if (charset == NULL) { | |
5818 debug_printf("No charset specified for info, assuming ASCII\n"); | |
5819 return 0; | |
5820 } | |
5821 charset += 8; | |
4600 | 5822 if (!strcmp(charset, "\"us-ascii\"") || !strcmp(charset, "\"utf-8\"")) { |
5823 /* UTF-8 is our native charset, ASCII is a proper subset */ | |
4151 | 5824 return 0; |
4166 | 5825 } else if (!strcmp(charset, "\"iso-8859-1\"")) { |
5826 return AIM_IMFLAGS_ISO_8859_1; | |
4151 | 5827 } else if (!strcmp(charset, "\"unicode-2-0\"")) { |
5828 return AIM_IMFLAGS_UNICODE; | |
5829 } else { | |
5830 debug_printf("Unrecognized character set '%s', using ASCII\n", charset); | |
5831 return 0; | |
5832 } | |
5833 } | |
3035 | 5834 |
3630 | 5835 G_MODULE_EXPORT void oscar_init(struct prpl *ret) { |
3572 | 5836 struct proto_user_opt *puo; |
2086 | 5837 ret->protocol = PROTO_OSCAR; |
3694 | 5838 ret->options = OPT_PROTO_MAIL_CHECK | OPT_PROTO_BUDDY_ICON | OPT_PROTO_IM_IMAGE; |
3858 | 5839 ret->name = g_strdup("AIM/ICQ"); |
2086 | 5840 ret->list_icon = oscar_list_icon; |
4687 | 5841 ret->list_emblems = oscar_list_emblems; |
2086 | 5842 ret->away_states = oscar_away_states; |
5843 ret->actions = oscar_actions; | |
5844 ret->buddy_menu = oscar_buddy_menu; | |
3456 | 5845 ret->edit_buddy_menu = oscar_edit_buddy_menu; |
2086 | 5846 ret->login = oscar_login; |
5847 ret->close = oscar_close; | |
5848 ret->send_im = oscar_send_im; | |
2993 | 5849 ret->send_typing = oscar_send_typing; |
2086 | 5850 ret->set_info = oscar_set_info; |
5851 ret->get_info = oscar_get_info; | |
5852 ret->set_away = oscar_set_away; | |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
5853 ret->get_away = oscar_get_away; |
2086 | 5854 ret->set_dir = oscar_set_dir; |
5855 ret->get_dir = NULL; /* Oscar really doesn't have this */ | |
5856 ret->dir_search = oscar_dir_search; | |
5857 ret->set_idle = oscar_set_idle; | |
5858 ret->change_passwd = oscar_change_passwd; | |
5859 ret->add_buddy = oscar_add_buddy; | |
5860 ret->add_buddies = oscar_add_buddies; | |
4269 | 5861 ret->remove_buddy = oscar_remove_buddy; |
5862 ret->remove_buddies = oscar_remove_buddies; | |
4230 | 5863 #ifndef NOSSI |
3140 | 5864 ret->group_buddy = oscar_move_buddy; |
4269 | 5865 ret->alias_buddy = oscar_alias_buddy; |
3348 | 5866 ret->rename_group = oscar_rename_group; |
4230 | 5867 #endif |
4269 | 5868 ret->add_permit = oscar_add_permit; |
5869 ret->add_deny = oscar_add_deny; | |
5870 ret->rem_permit = oscar_rem_permit; | |
5871 ret->rem_deny = oscar_rem_deny; | |
5872 ret->set_permit_deny = oscar_set_permit_deny; | |
4508
4c40fccbd7c9
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
5873 |
2086 | 5874 ret->warn = oscar_warn; |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
5875 ret->chat_info = oscar_chat_info; |
2086 | 5876 ret->join_chat = oscar_join_chat; |
5877 ret->chat_invite = oscar_chat_invite; | |
5878 ret->chat_leave = oscar_chat_leave; | |
5879 ret->chat_whisper = NULL; | |
5880 ret->chat_send = oscar_chat_send; | |
5881 ret->keepalive = oscar_keepalive; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
5882 ret->convo_closed = oscar_convo_closed; |
4732 | 5883 ret->tooltip_text = oscar_tooltip_text; |
2086 | 5884 |
3572 | 5885 puo = g_new0(struct proto_user_opt, 1); |
5886 puo->label = g_strdup("Auth Host:"); | |
5887 puo->def = g_strdup("login.oscar.aol.com"); | |
5888 puo->pos = USEROPT_AUTH; | |
5889 ret->user_opts = g_list_append(ret->user_opts, puo); | |
5890 | |
5891 puo = g_new0(struct proto_user_opt, 1); | |
5892 puo->label = g_strdup("Auth Port:"); | |
5893 puo->def = g_strdup("5190"); | |
5894 puo->pos = USEROPT_AUTHPORT; | |
5895 ret->user_opts = g_list_append(ret->user_opts, puo); | |
5896 | |
2086 | 5897 my_protocol = ret; |
5898 } | |
5899 | |
5900 #ifndef STATIC | |
5901 | |
3630 | 5902 G_MODULE_EXPORT void gaim_prpl_init(struct prpl *prpl) |
2086 | 5903 { |
3572 | 5904 oscar_init(prpl); |
5905 prpl->plug->desc.api_version = PLUGIN_API_VERSION; | |
2086 | 5906 } |
5907 | |
5908 #endif |