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