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