Mercurial > pidgin
annotate src/protocols/oscar/oscar.c @ 3952:07283934dedd
[gaim-migrate @ 4133]
Ok, big commit with little functionality change.
Most of it is me shuffling crap around because I'm one of them neat freaks. Lots of general code
cleanup too. I'm trying to move to that whole "one-family-per-file" thing.
The details...
I added libfaim support for aim's new search family, 0x000f. I only tested this briefly, so if
anyone uses it for anything, be aware that it could be buggy. I'll add oscar support sometime.
Advantages of this family are... when you search for someone, you get the directory info for that
person. So like, first name, middle name, last name, maiden name, city, state, country, zip,
address, interests, nickname, and maybe some other stuff. Basically all the info that they've set in
their directory info thing. Info. Oh, and I'm calling it "new search" because seach was already
taken, and cookie monster ate my right brain.
The reason I didn't add support to oscar.c... the new search family requires making a connection to
another server. While moving stuff around I realized that I didn't really like how new connections
are made. It's kind of sloppy. I'm thinking it would be nice to have an outgoing queue for each
type of connection, and then let the client queue messages as much as they want. Then, if libfaim
sees that there is a message for a certain type of connection, and there is no open connection of
that type, it will connect, and then flush the queue when the connection is made. This seems a lot
cleaner, but it also seems like a pain in the ass. I should do ssi for icq first, anyway :-)
Also, I think it would be neat if there was an ICBM file that handled channels 1 through 4. Then
im.c and chat.c could pass the ICBM part to the icbm stuff and it could get parsed there. im.c is
really huge right now.
I applied a patch from Graham Booker that paves the way for unicode in direct IMs. Thanks Graham.
Now we just need Paco-Paco to git a little free time and write a patch for this.
http://sourceforge.net/tracker/index.php?func=detail&aid=633589&group_id=235&atid=300235
I applied 2 patches from Will Mahan dealing with file transfer/oft/rendezous/whatever. Here's some
info on them, from The Man himself:
Patch 1
"Currently the Rendezvous code is rather messy; this
patch attempts to bring it up to speed with the rest of
the Oscar prpl. Its changes include:
* Rewrite several ft.c functions to use bstreams.
Apparently the code in question was written before
bstreams were implemented.
* Handle incoming Rendezvous packets through the
rxqueue like FLAP packets, rather than handling them as
a special case as soon as they are received. This
takes advantage of the bstream cleanup to unify some
code and simplify the aim_frame_t struct.
* Change some names used to try to clarify the
distinction between OFT, which refers specifically to
file transfer, and Rendezvous, which encompasses OFT as
well as other types of client-to-client connections."
Patch 2
"* Add some comments I inadvertently left out of my last patch.
* Fix a double-free that occurs when connections time out.
* Correct a bug causing filenames to be truncated by 4 characters on
some clients.
* Preserve directory structure when sending multiple files.
* Handle (throw away) resource forks sent by Mac clients."
I also changed all indents to tabs in ft.c.
And split all the bstream stuff from rxqueue.c and put it in bstream.c. It really is a separate
thing. Especially since it can be used for outgoing connections.
Also, I was going to look over the whole patch tonight to make sure it's all good, but it's like 6000
lines, so, uh, I'll do it later.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Wed, 13 Nov 2002 07:01:37 +0000 |
parents | e73c48cf1645 |
children | 4f3fb54ee669 |
rev | line source |
---|---|
3453 | 1 |
2086 | 2 /* |
3 * gaim | |
4 * | |
5 * Some code copyright (C) 1998-1999, Mark Spencer <markster@marko.net> | |
6 * libfaim code copyright 1998, 1999 Adam Fritzler <afritz@auk.cx> | |
7 * | |
8 * This program is free software; you can redistribute it and/or modify | |
9 * it under the terms of the GNU General Public License as published by | |
10 * the Free Software Foundation; either version 2 of the License, or | |
11 * (at your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 * GNU General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU General Public License | |
19 * along with this program; if not, write to the Free Software | |
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
21 * | |
22 */ | |
23 | |
24 #ifdef HAVE_CONFIG_H | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
25 #include <config.h> |
2086 | 26 #endif |
27 | |
3664 | 28 #include <sys/types.h> |
29 /*this must happen before sys/socket.h or freebsd won't compile*/ | |
30 | |
3630 | 31 #ifndef _WIN32 |
2086 | 32 #include <netdb.h> |
33 #include <netinet/in.h> | |
34 #include <arpa/inet.h> | |
3630 | 35 #include <sys/socket.h> |
36 #include <unistd.h> | |
37 #endif | |
38 | |
39 #include <errno.h> | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
40 #include <ctype.h> |
2086 | 41 #include <string.h> |
42 #include <stdlib.h> | |
43 #include <stdio.h> | |
44 #include <time.h> | |
45 #include <sys/stat.h> | |
3630 | 46 #include <signal.h> |
47 | |
2086 | 48 #include "multi.h" |
49 #include "prpl.h" | |
50 #include "gaim.h" | |
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 | |
3630 | 87 /* For win32 compatability */ |
88 G_MODULE_IMPORT GSList *connections; | |
89 G_MODULE_IMPORT int report_idle; | |
90 | |
91 static int caps_aim = AIM_CAPS_CHAT | AIM_CAPS_BUDDYICON | | |
92 AIM_CAPS_IMIMAGE | AIM_CAPS_SENDFILE; | |
3458 | 93 |
94 /* Set AIM caps, because Gaim can still do them over ICQ and | |
95 * Winicq doesn't mind. */ | |
96 static int caps_icq = AIM_CAPS_CHAT | AIM_CAPS_BUDDYICON | AIM_CAPS_IMIMAGE; | |
3595 | 97 /* static int caps_icq = AIM_CAPS_ICQ; */ |
98 /* What does AIM_CAPS_ICQ actually mean? -SE */ | |
3458 | 99 |
2308
a90be9567452
[gaim-migrate @ 2318]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2305
diff
changeset
|
100 static fu8_t gaim_features[] = {0x01, 0x01, 0x01, 0x02}; |
2086 | 101 |
102 struct oscar_data { | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
103 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
104 aim_conn_t *conn; |
2086 | 105 |
106 guint cnpa; | |
107 guint paspa; | |
3694 | 108 guint emlpa; |
2086 | 109 |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
110 GSList *create_rooms; |
2086 | 111 |
112 gboolean conf; | |
113 gboolean reqemail; | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
114 gboolean setemail; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
115 char *email; |
2979 | 116 gboolean setnick; |
117 char *newsn; | |
2086 | 118 gboolean chpass; |
119 char *oldp; | |
120 char *newp; | |
121 | |
122 GSList *oscar_chats; | |
123 GSList *direct_ims; | |
3630 | 124 GSList *file_transfers; |
2086 | 125 GSList *hasicons; |
3600 | 126 GHashTable *supports_tn; |
2086 | 127 |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
128 gboolean killme; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
129 gboolean icq; |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
130 GSList *evilhack; |
2993 | 131 |
132 struct { | |
133 guint maxbuddies; /* max users you can watch */ | |
134 guint maxwatchers; /* max users who can watch you */ | |
135 guint maxpermits; /* max users on permit list */ | |
136 guint maxdenies; /* max users on deny list */ | |
137 guint maxsiglen; /* max size (bytes) of profile */ | |
138 guint maxawaymsglen; /* max size (bytes) of posted away message */ | |
139 } rights; | |
2086 | 140 }; |
141 | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
142 struct create_room { |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
143 char *name; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
144 int exchange; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
145 }; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
146 |
2086 | 147 struct chat_connection { |
148 char *name; | |
149 char *show; /* AOL did something funny to us */ | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
150 fu16_t exchange; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
151 fu16_t instance; |
2086 | 152 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
|
153 aim_conn_t *conn; |
2086 | 154 int inpa; |
155 int id; | |
156 struct gaim_connection *gc; /* i hate this. */ | |
157 struct conversation *cnv; /* bah. */ | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
158 int maxlen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
159 int maxvis; |
2086 | 160 }; |
161 | |
162 struct direct_im { | |
163 struct gaim_connection *gc; | |
164 char name[80]; | |
165 int watcher; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
166 aim_conn_t *conn; |
3008 | 167 gboolean connected; |
2086 | 168 }; |
169 | |
170 struct ask_direct { | |
171 struct gaim_connection *gc; | |
172 char *sn; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
173 char ip[64]; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
174 fu8_t cookie[8]; |
2086 | 175 }; |
176 | |
3630 | 177 struct oscar_file_transfer { |
178 enum { OFT_SENDFILE_IN, OFT_SENDFILE_OUT } type; | |
179 aim_conn_t *conn; | |
180 struct file_transfer *xfer; | |
181 char *sn; | |
182 char ip[64]; | |
183 fu16_t port; | |
184 fu8_t cookie[8]; | |
185 int totsize; | |
186 int filesdone; | |
187 int totfiles; | |
188 int watcher; | |
189 }; | |
190 | |
2086 | 191 struct icon_req { |
192 char *user; | |
193 time_t timestamp; | |
2196
016c5307f26b
[gaim-migrate @ 2206]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2194
diff
changeset
|
194 unsigned long length; |
2191
657dbe515608
[gaim-migrate @ 2201]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2172
diff
changeset
|
195 unsigned long checksum; |
2086 | 196 gboolean request; |
197 }; | |
198 | |
3453 | 199 struct channel4_data { |
3141 | 200 struct gaim_connection *gc; |
3453 | 201 gchar *uin; |
202 gchar *nick; | |
3141 | 203 }; |
204 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
205 static struct direct_im *find_direct_im(struct oscar_data *od, const char *who) { |
2086 | 206 GSList *d = od->direct_ims; |
207 char *n = g_strdup(normalize(who)); | |
208 struct direct_im *m = NULL; | |
209 | |
210 while (d) { | |
211 m = (struct direct_im *)d->data; | |
212 if (!strcmp(n, normalize(m->name))) | |
213 break; | |
214 m = NULL; | |
215 d = d->next; | |
216 } | |
217 | |
218 g_free(n); | |
219 return m; | |
220 } | |
221 | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
222 static char *extract_name(const char *name) { |
2086 | 223 char *tmp; |
224 int i, j; | |
225 char *x = strchr(name, '-'); | |
226 if (!x) return NULL; | |
227 x = strchr(++x, '-'); | |
228 if (!x) return NULL; | |
229 tmp = g_strdup(++x); | |
230 | |
231 for (i = 0, j = 0; x[i]; i++) { | |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
232 char hex[3]; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
233 if (x[i] != '%') { |
2086 | 234 tmp[j++] = x[i]; |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
235 continue; |
2086 | 236 } |
2361
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
237 strncpy(hex, x + ++i, 2); hex[2] = 0; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
238 i++; |
554b001d7d98
[gaim-migrate @ 2374]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2357
diff
changeset
|
239 tmp[j++] = strtol(hex, NULL, 16); |
2086 | 240 } |
241 | |
242 tmp[j] = 0; | |
243 return tmp; | |
244 } | |
245 | |
246 static struct chat_connection *find_oscar_chat(struct gaim_connection *gc, int id) { | |
247 GSList *g = ((struct oscar_data *)gc->proto_data)->oscar_chats; | |
248 struct chat_connection *c = NULL; | |
249 | |
250 while (g) { | |
251 c = (struct chat_connection *)g->data; | |
252 if (c->id == id) | |
253 break; | |
254 g = g->next; | |
255 c = NULL; | |
256 } | |
257 | |
258 return c; | |
259 } | |
260 | |
261 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
|
262 aim_conn_t *conn) { |
2086 | 263 GSList *g = ((struct oscar_data *)gc->proto_data)->oscar_chats; |
264 struct chat_connection *c = NULL; | |
265 | |
266 while (g) { | |
267 c = (struct chat_connection *)g->data; | |
268 if (c->conn == conn) | |
269 break; | |
270 g = g->next; | |
271 c = NULL; | |
272 } | |
273 | |
274 return c; | |
275 } | |
276 | |
3630 | 277 /* XXX there must be a better way than this.... -- wtm */ |
278 static struct oscar_file_transfer *find_oft_by_conn(struct gaim_connection *gc, | |
279 aim_conn_t *conn) { | |
280 GSList *g = ((struct oscar_data *)gc->proto_data)->file_transfers; | |
281 struct oscar_file_transfer *f = NULL; | |
282 | |
283 while (g) { | |
284 f = (struct oscar_file_transfer *)g->data; | |
285 if (f->conn == conn) | |
286 break; | |
287 g = g->next; | |
288 f = NULL; | |
289 } | |
290 | |
291 return f; | |
292 } | |
293 | |
294 static struct oscar_file_transfer *find_oft_by_xfer(struct gaim_connection *gc, | |
295 struct file_transfer *xfer) { | |
296 GSList *g = ((struct oscar_data *)gc->proto_data)->file_transfers; | |
297 struct oscar_file_transfer *f = NULL; | |
298 | |
299 while (g) { | |
300 f = (struct oscar_file_transfer *)g->data; | |
301 if (f->xfer == xfer) | |
302 break; | |
303 g = g->next; | |
304 f = NULL; | |
305 } | |
306 | |
307 return f; | |
308 } | |
309 | |
310 static struct oscar_file_transfer *find_oft_by_cookie(struct gaim_connection *gc, | |
311 const char *cookie) { | |
312 GSList *g = ((struct oscar_data *)gc->proto_data)->file_transfers; | |
313 struct oscar_file_transfer *f = NULL; | |
314 | |
315 while (g) { | |
316 f = (struct oscar_file_transfer *)g->data; | |
317 if (!strncmp(f->cookie, cookie, 8)) | |
318 break; | |
319 g = g->next; | |
320 f = NULL; | |
321 } | |
322 | |
323 return f; | |
324 } | |
325 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
326 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
|
327 static int gaim_parse_login (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
328 static int gaim_handle_redirect (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
329 static int gaim_info_change (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
330 static int gaim_account_confirm (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
331 static int gaim_parse_oncoming (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
332 static int gaim_parse_offgoing (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
333 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
|
334 static int gaim_parse_misses (aim_session_t *, aim_frame_t *, ...); |
3212 | 335 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
|
336 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
|
337 static int gaim_parse_motd (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
338 static int gaim_chatnav_info (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
339 static int gaim_chat_join (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
340 static int gaim_chat_leave (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
341 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
|
342 static int gaim_chat_incoming_msg(aim_session_t *, aim_frame_t *, ...); |
3694 | 343 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
|
344 static int gaim_parse_msgack (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
345 static int gaim_parse_ratechange (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
346 static int gaim_parse_evilnotify (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
347 static int gaim_parse_searcherror(aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
348 static int gaim_parse_searchreply(aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
349 static int gaim_bosrights (aim_session_t *, aim_frame_t *, ...); |
3952 | 350 static int conninitdone_admin (aim_session_t *, aim_frame_t *, ...); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
351 static int conninitdone_bos (aim_session_t *, aim_frame_t *, ...); |
3952 | 352 static int conninitdone_chatnav (aim_session_t *, aim_frame_t *, ...); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
353 static int conninitdone_chat (aim_session_t *, aim_frame_t *, ...); |
3694 | 354 static int conninitdone_email (aim_session_t *, aim_frame_t *, ...); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
355 static int gaim_parse_msgerr (aim_session_t *, aim_frame_t *, ...); |
3595 | 356 static int gaim_parse_mtn (aim_session_t *, aim_frame_t *, ...); |
2993 | 357 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
|
358 static int gaim_parse_buddyrights(aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
359 static int gaim_parse_locerr (aim_session_t *, aim_frame_t *, ...); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
360 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
|
361 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
|
362 static int gaim_memrequest (aim_session_t *, aim_frame_t *, ...); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
363 static int gaim_selfinfo (aim_session_t *, aim_frame_t *, ...); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
364 static int gaim_offlinemsg (aim_session_t *, aim_frame_t *, ...); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
365 static int gaim_offlinemsgdone (aim_session_t *, aim_frame_t *, ...); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
366 static int gaim_simpleinfo (aim_session_t *, aim_frame_t *, ...); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
367 static int gaim_popup (aim_session_t *, aim_frame_t *, ...); |
2991 | 368 static int gaim_ssi_parserights (aim_session_t *, aim_frame_t *, ...); |
369 static int gaim_ssi_parselist (aim_session_t *, aim_frame_t *, ...); | |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
370 |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
371 static int gaim_directim_initiate(aim_session_t *, aim_frame_t *, ...); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
372 static int gaim_directim_incoming(aim_session_t *, aim_frame_t *, ...); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
373 static int gaim_directim_typing (aim_session_t *, aim_frame_t *, ...); |
2993 | 374 static int gaim_update_ui (aim_session_t *, aim_frame_t *, ...); |
2086 | 375 |
3630 | 376 static int oscar_file_transfer_do(aim_session_t *, aim_frame_t *, ...); |
377 static void oscar_file_transfer_disconnect(aim_session_t *, | |
378 aim_conn_t *); | |
3771 | 379 static void oscar_file_transfer_cancel(struct gaim_connection *, |
3630 | 380 struct file_transfer *); |
381 static int oscar_sendfile_request(aim_session_t *sess, | |
382 struct oscar_file_transfer *oft); | |
3752 | 383 static int oscar_sendfile_timeout(aim_session_t *sess, aim_frame_t *fr, ...); |
3630 | 384 |
2086 | 385 static char *msgerrreason[] = { |
386 "Invalid error", | |
387 "Invalid SNAC", | |
388 "Rate to host", | |
389 "Rate to client", | |
390 "Not logged in", | |
391 "Service unavailable", | |
392 "Service not defined", | |
393 "Obsolete SNAC", | |
394 "Not supported by host", | |
395 "Not supported by client", | |
396 "Refused by client", | |
397 "Reply too big", | |
398 "Responses lost", | |
399 "Request denied", | |
400 "Busted SNAC payload", | |
401 "Insufficient rights", | |
402 "In local permit/deny", | |
403 "Too evil (sender)", | |
404 "Too evil (receiver)", | |
405 "User temporarily unavailable", | |
406 "No match", | |
407 "List overflow", | |
408 "Request ambiguous", | |
409 "Queue full", | |
410 "Not while on AOL" | |
411 }; | |
412 static int msgerrreasonlen = 25; | |
413 | |
3952 | 414 /* |
415 * This is called to clean up whenever a file transfer is no longer in progress, | |
416 * whether because it finished sucessfully, it was canceled, or there was an error. | |
417 */ | |
418 static void oscar_file_transfer_disconnect(aim_session_t *sess, aim_conn_t *conn) { | |
3630 | 419 struct gaim_connection *gc = sess->aux_data; |
420 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
421 struct oscar_file_transfer *oft = find_oft_by_conn(gc, | |
422 conn); | |
423 | |
424 od->file_transfers = g_slist_remove(od->file_transfers, oft); | |
425 | |
426 if (oft->watcher) { | |
427 gaim_input_remove(oft->watcher); | |
428 oft->watcher = 0; | |
429 } | |
430 | |
431 aim_conn_kill(sess, &conn); | |
432 | |
433 g_free(oft->sn); | |
434 g_free(oft); | |
435 } | |
436 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
437 static void gaim_directim_disconnect(aim_session_t *sess, aim_conn_t *conn) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
438 struct gaim_connection *gc = sess->aux_data; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
439 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
440 struct conversation *cnv; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
441 struct direct_im *dim; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
442 char *sn; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
443 char buf[256]; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
444 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
445 sn = g_strdup(aim_directim_getsn(conn)); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
446 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
447 debug_printf("%s disconnected Direct IM.\n", sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
448 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
449 dim = find_direct_im(od, sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
450 od->direct_ims = g_slist_remove(od->direct_ims, dim); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
451 gaim_input_remove(dim->watcher); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
452 |
3008 | 453 if (dim->connected) |
454 g_snprintf(buf, sizeof buf, _("Direct IM with %s closed"), sn); | |
455 else | |
456 g_snprintf(buf, sizeof buf, _("Direct IM with %s failed"), sn); | |
457 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
458 if ((cnv = find_conversation(sn))) |
2856
b1e300a85678
[gaim-migrate @ 2869]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2833
diff
changeset
|
459 write_to_conv(cnv, buf, WFLAG_SYSTEM, NULL, time(NULL), -1); |
2993 | 460 update_progress(cnv, 100); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
461 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
462 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
|
463 g_free(sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
464 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
465 return; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
466 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
467 |
2086 | 468 static void oscar_callback(gpointer data, gint source, |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
469 GaimInputCondition condition) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
470 aim_conn_t *conn = (aim_conn_t *)data; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
471 aim_session_t *sess = aim_conn_getsess(conn); |
2086 | 472 struct gaim_connection *gc = sess ? sess->aux_data : NULL; |
473 struct oscar_data *odata; | |
474 | |
475 if (!gc) { | |
476 /* gc is null. we return, else we seg SIGSEG on next line. */ | |
477 debug_printf("oscar callback for closed connection (1).\n"); | |
478 return; | |
479 } | |
480 | |
481 odata = (struct oscar_data *)gc->proto_data; | |
482 | |
483 if (!g_slist_find(connections, gc)) { | |
484 /* oh boy. this is probably bad. i guess the only thing we | |
485 * can really do is return? */ | |
486 debug_printf("oscar callback for closed connection (2).\n"); | |
487 return; | |
488 } | |
489 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
490 if (condition & GAIM_INPUT_READ) { |
2086 | 491 if (conn->type == AIM_CONN_TYPE_RENDEZVOUS_OUT) { |
492 debug_printf("got information on rendezvous\n"); | |
493 if (aim_handlerendconnect(odata->sess, conn) < 0) { | |
494 debug_printf(_("connection error (rend)\n")); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
495 aim_conn_kill(odata->sess, &conn); |
2086 | 496 } |
497 } else { | |
498 if (aim_get_command(odata->sess, conn) >= 0) { | |
499 aim_rxdispatch(odata->sess); | |
500 if (odata->killme) | |
501 signoff(gc); | |
502 } else { | |
503 if ((conn->type == AIM_CONN_TYPE_BOS) || | |
504 !(aim_getconn_type(odata->sess, AIM_CONN_TYPE_BOS))) { | |
505 debug_printf(_("major connection error\n")); | |
3074 | 506 hide_login_progress_error(gc, _("Disconnected.")); |
2086 | 507 signoff(gc); |
508 } else if (conn->type == AIM_CONN_TYPE_CHAT) { | |
509 struct chat_connection *c = find_oscar_chat_by_conn(gc, conn); | |
510 char buf[BUF_LONG]; | |
511 debug_printf("disconnected from chat room %s\n", c->name); | |
512 c->conn = NULL; | |
513 if (c->inpa > 0) | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
514 gaim_input_remove(c->inpa); |
2086 | 515 c->inpa = 0; |
516 c->fd = -1; | |
517 aim_conn_kill(odata->sess, &conn); | |
3574 | 518 snprintf(buf, sizeof(buf), _("You have been disconnected from chat room %s."), c->name); |
3427 | 519 do_error_dialog(buf, NULL, GAIM_ERROR); |
2086 | 520 } else if (conn->type == AIM_CONN_TYPE_CHATNAV) { |
521 if (odata->cnpa > 0) | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
522 gaim_input_remove(odata->cnpa); |
2086 | 523 odata->cnpa = 0; |
524 debug_printf("removing chatnav input watcher\n"); | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
525 while (odata->create_rooms) { |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
526 struct create_room *cr = odata->create_rooms->data; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
527 g_free(cr->name); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
528 odata->create_rooms = |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
529 g_slist_remove(odata->create_rooms, cr); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
530 g_free(cr); |
3427 | 531 do_error_dialog(_("Chat is currently unavailable"), NULL, GAIM_ERROR); |
2086 | 532 } |
533 aim_conn_kill(odata->sess, &conn); | |
534 } else if (conn->type == AIM_CONN_TYPE_AUTH) { | |
535 if (odata->paspa > 0) | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
536 gaim_input_remove(odata->paspa); |
2086 | 537 odata->paspa = 0; |
538 debug_printf("removing authconn input watcher\n"); | |
539 aim_conn_kill(odata->sess, &conn); | |
3694 | 540 } else if (conn->type == AIM_CONN_TYPE_EMAIL) { |
541 if (odata->emlpa > 0) | |
542 gaim_input_remove(odata->emlpa); | |
543 odata->emlpa = 0; | |
544 debug_printf("removing email input watcher\n"); | |
545 aim_conn_kill(odata->sess, &conn); | |
2086 | 546 } else if (conn->type == AIM_CONN_TYPE_RENDEZVOUS) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
547 if (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
548 gaim_directim_disconnect(odata->sess, conn); |
3630 | 549 else if (conn->subtype == AIM_CONN_SUBTYPE_OFT_SENDFILE) { |
550 struct oscar_file_transfer *oft = find_oft_by_conn(gc, conn); | |
551 if (oft) { | |
552 transfer_abort(oft->xfer, _("Buddy canceled transfer")); | |
553 } | |
554 oscar_file_transfer_disconnect(odata->sess, conn); | |
555 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
556 else { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
557 debug_printf("No handler for rendezvous disconnect (%d).\n", |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
558 source); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
559 } |
2086 | 560 aim_conn_kill(odata->sess, &conn); |
561 } else { | |
562 debug_printf("holy crap! generic connection error! %d\n", | |
563 conn->type); | |
564 aim_conn_kill(odata->sess, &conn); | |
565 } | |
566 } | |
567 } | |
568 } | |
569 } | |
570 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
571 static void oscar_debug(aim_session_t *sess, int level, const char *format, va_list va) { |
2086 | 572 char *s = g_strdup_vprintf(format, va); |
573 char buf[256]; | |
574 char *t; | |
575 struct gaim_connection *gc = sess->aux_data; | |
576 | |
577 g_snprintf(buf, sizeof(buf), "%s %d: ", gc->username, level); | |
578 t = g_strconcat(buf, s, NULL); | |
579 debug_printf(t); | |
580 if (t[strlen(t)-1] != '\n') | |
581 debug_printf("\n"); | |
582 g_free(t); | |
583 g_free(s); | |
584 } | |
585 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
586 static void oscar_login_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 587 { |
588 struct gaim_connection *gc = data; | |
589 struct oscar_data *odata; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
590 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
591 aim_conn_t *conn; |
2086 | 592 |
593 if (!g_slist_find(connections, gc)) { | |
594 close(source); | |
595 return; | |
596 } | |
597 | |
598 odata = gc->proto_data; | |
599 sess = odata->sess; | |
600 conn = aim_getconn_type_all(sess, AIM_CONN_TYPE_AUTH); | |
601 | |
602 if (source < 0) { | |
603 hide_login_progress(gc, _("Couldn't connect to host")); | |
604 signoff(gc); | |
605 return; | |
606 } | |
607 | |
608 aim_conn_completeconnect(sess, conn); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
609 gc->inpa = gaim_input_add(conn->fd, GAIM_INPUT_READ, |
2086 | 610 oscar_callback, conn); |
611 debug_printf(_("Password sent, waiting for response\n")); | |
612 } | |
613 | |
614 static void oscar_login(struct aim_user *user) { | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
615 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
616 aim_conn_t *conn; |
2086 | 617 char buf[256]; |
618 struct gaim_connection *gc = new_gaim_conn(user); | |
619 struct oscar_data *odata = gc->proto_data = g_new0(struct oscar_data, 1); | |
620 | |
2589
4e149a0b9665
[gaim-migrate @ 2602]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2507
diff
changeset
|
621 if (isdigit(*user->username)) { |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
622 odata->icq = TRUE; |
2589
4e149a0b9665
[gaim-migrate @ 2602]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2507
diff
changeset
|
623 /* this is odd but it's necessary for a proper do_import and do_export */ |
4e149a0b9665
[gaim-migrate @ 2602]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2507
diff
changeset
|
624 gc->protocol = PROTO_ICQ; |
3064 | 625 gc->password[8] = 0; |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
626 } else { |
2590
2dd86a1af92b
[gaim-migrate @ 2603]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2589
diff
changeset
|
627 gc->protocol = PROTO_TOC; |
2918
4df759d607f3
[gaim-migrate @ 2931]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2916
diff
changeset
|
628 gc->flags |= OPT_CONN_HTML; |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
629 } |
3600 | 630 odata->supports_tn = g_hash_table_new(g_str_hash, g_str_equal); |
2086 | 631 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
632 sess = g_new0(aim_session_t, 1); |
2086 | 633 |
634 aim_session_init(sess, AIM_SESS_FLAGS_NONBLOCKCONNECT, 0); | |
635 aim_setdebuggingcb(sess, oscar_debug); | |
636 | |
637 /* we need an immediate queue because we don't use a while-loop to | |
638 * see if things need to be sent. */ | |
639 aim_tx_setenqueue(sess, AIM_TX_IMMEDIATE, NULL); | |
640 odata->sess = sess; | |
641 sess->aux_data = gc; | |
642 | |
643 conn = aim_newconn(sess, AIM_CONN_TYPE_AUTH, NULL); | |
644 if (conn == NULL) { | |
645 debug_printf(_("internal connection error\n")); | |
646 hide_login_progress(gc, _("Unable to login to AIM")); | |
647 signoff(gc); | |
648 return; | |
649 } | |
650 | |
651 g_snprintf(buf, sizeof(buf), _("Signon: %s"), gc->username); | |
652 set_login_progress(gc, 2, buf); | |
653 | |
654 aim_conn_addhandler(sess, conn, 0x0017, 0x0007, gaim_parse_login, 0); | |
655 aim_conn_addhandler(sess, conn, 0x0017, 0x0003, gaim_parse_auth_resp, 0); | |
656 | |
657 conn->status |= AIM_CONN_STATUS_INPROGRESS; | |
658 conn->fd = proxy_connect(user->proto_opt[USEROPT_AUTH][0] ? | |
659 user->proto_opt[USEROPT_AUTH] : FAIM_LOGIN_SERVER, | |
660 user->proto_opt[USEROPT_AUTHPORT][0] ? | |
661 atoi(user->proto_opt[USEROPT_AUTHPORT]) : FAIM_LOGIN_PORT, | |
662 oscar_login_connect, gc); | |
663 if (conn->fd < 0) { | |
664 hide_login_progress(gc, _("Couldn't connect to host")); | |
665 signoff(gc); | |
666 return; | |
667 } | |
668 aim_request_login(sess, conn, gc->username); | |
669 } | |
670 | |
671 static void oscar_close(struct gaim_connection *gc) { | |
672 struct oscar_data *odata = (struct oscar_data *)gc->proto_data; | |
673 | |
674 while (odata->oscar_chats) { | |
675 struct chat_connection *n = odata->oscar_chats->data; | |
676 if (n->inpa > 0) | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
677 gaim_input_remove(n->inpa); |
2086 | 678 g_free(n->name); |
679 g_free(n->show); | |
680 odata->oscar_chats = g_slist_remove(odata->oscar_chats, n); | |
681 g_free(n); | |
682 } | |
683 while (odata->direct_ims) { | |
684 struct direct_im *n = odata->direct_ims->data; | |
685 if (n->watcher > 0) | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
686 gaim_input_remove(n->watcher); |
2086 | 687 odata->direct_ims = g_slist_remove(odata->direct_ims, n); |
688 g_free(n); | |
689 } | |
3630 | 690 while (odata->file_transfers) { |
691 struct oscar_file_transfer *n = odata->file_transfers->data; | |
692 if (n->watcher > 0) | |
693 gaim_input_remove(n->watcher); | |
694 odata->file_transfers = g_slist_remove(odata->file_transfers, n); | |
695 g_free(n); | |
696 } | |
2086 | 697 while (odata->hasicons) { |
698 struct icon_req *n = odata->hasicons->data; | |
699 g_free(n->user); | |
700 odata->hasicons = g_slist_remove(odata->hasicons, n); | |
701 g_free(n); | |
702 } | |
3600 | 703 g_hash_table_destroy(odata->supports_tn); |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
704 while (odata->evilhack) { |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
705 g_free(odata->evilhack->data); |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
706 odata->evilhack = g_slist_remove(odata->evilhack, odata->evilhack->data); |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
707 } |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
708 while (odata->create_rooms) { |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
709 struct create_room *cr = odata->create_rooms->data; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
710 g_free(cr->name); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
711 odata->create_rooms = g_slist_remove(odata->create_rooms, cr); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
712 g_free(cr); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
713 } |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
714 if (odata->email) |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
715 g_free(odata->email); |
2754
642413968b03
[gaim-migrate @ 2767]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2742
diff
changeset
|
716 if (odata->newp) |
642413968b03
[gaim-migrate @ 2767]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2742
diff
changeset
|
717 g_free(odata->newp); |
642413968b03
[gaim-migrate @ 2767]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2742
diff
changeset
|
718 if (odata->oldp) |
642413968b03
[gaim-migrate @ 2767]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2742
diff
changeset
|
719 g_free(odata->oldp); |
2086 | 720 if (gc->inpa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
721 gaim_input_remove(gc->inpa); |
2086 | 722 if (odata->cnpa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
723 gaim_input_remove(odata->cnpa); |
2086 | 724 if (odata->paspa > 0) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
725 gaim_input_remove(odata->paspa); |
3694 | 726 if (odata->emlpa > 0) |
727 gaim_input_remove(odata->emlpa); | |
2086 | 728 aim_session_kill(odata->sess); |
729 g_free(odata->sess); | |
730 odata->sess = NULL; | |
731 g_free(gc->proto_data); | |
732 gc->proto_data = NULL; | |
733 debug_printf(_("Signed off.\n")); | |
734 } | |
735 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
736 static void oscar_bos_connect(gpointer data, gint source, GaimInputCondition cond) { |
2086 | 737 struct gaim_connection *gc = data; |
738 struct oscar_data *odata; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
739 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
740 aim_conn_t *bosconn; |
2086 | 741 |
742 if (!g_slist_find(connections, gc)) { | |
743 close(source); | |
744 return; | |
745 } | |
746 | |
747 odata = gc->proto_data; | |
748 sess = odata->sess; | |
749 bosconn = odata->conn; | |
750 | |
751 if (source < 0) { | |
752 hide_login_progress(gc, _("Could Not Connect")); | |
753 signoff(gc); | |
754 return; | |
755 } | |
756 | |
757 aim_conn_completeconnect(sess, bosconn); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
758 gc->inpa = gaim_input_add(bosconn->fd, GAIM_INPUT_READ, |
2086 | 759 oscar_callback, bosconn); |
760 set_login_progress(gc, 4, _("Connection established, cookie sent")); | |
761 } | |
762 | |
3630 | 763 static void oscar_ask_send_file(struct gaim_connection *gc, char *destsn) { |
764 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
3752 | 765 |
766 struct oscar_file_transfer *oft = g_new0(struct oscar_file_transfer, | |
767 1); | |
768 | |
769 oft->type = OFT_SENDFILE_OUT; | |
770 oft->sn = g_strdup(destsn); | |
771 | |
772 od->file_transfers = g_slist_append(od->file_transfers, oft); | |
773 | |
774 oft->xfer = transfer_out_add(gc, oft->sn); | |
3630 | 775 } |
776 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
777 static int gaim_parse_auth_resp(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 778 va_list ap; |
2704 | 779 struct aim_authresp_info *info; |
2086 | 780 int i; char *host; int port; |
781 struct aim_user *user; | |
2704 | 782 aim_conn_t *bosconn; |
2086 | 783 |
784 struct gaim_connection *gc = sess->aux_data; | |
785 struct oscar_data *od = gc->proto_data; | |
786 user = gc->user; | |
787 port = user->proto_opt[USEROPT_AUTHPORT][0] ? | |
788 atoi(user->proto_opt[USEROPT_AUTHPORT]) : FAIM_LOGIN_PORT, | |
789 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
790 va_start(ap, fr); |
2704 | 791 info = va_arg(ap, struct aim_authresp_info *); |
2086 | 792 va_end(ap); |
793 | |
2704 | 794 debug_printf("inside auth_resp (Screen name: %s)\n", info->sn); |
795 | |
796 if (info->errorcode || !info->bosip || !info->cookie) { | |
797 switch (info->errorcode) { | |
2086 | 798 case 0x05: |
799 /* Incorrect nick/password */ | |
800 hide_login_progress(gc, _("Incorrect nickname or password.")); | |
801 plugin_event(event_error, (void *)980, 0, 0, 0); | |
802 break; | |
803 case 0x11: | |
804 /* Suspended account */ | |
805 hide_login_progress(gc, _("Your account is currently suspended.")); | |
806 break; | |
3498 | 807 case 0x14: |
808 /* service temporarily unavailable */ | |
809 hide_login_progress(gc, _("The AOL Instant Messenger service is temporarily unavailable.")); | |
810 break; | |
2086 | 811 case 0x18: |
812 /* connecting too frequently */ | |
813 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.")); | |
814 plugin_event(event_error, (void *)983, 0, 0, 0); | |
815 break; | |
816 case 0x1c: | |
817 /* client too old */ | |
818 hide_login_progress(gc, _("The client version you are using is too old. Please upgrade at " WEBSITE)); | |
819 plugin_event(event_error, (void *)989, 0, 0, 0); | |
820 break; | |
821 default: | |
822 hide_login_progress(gc, _("Authentication Failed")); | |
823 break; | |
824 } | |
2704 | 825 debug_printf("Login Error Code 0x%04x\n", info->errorcode); |
826 debug_printf("Error URL: %s\n", info->errorurl); | |
2086 | 827 od->killme = TRUE; |
828 return 1; | |
829 } | |
830 | |
831 | |
2704 | 832 debug_printf("Reg status: %d\n", info->regstatus); |
833 if (info->email) { | |
834 debug_printf("Email: %s\n", info->email); | |
2086 | 835 } else { |
836 debug_printf("Email is NULL\n"); | |
837 } | |
2704 | 838 debug_printf("BOSIP: %s\n", info->bosip); |
2086 | 839 debug_printf("Closing auth connection...\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
840 aim_conn_kill(sess, &fr->conn); |
2086 | 841 |
842 bosconn = aim_newconn(sess, AIM_CONN_TYPE_BOS, NULL); | |
843 if (bosconn == NULL) { | |
844 hide_login_progress(gc, _("Internal Error")); | |
845 od->killme = TRUE; | |
846 return 0; | |
847 } | |
848 | |
2675 | 849 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_bos, 0); |
2086 | 850 aim_conn_addhandler(sess, bosconn, 0x0009, 0x0003, gaim_bosrights, 0); |
851 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ACK, AIM_CB_ACK_ACK, NULL, 0); | |
852 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_REDIRECT, gaim_handle_redirect, 0); | |
2993 | 853 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_RIGHTSINFO, gaim_parse_locaterights, 0); |
2086 | 854 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_RIGHTSINFO, gaim_parse_buddyrights, 0); |
855 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_ONCOMING, gaim_parse_oncoming, 0); | |
856 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_OFFGOING, gaim_parse_offgoing, 0); | |
857 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_INCOMING, gaim_parse_incoming_im, 0); | |
858 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_ERROR, gaim_parse_locerr, 0); | |
859 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_MISSEDCALL, gaim_parse_misses, 0); | |
3212 | 860 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_CLIENTAUTORESP, gaim_parse_clientauto, 0); |
2086 | 861 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_RATECHANGE, gaim_parse_ratechange, 0); |
862 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_EVIL, gaim_parse_evilnotify, 0); | |
863 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOK, AIM_CB_LOK_ERROR, gaim_parse_searcherror, 0); | |
864 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOK, 0x0003, gaim_parse_searchreply, 0); | |
865 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ERROR, gaim_parse_msgerr, 0); | |
3595 | 866 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_MTN, gaim_parse_mtn, 0); |
2086 | 867 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_USERINFO, gaim_parse_user_info, 0); |
868 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ACK, gaim_parse_msgack, 0); | |
869 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
|
870 aim_conn_addhandler(sess, bosconn, 0x0004, 0x0005, gaim_icbm_param_info, 0); |
2086 | 871 aim_conn_addhandler(sess, bosconn, 0x0001, 0x0001, gaim_parse_genericerr, 0); |
872 aim_conn_addhandler(sess, bosconn, 0x0003, 0x0001, gaim_parse_genericerr, 0); | |
873 aim_conn_addhandler(sess, bosconn, 0x0009, 0x0001, gaim_parse_genericerr, 0); | |
874 aim_conn_addhandler(sess, bosconn, 0x0001, 0x001f, gaim_memrequest, 0); | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
875 aim_conn_addhandler(sess, bosconn, 0x0001, 0x000f, gaim_selfinfo, 0); |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
876 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
|
877 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
|
878 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_POP, 0x0002, gaim_popup, 0); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
879 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_SIMPLEINFO, gaim_simpleinfo, 0); |
2991 | 880 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_RIGHTSINFO, gaim_ssi_parserights, 0); |
881 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_LIST, gaim_ssi_parselist, 0); | |
882 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_NOLIST, gaim_ssi_parselist, 0); | |
3752 | 883 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_MSGTIMEOUT, oscar_sendfile_timeout, 0); |
2086 | 884 |
885 ((struct oscar_data *)gc->proto_data)->conn = bosconn; | |
2704 | 886 for (i = 0; i < (int)strlen(info->bosip); i++) { |
887 if (info->bosip[i] == ':') { | |
888 port = atoi(&(info->bosip[i+1])); | |
2086 | 889 break; |
890 } | |
891 } | |
2704 | 892 host = g_strndup(info->bosip, i); |
2086 | 893 bosconn->status |= AIM_CONN_STATUS_INPROGRESS; |
894 bosconn->fd = proxy_connect(host, port, oscar_bos_connect, gc); | |
895 g_free(host); | |
896 if (bosconn->fd < 0) { | |
897 hide_login_progress(gc, _("Could Not Connect")); | |
898 od->killme = TRUE; | |
899 return 0; | |
900 } | |
2704 | 901 aim_sendcookie(sess, bosconn, info->cookie); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
902 gaim_input_remove(gc->inpa); |
2704 | 903 |
2086 | 904 return 1; |
905 } | |
906 | |
907 struct pieceofcrap { | |
908 struct gaim_connection *gc; | |
909 unsigned long offset; | |
910 unsigned long len; | |
911 char *modname; | |
912 int fd; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
913 aim_conn_t *conn; |
2086 | 914 unsigned int inpa; |
915 }; | |
916 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
917 static void damn_you(gpointer data, gint source, GaimInputCondition c) |
2086 | 918 { |
919 struct pieceofcrap *pos = data; | |
920 struct oscar_data *od = pos->gc->proto_data; | |
921 char in = '\0'; | |
922 int x = 0; | |
923 unsigned char m[17]; | |
924 | |
925 while (read(pos->fd, &in, 1) == 1) { | |
926 if (in == '\n') | |
927 x++; | |
928 else if (in != '\r') | |
929 x = 0; | |
930 if (x == 2) | |
931 break; | |
932 in = '\0'; | |
933 } | |
934 if (in != '\n') { | |
3427 | 935 do_error_dialog(_("Gaim was Unable to get a valid AIM login hash."), |
936 _("You may be disconnected shortly. You may want to use TOC until " | |
937 "this is fixed. Check " WEBSITE " for updates."), GAIM_WARNING); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
938 gaim_input_remove(pos->inpa); |
2086 | 939 close(pos->fd); |
940 g_free(pos); | |
941 return; | |
942 } | |
943 read(pos->fd, m, 16); | |
944 m[16] = '\0'; | |
945 debug_printf("Sending hash: "); | |
946 for (x = 0; x < 16; x++) | |
947 debug_printf("%02x ", (unsigned char)m[x]); | |
948 debug_printf("\n"); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
949 gaim_input_remove(pos->inpa); |
2086 | 950 close(pos->fd); |
951 aim_sendmemblock(od->sess, pos->conn, 0, 16, m, AIM_SENDMEMBLOCK_FLAG_ISHASH); | |
952 g_free(pos); | |
953 } | |
954 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
955 static void straight_to_hell(gpointer data, gint source, GaimInputCondition cond) { |
2086 | 956 struct pieceofcrap *pos = data; |
957 char buf[BUF_LONG]; | |
958 | |
959 if (source < 0) { | |
3427 | 960 do_error_dialog(_("Gaim was Unable to get a valid AIM login hash."), |
961 _("You may be disconnected shortly. You may want to use TOC until " | |
962 "this is fixed. Check " WEBSITE " for updates."), GAIM_WARNING); | |
2086 | 963 if (pos->modname) |
964 g_free(pos->modname); | |
965 g_free(pos); | |
966 return; | |
967 } | |
968 | |
969 g_snprintf(buf, sizeof(buf), "GET " AIMHASHDATA | |
970 "?offset=%ld&len=%ld&modname=%s HTTP/1.0\n\n", | |
971 pos->offset, pos->len, pos->modname ? pos->modname : ""); | |
972 write(pos->fd, buf, strlen(buf)); | |
973 if (pos->modname) | |
974 g_free(pos->modname); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
975 pos->inpa = gaim_input_add(pos->fd, GAIM_INPUT_READ, damn_you, pos); |
2086 | 976 return; |
977 } | |
978 | |
979 /* size of icbmui.ocm, the largest module in AIM 3.5 */ | |
980 #define AIM_MAX_FILE_SIZE 98304 | |
981 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
982 int gaim_memrequest(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 983 va_list ap; |
984 struct pieceofcrap *pos; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
985 fu32_t offset, len; |
2086 | 986 char *modname; |
987 int fd; | |
988 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
989 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
990 offset = (fu32_t)va_arg(ap, unsigned long); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
991 len = (fu32_t)va_arg(ap, unsigned long); |
2086 | 992 modname = va_arg(ap, char *); |
993 va_end(ap); | |
994 | |
995 debug_printf("offset: %d, len: %d, file: %s\n", offset, len, modname ? modname : "aim.exe"); | |
996 if (len == 0) { | |
997 debug_printf("len is 0, hashing NULL\n"); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
998 aim_sendmemblock(sess, fr->conn, offset, len, NULL, |
2086 | 999 AIM_SENDMEMBLOCK_FLAG_ISREQUEST); |
1000 return 1; | |
1001 } | |
1002 /* uncomment this when you're convinced it's right. remember, it's been wrong before. | |
1003 if (offset > AIM_MAX_FILE_SIZE || len > AIM_MAX_FILE_SIZE) { | |
1004 char *buf; | |
1005 int i = 8; | |
1006 if (modname) | |
1007 i += strlen(modname); | |
1008 buf = g_malloc(i); | |
1009 i = 0; | |
1010 if (modname) { | |
1011 memcpy(buf, modname, strlen(modname)); | |
1012 i += strlen(modname); | |
1013 } | |
1014 buf[i++] = offset & 0xff; | |
1015 buf[i++] = (offset >> 8) & 0xff; | |
1016 buf[i++] = (offset >> 16) & 0xff; | |
1017 buf[i++] = (offset >> 24) & 0xff; | |
1018 buf[i++] = len & 0xff; | |
1019 buf[i++] = (len >> 8) & 0xff; | |
1020 buf[i++] = (len >> 16) & 0xff; | |
1021 buf[i++] = (len >> 24) & 0xff; | |
1022 debug_printf("len + offset is invalid, hashing request\n"); | |
1023 aim_sendmemblock(sess, command->conn, offset, i, buf, AIM_SENDMEMBLOCK_FLAG_ISREQUEST); | |
1024 g_free(buf); | |
1025 return 1; | |
1026 } | |
1027 */ | |
1028 | |
1029 pos = g_new0(struct pieceofcrap, 1); | |
1030 pos->gc = sess->aux_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1031 pos->conn = fr->conn; |
2086 | 1032 |
1033 pos->offset = offset; | |
1034 pos->len = len; | |
1035 pos->modname = modname ? g_strdup(modname) : NULL; | |
1036 | |
1037 fd = proxy_connect("gaim.sourceforge.net", 80, straight_to_hell, pos); | |
1038 if (fd < 0) { | |
1039 if (pos->modname) | |
1040 g_free(pos->modname); | |
1041 g_free(pos); | |
3427 | 1042 do_error_dialog(_("Gaim was Unable to get valid login hash."), |
1043 _("You may be disconnected shortly. You may want to use TOC until " | |
1044 "this is fixed. Check " WEBSITE " for updates."), GAIM_WARNING); | |
2086 | 1045 } |
1046 pos->fd = fd; | |
1047 | |
1048 return 1; | |
1049 } | |
1050 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1051 static int gaim_parse_login(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 1052 char *key; |
1053 va_list ap; | |
1054 struct gaim_connection *gc = sess->aux_data; | |
3458 | 1055 struct oscar_data *odata = gc->proto_data; |
2086 | 1056 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1057 va_start(ap, fr); |
2086 | 1058 key = va_arg(ap, char *); |
1059 va_end(ap); | |
1060 | |
3458 | 1061 if (odata->icq) { |
1062 struct client_info_s info = CLIENTINFO_ICQ_KNOWNGOOD; | |
1063 aim_send_login(sess, fr->conn, gc->username, gc->password, &info, key); | |
1064 } else { | |
1065 #if 0 | |
1066 struct client_info_s info = {"gaim", 4, 1, 2010, "us", "en", 0x0004, 0x0000, 0x04b}; | |
1067 #endif | |
1068 struct client_info_s info = CLIENTINFO_AIM_KNOWNGOOD; | |
1069 aim_send_login(sess, fr->conn, gc->username, gc->password, &info, key); | |
1070 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1071 |
2086 | 1072 return 1; |
1073 } | |
1074 | |
2675 | 1075 static int conninitdone_chat(aim_session_t *sess, aim_frame_t *fr, ...) { |
2647 | 1076 struct gaim_connection *gc = sess->aux_data; |
1077 struct chat_connection *chatcon; | |
1078 static int id = 1; | |
1079 | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1080 aim_conn_addhandler(sess, fr->conn, 0x000e, 0x0001, gaim_parse_genericerr, 0); |
2675 | 1081 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERJOIN, gaim_chat_join, 0); |
1082 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERLEAVE, gaim_chat_leave, 0); | |
1083 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_ROOMINFOUPDATE, gaim_chat_info_update, 0); | |
1084 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_INCOMINGMSG, gaim_chat_incoming_msg, 0); | |
1085 | |
2672 | 1086 aim_clientready(sess, fr->conn); |
2675 | 1087 |
2647 | 1088 chatcon = find_oscar_chat_by_conn(gc, fr->conn); |
1089 chatcon->id = id; | |
1090 chatcon->cnv = serv_got_joined_chat(gc, id++, chatcon->show); | |
1091 | |
1092 return 1; | |
1093 } | |
1094 | |
2675 | 1095 static int conninitdone_chatnav(aim_session_t *sess, aim_frame_t *fr, ...) { |
1096 | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1097 aim_conn_addhandler(sess, fr->conn, 0x000d, 0x0001, gaim_parse_genericerr, 0); |
2647 | 1098 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CTN, AIM_CB_CTN_INFO, gaim_chatnav_info, 0); |
2675 | 1099 |
1100 aim_clientready(sess, fr->conn); | |
1101 | |
1102 aim_chatnav_reqrights(sess, fr->conn); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1103 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1104 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1105 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1106 |
3694 | 1107 static int conninitdone_email(aim_session_t *sess, aim_frame_t *fr, ...) { |
1108 | |
1109 aim_conn_addhandler(sess, fr->conn, 0x0018, 0x0001, gaim_parse_genericerr, 0); | |
1110 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_EML, AIM_CB_EML_MAILSTATUS, gaim_email_parseupdate, 0); | |
1111 | |
1112 aim_email_sendcookies(sess, fr->conn); | |
1113 aim_email_activate(sess, fr->conn); | |
1114 aim_clientready(sess, fr->conn); | |
1115 | |
1116 return 1; | |
1117 } | |
1118 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1119 static void oscar_chatnav_connect(gpointer data, gint source, GaimInputCondition cond) { |
2086 | 1120 struct gaim_connection *gc = data; |
1121 struct oscar_data *odata; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1122 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1123 aim_conn_t *tstconn; |
2086 | 1124 |
1125 if (!g_slist_find(connections, gc)) { | |
1126 close(source); | |
1127 return; | |
1128 } | |
1129 | |
1130 odata = gc->proto_data; | |
1131 sess = odata->sess; | |
1132 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_CHATNAV); | |
1133 | |
1134 if (source < 0) { | |
1135 aim_conn_kill(sess, &tstconn); | |
1136 debug_printf("unable to connect to chatnav server\n"); | |
1137 return; | |
1138 } | |
1139 | |
1140 aim_conn_completeconnect(sess, tstconn); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1141 odata->cnpa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1142 oscar_callback, tstconn); |
2086 | 1143 debug_printf("chatnav: connected\n"); |
1144 } | |
1145 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1146 static void oscar_auth_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 1147 { |
1148 struct gaim_connection *gc = data; | |
1149 struct oscar_data *odata; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1150 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1151 aim_conn_t *tstconn; |
2086 | 1152 |
1153 if (!g_slist_find(connections, gc)) { | |
1154 close(source); | |
1155 return; | |
1156 } | |
1157 | |
1158 odata = gc->proto_data; | |
1159 sess = odata->sess; | |
1160 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_AUTH); | |
1161 | |
1162 if (source < 0) { | |
1163 aim_conn_kill(sess, &tstconn); | |
1164 debug_printf("unable to connect to authorizer\n"); | |
1165 return; | |
1166 } | |
1167 | |
1168 aim_conn_completeconnect(sess, tstconn); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1169 odata->paspa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, |
2086 | 1170 oscar_callback, tstconn); |
1171 debug_printf("chatnav: connected\n"); | |
1172 } | |
1173 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1174 static void oscar_chat_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 1175 { |
1176 struct chat_connection *ccon = data; | |
1177 struct gaim_connection *gc = ccon->gc; | |
1178 struct oscar_data *odata; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1179 aim_session_t *sess; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1180 aim_conn_t *tstconn; |
2086 | 1181 |
1182 if (!g_slist_find(connections, gc)) { | |
1183 close(source); | |
1184 g_free(ccon->show); | |
1185 g_free(ccon->name); | |
1186 g_free(ccon); | |
1187 return; | |
1188 } | |
1189 | |
1190 odata = gc->proto_data; | |
1191 sess = odata->sess; | |
1192 tstconn = ccon->conn; | |
1193 | |
1194 if (source < 0) { | |
1195 aim_conn_kill(sess, &tstconn); | |
1196 g_free(ccon->show); | |
1197 g_free(ccon->name); | |
1198 g_free(ccon); | |
1199 return; | |
1200 } | |
1201 | |
1202 aim_conn_completeconnect(sess, ccon->conn); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1203 ccon->inpa = gaim_input_add(tstconn->fd, |
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1204 GAIM_INPUT_READ, |
2086 | 1205 oscar_callback, tstconn); |
1206 odata->oscar_chats = g_slist_append(odata->oscar_chats, ccon); | |
1207 } | |
1208 | |
3694 | 1209 static void oscar_email_connect(gpointer data, gint source, GaimInputCondition cond) { |
1210 struct gaim_connection *gc = data; | |
1211 struct oscar_data *odata; | |
1212 aim_session_t *sess; | |
1213 aim_conn_t *tstconn; | |
1214 | |
1215 if (!g_slist_find(connections, gc)) { | |
1216 close(source); | |
1217 return; | |
1218 } | |
1219 | |
1220 odata = gc->proto_data; | |
1221 sess = odata->sess; | |
1222 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_EMAIL); | |
1223 | |
1224 if (source < 0) { | |
1225 aim_conn_kill(sess, &tstconn); | |
1226 debug_printf("unable to connect to email server\n"); | |
1227 return; | |
1228 } | |
1229 | |
1230 aim_conn_completeconnect(sess, tstconn); | |
1231 odata->emlpa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); | |
1232 debug_printf("email: connected\n"); | |
1233 } | |
1234 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1235 /* 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
|
1236 static int gaim_handle_redirect(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 1237 va_list ap; |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1238 struct aim_redirect_data *redir; |
2086 | 1239 struct gaim_connection *gc = sess->aux_data; |
1240 struct aim_user *user = gc->user; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1241 aim_conn_t *tstconn; |
2086 | 1242 int i; |
1243 char *host; | |
1244 int port; | |
1245 | |
1246 port = user->proto_opt[USEROPT_AUTHPORT][0] ? | |
1247 atoi(user->proto_opt[USEROPT_AUTHPORT]) : FAIM_LOGIN_PORT, | |
1248 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1249 va_start(ap, fr); |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1250 redir = va_arg(ap, struct aim_redirect_data *); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1251 va_end(ap); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1252 |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1253 for (i = 0; i < (int)strlen(redir->ip); i++) { |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1254 if (redir->ip[i] == ':') { |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1255 port = atoi(&(redir->ip[i+1])); |
2086 | 1256 break; |
1257 } | |
1258 } | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1259 host = g_strndup(redir->ip, i); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1260 |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1261 switch(redir->group) { |
2086 | 1262 case 0x7: /* Authorizer */ |
1263 debug_printf("Reconnecting with authorizor...\n"); | |
1264 tstconn = aim_newconn(sess, AIM_CONN_TYPE_AUTH, NULL); | |
1265 if (tstconn == NULL) { | |
1266 debug_printf("unable to reconnect with authorizer\n"); | |
1267 g_free(host); | |
1268 return 1; | |
1269 } | |
2675 | 1270 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_admin, 0); |
2086 | 1271 aim_conn_addhandler(sess, tstconn, 0x0007, 0x0003, gaim_info_change, 0); |
1272 aim_conn_addhandler(sess, tstconn, 0x0007, 0x0005, gaim_info_change, 0); | |
1273 aim_conn_addhandler(sess, tstconn, 0x0007, 0x0007, gaim_account_confirm, 0); | |
1274 | |
1275 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
1276 tstconn->fd = proxy_connect(host, port, oscar_auth_connect, gc); | |
1277 if (tstconn->fd < 0) { | |
1278 aim_conn_kill(sess, &tstconn); | |
1279 debug_printf("unable to reconnect with authorizer\n"); | |
1280 g_free(host); | |
1281 return 1; | |
1282 } | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1283 aim_sendcookie(sess, tstconn, redir->cookie); |
2086 | 1284 break; |
1285 case 0xd: /* ChatNav */ | |
1286 tstconn = aim_newconn(sess, AIM_CONN_TYPE_CHATNAV, NULL); | |
1287 if (tstconn == NULL) { | |
1288 debug_printf("unable to connect to chatnav server\n"); | |
1289 g_free(host); | |
1290 return 1; | |
1291 } | |
2675 | 1292 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_chatnav, 0); |
2086 | 1293 |
1294 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
1295 tstconn->fd = proxy_connect(host, port, oscar_chatnav_connect, gc); | |
1296 if (tstconn->fd < 0) { | |
1297 aim_conn_kill(sess, &tstconn); | |
1298 debug_printf("unable to connect to chatnav server\n"); | |
1299 g_free(host); | |
1300 return 1; | |
1301 } | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1302 aim_sendcookie(sess, tstconn, redir->cookie); |
2086 | 1303 break; |
1304 case 0xe: /* Chat */ | |
1305 { | |
1306 struct chat_connection *ccon; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1307 |
2086 | 1308 tstconn = aim_newconn(sess, AIM_CONN_TYPE_CHAT, NULL); |
1309 if (tstconn == NULL) { | |
1310 debug_printf("unable to connect to chat server\n"); | |
1311 g_free(host); | |
1312 return 1; | |
1313 } | |
1314 | |
2675 | 1315 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_chat, 0); |
1316 | |
2086 | 1317 ccon = g_new0(struct chat_connection, 1); |
1318 ccon->conn = tstconn; | |
1319 ccon->gc = gc; | |
1320 ccon->fd = -1; | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1321 ccon->name = g_strdup(redir->chat.room); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1322 ccon->exchange = redir->chat.exchange; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1323 ccon->instance = redir->chat.instance; |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1324 ccon->show = extract_name(redir->chat.room); |
2086 | 1325 |
1326 ccon->conn->status |= AIM_CONN_STATUS_INPROGRESS; | |
1327 ccon->conn->fd = proxy_connect(host, port, oscar_chat_connect, ccon); | |
1328 if (ccon->conn->fd < 0) { | |
1329 aim_conn_kill(sess, &tstconn); | |
1330 debug_printf("unable to connect to chat server\n"); | |
1331 g_free(host); | |
1332 g_free(ccon->show); | |
1333 g_free(ccon->name); | |
1334 g_free(ccon); | |
1335 return 1; | |
1336 } | |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1337 aim_sendcookie(sess, tstconn, redir->cookie); |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1338 debug_printf("Connected to chat room %s exchange %d\n", ccon->name, ccon->exchange); |
2086 | 1339 } |
1340 break; | |
3694 | 1341 |
1342 case 0x0018: { /* email */ | |
1343 if (!(tstconn = aim_newconn(sess, AIM_CONN_TYPE_EMAIL, NULL))) { | |
1344 debug_printf("unable to connect to email server\n"); | |
1345 g_free(host); | |
1346 return 1; | |
1347 } | |
1348 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_email, 0); | |
1349 | |
1350 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
1351 tstconn->fd = proxy_connect(host, port, oscar_email_connect, gc); | |
1352 if (tstconn->fd < 0) { | |
1353 aim_conn_kill(sess, &tstconn); | |
1354 debug_printf("unable to connect to email server\n"); | |
1355 g_free(host); | |
1356 return 1; | |
1357 } | |
1358 aim_sendcookie(sess, tstconn, redir->cookie); | |
1359 } break; | |
1360 | |
2086 | 1361 default: /* huh? */ |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
1362 debug_printf("got redirect for unknown service 0x%04x\n", redir->group); |
2086 | 1363 break; |
1364 } | |
1365 | |
1366 g_free(host); | |
1367 return 1; | |
1368 } | |
1369 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1370 static int gaim_parse_oncoming(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 1371 struct gaim_connection *gc = sess->aux_data; |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
1372 struct oscar_data *od = gc->proto_data; |
2993 | 1373 aim_userinfo_t *info; |
1374 time_t time_idle = 0, signon = 0; | |
1375 int type = 0; | |
1376 int caps = 0; | |
2305
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
1377 char *tmp; |
2086 | 1378 |
1379 va_list ap; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1380 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
1381 info = va_arg(ap, aim_userinfo_t *); |
2086 | 1382 va_end(ap); |
1383 | |
2993 | 1384 if (info->present & AIM_USERINFO_PRESENT_CAPABILITIES) |
1385 caps = info->capabilities; | |
3267 | 1386 if (info->flags & AIM_FLAG_ACTIVEBUDDY) |
1387 type |= UC_AB; | |
1388 | |
1389 if ((!od->icq) && (info->present & AIM_USERINFO_PRESENT_FLAGS)) { | |
1390 if (info->flags & AIM_FLAG_UNCONFIRMED) | |
1391 type |= UC_UNCONFIRMED; | |
1392 if (info->flags & AIM_FLAG_ADMINISTRATOR) | |
1393 type |= UC_ADMIN; | |
1394 if (info->flags & AIM_FLAG_AOL) | |
1395 type |= UC_AOL; | |
1396 if (info->flags & AIM_FLAG_FREE) | |
1397 type |= UC_NORMAL; | |
1398 if (info->flags & AIM_FLAG_AWAY) | |
1399 type |= UC_UNAVAILABLE; | |
1400 if (info->flags & AIM_FLAG_WIRELESS) | |
1401 type |= UC_WIRELESS; | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
1402 } |
2993 | 1403 if (info->present & AIM_USERINFO_PRESENT_ICQEXTSTATUS) { |
3595 | 1404 type = (info->icqinfo.status << 16); |
3013 | 1405 if (!(info->icqinfo.status & AIM_ICQ_STATE_CHAT) && |
1406 (info->icqinfo.status != AIM_ICQ_STATE_NORMAL)) { | |
2993 | 1407 type |= UC_UNAVAILABLE; |
3013 | 1408 } |
2993 | 1409 } |
1410 | |
1411 if (caps & AIM_CAPS_ICQ) | |
1412 caps ^= AIM_CAPS_ICQ; | |
1413 | |
1414 if (info->present & AIM_USERINFO_PRESENT_IDLE) { | |
2086 | 1415 time(&time_idle); |
1416 time_idle -= info->idletime*60; | |
2993 | 1417 } |
1418 | |
1419 if (info->present & AIM_USERINFO_PRESENT_SESSIONLEN) | |
1420 signon = time(NULL) - info->sessionlen; | |
2086 | 1421 |
2305
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
1422 tmp = g_strdup(normalize(gc->username)); |
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
1423 if (!strcmp(tmp, normalize(info->sn))) |
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
1424 g_snprintf(gc->displayname, sizeof(gc->displayname), "%s", info->sn); |
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
1425 g_free(tmp); |
0371b905baef
[gaim-migrate @ 2315]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2303
diff
changeset
|
1426 |
2993 | 1427 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
|
1428 time_idle, type, caps); |
2086 | 1429 |
1430 return 1; | |
1431 } | |
1432 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1433 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
|
1434 aim_userinfo_t *info; |
2086 | 1435 va_list ap; |
1436 struct gaim_connection *gc = sess->aux_data; | |
1437 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1438 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
1439 info = va_arg(ap, aim_userinfo_t *); |
2086 | 1440 va_end(ap); |
1441 | |
1442 serv_got_update(gc, info->sn, 0, 0, 0, 0, 0, 0); | |
1443 | |
1444 return 1; | |
1445 } | |
1446 | |
3730 | 1447 static void cancel_direct_im(struct ask_direct *d) { |
2086 | 1448 debug_printf("Freeing DirectIM prompts.\n"); |
1449 | |
1450 g_free(d->sn); | |
1451 g_free(d); | |
1452 } | |
1453 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1454 static void oscar_directim_callback(gpointer data, gint source, GaimInputCondition condition) { |
2086 | 1455 struct direct_im *dim = data; |
1456 struct gaim_connection *gc = dim->gc; | |
1457 struct oscar_data *od = gc->proto_data; | |
2235
5d8b6100a9cc
[gaim-migrate @ 2245]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2232
diff
changeset
|
1458 struct conversation *cnv; |
2086 | 1459 char buf[256]; |
3008 | 1460 struct sockaddr name; |
1461 socklen_t name_len = 1; | |
1462 | |
2086 | 1463 if (!g_slist_find(connections, gc)) { |
1464 g_free(dim); | |
1465 return; | |
1466 } | |
1467 | |
1468 if (source < 0) { | |
1469 g_free(dim); | |
1470 return; | |
1471 } | |
1472 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1473 if (dim->conn->fd != source) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1474 dim->conn->fd = source; |
2086 | 1475 aim_conn_completeconnect(od->sess, dim->conn); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1476 if (!(cnv = find_conversation(dim->name))) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1477 cnv = new_conversation(dim->name); |
3008 | 1478 |
1479 /* This is the best way to see if we're connected or not */ | |
1480 if (getpeername(source, &name, &name_len) == 0) { | |
1481 g_snprintf(buf, sizeof buf, _("Direct IM with %s established"), dim->name); | |
1482 dim->connected = TRUE; | |
1483 write_to_conv(cnv, buf, WFLAG_SYSTEM, NULL, time(NULL), -1); | |
1484 } | |
2086 | 1485 od->direct_ims = g_slist_append(od->direct_ims, dim); |
3008 | 1486 |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
1487 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, |
3008 | 1488 oscar_callback, dim->conn); |
2086 | 1489 } |
1490 | |
3952 | 1491 /* |
1492 * This is called every time we are finished sending a file and the receiving buddy | |
1493 * has sent back an acknowledgement; we start the next file or tear down the | |
1494 * connection as appropriate. | |
1495 */ | |
3630 | 1496 static int oscar_sendfile_out_done(aim_session_t *sess, aim_frame_t *fr, ...) { |
1497 struct gaim_connection *gc = sess->aux_data; | |
1498 va_list ap; | |
1499 aim_conn_t *conn; | |
1500 const char *cook; | |
1501 struct oscar_file_transfer *oft; | |
1502 | |
1503 va_start(ap, fr); | |
1504 conn = va_arg(ap, aim_conn_t *); | |
1505 cook = va_arg(ap, const char *); | |
1506 va_end(ap); | |
1507 | |
1508 oft = find_oft_by_cookie(gc, cook); | |
1509 if (oft->filesdone == oft->totfiles) | |
1510 oscar_file_transfer_disconnect(sess, conn); | |
1511 else | |
1512 /* Send header for next file */ | |
1513 oscar_sendfile_request(sess, oft); | |
1514 | |
1515 return 0; | |
1516 } | |
1517 | |
1518 /* Called once for each file before sending the raw data. */ | |
1519 static int oscar_sendfile_request(aim_session_t *sess, | |
1520 struct oscar_file_transfer *oft) { | |
1521 char *name; | |
1522 int size; | |
1523 | |
1524 transfer_get_file_info(oft->xfer, &size, &name); | |
3952 | 1525 /* AAA convert the name to UCS-2 if necessary, and pass the encoding to the call below */ |
3630 | 1526 aim_oft_sendfile_request(sess, oft->conn, name, oft->filesdone, |
1527 oft->totfiles, size, oft->totsize); | |
1528 | |
1529 return 0; | |
1530 } | |
1531 | |
3952 | 1532 /* |
1533 * This is called when sending a file and a direct connection has been set up with | |
1534 * the buddy; we can now transmit the appropriate headers describing the transfer. | |
1535 */ | |
3630 | 1536 static int oscar_sendfile_accepted(aim_session_t *sess, aim_frame_t *fr, ...) { |
1537 struct gaim_connection *gc = sess->aux_data; | |
1538 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
1539 struct oscar_file_transfer *oft; | |
1540 va_list ap; | |
1541 aim_conn_t *conn, *listenerconn; | |
3752 | 1542 |
3630 | 1543 va_start(ap, fr); |
1544 conn = va_arg(ap, aim_conn_t *); | |
1545 listenerconn = va_arg(ap, aim_conn_t *); | |
1546 va_end(ap); | |
1547 | |
1548 oft = find_oft_by_conn(gc, listenerconn); | |
1549 oft->conn = conn; | |
1550 /* Stop watching listener conn; watch transfer conn instead */ | |
1551 gaim_input_remove(oft->watcher); | |
1552 aim_conn_kill(sess, &listenerconn); | |
1553 | |
1554 aim_conn_addhandler(od->sess, oft->conn, AIM_CB_FAM_OFT, | |
3771 | 1555 AIM_CB_OFT_SENDFILEFILESEND, |
3630 | 1556 oscar_file_transfer_do, |
1557 0); | |
1558 aim_conn_addhandler(sess, conn, | |
1559 AIM_CB_FAM_OFT, | |
3771 | 1560 AIM_CB_OFT_SENDFILECOMPLETE, |
3630 | 1561 oscar_sendfile_out_done, |
1562 0); | |
1563 oft->watcher = gaim_input_add(oft->conn->fd, GAIM_INPUT_READ, | |
1564 oscar_callback, oft->conn); | |
1565 | |
1566 oscar_sendfile_request(sess, oft); | |
1567 | |
1568 return 0; | |
1569 } | |
1570 | |
3952 | 1571 /* |
1572 * This is called when we requested to send a file to a buddy, but he or she didn't | |
1573 * respond; we need to clean up. | |
1574 */ | |
3752 | 1575 static int oscar_sendfile_timeout(aim_session_t *sess, aim_frame_t *fr, ...) { |
1576 struct gaim_connection *gc = sess->aux_data; | |
1577 va_list ap; | |
1578 struct oscar_file_transfer *oft; | |
1579 char *cookie; | |
1580 aim_conn_t *bosconn; | |
1581 | |
1582 va_start(ap, fr); | |
1583 bosconn = va_arg(ap, aim_conn_t *); | |
1584 cookie = va_arg(ap, char *); | |
1585 va_end(ap); | |
1586 | |
1587 if ((oft = find_oft_by_cookie(gc, cookie))) { | |
3630 | 1588 aim_canceltransfer(sess, bosconn, oft->cookie, |
1589 oft->sn, AIM_CAPS_SENDFILE); | |
1590 | |
1591 transfer_abort(oft->xfer, _("Transfer timed out")); | |
1592 oscar_file_transfer_disconnect(sess, oft->conn); | |
1593 } | |
3752 | 1594 |
1595 return 1; /* success */ | |
3630 | 1596 } |
1597 | |
1598 /* Called once at the beginning of an outgoing transfer session. */ | |
3771 | 1599 static void oscar_file_transfer_out(struct gaim_connection *gc, |
3630 | 1600 struct file_transfer *xfer, const char *name, int totfiles, |
1601 int totsize) { | |
1602 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
1603 struct oscar_file_transfer *oft = find_oft_by_xfer(gc, xfer); | |
1604 | |
1605 oft->xfer = xfer; | |
1606 oft->totsize = totsize; | |
1607 oft->totfiles = totfiles; | |
1608 oft->filesdone = 0; | |
1609 | |
1610 oft->conn = aim_sendfile_initiate(od->sess, oft->sn, | |
1611 name, totfiles, oft->totsize, oft->cookie); | |
1612 if (!oft->conn) { | |
1613 do_error_dialog(_("Couldn't open listener to send file"), | |
1614 _("File transfer aborted"), | |
1615 GAIM_ERROR); | |
1616 return; | |
1617 } | |
3752 | 1618 |
3630 | 1619 aim_conn_addhandler(od->sess, oft->conn, AIM_CB_FAM_OFT, |
3771 | 1620 AIM_CB_OFT_SENDFILEINITIATE, |
3630 | 1621 oscar_sendfile_accepted, |
1622 0); | |
1623 oft->watcher = gaim_input_add(oft->conn->fd, GAIM_INPUT_READ, | |
1624 oscar_callback, oft->conn); | |
1625 } | |
1626 | |
3952 | 1627 /* |
1628 * This is called after a chunk of data has been sent out or received; it is used | |
1629 * to update the checksum. | |
1630 */ | |
3771 | 1631 static void oscar_file_transfer_data_chunk(struct gaim_connection *gc, |
3630 | 1632 struct file_transfer *xfer, const char *buf, int len) |
1633 { | |
1634 struct oscar_file_transfer *oft = find_oft_by_xfer(gc, xfer); | |
1635 aim_session_t *sess = aim_conn_getsess(oft->conn); | |
1636 | |
1637 if (oft->type == OFT_SENDFILE_IN) | |
1638 aim_update_checksum(sess, oft->conn, buf, len); | |
1639 } | |
1640 | |
3952 | 1641 /* Called once at the beginning of an incoming transfer session. */ |
3771 | 1642 static void oscar_file_transfer_in(struct gaim_connection *gc, |
3630 | 1643 struct file_transfer *xfer, int offset) { |
1644 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
1645 struct oscar_file_transfer *oft = find_oft_by_xfer(gc, xfer); | |
1646 | |
1647 oft->xfer = xfer; | |
1648 oft->conn = aim_accepttransfer(od->sess, od->conn, oft->sn, | |
1649 oft->cookie, oft->ip, | |
1650 oft->port, | |
1651 AIM_CAPS_SENDFILE); | |
1652 if (!oft->conn) { | |
3952 | 1653 /* XXX implement reverse connections for receiving from behind a firewall */ |
3630 | 1654 char *buf = g_strdup_printf("Couldn't connect to remote host"); |
1655 do_error_dialog(buf, NULL, GAIM_ERROR); | |
1656 g_free(buf); | |
1657 return; | |
1658 } | |
1659 | |
1660 aim_conn_addhandler(od->sess, oft->conn, AIM_CB_FAM_OFT, | |
3771 | 1661 AIM_CB_OFT_SENDFILEFILEREQ, oscar_file_transfer_do, |
3630 | 1662 0); |
1663 | |
1664 oft->watcher = gaim_input_add(oft->conn->fd, GAIM_INPUT_READ, | |
1665 oscar_callback, oft->conn); | |
1666 } | |
1667 | |
3952 | 1668 /* |
1669 * This is called when the user began a file transfer, but subsequently canceled. | |
1670 */ | |
1671 static void oscar_file_transfer_cancel(struct gaim_connection *gc, struct file_transfer *xfer) { | |
3630 | 1672 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
1673 struct oscar_file_transfer *oft = find_oft_by_xfer(gc, xfer); | |
1674 | |
1675 if (oft->type == OFT_SENDFILE_IN) | |
1676 aim_denytransfer(od->sess, oft->sn, oft->cookie, | |
1677 AIM_TRANSFER_DENY_DECLINE); | |
1678 | |
1679 od->file_transfers = g_slist_remove(od->file_transfers, oft); | |
1680 aim_conn_kill(od->sess, &oft->conn); | |
1681 g_free(oft->sn); | |
1682 g_free(oft); | |
1683 } | |
1684 | |
3730 | 1685 static int accept_direct_im(struct ask_direct *d) { |
2086 | 1686 struct gaim_connection *gc = d->gc; |
1687 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
1688 struct direct_im *dim; | |
2945 | 1689 char *host; int port = 4443; |
2086 | 1690 int i; |
1691 | |
1692 debug_printf("Accepted DirectIM.\n"); | |
1693 | |
1694 dim = find_direct_im(od, d->sn); | |
1695 if (dim) { | |
3730 | 1696 cancel_direct_im(d); /* 40 */ |
2086 | 1697 return TRUE; |
1698 } | |
1699 dim = g_new0(struct direct_im, 1); | |
1700 dim->gc = d->gc; | |
1701 g_snprintf(dim->name, sizeof dim->name, "%s", d->sn); | |
1702 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1703 dim->conn = aim_directim_connect(od->sess, d->sn, NULL, d->cookie); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1704 if (!dim->conn) { |
2086 | 1705 g_free(dim); |
3730 | 1706 cancel_direct_im(d); |
2086 | 1707 return TRUE; |
1708 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1709 |
2086 | 1710 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, |
1711 gaim_directim_incoming, 0); | |
1712 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, | |
1713 gaim_directim_typing, 0); | |
3033 | 1714 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER, |
2993 | 1715 gaim_update_ui, 0); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1716 for (i = 0; i < (int)strlen(d->ip); i++) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1717 if (d->ip[i] == ':') { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1718 port = atoi(&(d->ip[i+1])); |
2086 | 1719 break; |
1720 } | |
1721 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1722 host = g_strndup(d->ip, i); |
2086 | 1723 dim->conn->status |= AIM_CONN_STATUS_INPROGRESS; |
1724 dim->conn->fd = proxy_connect(host, port, oscar_directim_callback, dim); | |
1725 g_free(host); | |
1726 if (dim->conn->fd < 0) { | |
1727 aim_conn_kill(od->sess, &dim->conn); | |
1728 g_free(dim); | |
3730 | 1729 cancel_direct_im(d); |
2086 | 1730 return TRUE; |
1731 } | |
1732 | |
3730 | 1733 cancel_direct_im(d); |
2086 | 1734 |
1735 return TRUE; | |
1736 } | |
1737 | |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
1738 static int incomingim_chan1(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch1_args *args) { |
3642 | 1739 char *tmp; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1740 struct gaim_connection *gc = sess->aux_data; |
3600 | 1741 struct oscar_data *od = gc->proto_data; |
2273
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
1742 int flags = 0; |
3659 | 1743 int convlen; |
1744 GError *err = NULL; | |
2273
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
1745 |
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
1746 if (args->icbmflags & AIM_IMFLAGS_AWAY) |
0b5c3338fa3d
[gaim-migrate @ 2283]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2249
diff
changeset
|
1747 flags |= IM_FLAG_AWAY; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1748 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1749 if (args->icbmflags & AIM_IMFLAGS_HASICON) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1750 struct icon_req *ir = NULL; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1751 GSList *h = od->hasicons; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1752 char *who = normalize(userinfo->sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1753 debug_printf("%s has an icon\n", userinfo->sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1754 while (h) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1755 ir = h->data; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1756 if (!strcmp(ir->user, who)) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1757 break; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1758 h = h->next; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1759 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1760 if (!h) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1761 ir = g_new0(struct icon_req, 1); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1762 ir->user = g_strdup(who); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1763 od->hasicons = g_slist_append(od->hasicons, ir); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1764 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1765 if ((args->iconlen != ir->length) || |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1766 (args->iconsum != ir->checksum) || |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1767 (args->iconstamp != ir->timestamp)) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1768 ir->request = TRUE; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1769 ir->length = args->iconlen; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1770 ir->checksum = args->iconsum; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1771 ir->timestamp = args->iconstamp; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1772 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1773 |
2336
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
1774 if (gc->user->iconfile[0] && (args->icbmflags & AIM_IMFLAGS_BUDDYREQ)) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1775 FILE *file; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1776 struct stat st; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1777 |
2248
cef6d4e81aec
[gaim-migrate @ 2258]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
1778 if (!stat(gc->user->iconfile, &st)) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1779 char *buf = g_malloc(st.st_size); |
2248
cef6d4e81aec
[gaim-migrate @ 2258]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
1780 file = fopen(gc->user->iconfile, "r"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1781 if (file) { |
2603
24664768a739
[gaim-migrate @ 2616]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2597
diff
changeset
|
1782 int len = fread(buf, 1, st.st_size, file); |
24664768a739
[gaim-migrate @ 2616]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2597
diff
changeset
|
1783 debug_printf("Sending buddy icon to %s (%d bytes, %d reported)\n", |
24664768a739
[gaim-migrate @ 2616]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2597
diff
changeset
|
1784 userinfo->sn, len, st.st_size); |
2673
81d658e6ac1e
[gaim-migrate @ 2686]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2672
diff
changeset
|
1785 aim_send_icon(sess, userinfo->sn, buf, st.st_size, |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1786 st.st_mtime, aim_iconsum(buf, st.st_size)); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1787 fclose(file); |
2336
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
1788 } else |
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
1789 debug_printf("Can't open buddy icon file!\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1790 g_free(buf); |
2336
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
1791 } else |
c6c5eaf69188
[gaim-migrate @ 2349]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2315
diff
changeset
|
1792 debug_printf("Can't stat buddy icon file!\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1793 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1794 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1795 if (args->icbmflags & AIM_IMFLAGS_UNICODE) { |
3722 | 1796 /* This message is marked as UNICODE, so we have to |
1797 * convert it to utf-8 before handing it to the gaim core. | |
1798 * This conversion should *never* fail, if it does it | |
1799 * means that either the incoming ICBM is corrupted or | |
1800 * there is something we don't understand about it. */ | |
1801 /* For the record, AIM Unicode is big-endian UCS-2 */ | |
3659 | 1802 tmp = g_convert(args->msg, args->msglen, "UTF-8", "UCS-2BE", NULL, &convlen, &err); |
1803 if (err) { | |
1804 debug_printf("Unicode IM conversion: %s\n", err->message); | |
1805 tmp = strdup(_("(There was an error receiving this message)")); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1806 } |
3722 | 1807 } else { |
3850 | 1808 /* This will get executed for both AIM_IMFLAGS_ISO_8859_1 and |
3722 | 1809 * unflagged messages, which are ASCII. That's OK because |
1810 * ASCII is a strict subset of ISO-8859-1; this should | |
1811 * help with compatibility with old, broken versions of | |
1812 * gaim (everything before 0.60) and other broken clients | |
1813 * that will happily send ISO-8859-1 without marking it as | |
1814 * such */ | |
3850 | 1815 if (args->icbmflags & AIM_IMFLAGS_ISO_8859_1) { |
1816 debug_printf ("Received ISO-8859-1 IM\n"); | |
1817 } | |
3659 | 1818 tmp = g_convert(args->msg, args->msglen, "UTF-8", "ISO-8859-1", NULL, &convlen, &err); |
1819 if (err) { | |
1820 debug_printf("ISO-8859-1 IM conversion: %s\n", err->message); | |
1821 tmp = strdup(_("(There was an error receiving this message)")); | |
1822 } | |
3642 | 1823 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1824 |
3850 | 1825 if (args->icbmflags & AIM_IMFLAGS_CUSTOMCHARSET) { |
1826 debug_printf ("Custom character set: %d %d\n", args->charset, args->charsubset); | |
1827 } | |
1828 | |
3595 | 1829 if (args->icbmflags & AIM_IMFLAGS_TYPINGNOT) { |
3600 | 1830 char *who = normalize(userinfo->sn); |
1831 if (!g_hash_table_lookup(od->supports_tn, who)) | |
1832 g_hash_table_insert(od->supports_tn, who, who); | |
3595 | 1833 } |
1834 | |
3642 | 1835 //strip_linefeed(tmp); |
2856
b1e300a85678
[gaim-migrate @ 2869]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2833
diff
changeset
|
1836 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
|
1837 g_free(tmp); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1838 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1839 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1840 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1841 |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
1842 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
|
1843 struct gaim_connection *gc = sess->aux_data; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1844 |
2869 | 1845 debug_printf("rendezvous status %d (%s)\n", args->status, userinfo->sn); |
1846 | |
3630 | 1847 |
1848 if (args->status == AIM_RENDEZVOUS_CANCEL) { | |
1849 struct oscar_file_transfer *oft; | |
1850 oft = find_oft_by_cookie(gc, args->cookie); | |
1851 if (oft) { | |
1852 transfer_abort(oft->xfer, _("Buddy canceled transfer")); | |
1853 oscar_file_transfer_disconnect(sess, oft->conn); | |
1854 } | |
1855 return 0; | |
1856 } | |
1857 else if (args->status == AIM_RENDEZVOUS_ACCEPT) { | |
1858 /* The user accepted our transfer request, but we don't | |
1859 * really need to do anything yet. | |
1860 * -- wtm | |
1861 */ | |
1862 return 0; | |
1863 } | |
1864 else if (args->status != AIM_RENDEZVOUS_PROPOSE) { | |
3752 | 1865 debug_printf("unknown rendezvous status\n"); |
2869 | 1866 return 1; |
3630 | 1867 } |
2869 | 1868 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1869 if (args->reqclass & AIM_CAPS_CHAT) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1870 char *name = extract_name(args->info.chat.roominfo.name); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1871 int *exch = g_new0(int, 1); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1872 GList *m = NULL; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1873 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
|
1874 *exch = args->info.chat.roominfo.exchange; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1875 m = g_list_append(m, exch); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1876 serv_got_chat_invite(gc, |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1877 name ? name : args->info.chat.roominfo.name, |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1878 userinfo->sn, |
2869 | 1879 (char *)args->msg, |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1880 m); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1881 if (name) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1882 g_free(name); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1883 } else if (args->reqclass & AIM_CAPS_SENDFILE) { |
3630 | 1884 struct oscar_file_transfer *oft; |
3752 | 1885 struct oscar_data *od = gc->proto_data; |
1886 | |
1887 if ((oft = find_oft_by_cookie(sess->aux_data, args->cookie))) | |
1888 { | |
1889 /* This is a request for a reverse connection, | |
1890 * which is used by newer clients when for some | |
1891 * reason they are unable to connect to our listener | |
1892 * (e.g. they are behind a firewall). | |
1893 */ | |
1894 if (oft->type != OFT_SENDFILE_OUT) | |
1895 return -1; | |
1896 | |
1897 /* It seems that Trillian sends some weird | |
1898 * packets. Sanity check. | |
1899 */ | |
1900 if (!args->verifiedip) | |
1901 return -1; | |
1902 | |
1903 /* This connection isn't used for anything, since | |
1904 * we're using a reverse connection instead. | |
3630 | 1905 */ |
3752 | 1906 gaim_input_remove(oft->watcher); |
1907 aim_conn_kill(sess, &oft->conn); | |
1908 | |
1909 debug_printf("sendfile: doing reverse connection to %s:%d\n", args->verifiedip, args->port); | |
1910 | |
1911 oft->conn = aim_accepttransfer(sess, od->conn, | |
1912 userinfo->sn, | |
1913 args->cookie, args->verifiedip, | |
1914 args->port, | |
1915 AIM_CAPS_SENDFILE); | |
1916 | |
1917 /* XXX: this is a bit of a hack: ideally | |
1918 * we should wait on GAIM_INPUT_WRITE. -- wtm | |
1919 */ | |
1920 aim_conn_completeconnect(sess, oft->conn); | |
1921 | |
1922 oscar_sendfile_request(sess, oft); | |
1923 | |
1924 aim_conn_addhandler(sess, oft->conn, | |
1925 AIM_CB_FAM_OFT, | |
3771 | 1926 AIM_CB_OFT_SENDFILECOMPLETE, |
3752 | 1927 oscar_sendfile_out_done, |
1928 0); | |
1929 aim_conn_addhandler(sess, oft->conn, | |
1930 AIM_CB_FAM_OFT, | |
3771 | 1931 AIM_CB_OFT_SENDFILEFILESEND, |
3752 | 1932 oscar_file_transfer_do, |
1933 0); | |
1934 oft->watcher = gaim_input_add(oft->conn->fd, | |
1935 GAIM_INPUT_READ, oscar_callback, | |
1936 oft->conn); | |
1937 return 0; | |
3630 | 1938 } |
1939 | |
3952 | 1940 /* Someone wants to send a file (or files) to us */ |
3630 | 1941 debug_printf("%s (%s) requests to send a file to %s\n", |
1942 userinfo->sn, args->verifiedip, gc->username); | |
3752 | 1943 |
1944 oft = g_new0(struct oscar_file_transfer, 1); | |
3630 | 1945 |
1946 oft->type = OFT_SENDFILE_IN; | |
1947 oft->sn = g_strdup(userinfo->sn); | |
1948 strncpy(oft->ip, args->verifiedip, sizeof(oft->ip)); | |
1949 oft->port = args->port; | |
1950 memcpy(oft->cookie, args->cookie, 8); | |
1951 | |
3752 | 1952 od->file_transfers = g_slist_append(od->file_transfers, oft); |
3630 | 1953 |
1954 oft->xfer = transfer_in_add(gc, userinfo->sn, | |
1955 args->info.sendfile.filename, | |
1956 args->info.sendfile.totsize, | |
1957 args->info.sendfile.totfiles, | |
1958 args->msg); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1959 } else if (args->reqclass & AIM_CAPS_GETFILE) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1960 } else if (args->reqclass & AIM_CAPS_VOICE) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1961 } else if (args->reqclass & AIM_CAPS_BUDDYICON) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1962 set_icon_data(gc, normalize(userinfo->sn), args->info.icon.icon, |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1963 args->info.icon.length); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1964 } else if (args->reqclass & AIM_CAPS_IMIMAGE) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1965 struct ask_direct *d = g_new0(struct ask_direct, 1); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1966 char buf[256]; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1967 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1968 debug_printf("%s received direct im request from %s (%s)\n", |
2869 | 1969 gc->username, userinfo->sn, args->verifiedip); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1970 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1971 d->gc = gc; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1972 d->sn = g_strdup(userinfo->sn); |
2869 | 1973 strncpy(d->ip, args->verifiedip, sizeof(d->ip)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1974 memcpy(d->cookie, args->cookie, 8); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1975 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
|
1976 userinfo->sn, gc->username); |
3730 | 1977 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); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1978 } else { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1979 debug_printf("Unknown reqclass %d\n", args->reqclass); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1980 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1981 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1982 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1983 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
1984 |
3453 | 1985 /* |
1986 * Next 2 functions are for when other people ask you for authorization | |
1987 */ | |
3730 | 1988 static void gaim_icq_authgrant(struct channel4_data *data) { |
3453 | 1989 char message; |
3141 | 1990 struct oscar_data *od = (struct oscar_data *)data->gc->proto_data; |
1991 message = 0; | |
3453 | 1992 aim_send_im_ch4(od->sess, data->uin, AIM_ICQMSG_AUTHGRANTED, &message); |
1993 show_got_added(data->gc, NULL, data->uin, NULL, NULL); | |
1994 g_free(data->uin); | |
3730 | 1995 g_free(data); |
3141 | 1996 } |
1997 | |
3730 | 1998 static void gaim_icq_authdeny(struct channel4_data *data) { |
1999 gchar *message; | |
2000 struct oscar_data *od = (struct oscar_data *)data->gc->proto_data; | |
2001 message = g_strdup_printf("No reason given."); | |
2002 aim_send_im_ch4(od->sess, data->uin, AIM_ICQMSG_AUTHDENIED, message); | |
2003 g_free(data->uin); | |
2004 g_free(message); | |
3141 | 2005 g_free(data); |
2006 } | |
2007 | |
2008 /* | |
2009 * For when other people ask you for authorization | |
2010 */ | |
2011 static void gaim_icq_authask(struct gaim_connection *gc, fu32_t uin, char *msg) { | |
3453 | 2012 struct channel4_data *data = g_new(struct channel4_data, 1); |
3141 | 2013 /* The first 6 chars of the message are some type of alien gibberish, so skip them */ |
3867 | 2014 char *dialog_msg = g_strdup_printf("The user %lu wants to add you to their buddy list for the following reason: %s", uin, (msg && strlen(msg)>6) ? msg+6 : "No reason given."); |
3159 | 2015 debug_printf("Received an authorization request from UIN %lu\n", uin); |
3141 | 2016 data->gc = gc; |
3453 | 2017 data->uin = g_strdup_printf("%lu", uin); |
3730 | 2018 do_ask_dialog(dialog_msg, (msg && strlen(msg) > 6) ? msg+6 : _("No reason given."), data, _("Authorize"), gaim_icq_authgrant, _("Deny"), gaim_icq_authdeny); |
3141 | 2019 g_free(dialog_msg); |
2020 } | |
2021 | |
3453 | 2022 /* |
2023 * Next 2 functions are for when someone sends you contacts | |
2024 */ | |
3730 | 2025 static void gaim_icq_contactadd(struct channel4_data *data) { |
3453 | 2026 show_add_buddy(data->gc, data->uin, NULL, data->nick); |
3730 | 2027 free(data->uin); |
2028 free(data->nick); | |
2029 g_free(data); | |
3453 | 2030 } |
2031 | |
3730 | 2032 static void gaim_icq_contactdontadd(struct channel4_data *data) { |
3453 | 2033 free(data->uin); |
2034 free(data->nick); | |
2035 g_free(data); | |
2036 } | |
2037 | |
3141 | 2038 static int incomingim_chan4(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch4_args *args) { |
2039 struct gaim_connection *gc = sess->aux_data; | |
2040 | |
3952 | 2041 switch (args->type) { |
3316 | 2042 case 0x0001: { /* An almost-normal instant message. Mac ICQ sends this. It's peculiar. */ |
3453 | 2043 gchar *uin, *message; |
3316 | 2044 uin = g_strdup_printf("%lu", args->uin); |
2045 message = g_strdup(args->msg); | |
2046 strip_linefeed(message); | |
2047 serv_got_im(gc, uin, message, 0, time(NULL), -1); | |
2048 g_free(uin); | |
2049 g_free(message); | |
2050 } break; | |
2051 | |
3453 | 2052 case 0x0004: { /* Someone sent you a URL */ |
2053 gchar **text, *uin, *message; | |
2054 text = g_strsplit(args->msg, "þ", 2); | |
2055 if (text) { | |
2056 uin = g_strdup_printf("%lu", args->uin); | |
2057 message = g_strdup_printf("<A HREF=\"%s\">%s</A>", text[1], text[0]); | |
2058 strip_linefeed(message); | |
2059 serv_got_im(gc, uin, message, 0, time(NULL), -1); | |
2060 g_strfreev(text); | |
2061 g_free(uin); | |
2062 g_free(message); | |
2063 } | |
2064 } break; | |
2065 | |
3141 | 2066 case 0x0006: { /* Someone requested authorization */ |
2067 gaim_icq_authask(gc, args->uin, args->msg); | |
2068 } break; | |
2069 | |
2070 case 0x0007: { /* Someone has denied you authorization */ | |
2071 char *dialog_msg; | |
3159 | 2072 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, args->msg ? args->msg : _("No reason given.")); |
3427 | 2073 do_error_dialog(_("ICQ authorization denied."), dialog_msg, GAIM_ERROR); |
3141 | 2074 g_free(dialog_msg); |
2075 } break; | |
2076 | |
2077 case 0x0008: { /* Someone has granted you authorization */ | |
2078 char *dialog_msg; | |
3159 | 2079 dialog_msg = g_strdup_printf(_("The user %lu has granted your request to add them to your contact list."), args->uin); |
3427 | 2080 do_error_dialog("ICQ authorization accepted.", dialog_msg, GAIM_INFO); |
3141 | 2081 g_free(dialog_msg); |
2082 } break; | |
2083 | |
2084 case 0x0012: { | |
2085 /* Ack for authorizing/denying someone. Or possibly an ack for sending any system notice */ | |
2086 } break; | |
2087 | |
3453 | 2088 case 0x0013: { /* Someone has sent you some ICQ contacts */ |
2089 int i, num; | |
2090 gchar **text; | |
2091 text = g_strsplit(args->msg, "þ", 0); | |
2092 if (text) { | |
2093 num = 0; | |
2094 for (i=0; i<strlen(text[0]); i++) | |
2095 num = num*10 + text[0][i]-48; | |
2096 for (i=0; i<num; i++) { | |
2097 struct channel4_data *data = g_new(struct channel4_data, 1); | |
3730 | 2098 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 | 2099 data->gc = gc; |
2100 data->uin = g_strdup(text[i*2+2]); | |
2101 data->nick = g_strdup(text[i*2+1]); | |
3730 | 2102 do_ask_dialog(message, "Do you want to add this contact to your Buddy List?", data, _("Add"), gaim_icq_contactadd, _("Deny"), gaim_icq_contactdontadd); |
3453 | 2103 g_free(message); |
2104 } | |
2105 g_strfreev(text); | |
2106 } | |
2107 } break; | |
2108 | |
2109 case 0x001a: { /* Someone has requested that you send them from ICQ contacts */ | |
2110 /* This is boring and silly. */ | |
2111 } break; | |
2112 | |
3141 | 2113 default: { |
2114 debug_printf("Received a channel 4 message of unknown type (type 0x%04d).\n", args->type); | |
2115 } break; | |
2116 } | |
2117 | |
2118 return 1; | |
2119 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2120 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2121 static int gaim_parse_incoming_im(aim_session_t *sess, aim_frame_t *fr, ...) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2122 int channel, ret = 0; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2123 aim_userinfo_t *userinfo; |
2086 | 2124 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2125 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2126 va_start(ap, fr); |
2086 | 2127 channel = va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2128 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 2129 |
3141 | 2130 switch (channel) { |
2131 case 1: { /* standard message */ | |
2132 struct aim_incomingim_ch1_args *args; | |
2133 args = va_arg(ap, struct aim_incomingim_ch1_args *); | |
2134 ret = incomingim_chan1(sess, fr->conn, userinfo, args); | |
2135 } break; | |
2136 | |
2137 case 2: { /* rendevous */ | |
2138 struct aim_incomingim_ch2_args *args; | |
2139 args = va_arg(ap, struct aim_incomingim_ch2_args *); | |
2140 ret = incomingim_chan2(sess, fr->conn, userinfo, args); | |
2141 } break; | |
2142 | |
2143 case 4: { /* ICQ */ | |
2144 struct aim_incomingim_ch4_args *args; | |
2145 args = va_arg(ap, struct aim_incomingim_ch4_args *); | |
2146 ret = incomingim_chan4(sess, fr->conn, userinfo, args); | |
2147 } break; | |
2148 | |
2149 default: { | |
2150 debug_printf("ICBM received on unsupported channel (channel 0x%04d).", channel); | |
2151 } break; | |
2086 | 2152 } |
2153 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2154 va_end(ap); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2155 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2156 return ret; |
2086 | 2157 } |
2158 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2159 static int gaim_parse_misses(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2160 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2161 fu16_t chan, nummissed, reason; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2162 aim_userinfo_t *userinfo; |
2086 | 2163 char buf[1024]; |
2164 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2165 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2166 chan = (fu16_t)va_arg(ap, unsigned int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2167 userinfo = va_arg(ap, aim_userinfo_t *); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2168 nummissed = (fu16_t)va_arg(ap, unsigned int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2169 reason = (fu16_t)va_arg(ap, unsigned int); |
2086 | 2170 va_end(ap); |
2171 | |
2172 switch(reason) { | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2173 case 0: |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2174 /* Invalid (0) */ |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2175 g_snprintf(buf, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2176 sizeof(buf), |
2946 | 2177 nummissed == 1 ? |
2947 | 2178 _("You missed %d message from %s because it was invalid.") : |
2179 _("You missed %d messages from %s because they were invalid."), | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2180 nummissed, |
2947 | 2181 userinfo->sn); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2182 break; |
2086 | 2183 case 1: |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2184 /* Message too large */ |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2185 g_snprintf(buf, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2186 sizeof(buf), |
2943 | 2187 nummissed == 1 ? |
2188 _("You missed %d message from %s because it was too large.") : | |
2946 | 2189 _("You missed %d messages from %s because they were too large."), |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2190 nummissed, |
2943 | 2191 userinfo->sn); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2192 break; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2193 case 2: |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2194 /* Rate exceeded */ |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2195 g_snprintf(buf, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2196 sizeof(buf), |
2943 | 2197 nummissed == 1 ? |
2198 _("You missed %d message from %s because the rate limit has been exceeded.") : | |
2199 _("You missed %d messages from %s because the rate limit has been exceeded."), | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2200 nummissed, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2201 userinfo->sn); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2202 break; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2203 case 3: |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2204 /* Evil Sender */ |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2205 g_snprintf(buf, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2206 sizeof(buf), |
2943 | 2207 nummissed == 1 ? |
2947 | 2208 _("You missed %d message from %s because it was too evil.") : |
2943 | 2209 _("You missed %d messages from %s because they are too evil."), |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2210 nummissed, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2211 userinfo->sn); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2212 break; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2213 case 4: |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2214 /* Evil Receiver */ |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2215 g_snprintf(buf, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2216 sizeof(buf), |
2943 | 2217 nummissed == 1 ? |
2218 _("You missed %d message from %s because you are too evil.") : | |
2219 _("You missed %d messages from %s because you are too evil."), | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2220 nummissed, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2221 userinfo->sn); |
2086 | 2222 break; |
2223 default: | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2224 g_snprintf(buf, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2225 sizeof(buf), |
2943 | 2226 nummissed == 1 ? |
2227 _("You missed %d message from %s for unknown reasons.") : | |
2228 _("You missed %d messages from %s for unknown reasons."), | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2229 nummissed, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2230 userinfo->sn); |
2086 | 2231 break; |
2232 } | |
3427 | 2233 do_error_dialog(buf, NULL, GAIM_ERROR); |
2086 | 2234 |
2235 return 1; | |
2236 } | |
2237 | |
3212 | 2238 static char *gaim_icq_status(int state) { |
2239 /* Make a cute little string that shows the status of the dude or dudet */ | |
2240 if (state & AIM_ICQ_STATE_CHAT) | |
2241 return g_strdup_printf("Free For Chat"); | |
2242 else if (state & AIM_ICQ_STATE_DND) | |
2243 return g_strdup_printf("Do Not Disturb"); | |
2244 else if (state & AIM_ICQ_STATE_OUT) | |
2245 return g_strdup_printf("Not Available"); | |
2246 else if (state & AIM_ICQ_STATE_BUSY) | |
2247 return g_strdup_printf("Occupied"); | |
2248 else if (state & AIM_ICQ_STATE_AWAY) | |
2249 return g_strdup_printf("Away"); | |
2250 else if (state & AIM_ICQ_STATE_WEBAWARE) | |
2251 return g_strdup_printf("Web Aware"); | |
2252 else if (state & AIM_ICQ_STATE_INVISIBLE) | |
2253 return g_strdup_printf("Invisible"); | |
2254 else | |
2255 return g_strdup_printf("Online"); | |
2256 } | |
2257 | |
3630 | 2258 static int gaim_parse_clientauto_rend(aim_session_t *sess, |
2259 const char *who, int reason, const char *cookie) { | |
2260 struct gaim_connection *gc = sess->aux_data; | |
2261 struct oscar_file_transfer *oft; | |
2262 char *buf; | |
2263 | |
2264 switch (reason) { | |
2265 case 3: /* Decline sendfile. */ | |
2266 oft = find_oft_by_cookie(gc, cookie); | |
2267 | |
2268 if (oft) { | |
2269 buf = g_strdup_printf(_("%s has declined to receive a file from %s.\n"), | |
2270 who, gc->username); | |
2271 transfer_abort(oft->xfer, buf); | |
2272 g_free(buf); | |
2273 oscar_file_transfer_disconnect(sess, oft->conn); | |
2274 } | |
2275 break; | |
2276 default: | |
2277 debug_printf("Received an unknown rendezvous client auto-response from %s. Type 0x%04x\n", who, reason); | |
2278 | |
2279 } | |
2280 | |
2281 return 0; | |
2282 } | |
2283 | |
3212 | 2284 static int gaim_parse_clientauto(aim_session_t *sess, aim_frame_t *fr, ...) { |
2285 struct gaim_connection *gc = sess->aux_data; | |
2286 va_list ap; | |
2287 fu16_t chan, reason; | |
2288 char *who; | |
2289 | |
2290 va_start(ap, fr); | |
2291 chan = (fu16_t)va_arg(ap, unsigned int); | |
2292 who = va_arg(ap, char *); | |
2293 reason = (fu16_t)va_arg(ap, unsigned int); | |
2294 | |
3952 | 2295 if (chan == 0x0002) { /* File transfer declined */ |
3630 | 2296 char *cookie = va_arg(ap, char *); |
3952 | 2297 return gaim_parse_clientauto_rend(sess, who, reason, cookie); |
2298 } else if (chan == 0x0004) { /* ICQ message */ | |
2299 switch(reason) { | |
2300 case 0x0003: { /* Reply from an ICQ status message request */ | |
2301 int state = (int)va_arg(ap, fu32_t); | |
2302 char *msg = va_arg(ap, char *); | |
2303 char *status_msg = gaim_icq_status(state); | |
2304 char *dialog_msg, **splitmsg; | |
2305 struct oscar_data *od = gc->proto_data; | |
2306 GSList *l = od->evilhack; | |
2307 gboolean evilhack = FALSE; | |
2308 | |
2309 /* Split at (carriage return/newline)'s, then rejoin later with BRs between. */ | |
2310 splitmsg = g_strsplit(msg, "\r\n", 0); | |
2311 | |
2312 /* If who is in od->evilhack, then we're just getting the away message, otherwise this | |
2313 * will just get appended to the info box (which is already showing). */ | |
2314 while (l) { | |
2315 char *x = l->data; | |
2316 if (!strcmp(x, normalize(who))) { | |
2317 evilhack = TRUE; | |
2318 g_free(x); | |
2319 od->evilhack = g_slist_remove(od->evilhack, x); | |
2320 break; | |
2321 } | |
2322 l = l->next; | |
3212 | 2323 } |
3952 | 2324 |
2325 if (evilhack) | |
2326 dialog_msg = g_strdup_printf(_("<B>UIN:</B> %s<BR><B>Status:</B> %s<BR><HR>%s<BR>"), who, status_msg, g_strjoinv("<BR>", splitmsg)); | |
2327 else | |
2328 dialog_msg = g_strdup_printf(_("<B>Status:</B> %s<BR><HR>%s<BR>"), status_msg, g_strjoinv("<BR>", splitmsg)); | |
2329 g_show_info_text(gc, who, 2, dialog_msg, NULL); | |
2330 | |
2331 g_free(status_msg); | |
2332 g_free(dialog_msg); | |
2333 g_strfreev(splitmsg); | |
2334 } break; | |
2335 | |
2336 default: { | |
2337 debug_printf("Received an unknown client auto-response from %s. Type 0x%04x\n", who, reason); | |
2338 } break; | |
2339 } /* end of switch */ | |
2340 | |
2341 } /* end of if */ | |
2342 | |
3212 | 2343 va_end(ap); |
2344 | |
2345 return 1; | |
2346 } | |
2347 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2348 static int gaim_parse_genericerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2349 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2350 fu16_t reason; |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
2351 char *m; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2352 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2353 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2354 reason = (fu16_t)va_arg(ap, unsigned int); |
2086 | 2355 va_end(ap); |
2356 | |
2864
e22c09351e67
[gaim-migrate @ 2877]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2856
diff
changeset
|
2357 debug_printf("snac threw error (reason 0x%04x: %s)\n", reason, |
2086 | 2358 (reason < msgerrreasonlen) ? msgerrreason[reason] : "unknown"); |
2359 | |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
2360 m = g_strdup_printf(_("SNAC threw error: %s\n"), |
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
2361 reason < msgerrreasonlen ? msgerrreason[reason] : "Unknown error"); |
3427 | 2362 do_error_dialog(m, NULL, GAIM_ERROR); |
2865
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
2363 g_free(m); |
88dc3623a2ae
[gaim-migrate @ 2878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2864
diff
changeset
|
2364 |
2086 | 2365 return 1; |
2366 } | |
2367 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2368 static int gaim_parse_msgerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2369 va_list ap; |
3752 | 2370 char *data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2371 fu16_t reason; |
2086 | 2372 char buf[1024]; |
3752 | 2373 struct gaim_connection *gc = sess->aux_data; |
2374 struct oscar_file_transfer *oft; | |
2375 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2376 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2377 reason = (fu16_t)va_arg(ap, unsigned int); |
3752 | 2378 data = va_arg(ap, char *); |
2086 | 2379 va_end(ap); |
2380 | |
3752 | 2381 /* If this was a file transfer request, data is a cookie. */ |
2382 if ((oft = find_oft_by_cookie(gc, data))) { | |
3630 | 2383 transfer_abort(oft->xfer, |
2384 (reason < msgerrreasonlen) ? msgerrreason[reason] : _("No reason was given.")); | |
2385 | |
2386 oscar_file_transfer_disconnect(sess, oft->conn); | |
2387 return 1; | |
2388 } | |
2389 | |
3752 | 2390 /* Data is assumed to be the destination sn. */ |
2391 snprintf(buf, sizeof(buf), _("Your message to %s did not get sent:"), data); | |
3427 | 2392 do_error_dialog(buf, (reason < msgerrreasonlen) ? msgerrreason[reason] : _("No reason was given."), GAIM_ERROR); |
2086 | 2393 |
2394 return 1; | |
2395 } | |
2396 | |
3595 | 2397 static int gaim_parse_mtn(aim_session_t *sess, aim_frame_t *fr, ...) { |
2398 struct gaim_connection *gc = sess->aux_data; | |
2399 va_list ap; | |
2400 fu16_t type1, type2; | |
2401 char *sn; | |
2402 | |
2403 va_start(ap, fr); | |
2404 type1 = (fu16_t)va_arg(ap, unsigned int); | |
2405 sn = va_arg(ap, char *); | |
2406 type2 = (fu16_t)va_arg(ap, unsigned int); | |
2407 va_end(ap); | |
2408 | |
2409 debug_printf("Received an mtn from %s. Type1 is 0x%04d and type2 is 0x%04d.\n", sn, type1, type2); | |
2410 | |
2411 switch (type2) { | |
2412 case 0x0000: { /* Text has been cleared */ | |
2413 serv_got_typing_stopped(gc, sn); | |
2414 } break; | |
2415 | |
2416 case 0x0001: { /* Paused typing */ | |
3768 | 2417 serv_got_typing(gc, sn, 0, TYPED); |
3595 | 2418 } break; |
2419 | |
2420 case 0x0002: { /* Typing */ | |
3768 | 2421 serv_got_typing(gc, sn, 0, TYPING); |
3595 | 2422 } break; |
2423 | |
2424 default: { | |
2425 printf("Received unknown typing notification type.\n"); | |
2426 } break; | |
2427 } | |
2428 | |
2429 return 1; | |
2430 } | |
2431 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2432 static int gaim_parse_locerr(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2433 va_list ap; |
2434 char *destn; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2435 fu16_t reason; |
2086 | 2436 char buf[1024]; |
2437 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2438 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2439 reason = (fu16_t)va_arg(ap, unsigned int); |
2086 | 2440 destn = va_arg(ap, char *); |
2441 va_end(ap); | |
2442 | |
3574 | 2443 snprintf(buf, sizeof(buf), _("User information for %s unavailable:"), destn); |
3427 | 2444 do_error_dialog(buf, (reason < msgerrreasonlen) ? msgerrreason[reason] : _("No reason was given."), GAIM_ERROR); |
2086 | 2445 |
2446 return 1; | |
2447 } | |
2448 | |
2449 static char *images(int flags) { | |
2450 static char buf[1024]; | |
3101 | 2451 g_snprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s", |
2679 | 2452 (flags & AIM_FLAG_ACTIVEBUDDY) ? "<IMG SRC=\"ab_icon.gif\">" : "", |
2086 | 2453 (flags & AIM_FLAG_UNCONFIRMED) ? "<IMG SRC=\"dt_icon.gif\">" : "", |
2454 (flags & AIM_FLAG_AOL) ? "<IMG SRC=\"aol_icon.gif\">" : "", | |
3101 | 2455 (flags & AIM_FLAG_ICQ) ? "<IMG SRC=\"icq_icon.gif\">" : "", |
2086 | 2456 (flags & AIM_FLAG_ADMINISTRATOR) ? "<IMG SRC=\"admin_icon.gif\">" : "", |
3079 | 2457 (flags & AIM_FLAG_FREE) ? "<IMG SRC=\"free_icon.gif\">" : "", |
2458 (flags & AIM_FLAG_WIRELESS) ? "<IMG SRC=\"wireless_icon.gif\">" : ""); | |
2086 | 2459 return buf; |
2460 } | |
2461 | |
3101 | 2462 |
2920 | 2463 /* XXX This is horribly copied from ../../buddy.c. */ |
2464 static char *caps_string(guint caps) | |
2465 { | |
2466 static char buf[512], *tmp; | |
2467 int count = 0, i = 0; | |
2468 guint bit = 1; | |
2469 while (bit <= 0x10000) { | |
2470 if (bit & caps) { | |
2471 switch (bit) { | |
2472 case 0x1: | |
2473 tmp = _("Buddy Icon"); | |
2474 break; | |
2475 case 0x2: | |
2476 tmp = _("Voice"); | |
2477 break; | |
2478 case 0x4: | |
2479 tmp = _("IM Image"); | |
2480 break; | |
2481 case 0x8: | |
2482 tmp = _("Chat"); | |
2483 break; | |
2484 case 0x10: | |
2485 tmp = _("Get File"); | |
2486 break; | |
2487 case 0x20: | |
2488 tmp = _("Send File"); | |
2489 break; | |
2490 case 0x40: | |
2491 case 0x200: | |
2492 tmp = _("Games"); | |
2493 break; | |
2494 case 0x80: | |
2495 tmp = _("Stocks"); | |
2496 break; | |
2497 case 0x100: | |
2498 tmp = _("Send Buddy List"); | |
2499 break; | |
2500 case 0x400: | |
2501 tmp = _("EveryBuddy Bug"); | |
2502 break; | |
2503 case 0x800: | |
2504 tmp = _("AP User"); | |
2505 break; | |
2506 case 0x1000: | |
2507 tmp = _("ICQ RTF"); | |
2508 break; | |
2509 case 0x2000: | |
2510 tmp = _("Nihilist"); | |
2511 break; | |
2512 case 0x4000: | |
2513 tmp = _("ICQ Server Relay"); | |
2514 break; | |
2515 case 0x8000: | |
2516 tmp = _("ICQ Unknown"); | |
2517 break; | |
2518 case 0x10000: | |
2519 tmp = _("Trillian Encryption"); | |
2520 break; | |
2521 default: | |
2522 tmp = NULL; | |
2523 break; | |
2524 } | |
2525 if (tmp) | |
2526 i += g_snprintf(buf + i, sizeof(buf) - i, "%s%s", (count ? ", " : ""), | |
2527 tmp); | |
2528 count++; | |
2529 } | |
2530 bit <<= 1; | |
2531 } | |
2532 return buf; | |
2533 } | |
2534 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2535 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
|
2536 aim_userinfo_t *info; |
2086 | 2537 char *prof_enc = NULL, *prof = NULL; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2538 fu16_t infotype; |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2539 char header[BUF_LONG]; |
2137
18722ae5b882
[gaim-migrate @ 2147]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2131
diff
changeset
|
2540 char legend[BUF_LONG]; |
2086 | 2541 struct gaim_connection *gc = sess->aux_data; |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2542 struct oscar_data *od = gc->proto_data; |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2543 GSList *l = od->evilhack; |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2544 gboolean evilhack = FALSE; |
2086 | 2545 va_list ap; |
2993 | 2546 gchar *membersince = NULL, *onlinesince = NULL, *idle = NULL; |
2086 | 2547 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2548 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2549 info = va_arg(ap, aim_userinfo_t *); |
2920 | 2550 infotype = (fu16_t)va_arg(ap, unsigned int); |
2086 | 2551 prof_enc = va_arg(ap, char *); |
2552 prof = va_arg(ap, char *); | |
2553 va_end(ap); | |
2554 | |
3101 | 2555 if (!od->icq) { |
2556 g_snprintf(legend, sizeof legend, | |
3952 | 2557 _("<BODY BGCOLOR=WHITE><hr><I>Legend:</I><br><br>" |
3101 | 2558 "<IMG SRC=\"free_icon.gif\"> : Normal AIM User<br>" |
2559 "<IMG SRC=\"aol_icon.gif\"> : AOL User <br>" | |
2560 "<IMG SRC=\"dt_icon.gif\"> : Trial AIM User <br>" | |
2561 "<IMG SRC=\"admin_icon.gif\"> : Administrator <br>" | |
2562 "<IMG SRC=\"ab_icon.gif\"> : ActiveBuddy Interactive Agent<br>" | |
2563 "<IMG SRC=\"wireless_icon.gif\"> : Wireless Device User<br>")); | |
3106 | 2564 } else { |
2565 legend[0] = 0; | |
3101 | 2566 } |
2567 | |
2993 | 2568 if (info->present & AIM_USERINFO_PRESENT_ONLINESINCE) { |
2569 onlinesince = g_strdup_printf("Online Since : <B>%s</B><BR>\n", | |
2570 asctime(localtime(&info->onlinesince))); | |
2571 } | |
2572 | |
2573 if (info->present & AIM_USERINFO_PRESENT_MEMBERSINCE) { | |
2574 membersince = g_strdup_printf("Member Since : <B>%s</B><BR>\n", | |
2575 asctime(localtime(&info->membersince))); | |
2576 } | |
2577 | |
2578 if (info->present & AIM_USERINFO_PRESENT_IDLE) { | |
2579 idle = g_strdup_printf("Idle : <B>%d minutes</B>", | |
2580 info->idletime); | |
2581 } else | |
2582 idle = g_strdup("Idle: <B>Active</B>"); | |
2583 | |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2584 g_snprintf(header, sizeof header, |
2086 | 2585 _("Username : <B>%s</B> %s <BR>\n" |
2993 | 2586 "Warning Level : <B>%d %%</B><BR>\n" |
2086 | 2587 "%s" |
2993 | 2588 "%s" |
2589 "%s<BR>\n" | |
3952 | 2590 "<HR>\n"), |
2086 | 2591 info->sn, images(info->flags), |
2592 info->warnlevel/10, | |
2993 | 2593 onlinesince ? onlinesince : "", |
2594 membersince ? membersince : "", | |
2595 idle ? idle : ""); | |
2596 | |
2597 g_free(onlinesince); | |
2598 g_free(membersince); | |
2599 g_free(idle); | |
2773
a0fd8f91e294
[gaim-migrate @ 2786]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2768
diff
changeset
|
2600 |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2601 while (l) { |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2602 char *x = l->data; |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2603 if (!strcmp(x, normalize(info->sn))) { |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2604 evilhack = TRUE; |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2605 g_free(x); |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2606 od->evilhack = g_slist_remove(od->evilhack, x); |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2607 break; |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2608 } |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2609 l = l->next; |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2610 } |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2611 |
2920 | 2612 if (infotype == AIM_GETINFO_AWAYMESSAGE) { |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2613 if (evilhack) { |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2614 g_show_info_text(gc, info->sn, 2, |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2615 header, |
2797
ccb5b2f05d16
[gaim-migrate @ 2810]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
2616 (prof && *prof) ? away_subs(prof, gc->username) : |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2617 _("<i>User has no away message</i>"), |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2618 legend, NULL); |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2619 } else { |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2620 g_show_info_text(gc, info->sn, 0, |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2621 header, |
2797
ccb5b2f05d16
[gaim-migrate @ 2810]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
2622 (prof && *prof) ? away_subs(prof, gc->username) : NULL, |
3952 | 2623 (prof && *prof) ? "<BR><HR>" : NULL, |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2624 NULL); |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2625 } |
2920 | 2626 } else if (infotype == AIM_GETINFO_CAPABILITIES) { |
2627 g_show_info_text(gc, info->sn, 2, | |
2628 header, | |
2629 "<i>", _("Client Capabilities: "), | |
2630 caps_string(info->capabilities), | |
2631 "</i>", | |
2632 legend, | |
2633 NULL); | |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2634 } else { |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2635 g_show_info_text(gc, info->sn, 1, |
2797
ccb5b2f05d16
[gaim-migrate @ 2810]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
2636 (prof && *prof) ? away_subs(prof, gc->username) : |
ccb5b2f05d16
[gaim-migrate @ 2810]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
2637 _("<i>No Information Provided</i>"), |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2638 legend, |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2639 NULL); |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
2640 } |
2086 | 2641 |
2642 return 1; | |
2643 } | |
2644 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2645 static int gaim_parse_motd(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2646 char *msg; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2647 fu16_t id; |
2086 | 2648 va_list ap; |
2649 char buildbuf[150]; | |
2650 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2651 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2652 id = (fu16_t)va_arg(ap, unsigned int); |
2086 | 2653 msg = va_arg(ap, char *); |
2654 va_end(ap); | |
2655 | |
2656 aim_getbuildstring(buildbuf, sizeof(buildbuf)); | |
2657 | |
2658 debug_printf("MOTD: %s (%d)\n", msg ? msg : "Unknown", id); | |
2092
59b0377d18aa
[gaim-migrate @ 2102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
2659 if (id < 4) |
3427 | 2660 do_error_dialog(_("Your AIM connection may be lost."), NULL, GAIM_WARNING); |
2086 | 2661 |
2662 return 1; | |
2663 } | |
2664 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2665 static int gaim_chatnav_info(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2666 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2667 fu16_t type; |
2086 | 2668 struct gaim_connection *gc = sess->aux_data; |
2669 struct oscar_data *odata = (struct oscar_data *)gc->proto_data; | |
2670 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2671 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2672 type = (fu16_t)va_arg(ap, unsigned int); |
2086 | 2673 |
2674 switch(type) { | |
2675 case 0x0002: { | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2676 fu8_t maxrooms; |
2086 | 2677 struct aim_chat_exchangeinfo *exchanges; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2678 int exchangecount, i; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2679 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2680 maxrooms = (fu8_t)va_arg(ap, unsigned int); |
2086 | 2681 exchangecount = va_arg(ap, int); |
2682 exchanges = va_arg(ap, struct aim_chat_exchangeinfo *); | |
2683 va_end(ap); | |
2684 | |
2685 debug_printf("chat info: Chat Rights:\n"); | |
2686 debug_printf("chat info: \tMax Concurrent Rooms: %d\n", maxrooms); | |
2687 debug_printf("chat info: \tExchange List: (%d total)\n", exchangecount); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2688 for (i = 0; i < exchangecount; i++) |
2931 | 2689 debug_printf("chat info: \t\t%d %s\n", exchanges[i].number, exchanges[i].name ? exchanges[i].name : ""); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
2690 while (odata->create_rooms) { |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
2691 struct create_room *cr = odata->create_rooms->data; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
2692 debug_printf("creating room %s\n", cr->name); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
2693 aim_chatnav_createroom(sess, fr->conn, cr->name, cr->exchange); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
2694 g_free(cr->name); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
2695 odata->create_rooms = g_slist_remove(odata->create_rooms, cr); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
2696 g_free(cr); |
2086 | 2697 } |
2698 } | |
2699 break; | |
2700 case 0x0008: { | |
2701 char *fqcn, *name, *ck; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2702 fu16_t instance, flags, maxmsglen, maxoccupancy, unknown, exchange; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2703 fu8_t createperms; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2704 fu32_t createtime; |
2086 | 2705 |
2706 fqcn = va_arg(ap, char *); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2707 instance = (fu16_t)va_arg(ap, unsigned int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2708 exchange = (fu16_t)va_arg(ap, unsigned int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2709 flags = (fu16_t)va_arg(ap, unsigned int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2710 createtime = va_arg(ap, fu32_t); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2711 maxmsglen = (fu16_t)va_arg(ap, unsigned int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2712 maxoccupancy = (fu16_t)va_arg(ap, unsigned int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2713 createperms = (fu8_t)va_arg(ap, int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2714 unknown = (fu16_t)va_arg(ap, unsigned int); |
2086 | 2715 name = va_arg(ap, char *); |
2716 ck = va_arg(ap, char *); | |
2717 va_end(ap); | |
2718 | |
2719 debug_printf("created room: %s %d %d %d %lu %d %d %d %d %s %s\n", | |
2720 fqcn, | |
2721 exchange, instance, flags, | |
2722 createtime, | |
2723 maxmsglen, maxoccupancy, createperms, unknown, | |
2724 name, ck); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2725 aim_chat_join(odata->sess, odata->conn, exchange, ck, instance); |
2086 | 2726 } |
2727 break; | |
2728 default: | |
2729 va_end(ap); | |
2730 debug_printf("chatnav info: unknown type (%04x)\n", type); | |
2731 break; | |
2732 } | |
2733 return 1; | |
2734 } | |
2735 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2736 static int gaim_chat_join(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2737 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2738 int count, i; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2739 aim_userinfo_t *info; |
2086 | 2740 struct gaim_connection *g = sess->aux_data; |
2741 | |
2742 struct chat_connection *c = NULL; | |
2743 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2744 va_start(ap, fr); |
2086 | 2745 count = va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2746 info = va_arg(ap, aim_userinfo_t *); |
2086 | 2747 va_end(ap); |
2748 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2749 c = find_oscar_chat_by_conn(g, fr->conn); |
2086 | 2750 if (!c) |
2751 return 1; | |
2752 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2753 for (i = 0; i < count; i++) |
3708 | 2754 add_chat_buddy(c->cnv, info[i].sn, NULL); |
2086 | 2755 |
2756 return 1; | |
2757 } | |
2758 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2759 static int gaim_chat_leave(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2760 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2761 int count, i; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2762 aim_userinfo_t *info; |
2086 | 2763 struct gaim_connection *g = sess->aux_data; |
2764 | |
2765 struct chat_connection *c = NULL; | |
2766 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2767 va_start(ap, fr); |
2086 | 2768 count = va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2769 info = va_arg(ap, aim_userinfo_t *); |
2086 | 2770 va_end(ap); |
2771 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2772 c = find_oscar_chat_by_conn(g, fr->conn); |
2086 | 2773 if (!c) |
2774 return 1; | |
2775 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2776 for (i = 0; i < count; i++) |
2820
b917845dad3c
[gaim-migrate @ 2833]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2817
diff
changeset
|
2777 remove_chat_buddy(c->cnv, info[i].sn, NULL); |
2086 | 2778 |
2779 return 1; | |
2780 } | |
2781 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2782 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
|
2783 va_list ap; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2784 aim_userinfo_t *userinfo; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2785 struct aim_chat_roominfo *roominfo; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2786 char *roomname; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2787 int usercount; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2788 char *roomdesc; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2789 fu16_t unknown_c9, unknown_d2, unknown_d5, maxmsglen, maxvisiblemsglen; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2790 fu32_t creationtime; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2791 struct gaim_connection *gc = sess->aux_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2792 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
|
2793 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2794 va_start(ap, fr); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2795 roominfo = va_arg(ap, struct aim_chat_roominfo *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2796 roomname = va_arg(ap, char *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2797 usercount= va_arg(ap, int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2798 userinfo = va_arg(ap, aim_userinfo_t *); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2799 roomdesc = va_arg(ap, char *); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2800 unknown_c9 = (fu16_t)va_arg(ap, int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2801 creationtime = (fu32_t)va_arg(ap, unsigned long); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2802 maxmsglen = (fu16_t)va_arg(ap, int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2803 unknown_d2 = (fu16_t)va_arg(ap, int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2804 unknown_d5 = (fu16_t)va_arg(ap, int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2805 maxvisiblemsglen = (fu16_t)va_arg(ap, int); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2806 va_end(ap); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2807 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2808 debug_printf("inside chat_info_update (maxmsglen = %d, maxvislen = %d)\n", |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2809 maxmsglen, maxvisiblemsglen); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2810 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2811 ccon->maxlen = maxmsglen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2812 ccon->maxvis = maxvisiblemsglen; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
2813 |
2086 | 2814 return 1; |
2815 } | |
2816 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2817 static int gaim_chat_incoming_msg(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2818 va_list ap; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2819 aim_userinfo_t *info; |
2086 | 2820 char *msg; |
2821 struct gaim_connection *gc = sess->aux_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2822 struct chat_connection *ccon = find_oscar_chat_by_conn(gc, fr->conn); |
2086 | 2823 char *tmp; |
2824 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2825 va_start(ap, fr); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2826 info = va_arg(ap, aim_userinfo_t *); |
2086 | 2827 msg = va_arg(ap, char *); |
2828 | |
2829 tmp = g_malloc(BUF_LONG); | |
2830 g_snprintf(tmp, BUF_LONG, "%s", msg); | |
2831 serv_got_chat_in(gc, ccon->id, info->sn, 0, tmp, time((time_t)NULL)); | |
2832 g_free(tmp); | |
2833 | |
2834 return 1; | |
2835 } | |
2836 | |
3694 | 2837 static int gaim_email_parseupdate(aim_session_t *sess, aim_frame_t *fr, ...) { |
2838 va_list ap; | |
2839 struct gaim_connection *gc = sess->aux_data; | |
2840 struct aim_emailinfo *emailinfo; | |
3725 | 2841 int havenewmail; |
3694 | 2842 |
2843 va_start(ap, fr); | |
2844 emailinfo = va_arg(ap, struct aim_emailinfo *); | |
3725 | 2845 havenewmail = va_arg(ap, int); |
3694 | 2846 va_end(ap); |
2847 | |
3725 | 2848 if (emailinfo) { |
2849 debug_printf("Got email info. webmail address for screenname@%s is %s, new email: %hd, number new: %d, flag is %d, havenewmail is %d\n", emailinfo->domain, emailinfo->url, emailinfo->unread, emailinfo->nummsgs, emailinfo->flag, havenewmail); | |
2850 if (emailinfo->unread) { | |
2851 if (havenewmail) | |
2852 connection_has_mail(gc, emailinfo->nummsgs ? emailinfo->nummsgs : -1, NULL, NULL, emailinfo->url); | |
2853 } else | |
3694 | 2854 connection_has_mail(gc, 0, NULL, NULL, emailinfo->url); |
2855 } | |
2856 | |
2857 return 1; | |
2858 } | |
2859 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2860 /* |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2861 * 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
|
2862 */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2863 static int gaim_parse_msgack(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2864 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2865 fu16_t type; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2866 char *sn; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2867 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2868 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2869 type = (fu16_t)va_arg(ap, unsigned int); |
2086 | 2870 sn = va_arg(ap, char *); |
2871 va_end(ap); | |
2872 | |
2873 debug_printf("Sent message to %s.\n", sn); | |
2874 | |
2875 return 1; | |
2876 } | |
2877 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2878 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
|
2879 static const char *codes[5] = { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2880 "invalid", |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2881 "change", |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2882 "warning", |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2883 "limit", |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2884 "limit cleared", |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2885 }; |
2086 | 2886 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2887 fu16_t code, rateclass; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2888 fu32_t windowsize, clear, alert, limit, disconnect, currentavg, maxavg; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2889 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2890 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2891 code = (fu16_t)va_arg(ap, unsigned int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2892 rateclass= (fu16_t)va_arg(ap, unsigned int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2893 windowsize = (fu32_t)va_arg(ap, unsigned long); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2894 clear = (fu32_t)va_arg(ap, unsigned long); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2895 alert = (fu32_t)va_arg(ap, unsigned long); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2896 limit = (fu32_t)va_arg(ap, unsigned long); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2897 disconnect = (fu32_t)va_arg(ap, unsigned long); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2898 currentavg = (fu32_t)va_arg(ap, unsigned long); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2899 maxavg = (fu32_t)va_arg(ap, unsigned long); |
2086 | 2900 va_end(ap); |
2901 | |
2902 debug_printf("rate %s (paramid 0x%04lx): curavg = %ld, maxavg = %ld, alert at %ld, " | |
2903 "clear warning at %ld, limit at %ld, disconnect at %ld (window size = %ld)\n", | |
2904 (code < 5) ? codes[code] : codes[0], | |
2905 rateclass, | |
2906 currentavg, maxavg, | |
2907 alert, clear, | |
2908 limit, disconnect, | |
2909 windowsize); | |
2910 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2911 /* XXX fix these values */ |
2086 | 2912 if (code == AIM_RATE_CODE_CHANGE) { |
2913 if (currentavg >= clear) | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2914 aim_conn_setlatency(fr->conn, 0); |
2086 | 2915 } else if (code == AIM_RATE_CODE_WARNING) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2916 aim_conn_setlatency(fr->conn, windowsize/4); |
2909
48ec70928d7f
[gaim-migrate @ 2922]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2906
diff
changeset
|
2917 } else if (code == AIM_RATE_CODE_LIMIT) { |
3427 | 2918 do_error_dialog(_("Rate limiting error."), |
2919 _("The last message was not sent because you are over the rate limit. " | |
2920 "Please wait 10 seconds and try again."), GAIM_ERROR); | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2921 aim_conn_setlatency(fr->conn, windowsize/2); |
2086 | 2922 } else if (code == AIM_RATE_CODE_CLEARLIMIT) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2923 aim_conn_setlatency(fr->conn, 0); |
2086 | 2924 } |
2925 | |
2926 return 1; | |
2927 } | |
2928 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2929 static int gaim_parse_evilnotify(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 2930 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2931 fu16_t newevil; |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2932 aim_userinfo_t *userinfo; |
2086 | 2933 struct gaim_connection *gc = sess->aux_data; |
2934 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2935 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2936 newevil = (fu16_t)va_arg(ap, unsigned int); |
2421
95b4ec08abec
[gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2411
diff
changeset
|
2937 userinfo = va_arg(ap, aim_userinfo_t *); |
2086 | 2938 va_end(ap); |
2939 | |
2940 serv_got_eviled(gc, (userinfo && userinfo->sn[0]) ? userinfo->sn : NULL, newevil / 10); | |
2941 | |
2942 return 1; | |
2943 } | |
2944 | |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2945 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
|
2946 va_list ap; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2947 aim_userinfo_t *info; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2948 struct gaim_connection *gc = sess->aux_data; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2949 |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2950 va_start(ap, fr); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2951 info = va_arg(ap, aim_userinfo_t *); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2952 va_end(ap); |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2953 |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2954 gc->evil = info->warnlevel/10; |
2698
e80f4b4f840f
[gaim-migrate @ 2711]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2689
diff
changeset
|
2955 /* gc->correction_time = (info->onlinesince - gc->login_time); */ |
2507
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2956 |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2957 return 1; |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2958 } |
1069b0940237
[gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
2959 |
2675 | 2960 static int conninitdone_bos(aim_session_t *sess, aim_frame_t *fr, ...) { |
3458 | 2961 struct gaim_connection *gc = sess->aux_data; |
2962 struct oscar_data *od = gc->proto_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2963 |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
2964 aim_reqpersonalinfo(sess, fr->conn); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2965 aim_bos_reqlocaterights(sess, fr->conn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2966 aim_bos_reqbuddyrights(sess, fr->conn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2967 |
2673
81d658e6ac1e
[gaim-migrate @ 2686]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2672
diff
changeset
|
2968 aim_reqicbmparams(sess); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2969 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2970 aim_bos_reqrights(sess, fr->conn); |
3458 | 2971 if (od->icq) { |
2972 aim_bos_setgroupperm(sess, fr->conn, AIM_FLAG_ALLUSERS); | |
2973 aim_bos_setprivacyflags(sess, fr->conn, AIM_PRIVFLAGS_ALLOWIDLE | | |
2974 AIM_PRIVFLAGS_ALLOWMEMBERSINCE); | |
2975 } | |
2086 | 2976 |
2977 return 1; | |
2978 } | |
2979 | |
2675 | 2980 static int conninitdone_admin(aim_session_t *sess, aim_frame_t *fr, ...) { |
2647 | 2981 struct gaim_connection *gc = sess->aux_data; |
2982 struct oscar_data *od = gc->proto_data; | |
2983 | |
2672 | 2984 aim_clientready(sess, fr->conn); |
2675 | 2985 debug_printf("connected to admin\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
2986 |
2647 | 2987 if (od->chpass) { |
2988 debug_printf("changing password\n"); | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
2989 aim_admin_changepasswd(sess, fr->conn, od->newp, od->oldp); |
2647 | 2990 g_free(od->oldp); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
2991 od->oldp = NULL; |
2647 | 2992 g_free(od->newp); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
2993 od->newp = NULL; |
2647 | 2994 od->chpass = FALSE; |
2995 } | |
2979 | 2996 if (od->setnick) { |
2997 debug_printf("formatting screenname\n"); | |
2998 aim_admin_setnick(sess, fr->conn, od->newsn); | |
2999 g_free(od->newsn); | |
3000 od->newsn = NULL; | |
3001 od->setnick = FALSE; | |
3002 } | |
2647 | 3003 if (od->conf) { |
3004 debug_printf("confirming account\n"); | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3005 aim_admin_reqconfirm(sess, fr->conn); |
2647 | 3006 od->conf = FALSE; |
3007 } | |
3008 if (od->reqemail) { | |
3009 debug_printf("requesting email\n"); | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3010 aim_admin_getinfo(sess, fr->conn, 0x0011); |
2647 | 3011 od->reqemail = FALSE; |
3012 } | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3013 if (od->setemail) { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3014 debug_printf("setting email\n"); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3015 aim_admin_setemail(sess, fr->conn, od->email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3016 g_free(od->email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3017 od->setemail = FALSE; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3018 } |
2647 | 3019 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3020 return 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3021 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3022 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3023 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
|
3024 struct aim_icbmparameters *params; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3025 va_list ap; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3026 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3027 va_start(ap, fr); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3028 params = va_arg(ap, struct aim_icbmparameters *); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3029 va_end(ap); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3030 |
2427
5bc3b39fc0a5
[gaim-migrate @ 2440]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2421
diff
changeset
|
3031 /* evidently this crashes on solaris. i have no clue why |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3032 debug_printf("ICBM Parameters: maxchannel = %d, default flags = 0x%08lx, max msg len = %d, " |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3033 "max sender evil = %f, max receiver evil = %f, min msg interval = %ld\n", |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3034 params->maxchan, params->flags, params->maxmsglen, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3035 ((float)params->maxsenderwarn)/10.0, ((float)params->maxrecverwarn)/10.0, |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3036 params->minmsginterval); |
2427
5bc3b39fc0a5
[gaim-migrate @ 2440]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2421
diff
changeset
|
3037 */ |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3038 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3039 /* Maybe senderwarn and recverwarn should be user preferences... */ |
3595 | 3040 params->flags = 0x0000000b; |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3041 params->maxmsglen = 8000; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3042 params->minmsginterval = 0; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3043 |
2673
81d658e6ac1e
[gaim-migrate @ 2686]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2672
diff
changeset
|
3044 aim_seticbmparam(sess, params); |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3045 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3046 return 1; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3047 } |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
3048 |
2993 | 3049 static int gaim_parse_locaterights(aim_session_t *sess, aim_frame_t *fr, ...) |
3050 { | |
3051 va_list ap; | |
3052 fu16_t maxsiglen; | |
3053 struct gaim_connection *gc = sess->aux_data; | |
3054 struct oscar_data *odata = (struct oscar_data *)gc->proto_data; | |
3055 | |
3056 va_start(ap, fr); | |
3057 maxsiglen = va_arg(ap, int); | |
3058 va_end(ap); | |
3059 | |
3060 debug_printf("locate rights: max sig len = %d\n", maxsiglen); | |
3061 | |
3062 odata->rights.maxsiglen = odata->rights.maxawaymsglen = (guint)maxsiglen; | |
3063 | |
3458 | 3064 if (odata->icq) |
3065 aim_bos_setprofile(sess, fr->conn, NULL, NULL, caps_icq); | |
3066 else | |
3067 aim_bos_setprofile(sess, fr->conn, gc->user->user_info, NULL, caps_aim); | |
2993 | 3068 |
3069 return 1; | |
3070 } | |
3071 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3072 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
|
3073 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3074 fu16_t maxbuddies, maxwatchers; |
2993 | 3075 struct gaim_connection *gc = sess->aux_data; |
3076 struct oscar_data *odata = (struct oscar_data *)gc->proto_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3077 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3078 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3079 maxbuddies = (fu16_t)va_arg(ap, unsigned int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3080 maxwatchers = (fu16_t)va_arg(ap, unsigned int); |
2086 | 3081 va_end(ap); |
3082 | |
3083 debug_printf("buddy list rights: Max buddies = %d / Max watchers = %d\n", maxbuddies, maxwatchers); | |
3084 | |
2993 | 3085 odata->rights.maxbuddies = (guint)maxbuddies; |
3086 odata->rights.maxwatchers = (guint)maxwatchers; | |
3087 | |
2086 | 3088 return 1; |
3089 } | |
3090 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3091 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
|
3092 fu16_t maxpermits, maxdenies; |
2086 | 3093 va_list ap; |
2993 | 3094 struct gaim_connection *gc = sess->aux_data; |
3095 struct oscar_data *odata = (struct oscar_data *)gc->proto_data; | |
2086 | 3096 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3097 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3098 maxpermits = (fu16_t)va_arg(ap, unsigned int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3099 maxdenies = (fu16_t)va_arg(ap, unsigned int); |
2086 | 3100 va_end(ap); |
3101 | |
3102 debug_printf("BOS rights: Max permit = %d / Max deny = %d\n", maxpermits, maxdenies); | |
3103 | |
2993 | 3104 odata->rights.maxpermits = (guint)maxpermits; |
3105 odata->rights.maxdenies = (guint)maxdenies; | |
3106 | |
3107 account_online(gc); | |
3108 serv_finish_login(gc); | |
3109 | |
3110 if (bud_list_cache_exists(gc)) | |
3111 do_import(gc, NULL); | |
3112 | |
3113 debug_printf("buddy list loaded\n"); | |
3114 | |
2672 | 3115 aim_clientready(sess, fr->conn); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3116 |
3952 | 3117 /* XXX - Should call aim_bos_setidle with 0x0000 */ |
3118 | |
3119 /* XXX - Should only call reqofflinemsgs when using ICQ? */ | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3120 aim_icq_reqofflinemsgs(sess); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3121 |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3122 aim_reqservice(sess, fr->conn, AIM_CONN_TYPE_CHATNAV); |
3694 | 3123 aim_reqservice(sess, fr->conn, AIM_CONN_TYPE_EMAIL); |
2086 | 3124 |
3109 | 3125 if (!odata->icq) { |
3126 debug_printf("ssi: requesting ssi list\n"); | |
3092 | 3127 aim_ssi_reqrights(sess, fr->conn); |
3109 | 3128 aim_ssi_reqdata(sess, fr->conn, sess->ssi.timestamp, sess->ssi.revision); |
3129 } | |
2991 | 3130 |
2086 | 3131 return 1; |
3132 } | |
3133 | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3134 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
|
3135 va_list ap; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3136 struct aim_icq_offlinemsg *msg; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3137 struct gaim_connection *gc = sess->aux_data; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3138 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3139 va_start(ap, fr); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3140 msg = va_arg(ap, struct aim_icq_offlinemsg *); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3141 va_end(ap); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3142 |
3141 | 3143 debug_printf("Received offline message of type 0x%04x\n", msg->type); |
3144 | |
3145 switch (msg->type) { | |
3146 case 0x0001: { /* Basic offline message */ | |
3147 char sender[32]; | |
3148 char *dialog_msg = g_strdup(msg->msg); | |
3149 time_t t = get_time(msg->year, msg->month, msg->day, msg->hour, msg->minute, 0); | |
3150 g_snprintf(sender, sizeof(sender), "%lu", msg->sender); | |
3151 strip_linefeed(dialog_msg); | |
3152 serv_got_im(gc, sender, dialog_msg, 0, t, -1); | |
3153 g_free(dialog_msg); | |
3154 } break; | |
3155 | |
3156 case 0x0006: { /* Authorization request */ | |
3157 gaim_icq_authask(gc, msg->sender, msg->msg); | |
3158 } break; | |
3159 | |
3160 case 0x0007: { /* Someone has denied you authorization */ | |
3161 char *dialog_msg; | |
3159 | 3162 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"), msg->sender, msg->msg ? msg->msg : _("No reason given.")); |
3427 | 3163 do_error_dialog(_("ICQ Authorization denied"), dialog_msg, GAIM_ERROR); |
3141 | 3164 g_free(dialog_msg); |
3165 } break; | |
3166 | |
3167 case 0x0008: { /* Someone has granted you authorization */ | |
3168 char *dialog_msg; | |
3159 | 3169 dialog_msg = g_strdup_printf(_("The user %lu has granted your request to add them to your contact list."), msg->sender); |
3427 | 3170 do_error_dialog(_("ICQ Authorization Granted"), dialog_msg, GAIM_INFO); |
3141 | 3171 g_free(dialog_msg); |
3172 } break; | |
3173 | |
3174 case 0x0012: { | |
3175 /* Ack for authorizing/denying someone. Or possibly an ack for sending any system notice */ | |
3176 } break; | |
3177 | |
3178 default: { | |
3179 debug_printf("unknown offline message type 0x%04x\n", msg->type); | |
3180 } | |
2706
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3181 } |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3182 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3183 return 1; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3184 } |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3185 |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3186 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
|
3187 { |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3188 aim_icq_ackofflinemsgs(sess); |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3189 return 1; |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3190 } |
e841b14b5b89
[gaim-migrate @ 2719]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
3191 |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3192 static int gaim_simpleinfo(aim_session_t *sess, aim_frame_t *fr, ...) |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3193 { |
2773
a0fd8f91e294
[gaim-migrate @ 2786]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2768
diff
changeset
|
3194 struct gaim_connection *gc = sess->aux_data; |
3212 | 3195 struct buddy *budlight; |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3196 va_list ap; |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3197 struct aim_icq_simpleinfo *info; |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3198 char buf[16 * 1024]; |
2773
a0fd8f91e294
[gaim-migrate @ 2786]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2768
diff
changeset
|
3199 char who[16]; |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3200 |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3201 va_start(ap, fr); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3202 info = va_arg(ap, struct aim_icq_simpleinfo *); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3203 va_end(ap); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3204 |
2773
a0fd8f91e294
[gaim-migrate @ 2786]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2768
diff
changeset
|
3205 g_snprintf(who, sizeof who, "%lu", info->uin); |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3206 g_snprintf(buf, sizeof buf, |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3207 "<B>UIN:</B> %lu<BR>" |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3208 "<B>Nick:</B> %s<BR>" |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3209 "<B>Name:</B> %s %s<BR>" |
3212 | 3210 "<B>Email:</B> %s<BR>\n", |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3211 info->uin, |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3212 info->nick, |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3213 info->first, info->last, |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3214 info->email); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3215 |
3212 | 3216 /* If the contact is away, then we also want to get their status message |
3217 * and show it in the same window as info. g_show_info_text gets the status | |
3218 * message if the third arg is 0 (this seems really gross to me). The | |
3219 * parse-icq-status-message function knows if it is putting it's message in | |
3220 * an info window because the name will _not_ be in od->evilhack. For getting | |
3221 * only the away message the contact's UIN is put in od->evilhack. */ | |
3279 | 3222 if ((budlight = find_buddy(gc, who))) { |
3595 | 3223 if ((budlight->uc >> 16) & (AIM_ICQ_STATE_AWAY || AIM_ICQ_STATE_DND || AIM_ICQ_STATE_OUT || AIM_ICQ_STATE_BUSY || AIM_ICQ_STATE_CHAT)) { |
3270 | 3224 if (budlight->caps & AIM_CAPS_ICQSERVERRELAY) |
3225 g_show_info_text(gc, who, 0, buf, NULL); | |
3226 else { | |
3595 | 3227 char *state_msg = gaim_icq_status((budlight->uc & 0xffff0000) >> 16); |
3952 | 3228 g_show_info_text(gc, who, 2, buf, "<B>Status:</B> ", state_msg, "<BR>\n<HR><I>Remote client does not support sending status messages.</I><BR>\n", NULL); |
3270 | 3229 free(state_msg); |
3230 } | |
3231 } else { | |
3595 | 3232 char *state_msg = gaim_icq_status((budlight->uc & 0xffff0000) >> 16); |
3270 | 3233 g_show_info_text(gc, who, 2, buf, "<B>Status:</B> ", state_msg, NULL); |
3212 | 3234 free(state_msg); |
3235 } | |
3270 | 3236 } else |
3237 g_show_info_text(gc, who, 2, buf, NULL); | |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3238 |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3239 return 1; |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3240 } |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3241 |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3242 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
|
3243 { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3244 char *msg, *url; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3245 fu16_t wid, hei, delay; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3246 va_list ap; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3247 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3248 va_start(ap, fr); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3249 msg = va_arg(ap, char *); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3250 url = va_arg(ap, char *); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3251 wid = (fu16_t)va_arg(ap, int); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3252 hei = (fu16_t)va_arg(ap, int); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3253 delay = (fu16_t)va_arg(ap, int); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3254 va_end(ap); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3255 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3256 serv_got_popup(msg, url, wid, hei); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3257 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3258 return 1; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3259 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
3260 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3261 static int gaim_parse_searchreply(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3262 va_list ap; |
3263 char *address, *SNs; | |
3264 int i, num; | |
3265 char *buf; | |
3266 int at = 0, len; | |
3267 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3268 va_start(ap, fr); |
2086 | 3269 address = va_arg(ap, char *); |
3270 num = va_arg(ap, int); | |
3271 SNs = va_arg(ap, char *); | |
3272 va_end(ap); | |
3273 | |
3274 len = num * (MAXSNLEN + 1) + 1024; | |
3275 buf = g_malloc(len); | |
3276 at += g_snprintf(buf + at, len - at, "<B>%s has the following screen names:</B><BR>", address); | |
3277 for (i = 0; i < num; i++) | |
3278 at += g_snprintf(buf + at, len - at, "%s<BR>", &SNs[i * (MAXSNLEN + 1)]); | |
3212 | 3279 g_show_info_text(NULL, NULL, 2, buf, NULL); |
2086 | 3280 g_free(buf); |
3281 | |
3282 return 1; | |
3283 } | |
3284 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3285 static int gaim_parse_searcherror(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 3286 va_list ap; |
3287 char *address; | |
3288 char buf[BUF_LONG]; | |
3289 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3290 va_start(ap, fr); |
2086 | 3291 address = va_arg(ap, char *); |
3292 va_end(ap); | |
3293 | |
3294 g_snprintf(buf, sizeof(buf), "No results found for email address %s", address); | |
3427 | 3295 do_error_dialog(buf, NULL, GAIM_ERROR); |
2086 | 3296 |
3297 return 1; | |
3298 } | |
3299 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3300 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
|
3301 fu16_t status; |
2086 | 3302 va_list ap; |
3303 char msg[256]; | |
3304 struct gaim_connection *gc = sess->aux_data; | |
3305 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3306 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3307 status = (fu16_t)va_arg(ap, unsigned int); /* status code of confirmation request */ |
2086 | 3308 va_end(ap); |
3309 | |
3310 debug_printf("account confirmation returned status 0x%04x (%s)\n", status, | |
3912 | 3311 status ? "unknown" : "email sent"); |
3312 if (!status) { | |
2086 | 3313 g_snprintf(msg, sizeof(msg), "You should receive an email asking to confirm %s.", |
3314 gc->username); | |
3912 | 3315 do_error_dialog("Account Confirmation Requested", msg, GAIM_INFO); |
2086 | 3316 } |
3317 | |
3318 return 1; | |
3319 } | |
3320 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3321 static int gaim_info_change(aim_session_t *sess, aim_frame_t *fr, ...) { |
3912 | 3322 struct gaim_connection *gc = sess->aux_data; |
2086 | 3323 va_list ap; |
3912 | 3324 fu16_t perms, err; |
3325 char *url, *sn, *email; | |
3326 int change; | |
2086 | 3327 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3328 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3329 change = va_arg(ap, int); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
3330 perms = (fu16_t)va_arg(ap, unsigned int); |
3912 | 3331 err = (fu16_t)va_arg(ap, unsigned int); |
3332 url = va_arg(ap, char *); | |
3333 sn = va_arg(ap, char *); | |
3334 email = va_arg(ap, char *); | |
2086 | 3335 va_end(ap); |
3336 | |
3912 | 3337 debug_printf("account info: because of %s, perms=0x%04x, err=0x%04x, url=%s, sn=%s, email=%s\n", |
3338 change ? "change" : "request", perms, err, url, sn, email); | |
3339 | |
3340 if (err && url) { | |
3341 char *dialog_msg; | |
3342 char *dialog_top = g_strdup_printf(_("Error Changing Account Info")); | |
3343 switch (err) { | |
3344 case 0x0001: { | |
3345 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name differs from the original."), err); | |
3346 } break; | |
3347 case 0x0006: { | |
3348 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name ends in a space."), err); | |
3349 } break; | |
3350 case 0x000b: { | |
3351 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to format screen name because the requested screen name is too long."), err); | |
3352 } break; | |
3353 case 0x001d: { | |
3354 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); | |
3355 } break; | |
3356 case 0x0021: { | |
3357 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); | |
3358 } break; | |
3359 case 0x0023: { | |
3360 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unable to change email address because the given address is invalid."), err); | |
3361 } break; | |
3362 default: { | |
3363 dialog_msg = g_strdup_printf(_("Error 0x%04x: Unknown error."), err); | |
3364 } break; | |
3365 } | |
3366 do_error_dialog(dialog_top, dialog_msg, GAIM_ERROR); | |
3367 g_free(dialog_top); | |
3368 g_free(dialog_msg); | |
3369 return 1; | |
3370 } | |
3371 | |
3372 if (sn) { | |
3373 char *dialog_msg = g_strdup_printf(_("Your screen name is currently formated as follows:\n%s"), sn); | |
3374 do_error_dialog("Account Info", dialog_msg, GAIM_INFO); | |
3375 g_free(dialog_msg); | |
3376 } | |
3377 | |
3378 if (email) { | |
3379 char *dialog_msg = g_strdup_printf(_("The email address for %s is %s"), gc->username, email); | |
3380 do_error_dialog("Account Info", dialog_msg, GAIM_INFO); | |
3381 g_free(dialog_msg); | |
2086 | 3382 } |
3383 | |
3384 return 1; | |
3385 } | |
3386 | |
3387 static void oscar_keepalive(struct gaim_connection *gc) { | |
3388 struct oscar_data *odata = (struct oscar_data *)gc->proto_data; | |
3389 aim_flap_nop(odata->sess, odata->conn); | |
3390 } | |
3391 | |
3001 | 3392 static int oscar_send_typing(struct gaim_connection *gc, char *name, int typing) { |
2993 | 3393 struct oscar_data *odata = (struct oscar_data *)gc->proto_data; |
3394 struct direct_im *dim = find_direct_im(odata, name); | |
3595 | 3395 if (dim) |
3396 aim_send_typing(odata->sess, dim->conn, typing); | |
3397 else { | |
3600 | 3398 char *who = normalize(name); |
3399 if (g_hash_table_lookup(odata->supports_tn, who)) { | |
3596 | 3400 if (typing == TYPING) |
3595 | 3401 aim_mtn_send(odata->sess, 0x0001, name, 0x0002); |
3596 | 3402 else if (typing == TYPED) |
3403 aim_mtn_send(odata->sess, 0x0001, name, 0x0001); | |
3595 | 3404 else |
3405 aim_mtn_send(odata->sess, 0x0001, name, 0x0000); | |
3406 } | |
3407 } | |
2993 | 3408 return 0; |
3409 } | |
3048 | 3410 static void oscar_ask_direct_im(struct gaim_connection *gc, char *name); |
2993 | 3411 |
3033 | 3412 static int oscar_send_im(struct gaim_connection *gc, char *name, char *message, int len, int imflags) { |
2086 | 3413 struct oscar_data *odata = (struct oscar_data *)gc->proto_data; |
3414 struct direct_im *dim = find_direct_im(odata, name); | |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
3415 int ret = 0; |
3659 | 3416 GError *err = NULL; |
3458 | 3417 |
2086 | 3418 if (dim) { |
3009 | 3419 if (dim->connected) { /* If we're not connected yet, send through server */ |
3952 | 3420 /* AAA - The last parameter below is the encoding. Let Paco-Paco do something with it. */ |
3421 ret = aim_send_im_direct(odata->sess, dim->conn, message, len == -1 ? strlen(message) : len, 0); | |
3009 | 3422 if (ret == 0) |
3423 return 1; | |
3424 else return ret; | |
3425 } | |
3008 | 3426 debug_printf("Direct IM pending, but not connected; sending through server\n"); |
3044 | 3427 } else if (len != -1) { |
3428 /* Trying to send an IM image outside of a direct connection. */ | |
3429 oscar_ask_direct_im(gc, name); | |
3430 return -ENOTCONN; | |
3431 } | |
3008 | 3432 if (imflags & IM_FLAG_AWAY) { |
3433 ret = aim_send_im(odata->sess, name, AIM_IMFLAGS_AWAY, message); | |
2086 | 3434 } else { |
3008 | 3435 struct aim_sendimext_args args; |
3436 GSList *h = odata->hasicons; | |
3437 struct icon_req *ir = NULL; | |
3438 char *who = normalize(name); | |
3439 struct stat st; | |
3642 | 3440 int i, len; |
3008 | 3441 |
3442 args.flags = AIM_IMFLAGS_ACK | AIM_IMFLAGS_CUSTOMFEATURES; | |
3443 if (odata->icq) | |
3444 args.flags |= AIM_IMFLAGS_OFFLINE; | |
3445 | |
3446 args.features = gaim_features; | |
3447 args.featureslen = sizeof(gaim_features); | |
3448 | |
3449 while (h) { | |
3450 ir = h->data; | |
3451 if (ir->request && !strcmp(who, ir->user)) | |
3452 break; | |
3453 h = h->next; | |
2086 | 3454 } |
3008 | 3455 if (h) { |
3456 ir->request = FALSE; | |
3457 args.flags |= AIM_IMFLAGS_BUDDYREQ; | |
3458 debug_printf("sending buddy icon request with message\n"); | |
3459 } | |
3460 | |
3461 if (gc->user->iconfile[0] && !stat(gc->user->iconfile, &st)) { | |
3462 FILE *file = fopen(gc->user->iconfile, "r"); | |
3463 if (file) { | |
3464 char *buf = g_malloc(st.st_size); | |
3465 fread(buf, 1, st.st_size, file); | |
3466 | |
3467 args.iconlen = st.st_size; | |
3468 args.iconsum = aim_iconsum(buf, st.st_size); | |
3469 args.iconstamp = st.st_mtime; | |
3470 | |
3471 args.flags |= AIM_IMFLAGS_HASICON; | |
3472 debug_printf("Claiming to have an icon.\n"); | |
3473 | |
3474 fclose(file); | |
3475 g_free(buf); | |
2086 | 3476 } |
3477 } | |
3008 | 3478 |
3479 args.destsn = name; | |
3642 | 3480 |
3481 /* Determine how we can send this message. Per the | |
3482 * warnings elsewhere in this file, these little | |
3483 * checks determine the simplest encoding we can use | |
3484 * for a given message send using it. */ | |
3485 len = strlen(message); | |
3486 i = 0; | |
3487 while (message[i]) { | |
3488 if ((unsigned char)message[i] > 0x7f) { | |
3489 /* not ASCII! */ | |
3490 args.flags |= AIM_IMFLAGS_ISO_8859_1; | |
3491 break; | |
3492 } | |
3493 i++; | |
3494 } | |
3495 while (message[i]) { | |
3496 /* ISO-8859-1 is 0x00-0xbf in the first byte | |
3497 * followed by 0xc0-0xc3 in the second */ | |
3850 | 3498 if ((unsigned char)message[i] < 0x80) { |
3659 | 3499 i++; |
3500 continue; | |
3850 | 3501 } else if (((unsigned char)message[i] & 0xfc) == 0xc0 && |
3502 ((unsigned char)message[i + 1] & 0xc0) == 0x80) { | |
3503 i += 2; | |
3504 continue; | |
3642 | 3505 } |
3659 | 3506 args.flags ^= AIM_IMFLAGS_ISO_8859_1; |
3507 args.flags |= AIM_IMFLAGS_UNICODE; | |
3508 break; | |
3642 | 3509 } |
3510 if (args.flags & AIM_IMFLAGS_UNICODE) { | |
3850 | 3511 debug_printf ("Sending Unicode IM\n"); |
3659 | 3512 args.msg = g_convert(message, len, "UCS-2BE", "UTF-8", NULL, &len, &err); |
3513 if (err) { | |
3514 debug_printf("Error converting a unicode message: %s\n", err->message); | |
3515 debug_printf("This really shouldn't happen!\n"); | |
3516 /* We really shouldn't try to send the | |
3517 * IM now, but I'm not sure what to do */ | |
3518 } | |
3850 | 3519 } else if (args.flags & AIM_IMFLAGS_ISO_8859_1) { |
3520 debug_printf ("Sending ISO-8859-1 IM\n"); | |
3659 | 3521 args.msg = g_convert(message, len, "ISO-8859-1", "UTF-8", NULL, &len, &err); |
3522 if (err) { | |
3523 debug_printf("conversion error: %s\n", err->message); | |
3642 | 3524 debug_printf("Someone tell Ethan his 8859-1 detection is wrong\n"); |
3525 args.flags ^= AIM_IMFLAGS_ISO_8859_1 | AIM_IMFLAGS_UNICODE; | |
3526 len = strlen(message); | |
3659 | 3527 args.msg = g_convert(message, len, "UCS-2BE", "UTF8", NULL, &len, &err); |
3528 if (err) { | |
3529 debug_printf ("Error in unicode fallback: %s\n", err->message); | |
3530 } | |
3642 | 3531 } |
3532 } else { | |
3533 args.msg = message; | |
3534 } | |
3535 args.msglen = len; | |
3008 | 3536 |
3537 ret = aim_send_im_ext(odata->sess, &args); | |
2086 | 3538 } |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
3539 if (ret >= 0) |
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
3540 return 1; |
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2297
diff
changeset
|
3541 return ret; |
2086 | 3542 } |
3543 | |
3544 static void oscar_get_info(struct gaim_connection *g, char *name) { | |
3545 struct oscar_data *odata = (struct oscar_data *)g->proto_data; | |
2742
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3546 if (odata->icq) |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3547 aim_icq_getsimpleinfo(odata->sess, name); |
6f527cbd899d
[gaim-migrate @ 2755]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2734
diff
changeset
|
3548 else |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3549 /* 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
|
3550 * 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
|
3551 * insert in the middle. i hate people. */ |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3552 aim_getinfo(odata->sess, odata->conn, name, AIM_GETINFO_AWAYMESSAGE); |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3553 } |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3554 |
3212 | 3555 static void oscar_get_away(struct gaim_connection *g, char *who) { |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
3556 struct oscar_data *odata = (struct oscar_data *)g->proto_data; |
3212 | 3557 if (odata->icq) { |
3558 struct buddy *budlight = find_buddy(g, who); | |
3559 if (budlight) | |
3595 | 3560 if ((budlight->uc & 0xffff0000) >> 16) |
3212 | 3561 if (budlight->caps & AIM_CAPS_ICQSERVERRELAY) |
3595 | 3562 aim_send_im_ch2_geticqmessage(odata->sess, who, (budlight->uc & 0xffff0000) >> 16); |
3212 | 3563 else |
3564 debug_printf("Error: Remote client does not support retrieval of status messages.\n"); | |
3565 else | |
3566 debug_printf("Error: The user %s has no status message, therefore not requesting.\n", who); | |
3567 else | |
3568 debug_printf("Error: Could not find %s in local contact list, therefore unable to request status message.\n", who); | |
3569 } else | |
3570 aim_getinfo(odata->sess, odata->conn, who, AIM_GETINFO_GENERALINFO); | |
2086 | 3571 } |
3572 | |
2920 | 3573 static void oscar_get_caps(struct gaim_connection *g, char *name) { |
3574 struct oscar_data *odata = (struct oscar_data *)g->proto_data; | |
3575 aim_getinfo(odata->sess, odata->conn, name, AIM_GETINFO_CAPABILITIES); | |
3576 } | |
3577 | |
3466 | 3578 static void oscar_set_dir(struct gaim_connection *g, const char *first, const char *middle, const char *last, |
3579 const char *maiden, const char *city, const char *state, const char *country, int web) { | |
2086 | 3580 /* FIXME : some of these things are wrong, but i'm lazy */ |
3581 struct oscar_data *odata = (struct oscar_data *)g->proto_data; | |
3582 aim_setdirectoryinfo(odata->sess, odata->conn, first, middle, last, | |
3583 maiden, NULL, NULL, city, state, NULL, 0, web); | |
3584 } | |
3585 | |
3586 | |
3587 static void oscar_set_idle(struct gaim_connection *g, int time) { | |
3588 struct oscar_data *odata = (struct oscar_data *)g->proto_data; | |
3589 aim_bos_setidle(odata->sess, odata->conn, time); | |
3590 } | |
3591 | |
3592 static void oscar_set_info(struct gaim_connection *g, char *info) { | |
3593 struct oscar_data *odata = (struct oscar_data *)g->proto_data; | |
2993 | 3594 gchar *inforeal; |
3595 | |
3596 if (odata->rights.maxsiglen == 0) | |
3427 | 3597 do_error_dialog(_("Unable to set AIM profile."), |
3598 _("You have probably requested to set your profile before the login procedure completed. " | |
3599 "Your profile remains unset; try setting it again when you are fully connected."), GAIM_ERROR); | |
2993 | 3600 |
3601 if (strlen(info) > odata->rights.maxsiglen) { | |
3602 gchar *errstr; | |
3603 | |
3427 | 3604 errstr = g_strdup_printf(_("The maximum profile length of %d bytes has been exceeded. " |
3605 "Gaim has truncated and set it."), odata->rights.maxsiglen); | |
3606 do_error_dialog("Profile too long.", errstr, GAIM_WARNING); | |
2993 | 3607 |
3608 g_free(errstr); | |
3609 } | |
3610 | |
3611 inforeal = g_strndup(info, odata->rights.maxsiglen); | |
3612 | |
3458 | 3613 if (odata->icq) |
3614 aim_bos_setprofile(odata->sess, odata->conn, NULL, NULL, caps_icq); | |
3615 else | |
3616 aim_bos_setprofile(odata->sess, odata->conn, inforeal, NULL, caps_aim); | |
2993 | 3617 |
3618 g_free(inforeal); | |
3619 | |
3620 return; | |
2086 | 3621 } |
3622 | |
2993 | 3623 static void oscar_set_away_aim(struct gaim_connection *gc, struct oscar_data *od, const char *message) |
3624 { | |
3625 | |
3626 if (od->rights.maxawaymsglen == 0) | |
3427 | 3627 do_error_dialog(_("Unable to set AIM away message."), |
3628 _("You have probably requested to set your away message before the login procedure completed. " | |
3629 "You remain in a \"present\" state; try setting it again when you are fully connected."), GAIM_ERROR); | |
3630 | |
2993 | 3631 if (gc->away) |
3632 g_free(gc->away); | |
3633 gc->away = NULL; | |
3634 | |
3635 if (!message) { | |
3458 | 3636 aim_bos_setprofile(od->sess, od->conn, NULL, "", caps_aim); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3637 return; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3638 } |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3639 |
2993 | 3640 if (strlen(message) > od->rights.maxawaymsglen) { |
3641 gchar *errstr; | |
3642 | |
3427 | 3643 errstr = g_strdup_printf(_("The away message length of %d bytes has been exceeded. " |
3644 "Gaim has truncated it and set you away."), od->rights.maxawaymsglen); | |
3645 do_error_dialog("Away message too long.", errstr, GAIM_WARNING); | |
2993 | 3646 g_free(errstr); |
3647 } | |
3648 | |
3649 gc->away = g_strndup(message, od->rights.maxawaymsglen); | |
3458 | 3650 aim_bos_setprofile(od->sess, od->conn, NULL, gc->away, caps_aim); |
2993 | 3651 |
3652 return; | |
3653 } | |
3654 | |
3655 static void oscar_set_away_icq(struct gaim_connection *gc, struct oscar_data *od, const char *state, const char *message) | |
3656 { | |
3657 | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3658 if (gc->away) |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3659 gc->away = NULL; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3660 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3661 if (!strcmp(state, "Online")) |
2866
6d62d4520460
[gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2865
diff
changeset
|
3662 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_NORMAL); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3663 else if (!strcmp(state, "Away")) { |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3664 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_AWAY); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3665 gc->away = ""; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3666 } else if (!strcmp(state, "Do Not Disturb")) { |
3212 | 3667 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_DND | AIM_ICQ_STATE_BUSY); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3668 gc->away = ""; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3669 } else if (!strcmp(state, "Not Available")) { |
3101 | 3670 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_OUT | AIM_ICQ_STATE_AWAY); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3671 gc->away = ""; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3672 } else if (!strcmp(state, "Occupied")) { |
3212 | 3673 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_BUSY); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3674 gc->away = ""; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3675 } else if (!strcmp(state, "Free For Chat")) { |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3676 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_CHAT); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3677 gc->away = ""; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3678 } else if (!strcmp(state, "Invisible")) { |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
3679 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_INVISIBLE); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3680 gc->away = ""; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3681 } else if (!strcmp(state, GAIM_AWAY_CUSTOM)) { |
2998 | 3682 if (message) { |
3101 | 3683 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_OUT | AIM_ICQ_STATE_AWAY); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3684 gc->away = ""; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3685 } else { |
2866
6d62d4520460
[gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2865
diff
changeset
|
3686 aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_NORMAL); |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
3687 } |
2086 | 3688 } |
2993 | 3689 |
3690 return; | |
3691 } | |
3692 | |
3693 static void oscar_set_away(struct gaim_connection *gc, char *state, char *message) | |
3694 { | |
3695 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
3696 | |
3697 if (od->icq) | |
3698 oscar_set_away_icq(gc, od, state, message); | |
3699 else | |
3700 oscar_set_away_aim(gc, od, message); | |
3701 | |
3702 return; | |
2086 | 3703 } |
3704 | |
3705 static void oscar_warn(struct gaim_connection *g, char *name, int anon) { | |
3706 struct oscar_data *odata = (struct oscar_data *)g->proto_data; | |
2113 | 3707 aim_send_warning(odata->sess, odata->conn, name, anon ? AIM_WARN_ANON : 0); |
2086 | 3708 } |
3709 | |
3466 | 3710 static void oscar_dir_search(struct gaim_connection *g, const char *first, const char *middle, const char *last, |
3711 const char *maiden, const char *city, const char *state, const char *country, const char *email) { | |
2086 | 3712 struct oscar_data *odata = (struct oscar_data *)g->proto_data; |
3713 if (strlen(email)) | |
3714 aim_usersearch_address(odata->sess, odata->conn, email); | |
3715 } | |
3716 | |
3466 | 3717 static void oscar_add_buddy(struct gaim_connection *g, const char *name) { |
2086 | 3718 struct oscar_data *odata = (struct oscar_data *)g->proto_data; |
3092 | 3719 if (odata->icq) { |
3720 aim_add_buddy(odata->sess, odata->conn, name); | |
3721 } else { | |
3210 | 3722 if ((odata->sess->ssi.received_data) && !(aim_ssi_itemlist_finditem(odata->sess->ssi.items, NULL, name, 0x0000))) { |
2995 | 3723 debug_printf("ssi: adding buddy %s to group %s\n", name, find_group_by_buddy(g, name)->name); |
3724 aim_ssi_addbuddies(odata->sess, odata->conn, find_group_by_buddy(g, name)->name, &name, 1); | |
3092 | 3725 } |
2991 | 3726 } |
2086 | 3727 } |
3728 | |
3729 static void oscar_add_buddies(struct gaim_connection *g, GList *buddies) { | |
3730 struct oscar_data *odata = (struct oscar_data *)g->proto_data; | |
3092 | 3731 if (odata->icq) { |
3732 char buf[MSG_LEN]; | |
3733 int n=0; | |
3734 while (buddies) { | |
3735 if (n > MSG_LEN - 18) { | |
3736 aim_bos_setbuddylist(odata->sess, odata->conn, buf); | |
3737 n = 0; | |
3738 } | |
3739 n += g_snprintf(buf + n, sizeof(buf) - n, "%s&", (char *)buddies->data); | |
3740 buddies = buddies->next; | |
3741 } | |
3742 aim_bos_setbuddylist(odata->sess, odata->conn, buf); | |
3743 } else { | |
3744 if (odata->sess->ssi.received_data) { | |
3745 int tmp; | |
3746 GSList *curgrp, *curbud; | |
3747 for (curgrp=g->groups; curgrp; curgrp=g_slist_next(curgrp)) { | |
2995 | 3748 tmp = 0; |
3749 for (curbud=((struct group*)curgrp->data)->members; curbud; curbud=curbud->next) | |
3210 | 3750 if (!aim_ssi_itemlist_finditem(odata->sess->ssi.items, NULL, ((struct buddy*)curbud->data)->name, 0x0000)) |
2995 | 3751 tmp++; |
3092 | 3752 if (tmp) { |
3753 char **sns = (char **)malloc(tmp*sizeof(char*)); | |
3754 tmp = 0; | |
3755 for (curbud=((struct group*)curgrp->data)->members; curbud; curbud=curbud->next) | |
3210 | 3756 if (!aim_ssi_itemlist_finditem(odata->sess->ssi.items, NULL, ((struct buddy*)curbud->data)->name, 0x0000)) { |
3092 | 3757 debug_printf("ssi: adding buddy %s to group %s\n", ((struct buddy*)curbud->data)->name, ((struct group*)curgrp->data)->name); |
3758 sns[tmp] = (char *)((struct buddy*)curbud->data)->name; | |
3759 tmp++; | |
3760 } | |
3595 | 3761 aim_ssi_addbuddies(odata->sess, odata->conn, ((struct group*)curgrp->data)->name, (const char**)sns, tmp); |
3092 | 3762 free(sns); |
2995 | 3763 } |
3092 | 3764 } |
2995 | 3765 } |
3766 } | |
3767 } | |
3768 | |
3867 | 3769 static void oscar_move_buddy(struct gaim_connection *g, const char *name, const char *old_group, const char *new_group) { |
3140 | 3770 struct oscar_data *odata = (struct oscar_data *)g->proto_data; |
3771 if (!odata->icq) | |
3772 if (odata->sess->ssi.received_data) { | |
3773 aim_ssi_movebuddy(odata->sess, odata->conn, old_group, new_group, name); | |
3774 debug_printf("ssi: moved buddy %s from group %s to group %s\n", name, old_group, new_group); | |
3775 } | |
3776 } | |
3777 | |
2995 | 3778 static void oscar_remove_buddy(struct gaim_connection *g, char *name, char *group) { |
3779 struct oscar_data *odata = (struct oscar_data *)g->proto_data; | |
3092 | 3780 if (odata->icq) { |
3781 aim_remove_buddy(odata->sess, odata->conn, name); | |
3782 } else { | |
3783 if (odata->sess->ssi.received_data) { | |
3210 | 3784 struct aim_ssi_item *ssigroup; |
3785 while (aim_ssi_itemlist_finditem(odata->sess->ssi.items, NULL, name, 0x0000) && (ssigroup = aim_ssi_itemlist_findparent(odata->sess->ssi.items, name)) && !aim_ssi_delbuddies(odata->sess, odata->conn, ssigroup->name, &name, 1)) | |
3092 | 3786 debug_printf("ssi: deleted buddy %s from group %s\n", name, group); |
3787 } | |
2995 | 3788 } |
3789 } | |
3790 | |
3867 | 3791 static void oscar_remove_buddies(struct gaim_connection *g, GList *buddies, const char *group) { |
2995 | 3792 struct oscar_data *odata = (struct oscar_data *)g->proto_data; |
3092 | 3793 if (odata->icq) { |
2995 | 3794 GList *cur; |
3795 for (cur=buddies; cur; cur=cur->next) | |
3092 | 3796 aim_remove_buddy(odata->sess, odata->conn, cur->data); |
3797 } else { | |
3798 if (odata->sess->ssi.received_data) { | |
3799 GList *cur; | |
3800 int tmp = 0; | |
2995 | 3801 for (cur=buddies; cur; cur=cur->next) |
3210 | 3802 if (aim_ssi_itemlist_finditem(odata->sess->ssi.items, NULL, cur->data, 0x0000)) |
2991 | 3803 tmp++; |
3092 | 3804 if (tmp) { |
3805 char **sns; | |
3806 sns = (char **)malloc(tmp*sizeof(char*)); | |
3807 tmp = 0; | |
3808 for (cur=buddies; cur; cur=cur->next) | |
3210 | 3809 if (aim_ssi_itemlist_finditem(odata->sess->ssi.items, NULL, cur->data, 0x0000)) { |
3092 | 3810 debug_printf("ssi: deleting buddy %s from group %s\n", cur->data, group); |
3811 sns[tmp] = cur->data; | |
3812 tmp++; | |
3813 } | |
3814 aim_ssi_delbuddies(odata->sess, odata->conn, group, sns, tmp); | |
3815 free(sns); | |
3816 } | |
2991 | 3817 } |
3818 } | |
3819 } | |
3820 | |
3867 | 3821 static void oscar_rename_group(struct gaim_connection *g, const char *old_group, const char *new_group, GList *members) { |
3348 | 3822 struct oscar_data *odata = (struct oscar_data *)g->proto_data; |
3823 if (!odata->icq) | |
3824 if (odata->sess->ssi.received_data) { | |
3825 if (aim_ssi_itemlist_finditem(odata->sess->ssi.items, NULL, new_group, 0x0001)) { | |
3826 oscar_remove_buddies(g, members, old_group); | |
3827 oscar_add_buddies(g, members); | |
3828 debug_printf("ssi: moved all buddies from group %s to %s\n", old_group, new_group); | |
3829 } else { | |
3830 aim_ssi_rename_group(odata->sess, odata->conn, old_group, new_group); | |
3831 debug_printf("ssi: renamed group %s to %s\n", old_group, new_group); | |
3832 } | |
3833 } | |
3834 } | |
3835 | |
2991 | 3836 static int gaim_ssi_parserights(aim_session_t *sess, aim_frame_t *fr, ...) { |
3837 /* XXX - Fix parsing of the ssi rights packet and pass us the data | |
3838 fu16_t maxbuddies, maxgroups, maxpermits, maxdenies; | |
3839 va_list ap; | |
3840 | |
3841 va_start(ap, fr); | |
3842 maxbuddies = (fu16_t)va_arg(ap, unsigned int); | |
3843 maxgroupss = (fu16_t)va_arg(ap, unsigned int); | |
3844 maxpermits = (fu16_t)va_arg(ap, unsigned int); | |
3845 maxdenies = (fu16_t)va_arg(ap, unsigned int); | |
3846 va_end(ap); | |
3847 | |
3848 debug_printf("ssi rights: Max buddies = %d / Max groups = %d / Max permits = %d / Max denies = %d\n", maxbuddies, maxgroups, maxpermits, maxdenies); | |
3849 */ | |
3850 | |
3851 return 1; | |
3852 } | |
3853 | |
3854 static int gaim_ssi_parselist(aim_session_t *sess, aim_frame_t *fr, ...) { | |
3855 struct gaim_connection *gc = sess->aux_data; | |
2995 | 3856 struct oscar_data *odata = (struct oscar_data *)gc->proto_data; |
3857 struct aim_ssi_item *curitem; | |
2991 | 3858 int tmp; |
3466 | 3859 const char **sns; |
2991 | 3860 |
3861 debug_printf("ssi: syncing local list and server list\n"); | |
3862 | |
3109 | 3863 if (odata->icq) |
3092 | 3864 return 1; |
3865 | |
2991 | 3866 /* Activate SSI */ |
3867 debug_printf("ssi: activating server-stored buddy list\n"); | |
3868 aim_ssi_enable(sess, fr->conn); | |
3869 | |
3870 /* Clean the buddy list */ | |
3210 | 3871 aim_ssi_cleanlist(sess, fr->conn); |
2991 | 3872 |
3873 /* Add from server list to local list */ | |
3874 tmp = 0; | |
3875 for (curitem=sess->ssi.items; curitem; curitem=curitem->next) { | |
3876 switch (curitem->type) { | |
3877 case 0x0000: /* Buddy */ | |
3878 if ((curitem->name) && (!find_buddy(gc, curitem->name))) { | |
2995 | 3879 struct aim_ssi_item *curgroup = sess->ssi.items; |
2991 | 3880 while (curgroup) { |
3881 if ((curgroup->type == 0x0001) && (curgroup->gid == curitem->gid) && (curgroup->name)) { | |
2995 | 3882 debug_printf("ssi: adding buddy %s to group %s to local list\n", curitem->name, curgroup->name); |
2991 | 3883 add_buddy(gc, curgroup->name, curitem->name, 0); |
3884 tmp++; | |
3885 } | |
3886 curgroup = curgroup->next; | |
3887 } | |
3888 } | |
3889 break; | |
3890 | |
2995 | 3891 case 0x0002: /* Permit buddy */ |
2991 | 3892 if (curitem->name) { |
3893 GSList *list; | |
3894 for (list=gc->permit; (list && aim_sncmp(curitem->name, list->data)); list=list->next); | |
3895 if (!list) { | |
3896 char *name; | |
2995 | 3897 debug_printf("ssi: adding permit buddy %s to local list\n", curitem->name); |
2991 | 3898 name = g_strdup(normalize(curitem->name)); |
3899 gc->permit = g_slist_append(gc->permit, name); | |
3900 build_allow_list(); | |
3901 tmp++; | |
3902 } | |
3903 } | |
3904 break; | |
3905 | |
2995 | 3906 case 0x0003: /* Deny buddy */ |
2991 | 3907 if (curitem->name) { |
3908 GSList *list; | |
3909 for (list=gc->deny; (list && aim_sncmp(curitem->name, list->data)); list=list->next); | |
3910 if (!list) { | |
3911 char *name; | |
2995 | 3912 debug_printf("ssi: adding deny buddy %s to local list\n", curitem->name); |
2991 | 3913 name = g_strdup(normalize(curitem->name)); |
3914 gc->deny = g_slist_append(gc->deny, name); | |
3915 build_block_list(); | |
3916 tmp++; | |
3917 } | |
3918 } | |
3919 break; | |
3920 | |
2995 | 3921 case 0x0004: /* Permit/deny setting */ |
2991 | 3922 if (curitem->data) { |
3923 fu8_t permdeny; | |
3210 | 3924 if ((permdeny = aim_ssi_getpermdeny(sess->ssi.items)) && (permdeny != gc->permdeny)) { |
2991 | 3925 debug_printf("ssi: changing permdeny from %d to %d\n", gc->permdeny, permdeny); |
3926 gc->permdeny = permdeny; | |
2995 | 3927 tmp++; |
2991 | 3928 } |
3929 } | |
3930 break; | |
3109 | 3931 |
3932 case 0x0005: /* Presence setting */ | |
3933 /* We don't want to change Gaim's setting because it applies to all accounts */ | |
3934 break; | |
2991 | 3935 } /* End of switch on curitem->type */ |
3936 } /* End of for loop */ | |
3937 if (tmp) | |
3938 do_export(gc); | |
3939 | |
3940 /* Add from local list to server list */ | |
3941 if (gc) { | |
3017 | 3942 GSList *cur; |
3943 | |
2991 | 3944 /* Buddies */ |
3017 | 3945 cur = gc->groups; |
3946 while (cur) { | |
3947 GSList *curbud; | |
2991 | 3948 tmp = 0; |
3017 | 3949 for (curbud=((struct group*)cur->data)->members; curbud; curbud=curbud->next) |
3210 | 3950 if (!aim_ssi_itemlist_finditem(sess->ssi.items, NULL, ((struct buddy*)curbud->data)->name, 0x0000)) |
2991 | 3951 tmp++; |
3952 if (tmp) { | |
3466 | 3953 sns = malloc(tmp*sizeof(char*)); |
3017 | 3954 tmp = 0; |
3955 for (curbud=((struct group*)cur->data)->members; curbud; curbud=curbud->next) | |
3210 | 3956 if (!aim_ssi_itemlist_finditem(sess->ssi.items, NULL, ((struct buddy*)curbud->data)->name, 0x0000)) { |
3017 | 3957 debug_printf("ssi: adding buddy %s from local list to server list\n", ((struct buddy*)curbud->data)->name); |
3958 sns[tmp] = ((char *)((struct buddy*)curbud->data)->name); | |
3959 tmp++; | |
3960 } | |
3961 aim_ssi_addbuddies(sess, fr->conn, ((struct group*)cur->data)->name, sns, tmp); | |
2991 | 3962 free(sns); |
3963 } | |
3017 | 3964 cur = g_slist_next(cur); |
2991 | 3965 } |
3966 | |
3967 /* Permit list */ | |
3968 if (gc->permit) { | |
3969 tmp = 0; | |
3017 | 3970 for (cur=gc->permit; cur; cur=cur->next) |
3210 | 3971 if (!aim_ssi_itemlist_finditem(sess->ssi.items, NULL, cur->data, 0x0002)) |
2991 | 3972 tmp++; |
3973 if (tmp) { | |
3466 | 3974 sns = malloc(tmp*sizeof(char*)); |
3017 | 3975 tmp = 0; |
3976 for (cur=gc->permit; cur; cur=cur->next) | |
3210 | 3977 if (!aim_ssi_itemlist_finditem(sess->ssi.items, NULL, cur->data, 0x0002)) { |
3017 | 3978 debug_printf("ssi: adding permit %s from local list to server list\n", cur->data); |
3979 sns[tmp] = cur->data; | |
3980 tmp++; | |
3981 } | |
3982 aim_ssi_addpord(sess, fr->conn, sns, tmp, AIM_SSI_TYPE_PERMIT); | |
2991 | 3983 free(sns); |
3984 } | |
3985 } | |
3986 | |
3987 /* Deny list */ | |
3988 if (gc->deny) { | |
3989 tmp = 0; | |
3017 | 3990 for (cur=gc->deny; cur; cur=cur->next) |
3210 | 3991 if (!aim_ssi_itemlist_finditem(sess->ssi.items, NULL, cur->data, 0x0003)) |
2991 | 3992 tmp++; |
3993 if (tmp) { | |
3466 | 3994 sns = malloc(tmp*sizeof(char*)); |
3017 | 3995 tmp = 0; |
3996 for (cur=gc->deny; cur; cur=cur->next) | |
3210 | 3997 if (!aim_ssi_itemlist_finditem(sess->ssi.items, NULL, cur->data, 0x0003)) { |
3017 | 3998 debug_printf("ssi: adding deny %s from local list to server list\n", cur->data); |
3999 sns[tmp] = cur->data; | |
4000 tmp++; | |
4001 } | |
4002 aim_ssi_addpord(sess, fr->conn, sns, tmp, AIM_SSI_TYPE_DENY); | |
2991 | 4003 free(sns); |
4004 } | |
4005 } | |
3109 | 4006 |
4007 /* Presence settings (idle time visibility) */ | |
3210 | 4008 if ((tmp = aim_ssi_getpresence(sess->ssi.items)) != 0xFFFFFFFF) |
3109 | 4009 if (report_idle && !(tmp & 0x400)) |
4010 aim_ssi_setpresence(sess, fr->conn, tmp | 0x400); | |
3210 | 4011 |
4012 /* Check for maximum number of buddies */ | |
4013 for (cur=gc->groups, tmp=0; cur; cur=g_slist_next(cur)) { | |
3214 | 4014 struct group* gr = (struct group*)cur->data; |
4015 tmp = tmp + g_slist_length(gr->members); | |
4016 } | |
3210 | 4017 if (tmp > odata->rights.maxbuddies) { |
4018 char *dialog_msg = g_strdup_printf(_("The maximum number of buddies allowed in your buddy list is %d, and you have %d." | |
4019 " Until you are below the limit, some buddies will not show up as online."), | |
4020 odata->rights.maxbuddies, tmp); | |
3427 | 4021 do_error_dialog("Maximum buddy list length exceeded.", dialog_msg, GAIM_WARNING); |
3210 | 4022 g_free(dialog_msg); |
4023 } | |
3214 | 4024 |
3210 | 4025 } /* end if (gc) */ |
3092 | 4026 |
2991 | 4027 return 1; |
2086 | 4028 } |
4029 | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4030 static GList *oscar_chat_info(struct gaim_connection *gc) { |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4031 GList *m = NULL; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4032 struct proto_chat_entry *pce; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4033 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4034 pce = g_new0(struct proto_chat_entry, 1); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4035 pce->label = _("Join what group:"); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4036 m = g_list_append(m, pce); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4037 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4038 pce = g_new0(struct proto_chat_entry, 1); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4039 pce->label = _("Exchange:"); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4040 pce->is_int = TRUE; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4041 pce->min = 4; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4042 pce->max = 20; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4043 m = g_list_append(m, pce); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4044 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4045 return m; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4046 } |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4047 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4048 static void oscar_join_chat(struct gaim_connection *g, GList *data) { |
2086 | 4049 struct oscar_data *odata = (struct oscar_data *)g->proto_data; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4050 aim_conn_t *cur; |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4051 char *name; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4052 int *exchange; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4053 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4054 if (!data || !data->next) |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4055 return; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4056 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4057 name = data->data; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4058 exchange = data->next->data; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4059 |
2086 | 4060 debug_printf("Attempting to join chat room %s.\n", name); |
4061 if ((cur = aim_getconn_type(odata->sess, AIM_CONN_TYPE_CHATNAV))) { | |
4062 debug_printf("chatnav exists, creating room\n"); | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4063 aim_chatnav_createroom(odata->sess, cur, name, *exchange); |
2086 | 4064 } else { |
4065 /* this gets tricky */ | |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
4066 struct create_room *cr = g_new0(struct create_room, 1); |
2086 | 4067 debug_printf("chatnav does not exist, opening chatnav\n"); |
2822
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
4068 cr->exchange = *exchange; |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
4069 cr->name = g_strdup(name); |
744df95bf123
[gaim-migrate @ 2835]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2821
diff
changeset
|
4070 odata->create_rooms = g_slist_append(odata->create_rooms, cr); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4071 aim_reqservice(odata->sess, odata->conn, AIM_CONN_TYPE_CHATNAV); |
2086 | 4072 } |
4073 } | |
4074 | |
3466 | 4075 static void oscar_chat_invite(struct gaim_connection *g, int id, const char *message, const char *name) { |
2086 | 4076 struct oscar_data *odata = (struct oscar_data *)g->proto_data; |
4077 struct chat_connection *ccon = find_oscar_chat(g, id); | |
4078 | |
4079 if (!ccon) | |
4080 return; | |
4081 | |
4082 aim_chat_invite(odata->sess, odata->conn, name, message ? message : "", | |
4083 ccon->exchange, ccon->name, 0x0); | |
4084 } | |
4085 | |
4086 static void oscar_chat_leave(struct gaim_connection *g, int id) { | |
4087 struct oscar_data *odata = g ? (struct oscar_data *)g->proto_data : NULL; | |
4088 GSList *bcs = g->buddy_chats; | |
4089 struct conversation *b = NULL; | |
4090 struct chat_connection *c = NULL; | |
4091 int count = 0; | |
4092 | |
4093 while (bcs) { | |
4094 count++; | |
4095 b = (struct conversation *)bcs->data; | |
4096 if (id == b->id) | |
4097 break; | |
4098 bcs = bcs->next; | |
4099 b = NULL; | |
4100 } | |
4101 | |
4102 if (!b) | |
4103 return; | |
4104 | |
4105 debug_printf("Attempting to leave room %s (currently in %d rooms)\n", b->name, count); | |
4106 | |
4107 c = find_oscar_chat(g, b->id); | |
4108 if (c != NULL) { | |
4109 if (odata) | |
4110 odata->oscar_chats = g_slist_remove(odata->oscar_chats, c); | |
4111 if (c->inpa > 0) | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
4112 gaim_input_remove(c->inpa); |
2086 | 4113 if (g && odata->sess) |
4114 aim_conn_kill(odata->sess, &c->conn); | |
4115 g_free(c->name); | |
4116 g_free(c->show); | |
4117 g_free(c); | |
4118 } | |
4119 /* we do this because with Oscar it doesn't tell us we left */ | |
4120 serv_got_chat_left(g, b->id); | |
4121 } | |
4122 | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4123 static int oscar_chat_send(struct gaim_connection *g, int id, char *message) { |
2086 | 4124 struct oscar_data *odata = (struct oscar_data *)g->proto_data; |
4125 GSList *bcs = g->buddy_chats; | |
4126 struct conversation *b = NULL; | |
4127 struct chat_connection *c = NULL; | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4128 char *buf, *buf2; |
2086 | 4129 int i, j; |
4130 | |
4131 while (bcs) { | |
4132 b = (struct conversation *)bcs->data; | |
4133 if (id == b->id) | |
4134 break; | |
4135 bcs = bcs->next; | |
4136 b = NULL; | |
4137 } | |
4138 if (!b) | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4139 return -EINVAL; |
2086 | 4140 |
4141 bcs = odata->oscar_chats; | |
4142 while (bcs) { | |
4143 c = (struct chat_connection *)bcs->data; | |
4144 if (b == c->cnv) | |
4145 break; | |
4146 bcs = bcs->next; | |
4147 c = NULL; | |
4148 } | |
4149 if (!c) | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4150 return -EINVAL; |
2086 | 4151 |
4152 buf = g_malloc(strlen(message) * 4 + 1); | |
4153 for (i = 0, j = 0; i < strlen(message); i++) { | |
4154 if (message[i] == '\n') { | |
4155 buf[j++] = '<'; | |
4156 buf[j++] = 'B'; | |
4157 buf[j++] = 'R'; | |
4158 buf[j++] = '>'; | |
4159 } else { | |
4160 buf[j++] = message[i]; | |
4161 } | |
4162 } | |
4163 buf[j] = '\0'; | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4164 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4165 if (strlen(buf) > c->maxlen) |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4166 return -E2BIG; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4167 |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4168 buf2 = strip_html(buf); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4169 if (strlen(buf2) > c->maxvis) { |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4170 g_free(buf2); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4171 return -E2BIG; |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4172 } |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4173 g_free(buf2); |
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4174 |
2086 | 4175 aim_chat_send_im(odata->sess, c->conn, 0, buf, strlen(buf)); |
4176 g_free(buf); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
4177 return 0; |
2086 | 4178 } |
4179 | |
4180 static char **oscar_list_icon(int uc) { | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4181 if (uc == 0) |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4182 return (char **)icon_online_xpm; |
3595 | 4183 if (uc & 0xffff0000) { |
4184 uc >>= 16; | |
3101 | 4185 if (uc & AIM_ICQ_STATE_INVISIBLE) |
4186 return icon_offline_xpm; | |
4187 if (uc & AIM_ICQ_STATE_CHAT) | |
4188 return icon_ffc_xpm; | |
3212 | 4189 if (uc & AIM_ICQ_STATE_DND) |
4190 return icon_dnd_xpm; | |
4191 if (uc & AIM_ICQ_STATE_OUT) | |
4192 return icon_na_xpm; | |
3101 | 4193 if (uc & AIM_ICQ_STATE_BUSY) |
4194 return icon_occ_xpm; | |
4195 if (uc & AIM_ICQ_STATE_AWAY) | |
4196 return icon_away_xpm; | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4197 return icon_online_xpm; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4198 } |
3101 | 4199 if (uc & UC_UNAVAILABLE) |
4200 return (char **)away_icon_xpm; | |
3079 | 4201 if (uc & UC_WIRELESS) |
4202 return (char **)wireless_icon_xpm; | |
2689 | 4203 if (uc & UC_AB) |
2679 | 4204 return (char **)ab_xpm; |
2086 | 4205 if (uc & UC_AOL) |
4206 return (char **)aol_icon_xpm; | |
4207 if (uc & UC_ADMIN) | |
4208 return (char **)admin_icon_xpm; | |
4209 if (uc & UC_UNCONFIRMED) | |
4210 return (char **)dt_icon_xpm; | |
2297
a0f6ead876ca
[gaim-migrate @ 2307]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2288
diff
changeset
|
4211 if (uc & UC_NORMAL) |
a0f6ead876ca
[gaim-migrate @ 2307]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2288
diff
changeset
|
4212 return (char **)free_icon_xpm; |
2086 | 4213 return NULL; |
4214 } | |
4215 | |
3952 | 4216 /* |
4217 * This is called after the raw data for a file has been transferred (whether | |
4218 * we are sending or receiving), but there are other files remaining. | |
4219 */ | |
3771 | 4220 void oscar_file_transfer_nextfile(struct gaim_connection *gc, |
3630 | 4221 struct file_transfer *xfer) { |
4222 struct oscar_file_transfer *oft = find_oft_by_xfer(gc, xfer); | |
4223 aim_conn_t *conn = oft->conn; | |
4224 aim_session_t *sess = aim_conn_getsess(conn); | |
4225 | |
4226 oft->filesdone++; | |
4227 oft->watcher = gaim_input_add(conn->fd, GAIM_INPUT_READ, | |
4228 oscar_callback, conn); | |
4229 | |
4230 /* If this is an incoming sendfile transfer, we send an OK | |
4231 * message to the sender; if this is an outgoing sendfile, we | |
4232 * will get an OK from the receiver that will be handled in | |
4233 * oscar_sendfile_out_done(), so we don't need to do anything | |
4234 * yet. | |
4235 */ | |
4236 | |
4237 if (oft->type == OFT_SENDFILE_IN) | |
4238 aim_oft_end(sess, conn); | |
4239 } | |
4240 | |
3952 | 4241 /* |
4242 * This is called after the raw data for a file has been transferred (whether | |
4243 * we are sending or receiving), and it is the last file in the set, so we | |
4244 * can tear down the connection. | |
4245 */ | |
3771 | 4246 void oscar_file_transfer_done(struct gaim_connection *gc, |
3630 | 4247 struct file_transfer *xfer) { |
4248 struct oscar_file_transfer *oft = find_oft_by_xfer(gc, xfer); | |
4249 aim_conn_t *conn = oft->conn; | |
4250 aim_session_t *sess = aim_conn_getsess(conn); | |
4251 | |
4252 oft->filesdone++; | |
4253 if (oft->type == OFT_SENDFILE_IN) { | |
4254 aim_oft_end(sess, conn); | |
4255 oscar_file_transfer_disconnect(sess, conn); | |
4256 } | |
4257 else if (oft->type == OFT_SENDFILE_OUT) { | |
4258 /* Wait for response before closing connection. */ | |
4259 oft->watcher = gaim_input_add(conn->fd, GAIM_INPUT_READ, | |
4260 oscar_callback, conn); | |
4261 } | |
4262 } | |
4263 | |
3952 | 4264 /* |
4265 * This is called when there is raw data ready to be sent or received; all the | |
4266 * protocol details have been taken care of. | |
4267 */ | |
3630 | 4268 static int oscar_file_transfer_do(aim_session_t *sess, aim_frame_t *fr, ...) { |
4269 struct gaim_connection *gc = sess->aux_data; | |
4270 va_list ap; | |
4271 aim_conn_t *conn; | |
4272 struct oscar_file_transfer *oft; | |
3771 | 4273 struct aim_fileheader_t *fh; |
3752 | 4274 int err; |
3630 | 4275 |
4276 va_start(ap, fr); | |
4277 conn = va_arg(ap, aim_conn_t *); | |
3771 | 4278 fh = va_arg(ap, struct aim_fileheader_t *); |
4279 va_end(ap); | |
3630 | 4280 |
4281 oft = find_oft_by_conn(gc, conn); | |
4282 | |
4283 /* Don't use the regular input handler for the raw data. */ | |
4284 gaim_input_remove(oft->watcher); | |
4285 oft->watcher = 0; | |
4286 | |
4287 if (oft->type == OFT_SENDFILE_IN) { | |
3952 | 4288 /* AAA convert fh->name from UCS-2 to UTF-8 if (fh->nencode == 0x0002) */ |
4289 err = transfer_in_do(oft->xfer, conn->fd, fh->name, fh->size); | |
3630 | 4290 } |
4291 else { | |
3771 | 4292 err = transfer_out_do(oft->xfer, conn->fd, fh->nrecvd); |
3630 | 4293 } |
4294 | |
3752 | 4295 if (err) { |
4296 /* There was an error; cancel the transfer. */ | |
4297 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
4298 aim_conn_t *bosconn = od->conn; | |
4299 aim_canceltransfer(sess, bosconn, oft->cookie, | |
4300 oft->sn, AIM_CAPS_SENDFILE); | |
4301 oscar_file_transfer_disconnect(sess, oft->conn); | |
4302 } | |
4303 | |
3630 | 4304 return 0; |
4305 } | |
4306 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4307 static int gaim_directim_initiate(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 4308 va_list ap; |
4309 struct gaim_connection *gc = sess->aux_data; | |
4310 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4311 aim_conn_t *newconn, *listenerconn; |
2235
5d8b6100a9cc
[gaim-migrate @ 2245]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2232
diff
changeset
|
4312 struct conversation *cnv; |
2086 | 4313 struct direct_im *dim; |
4314 char buf[256]; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4315 char *sn; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4316 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4317 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4318 newconn = va_arg(ap, aim_conn_t *); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4319 listenerconn = va_arg(ap, aim_conn_t *); |
2086 | 4320 va_end(ap); |
4321 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4322 aim_conn_close(listenerconn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4323 aim_conn_kill(sess, &listenerconn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4324 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4325 sn = g_strdup(aim_directim_getsn(newconn)); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4326 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4327 debug_printf("DirectIM: initiate success to %s\n", sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4328 dim = find_direct_im(od, sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4329 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4330 if (!(cnv = find_conversation(sn))) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4331 cnv = new_conversation(sn); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
4332 gaim_input_remove(dim->watcher); |
2086 | 4333 dim->conn = newconn; |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
4334 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, |
2086 | 4335 oscar_callback, dim->conn); |
3008 | 4336 dim->connected = TRUE; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4337 g_snprintf(buf, sizeof buf, _("Direct IM with %s established"), sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4338 g_free(sn); |
2856
b1e300a85678
[gaim-migrate @ 2869]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2833
diff
changeset
|
4339 write_to_conv(cnv, buf, WFLAG_SYSTEM, NULL, time(NULL), -1); |
2086 | 4340 |
4341 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, | |
4342 gaim_directim_incoming, 0); | |
4343 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, | |
4344 gaim_directim_typing, 0); | |
3033 | 4345 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER, |
2993 | 4346 gaim_update_ui, 0); |
4347 return 1; | |
4348 } | |
4349 | |
4350 static int gaim_update_ui(aim_session_t *sess, aim_frame_t *fr, ...) { | |
4351 va_list ap; | |
4352 char *sn; | |
4353 double percent; | |
4354 struct gaim_connection *gc = sess->aux_data; | |
4355 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
4356 struct conversation *c; | |
4357 struct direct_im *dim; | |
4358 | |
4359 va_start(ap, fr); | |
4360 sn = va_arg(ap, char *); | |
4361 percent = va_arg(ap, double); | |
4362 va_end(ap); | |
4363 | |
2994 | 4364 if (!(dim = find_direct_im(od, sn))) |
4365 return 1; | |
3059 | 4366 if (dim->watcher) { |
4367 gaim_input_remove(dim->watcher); /* Otherwise, the callback will callback */ | |
4368 dim->watcher = 0; | |
4369 } | |
3044 | 4370 while (gtk_events_pending()) |
4371 gtk_main_iteration(); | |
4372 | |
2993 | 4373 if ((c = find_conversation(sn))) |
4374 update_progress(c, percent); | |
4375 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, | |
4376 oscar_callback, dim->conn); | |
2086 | 4377 |
4378 return 1; | |
4379 } | |
4380 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4381 static int gaim_directim_incoming(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 4382 va_list ap; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4383 char *msg, *sn; |
3952 | 4384 int len, encoding; |
2086 | 4385 struct gaim_connection *gc = sess->aux_data; |
4386 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4387 va_start(ap, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4388 sn = va_arg(ap, char *); |
2086 | 4389 msg = va_arg(ap, char *); |
2993 | 4390 len = va_arg(ap, int); |
3952 | 4391 encoding = va_arg(ap, int); |
2086 | 4392 va_end(ap); |
4393 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4394 debug_printf("Got DirectIM message from %s\n", sn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4395 |
3952 | 4396 /* AAA - I imagine Paco-Paco will want to do some voodoo with the encoding here */ |
2993 | 4397 serv_got_im(gc, sn, msg, 0, time(NULL), len); |
2086 | 4398 |
4399 return 1; | |
4400 } | |
4401 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4402 static int gaim_directim_typing(aim_session_t *sess, aim_frame_t *fr, ...) { |
2086 | 4403 va_list ap; |
4404 char *sn; | |
2993 | 4405 int typing; |
4406 struct gaim_connection *gc = sess->aux_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4407 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4408 va_start(ap, fr); |
2086 | 4409 sn = va_arg(ap, char *); |
2993 | 4410 typing = va_arg(ap, int); |
2086 | 4411 va_end(ap); |
4412 | |
2993 | 4413 if (typing) { |
4414 /* I had to leave this. It's just too funny. It reminds me of my sister. */ | |
4415 debug_printf("ohmigod! %s has started typing (DirectIM). He's going to send you a message! *squeal*\n", sn); | |
3768 | 4416 serv_got_typing(gc,sn,0, TYPING); |
2993 | 4417 } else |
4418 serv_got_typing_stopped(gc,sn); | |
2086 | 4419 return 1; |
4420 } | |
4421 | |
4422 struct ask_do_dir_im { | |
4423 char *who; | |
4424 struct gaim_connection *gc; | |
4425 }; | |
4426 | |
3730 | 4427 static void oscar_cancel_direct_im(struct ask_do_dir_im *data) { |
2086 | 4428 g_free(data); |
4429 } | |
4430 | |
3730 | 4431 static void oscar_direct_im(struct ask_do_dir_im *data) { |
2086 | 4432 struct gaim_connection *gc = data->gc; |
4433 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
4434 struct direct_im *dim; | |
4435 | |
4436 dim = find_direct_im(od, data->who); | |
4437 if (dim) { | |
3008 | 4438 if (!(dim->connected)) { /* We'll free the old, unconnected dim, and start over */ |
4439 od->direct_ims = g_slist_remove(od->direct_ims, dim); | |
4440 gaim_input_remove(dim->watcher); | |
4441 g_free(dim); | |
4442 debug_printf("Gave up on old direct IM, trying again\n"); | |
4443 } else { | |
3427 | 4444 do_error_dialog("DirectIM already open.", NULL, GAIM_ERROR); |
3008 | 4445 return; |
4446 } | |
2086 | 4447 } |
4448 dim = g_new0(struct direct_im, 1); | |
4449 dim->gc = gc; | |
4450 g_snprintf(dim->name, sizeof dim->name, "%s", data->who); | |
4451 | |
2717
03bf072c6238
[gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2713
diff
changeset
|
4452 dim->conn = aim_directim_initiate(od->sess, data->who); |
2086 | 4453 if (dim->conn != NULL) { |
4454 od->direct_ims = g_slist_append(od->direct_ims, dim); | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
4455 dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, |
2086 | 4456 oscar_callback, dim->conn); |
4457 aim_conn_addhandler(od->sess, dim->conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINITIATE, | |
4458 gaim_directim_initiate, 0); | |
4459 } else { | |
3427 | 4460 do_error_dialog(_("Unable to open Direct IM"), NULL, GAIM_ERROR); |
2086 | 4461 g_free(dim); |
4462 } | |
4463 } | |
4464 | |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4465 static void oscar_ask_direct_im(struct gaim_connection *gc, gchar *who) { |
2086 | 4466 char buf[BUF_LONG]; |
4467 struct ask_do_dir_im *data = g_new0(struct ask_do_dir_im, 1); | |
4468 data->who = who; | |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4469 data->gc = gc; |
3730 | 4470 g_snprintf(buf, sizeof(buf), _("You have selected to open a Direct IM connection with %s."), who); |
4471 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); | |
2086 | 4472 } |
4473 | |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4474 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
|
4475 struct oscar_data *od = gc->proto_data; |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4476 od->evilhack = g_slist_append(od->evilhack, g_strdup(normalize(who))); |
3212 | 4477 if (od->icq) { |
4478 struct buddy *budlight = find_buddy(gc, who); | |
4479 if (budlight) | |
3595 | 4480 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 | 4481 if (budlight->caps & AIM_CAPS_ICQSERVERRELAY) |
3595 | 4482 aim_send_im_ch2_geticqmessage(od->sess, who, (budlight->uc & 0xffff0000) >> 16); |
3212 | 4483 else { |
3595 | 4484 char *state_msg = gaim_icq_status((budlight->uc & 0xffff0000) >> 16); |
3952 | 4485 char *dialog_msg = g_strdup_printf(_("<B>UIN:</B> %s<BR><B>Status:</B> %s<BR><HR><I>Remote client does not support sending status messages.</I><BR>"), who, state_msg); |
3212 | 4486 g_show_info_text(gc, who, 2, dialog_msg, NULL); |
4487 free(state_msg); | |
4488 free(dialog_msg); | |
4489 } | |
4490 else { | |
3595 | 4491 char *state_msg = gaim_icq_status((budlight->uc & 0xffff0000) >> 16); |
3952 | 4492 char *dialog_msg = g_strdup_printf(_("<B>UIN:</B> %s<BR><B>Status:</B> %s<BR><HR><I>User has no status message.</I><BR>"), who, state_msg); |
3212 | 4493 g_show_info_text(gc, who, 2, dialog_msg, NULL); |
4494 free(state_msg); | |
4495 free(dialog_msg); | |
4496 } | |
4497 else | |
3427 | 4498 do_error_dialog("Could not find contact in local list, therefore unable to request status message.\n", NULL, GAIM_ERROR); |
3212 | 4499 } else |
4500 oscar_get_info(gc, who); | |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4501 } |
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4502 |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4503 static GList *oscar_buddy_menu(struct gaim_connection *gc, char *who) { |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4504 GList *m = NULL; |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4505 struct proto_buddy_menu *pbm; |
2086 | 4506 char *n = g_strdup(normalize(gc->username)); |
2833
cdbe6e2f0ff2
[gaim-migrate @ 2846]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2822
diff
changeset
|
4507 struct oscar_data *odata = gc->proto_data; |
2086 | 4508 |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4509 pbm = g_new0(struct proto_buddy_menu, 1); |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4510 pbm->label = _("Get Info"); |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4511 pbm->callback = oscar_get_info; |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4512 pbm->gc = gc; |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4513 m = g_list_append(m, pbm); |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4514 |
3212 | 4515 if (odata->icq) { |
4516 pbm = g_new0(struct proto_buddy_menu, 1); | |
4517 pbm->label = _("Get Status Msg"); | |
4518 pbm->callback = oscar_get_away_msg; | |
4519 pbm->gc = gc; | |
4520 m = g_list_append(m, pbm); | |
4521 } else { | |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4522 pbm = g_new0(struct proto_buddy_menu, 1); |
2833
cdbe6e2f0ff2
[gaim-migrate @ 2846]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2822
diff
changeset
|
4523 pbm->label = _("Get Away Msg"); |
cdbe6e2f0ff2
[gaim-migrate @ 2846]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2822
diff
changeset
|
4524 pbm->callback = oscar_get_away_msg; |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4525 pbm->gc = gc; |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4526 m = g_list_append(m, pbm); |
2833
cdbe6e2f0ff2
[gaim-migrate @ 2846]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2822
diff
changeset
|
4527 |
cdbe6e2f0ff2
[gaim-migrate @ 2846]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2822
diff
changeset
|
4528 if (strcmp(n, normalize(who))) { |
cdbe6e2f0ff2
[gaim-migrate @ 2846]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2822
diff
changeset
|
4529 pbm = g_new0(struct proto_buddy_menu, 1); |
cdbe6e2f0ff2
[gaim-migrate @ 2846]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2822
diff
changeset
|
4530 pbm->label = _("Direct IM"); |
cdbe6e2f0ff2
[gaim-migrate @ 2846]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2822
diff
changeset
|
4531 pbm->callback = oscar_ask_direct_im; |
cdbe6e2f0ff2
[gaim-migrate @ 2846]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2822
diff
changeset
|
4532 pbm->gc = gc; |
cdbe6e2f0ff2
[gaim-migrate @ 2846]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2822
diff
changeset
|
4533 m = g_list_append(m, pbm); |
3752 | 4534 |
4535 pbm = g_new0(struct proto_buddy_menu, 1); | |
4536 pbm->label = _("Send File"); | |
4537 pbm->callback = oscar_ask_send_file; | |
4538 pbm->gc = gc; | |
4539 m = g_list_append(m, pbm); | |
2833
cdbe6e2f0ff2
[gaim-migrate @ 2846]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2822
diff
changeset
|
4540 } |
2086 | 4541 } |
2920 | 4542 |
4543 pbm = g_new0(struct proto_buddy_menu, 1); | |
4544 pbm->label = _("Get Capabilities"); | |
4545 pbm->callback = oscar_get_caps; | |
4546 pbm->gc = gc; | |
4547 m = g_list_append(m, pbm); | |
4548 | |
2086 | 4549 g_free(n); |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4550 |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
4551 return m; |
2086 | 4552 } |
4553 | |
3456 | 4554 static GList *oscar_edit_buddy_menu(struct gaim_connection *gc, char *who) |
4555 { | |
4556 GList *m = NULL; | |
4557 struct proto_buddy_menu *pbm; | |
4558 struct oscar_data *odata = gc->proto_data; | |
4559 | |
4560 if (odata->icq) { | |
4561 pbm = g_new0(struct proto_buddy_menu, 1); | |
4562 pbm->label = _("Get Info"); | |
4563 pbm->callback = oscar_get_info; | |
4564 pbm->gc = gc; | |
4565 m = g_list_append(m, pbm); | |
4566 } | |
4567 | |
4568 return m; | |
4569 } | |
4570 | |
2086 | 4571 static void oscar_set_permit_deny(struct gaim_connection *gc) { |
4572 struct oscar_data *od = (struct oscar_data *)gc->proto_data; | |
2995 | 4573 if (od->icq) { |
3783 | 4574 GSList *list, *g; |
2995 | 4575 char buf[MAXMSGLEN]; |
4576 int at; | |
4577 | |
4578 switch(gc->permdeny) { | |
4579 case 1: | |
4580 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_DENYADD, gc->username); | |
4581 break; | |
4582 case 2: | |
4583 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_PERMITADD, gc->username); | |
4584 break; | |
4585 case 3: | |
4586 list = gc->permit; | |
4587 at = 0; | |
4588 while (list) { | |
4589 at += g_snprintf(buf + at, sizeof(buf) - at, "%s&", (char *)list->data); | |
4590 list = list->next; | |
4591 } | |
4592 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_PERMITADD, buf); | |
4593 break; | |
4594 case 4: | |
4595 list = gc->deny; | |
4596 at = 0; | |
4597 while (list) { | |
4598 at += g_snprintf(buf + at, sizeof(buf) - at, "%s&", (char *)list->data); | |
4599 list = list->next; | |
4600 } | |
4601 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_DENYADD, buf); | |
4602 break; | |
3782 | 4603 case 5: |
3783 | 4604 g = gc->groups; |
3782 | 4605 at = 0; |
4606 while (g) { | |
4607 list = ((struct group *)g->data)->members; | |
4608 while (list) { | |
4609 at += g_snprintf(buf + at, sizeof(buf) - at, "%s&", (char *)list->data); | |
4610 list = list->next; | |
4611 } | |
4612 g = g->next; | |
4613 } | |
4614 aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_PERMITADD, buf); | |
4615 break; | |
4616 default: | |
2995 | 4617 break; |
2086 | 4618 } |
2995 | 4619 signoff_blocked(gc); |
4620 } else { | |
4621 if (od->sess->ssi.received_data) | |
3210 | 4622 aim_ssi_setpermdeny(od->sess, od->conn, gc->permdeny, 0xffffffff); |
2086 | 4623 } |
4624 } | |
4625 | |
4626 static void oscar_add_permit(struct gaim_connection *gc, char *who) { | |
2991 | 4627 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
2995 | 4628 if (od->icq) { |
4629 if (gc->permdeny != 3) return; | |
4630 oscar_set_permit_deny(gc); | |
4631 } else { | |
4632 debug_printf("ssi: About to add a permit\n"); | |
4633 if (od->sess->ssi.received_data) | |
3466 | 4634 aim_ssi_addpord(od->sess, od->conn, (const char **) &who, 1, AIM_SSI_TYPE_PERMIT); |
2995 | 4635 } |
2086 | 4636 } |
4637 | |
4638 static void oscar_add_deny(struct gaim_connection *gc, char *who) { | |
2991 | 4639 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
2995 | 4640 if (od->icq) { |
4641 if (gc->permdeny != 4) return; | |
4642 oscar_set_permit_deny(gc); | |
4643 } else { | |
4644 debug_printf("ssi: About to add a deny\n"); | |
4645 if (od->sess->ssi.received_data) | |
3466 | 4646 aim_ssi_addpord(od->sess, od->conn, (const char **) &who, 1, AIM_SSI_TYPE_DENY); |
2995 | 4647 } |
2086 | 4648 } |
4649 | |
4650 static void oscar_rem_permit(struct gaim_connection *gc, char *who) { | |
2991 | 4651 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
2995 | 4652 if (od->icq) { |
4653 if (gc->permdeny != 3) return; | |
4654 oscar_set_permit_deny(gc); | |
4655 } else { | |
4656 debug_printf("ssi: About to delete a permit\n"); | |
4657 if (od->sess->ssi.received_data) | |
3595 | 4658 aim_ssi_delpord(od->sess, od->conn, (const char **) &who, 1, AIM_SSI_TYPE_PERMIT); |
2995 | 4659 } |
2086 | 4660 } |
4661 | |
4662 static void oscar_rem_deny(struct gaim_connection *gc, char *who) { | |
2991 | 4663 struct oscar_data *od = (struct oscar_data *)gc->proto_data; |
2995 | 4664 if (od->icq) { |
4665 if (gc->permdeny != 4) return; | |
4666 oscar_set_permit_deny(gc); | |
4667 } else { | |
4668 debug_printf("ssi: About to delete a deny\n"); | |
4669 if (od->sess->ssi.received_data) | |
3595 | 4670 aim_ssi_delpord(od->sess, od->conn, (const char **) &who, 1, AIM_SSI_TYPE_DENY); |
2995 | 4671 } |
2086 | 4672 } |
4673 | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4674 static GList *oscar_away_states(struct gaim_connection *gc) |
2086 | 4675 { |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4676 struct oscar_data *od = gc->proto_data; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4677 GList *m = NULL; |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4678 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4679 if (!od->icq) |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4680 return g_list_append(m, GAIM_AWAY_CUSTOM); |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4681 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4682 m = g_list_append(m, "Online"); |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4683 m = g_list_append(m, "Away"); |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4684 m = g_list_append(m, "Do Not Disturb"); |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4685 m = g_list_append(m, "Not Available"); |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4686 m = g_list_append(m, "Occupied"); |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4687 m = g_list_append(m, "Free For Chat"); |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4688 m = g_list_append(m, "Invisible"); |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4689 |
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2432
diff
changeset
|
4690 return m; |
2086 | 4691 } |
4692 | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4693 static void oscar_change_email(struct gaim_connection *gc, char *email) |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4694 { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4695 struct oscar_data *od = gc->proto_data; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4696 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
|
4697 |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4698 if (conn) { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4699 aim_admin_setemail(od->sess, conn, email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4700 } else { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4701 od->setemail = TRUE; |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4702 od->email = g_strdup(email); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4703 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4704 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4705 } |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4706 |
2979 | 4707 static void oscar_format_screenname(struct gaim_connection *gc, char *nick) { |
4708 struct oscar_data *od = gc->proto_data; | |
3031 | 4709 if (!strcmp(normalize(nick), normalize(gc->username))) { |
2979 | 4710 if (!aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH)) { |
4711 od->setnick = TRUE; | |
4712 od->newsn = g_strdup(nick); | |
4713 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); | |
4714 } else { | |
4715 aim_admin_setnick(od->sess, aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH), nick); | |
4716 } | |
4717 } else { | |
3427 | 4718 do_error_dialog("The new formatting is invalid.", |
4719 "Screenname formatting can change only capitalization and whitespace.", GAIM_ERROR); | |
2979 | 4720 } |
4721 } | |
4722 | |
2086 | 4723 static void oscar_do_action(struct gaim_connection *gc, char *act) |
4724 { | |
4725 struct oscar_data *od = gc->proto_data; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4726 aim_conn_t *conn = aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH); |
2086 | 4727 |
4728 if (!strcmp(act, "Set User Info")) { | |
4729 show_set_info(gc); | |
4730 } else if (!strcmp(act, "Change Password")) { | |
4731 show_change_passwd(gc); | |
2979 | 4732 } else if (!strcmp(act, "Format Screenname")) { |
4733 do_prompt_dialog("New screenname formatting:", | |
4734 gc->displayname, gc, oscar_format_screenname, NULL); | |
2086 | 4735 } else if (!strcmp(act, "Confirm Account")) { |
4736 if (!conn) { | |
4737 od->conf = TRUE; | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4738 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); |
2086 | 4739 } else |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4740 aim_admin_reqconfirm(od->sess, conn); |
2086 | 4741 } else if (!strcmp(act, "Display Current Registered Address")) { |
4742 if (!conn) { | |
4743 od->reqemail = TRUE; | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4744 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); |
2086 | 4745 } else |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4746 aim_admin_getinfo(od->sess, conn, 0x11); |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4747 } else if (!strcmp(act, "Change Current Registered Address")) { |
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4748 do_prompt_dialog("Change Address To: ", NULL, gc, oscar_change_email, NULL); |
2086 | 4749 } else if (!strcmp(act, "Search for Buddy by Email")) { |
4750 show_find_email(gc); | |
4751 } | |
4752 } | |
4753 | |
4754 static GList *oscar_actions() | |
4755 { | |
4756 GList *m = NULL; | |
4757 | |
4758 m = g_list_append(m, "Set User Info"); | |
4759 m = g_list_append(m, NULL); | |
4760 m = g_list_append(m, "Change Password"); | |
2979 | 4761 m = g_list_append(m, "Format Screenname"); |
2086 | 4762 m = g_list_append(m, "Confirm Account"); |
4763 m = g_list_append(m, "Display Current Registered Address"); | |
2768
8a918df1a5ed
[gaim-migrate @ 2781]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2762
diff
changeset
|
4764 m = g_list_append(m, "Change Current Registered Address"); |
2086 | 4765 m = g_list_append(m, NULL); |
4766 m = g_list_append(m, "Search for Buddy by Email"); | |
4767 | |
4768 return m; | |
4769 } | |
4770 | |
3466 | 4771 static void oscar_change_passwd(struct gaim_connection *gc, const char *old, const char *new) |
2086 | 4772 { |
4773 struct oscar_data *od = gc->proto_data; | |
4774 if (!aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH)) { | |
4775 od->chpass = TRUE; | |
4776 od->oldp = g_strdup(old); | |
4777 od->newp = g_strdup(new); | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4778 aim_reqservice(od->sess, od->conn, AIM_CONN_TYPE_AUTH); |
2086 | 4779 } else { |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2698
diff
changeset
|
4780 aim_admin_changepasswd(od->sess, aim_getconn_type(od->sess, AIM_CONN_TYPE_AUTH), |
2086 | 4781 new, old); |
4782 } | |
4783 } | |
4784 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4785 static void oscar_convo_closed(struct gaim_connection *gc, char *who) |
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 struct oscar_data *od = gc->proto_data; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4788 struct direct_im *dim = find_direct_im(od, who); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4789 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4790 if (!dim) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4791 return; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4792 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4793 od->direct_ims = g_slist_remove(od->direct_ims, dim); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4794 gaim_input_remove(dim->watcher); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4795 aim_conn_kill(od->sess, &dim->conn); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4796 g_free(dim); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4797 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4798 |
3035 | 4799 |
4800 | |
2086 | 4801 static struct prpl *my_protocol = NULL; |
4802 | |
3630 | 4803 G_MODULE_EXPORT void oscar_init(struct prpl *ret) { |
3572 | 4804 struct proto_user_opt *puo; |
2086 | 4805 ret->protocol = PROTO_OSCAR; |
3694 | 4806 ret->options = OPT_PROTO_MAIL_CHECK | OPT_PROTO_BUDDY_ICON | OPT_PROTO_IM_IMAGE; |
3858 | 4807 ret->name = g_strdup("AIM/ICQ"); |
2086 | 4808 ret->list_icon = oscar_list_icon; |
4809 ret->away_states = oscar_away_states; | |
4810 ret->actions = oscar_actions; | |
4811 ret->do_action = oscar_do_action; | |
4812 ret->buddy_menu = oscar_buddy_menu; | |
3456 | 4813 ret->edit_buddy_menu = oscar_edit_buddy_menu; |
2086 | 4814 ret->login = oscar_login; |
4815 ret->close = oscar_close; | |
4816 ret->send_im = oscar_send_im; | |
2993 | 4817 ret->send_typing = oscar_send_typing; |
2086 | 4818 ret->set_info = oscar_set_info; |
4819 ret->get_info = oscar_get_info; | |
4820 ret->set_away = oscar_set_away; | |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2789
diff
changeset
|
4821 ret->get_away = oscar_get_away; |
2086 | 4822 ret->set_dir = oscar_set_dir; |
4823 ret->get_dir = NULL; /* Oscar really doesn't have this */ | |
4824 ret->dir_search = oscar_dir_search; | |
4825 ret->set_idle = oscar_set_idle; | |
4826 ret->change_passwd = oscar_change_passwd; | |
4827 ret->add_buddy = oscar_add_buddy; | |
4828 ret->add_buddies = oscar_add_buddies; | |
3140 | 4829 ret->group_buddy = oscar_move_buddy; |
3348 | 4830 ret->rename_group = oscar_rename_group; |
3771 | 4831 ret->file_transfer_cancel = oscar_file_transfer_cancel; |
4832 ret->file_transfer_in = oscar_file_transfer_in; | |
4833 ret->file_transfer_out = oscar_file_transfer_out; | |
4834 ret->file_transfer_data_chunk = oscar_file_transfer_data_chunk; | |
4835 ret->file_transfer_nextfile = oscar_file_transfer_nextfile; | |
4836 ret->file_transfer_done = oscar_file_transfer_done; | |
2086 | 4837 ret->remove_buddy = oscar_remove_buddy; |
2991 | 4838 ret->remove_buddies = oscar_remove_buddies; |
2086 | 4839 ret->add_permit = oscar_add_permit; |
4840 ret->add_deny = oscar_add_deny; | |
4841 ret->rem_permit = oscar_rem_permit; | |
4842 ret->rem_deny = oscar_rem_deny; | |
4843 ret->set_permit_deny = oscar_set_permit_deny; | |
4844 ret->warn = oscar_warn; | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2197
diff
changeset
|
4845 ret->chat_info = oscar_chat_info; |
2086 | 4846 ret->join_chat = oscar_join_chat; |
4847 ret->chat_invite = oscar_chat_invite; | |
4848 ret->chat_leave = oscar_chat_leave; | |
4849 ret->chat_whisper = NULL; | |
4850 ret->chat_send = oscar_chat_send; | |
4851 ret->keepalive = oscar_keepalive; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2235
diff
changeset
|
4852 ret->convo_closed = oscar_convo_closed; |
2086 | 4853 |
3572 | 4854 puo = g_new0(struct proto_user_opt, 1); |
4855 puo->label = g_strdup("Auth Host:"); | |
4856 puo->def = g_strdup("login.oscar.aol.com"); | |
4857 puo->pos = USEROPT_AUTH; | |
4858 ret->user_opts = g_list_append(ret->user_opts, puo); | |
4859 | |
4860 puo = g_new0(struct proto_user_opt, 1); | |
4861 puo->label = g_strdup("Auth Port:"); | |
4862 puo->def = g_strdup("5190"); | |
4863 puo->pos = USEROPT_AUTHPORT; | |
4864 ret->user_opts = g_list_append(ret->user_opts, puo); | |
4865 | |
2086 | 4866 my_protocol = ret; |
4867 } | |
4868 | |
4869 #ifndef STATIC | |
4870 | |
3630 | 4871 G_MODULE_EXPORT void gaim_prpl_init(struct prpl *prpl) |
2086 | 4872 { |
3572 | 4873 oscar_init(prpl); |
4874 prpl->plug->desc.api_version = PLUGIN_API_VERSION; | |
2086 | 4875 } |
4876 | |
4877 #endif |