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