Mercurial > pidgin.yaz
annotate src/protocols/yahoo/yahoo.c @ 6793:3d84c933b939
[gaim-migrate @ 7332]
Tim Ringenbach (marv_sf) writes:
" This makes two things work (on the server side list):
1) Moving buddies between groups.
2) Renaming groups.
It doesn't, however, fix the case where Gaim disagrees
with the server as to what group a buddy is in. But
that doesn't make anything bad happen really, so I'll
save it for another patch. And moving the buddy seems
get the server and gaim in sync again."
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Mon, 08 Sep 2003 10:08:39 +0000 |
parents | 62aec9fd7aca |
children | 40ba19133882 |
rev | line source |
---|---|
2681 | 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 */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
22 #include "internal.h" |
2681 | 23 |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
24 #include "account.h" |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5590
diff
changeset
|
25 #include "accountopt.h" |
6760 | 26 #include "blist.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
27 #include "debug.h" |
2681 | 28 #include "multi.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
29 #include "notify.h" |
6760 | 30 #include "privacy.h" |
2681 | 31 #include "prpl.h" |
32 #include "proxy.h" | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
33 #include "request.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
34 #include "server.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
35 #include "util.h" |
6115
11bedb793a44
[gaim-migrate @ 6578]
Christian Hammond <chipx86@chipx86.com>
parents:
6069
diff
changeset
|
36 #include "html.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
37 |
6513 | 38 #include "yahoo.h" |
6729 | 39 #include "yahoochat.h" |
3147 | 40 #include "md5.h" |
2681 | 41 |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
42 /* XXX */ |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6321
diff
changeset
|
43 #include "gtkinternal.h" |
6546 | 44 #include "gaim.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
45 #include "ui.h" |
3630 | 46 |
5583 | 47 extern char *yahoo_crypt(const char *, const char *); |
2795
536bb833fdeb
[gaim-migrate @ 2808]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2786
diff
changeset
|
48 |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
49 /* #define YAHOO_DEBUG */ |
2681 | 50 |
51 #define USEROPT_MAIL 0 | |
52 | |
3147 | 53 #define YAHOO_PAGER_HOST "scs.yahoo.com" |
2681 | 54 #define YAHOO_PAGER_PORT 5050 |
6514 | 55 #define YAHOO_PROFILE_URL "http://profiles.yahoo.com/" |
2681 | 56 |
3467 | 57 #define YAHOO_PROTO_VER 0x0900 |
58 | |
2681 | 59 #define YAHOO_PACKET_HDRLEN (4 + 2 + 2 + 2 + 2 + 4 + 4) |
60 | |
6791 | 61 static void yahoo_add_buddy(GaimConnection *gc, const char *who, GaimGroup *); |
6784 | 62 |
63 static struct yahoo_friend *yahoo_friend_new() | |
64 { | |
65 struct yahoo_friend *ret; | |
66 | |
67 ret = g_new0(struct yahoo_friend, 1); | |
68 ret->status = YAHOO_STATUS_OFFLINE; | |
69 | |
70 return ret; | |
71 } | |
72 | |
73 static void yahoo_friend_free(gpointer p) | |
74 { | |
75 struct yahoo_friend *f = p; | |
76 if (f->msg) | |
77 g_free(f->msg); | |
78 if (f->game) | |
79 g_free(f->game); | |
80 g_free(f); | |
81 } | |
82 | |
6729 | 83 struct yahoo_packet *yahoo_packet_new(enum yahoo_service service, enum yahoo_status status, int id) |
2681 | 84 { |
85 struct yahoo_packet *pkt = g_new0(struct yahoo_packet, 1); | |
86 | |
87 pkt->service = service; | |
88 pkt->status = status; | |
89 pkt->id = id; | |
90 | |
91 return pkt; | |
92 } | |
93 | |
6729 | 94 void yahoo_packet_hash(struct yahoo_packet *pkt, int key, const char *value) |
2681 | 95 { |
96 struct yahoo_pair *pair = g_new0(struct yahoo_pair, 1); | |
97 pair->key = key; | |
98 pair->value = g_strdup(value); | |
99 pkt->hash = g_slist_append(pkt->hash, pair); | |
100 } | |
101 | |
102 static int yahoo_packet_length(struct yahoo_packet *pkt) | |
103 { | |
104 GSList *l; | |
105 | |
106 int len = 0; | |
107 | |
108 l = pkt->hash; | |
109 while (l) { | |
110 struct yahoo_pair *pair = l->data; | |
111 int tmp = pair->key; | |
112 do { | |
113 tmp /= 10; | |
114 len++; | |
115 } while (tmp); | |
116 len += 2; | |
117 len += strlen(pair->value); | |
118 len += 2; | |
119 l = l->next; | |
120 } | |
121 | |
122 return len; | |
123 } | |
124 | |
125 /* sometimes i wish prpls could #include things from other prpls. then i could just | |
126 * use the routines from libfaim and not have to admit to knowing how they work. */ | |
127 #define yahoo_put16(buf, data) ( \ | |
128 (*(buf) = (u_char)((data)>>8)&0xff), \ | |
129 (*((buf)+1) = (u_char)(data)&0xff), \ | |
130 2) | |
131 #define yahoo_get16(buf) ((((*(buf))<<8)&0xff00) + ((*((buf)+1)) & 0xff)) | |
132 #define yahoo_put32(buf, data) ( \ | |
133 (*((buf)) = (u_char)((data)>>24)&0xff), \ | |
134 (*((buf)+1) = (u_char)((data)>>16)&0xff), \ | |
135 (*((buf)+2) = (u_char)((data)>>8)&0xff), \ | |
136 (*((buf)+3) = (u_char)(data)&0xff), \ | |
137 4) | |
138 #define yahoo_get32(buf) ((((*(buf))<<24)&0xff000000) + \ | |
139 (((*((buf)+1))<<16)&0x00ff0000) + \ | |
140 (((*((buf)+2))<< 8)&0x0000ff00) + \ | |
141 (((*((buf)+3) )&0x000000ff))) | |
142 | |
143 static void yahoo_packet_read(struct yahoo_packet *pkt, guchar *data, int len) | |
144 { | |
145 int pos = 0; | |
146 | |
147 while (pos + 1 < len) { | |
6629 | 148 char key[64], *value = NULL, *esc; |
2724
7f3f4aa114ad
[gaim-migrate @ 2737]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2723
diff
changeset
|
149 int accept; |
2681 | 150 int x; |
151 | |
152 struct yahoo_pair *pair = g_new0(struct yahoo_pair, 1); | |
153 | |
154 x = 0; | |
155 while (pos + 1 < len) { | |
156 if (data[pos] == 0xc0 && data[pos + 1] == 0x80) | |
157 break; | |
158 key[x++] = data[pos++]; | |
159 } | |
160 key[x] = 0; | |
161 pos += 2; | |
162 pair->key = strtol(key, NULL, 10); | |
2724
7f3f4aa114ad
[gaim-migrate @ 2737]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2723
diff
changeset
|
163 accept = x; /* if x is 0 there was no key, so don't accept it */ |
2681 | 164 |
3996
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
165 if (len - pos + 1 <= 0) { |
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
166 /* Truncated. Garbage or something. */ |
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
167 accept = 0; |
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
168 } |
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
169 |
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
170 if (accept) { |
2724
7f3f4aa114ad
[gaim-migrate @ 2737]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2723
diff
changeset
|
171 value = g_malloc(len - pos + 1); |
3996
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
172 x = 0; |
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
173 while (pos + 1 < len) { |
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
174 if (data[pos] == 0xc0 && data[pos + 1] == 0x80) |
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
175 break; |
2724
7f3f4aa114ad
[gaim-migrate @ 2737]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2723
diff
changeset
|
176 value[x++] = data[pos++]; |
3996
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
177 } |
2724
7f3f4aa114ad
[gaim-migrate @ 2737]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2723
diff
changeset
|
178 value[x] = 0; |
7f3f4aa114ad
[gaim-migrate @ 2737]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2723
diff
changeset
|
179 pair->value = g_strdup(value); |
7f3f4aa114ad
[gaim-migrate @ 2737]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2723
diff
changeset
|
180 g_free(value); |
7f3f4aa114ad
[gaim-migrate @ 2737]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2723
diff
changeset
|
181 pkt->hash = g_slist_append(pkt->hash, pair); |
6629 | 182 esc = g_strescape(pair->value, NULL); |
5220
7b9d78fa051e
[gaim-migrate @ 5590]
Christian Hammond <chipx86@chipx86.com>
parents:
5216
diff
changeset
|
183 gaim_debug(GAIM_DEBUG_MISC, "yahoo", |
6629 | 184 "Key: %d \tValue: %s\n", pair->key, esc); |
185 g_free(esc); | |
2724
7f3f4aa114ad
[gaim-migrate @ 2737]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2723
diff
changeset
|
186 } else { |
7f3f4aa114ad
[gaim-migrate @ 2737]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2723
diff
changeset
|
187 g_free(pair); |
7f3f4aa114ad
[gaim-migrate @ 2737]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2723
diff
changeset
|
188 } |
3996
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
189 pos += 2; |
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
190 |
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
191 /* Skip over garbage we've noticed in the mail notifications */ |
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
192 if (data[0] == '9' && data[pos] == 0x01) |
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
193 pos++; |
2681 | 194 } |
195 } | |
196 | |
197 static void yahoo_packet_write(struct yahoo_packet *pkt, guchar *data) | |
198 { | |
199 GSList *l = pkt->hash; | |
200 int pos = 0; | |
201 | |
202 while (l) { | |
203 struct yahoo_pair *pair = l->data; | |
204 guchar buf[100]; | |
205 | |
206 g_snprintf(buf, sizeof(buf), "%d", pair->key); | |
207 strcpy(data + pos, buf); | |
208 pos += strlen(buf); | |
209 data[pos++] = 0xc0; | |
210 data[pos++] = 0x80; | |
211 | |
212 strcpy(data + pos, pair->value); | |
213 pos += strlen(pair->value); | |
214 data[pos++] = 0xc0; | |
215 data[pos++] = 0x80; | |
216 | |
217 l = l->next; | |
218 } | |
219 } | |
220 | |
221 static void yahoo_packet_dump(guchar *data, int len) | |
222 { | |
223 #ifdef YAHOO_DEBUG | |
224 int i; | |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
225 |
5220
7b9d78fa051e
[gaim-migrate @ 5590]
Christian Hammond <chipx86@chipx86.com>
parents:
5216
diff
changeset
|
226 gaim_debug(GAIM_DEBUG_MISC, "yahoo", ""); |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
227 |
2681 | 228 for (i = 0; i + 1 < len; i += 2) { |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
229 if ((i % 16 == 0) && i) { |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
230 gaim_debug(GAIM_DEBUG_MISC, NULL, "\n"); |
5220
7b9d78fa051e
[gaim-migrate @ 5590]
Christian Hammond <chipx86@chipx86.com>
parents:
5216
diff
changeset
|
231 gaim_debug(GAIM_DEBUG_MISC, "yahoo", ""); |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
232 } |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
233 |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
234 gaim_debug(GAIM_DEBUG_MISC, NULL, "%02x%02x ", data[i], data[i + 1]); |
2681 | 235 } |
236 if (i < len) | |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
237 gaim_debug(GAIM_DEBUG_MISC, NULL, "%02x", data[i]); |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
238 |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
239 gaim_debug(GAIM_DEBUG_MISC, NULL, "\n"); |
5220
7b9d78fa051e
[gaim-migrate @ 5590]
Christian Hammond <chipx86@chipx86.com>
parents:
5216
diff
changeset
|
240 gaim_debug(GAIM_DEBUG_MISC, "yahoo", ""); |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
241 |
2681 | 242 for (i = 0; i < len; i++) { |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
243 if ((i % 16 == 0) && i) { |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
244 gaim_debug(GAIM_DEBUG_MISC, NULL, "\n"); |
5220
7b9d78fa051e
[gaim-migrate @ 5590]
Christian Hammond <chipx86@chipx86.com>
parents:
5216
diff
changeset
|
245 gaim_debug(GAIM_DEBUG_MISC, "yahoo", ""); |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
246 } |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
247 |
6686 | 248 if (g_ascii_isprint(data[i])) |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
249 gaim_debug(GAIM_DEBUG_MISC, NULL, "%c ", data[i]); |
2681 | 250 else |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
251 gaim_debug(GAIM_DEBUG_MISC, NULL, ". "); |
2681 | 252 } |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
253 |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
254 gaim_debug(GAIM_DEBUG_MISC, NULL, "\n"); |
2681 | 255 #endif |
256 } | |
257 | |
6729 | 258 int yahoo_send_packet(struct yahoo_data *yd, struct yahoo_packet *pkt) |
2681 | 259 { |
260 int pktlen = yahoo_packet_length(pkt); | |
261 int len = YAHOO_PACKET_HDRLEN + pktlen; | |
262 int ret; | |
263 | |
264 guchar *data; | |
265 int pos = 0; | |
266 | |
267 if (yd->fd < 0) | |
268 return -1; | |
269 | |
270 data = g_malloc0(len + 1); | |
271 | |
272 memcpy(data + pos, "YMSG", 4); pos += 4; | |
3467 | 273 pos += yahoo_put16(data + pos, YAHOO_PROTO_VER); |
2681 | 274 pos += yahoo_put16(data + pos, 0x0000); |
275 pos += yahoo_put16(data + pos, pktlen); | |
276 pos += yahoo_put16(data + pos, pkt->service); | |
277 pos += yahoo_put32(data + pos, pkt->status); | |
278 pos += yahoo_put32(data + pos, pkt->id); | |
279 | |
280 yahoo_packet_write(pkt, data + pos); | |
281 | |
282 yahoo_packet_dump(data, len); | |
283 ret = write(yd->fd, data, len); | |
284 g_free(data); | |
285 | |
286 return ret; | |
287 } | |
288 | |
6729 | 289 void yahoo_packet_free(struct yahoo_packet *pkt) |
2681 | 290 { |
291 while (pkt->hash) { | |
292 struct yahoo_pair *pair = pkt->hash->data; | |
293 g_free(pair->value); | |
294 g_free(pair); | |
295 pkt->hash = g_slist_remove(pkt->hash, pair); | |
296 } | |
297 g_free(pkt); | |
298 } | |
299 | |
6784 | 300 static void yahoo_update_status(GaimConnection *gc, const char *name, struct yahoo_friend *f) |
301 { | |
302 if (!gc || !name || !f || !gaim_find_buddy(gaim_connection_get_account(gc), name)) | |
303 return; | |
304 | |
305 serv_got_update(gc, name, 1, 0, 0, f->idle, f->away ? UC_UNAVAILABLE : 0); | |
306 } | |
307 | |
5583 | 308 static void yahoo_process_status(GaimConnection *gc, struct yahoo_packet *pkt) |
2681 | 309 { |
310 struct yahoo_data *yd = gc->proto_data; | |
311 GSList *l = pkt->hash; | |
6784 | 312 struct yahoo_friend *f = NULL; |
2681 | 313 char *name = NULL; |
6784 | 314 |
6686 | 315 |
2681 | 316 while (l) { |
317 struct yahoo_pair *pair = l->data; | |
318 | |
319 switch (pair->key) { | |
320 case 0: /* we won't actually do anything with this */ | |
321 break; | |
322 case 1: /* we don't get the full buddy list here. */ | |
2805
9b3c7d2a6e9a
[gaim-migrate @ 2818]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2795
diff
changeset
|
323 if (!yd->logged_in) { |
5583 | 324 gaim_connection_set_state(gc, GAIM_CONNECTED); |
2805
9b3c7d2a6e9a
[gaim-migrate @ 2818]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2795
diff
changeset
|
325 serv_finish_login(gc); |
5583 | 326 gaim_connection_set_display_name(gc, pair->value); |
2805
9b3c7d2a6e9a
[gaim-migrate @ 2818]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2795
diff
changeset
|
327 yd->logged_in = TRUE; |
2681 | 328 |
3147 | 329 /* this requests the list. i have a feeling that this is very evil |
330 * | |
6686 | 331 * scs.yahoo.com sends you the list before this packet without it being |
3147 | 332 * requested |
333 * | |
334 * do_import(gc, NULL); | |
335 * newpkt = yahoo_packet_new(YAHOO_SERVICE_LIST, YAHOO_STATUS_OFFLINE, 0); | |
336 * yahoo_send_packet(yd, newpkt); | |
337 * yahoo_packet_free(newpkt); | |
338 */ | |
339 | |
340 } | |
2681 | 341 break; |
342 case 8: /* how many online buddies we have */ | |
343 break; | |
344 case 7: /* the current buddy */ | |
345 name = pair->value; | |
6784 | 346 f = g_hash_table_lookup(yd->friends, name); |
347 if (!f) { | |
348 f = yahoo_friend_new(); | |
349 g_hash_table_insert(yd->friends, g_strdup(name), f); | |
350 } | |
2681 | 351 break; |
352 case 10: /* state */ | |
6784 | 353 if (!f) |
354 break; | |
355 | |
356 f->status = strtol(pair->value, NULL, 10); | |
357 if ((f->status >= YAHOO_STATUS_BRB) && (f->status <= YAHOO_STATUS_STEPPEDOUT)) | |
358 f->away = 1; | |
359 else | |
360 f->away = 0; | |
361 if (f->status == YAHOO_STATUS_IDLE) | |
362 f->idle = time(NULL); | |
363 if (f->status != YAHOO_STATUS_CUSTOM) { | |
364 g_free(f->msg); | |
365 f->msg = NULL; | |
366 } | |
367 if (f->status == YAHOO_STATUS_AVAILABLE) | |
368 f->idle = 0; | |
2681 | 369 break; |
370 case 19: /* custom message */ | |
6784 | 371 if (f) { |
372 if (f->msg) | |
373 g_free(f->msg); | |
374 f->msg = g_strdup(pair->value); | |
375 } | |
2681 | 376 break; |
6686 | 377 case 11: /* this is the buddy's session id */ |
2681 | 378 break; |
379 case 17: /* in chat? */ | |
380 break; | |
6784 | 381 case 47: /* is custom status away or not? 2=idle*/ |
382 if (!f) | |
383 break; | |
384 f->away = strtol(pair->value, NULL, 10); | |
385 if (f->away == 2) | |
386 f->idle = time(NULL); | |
6686 | 387 break; |
6784 | 388 case 138: /* either we're not idle, or we are but won't say how long */ |
389 if (!f) | |
390 break; | |
391 | |
392 if (f->idle) | |
393 f->idle = -1; | |
394 break; | |
395 case 137: /* usually idle time in seconds, sometimes login time */ | |
396 if (!f) | |
397 break; | |
398 | |
399 if (f->status != YAHOO_STATUS_AVAILABLE) | |
400 f->idle = time(NULL) - strtol(pair->value, NULL, 10); | |
6686 | 401 break; |
402 case 13: /* bitmask, bit 0 = pager, bit 1 = chat, bit 2 = game */ | |
6784 | 403 if (strtol(pair->value, NULL, 10) == 0) { |
404 if (f) | |
405 f->status = YAHOO_STATUS_OFFLINE; | |
4732 | 406 serv_got_update(gc, name, 0, 0, 0, 0, 0); |
2807
f01e6a425136
[gaim-migrate @ 2820]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2805
diff
changeset
|
407 break; |
2805
9b3c7d2a6e9a
[gaim-migrate @ 2818]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2795
diff
changeset
|
408 } |
6784 | 409 |
410 if (f) | |
411 yahoo_update_status(gc, name, f); | |
412 break; | |
413 case 60: /* SMS */ | |
414 if (f) { | |
415 f->sms = strtol(pair->value, NULL, 10); | |
416 yahoo_update_status(gc, name, f); | |
2771
450f4f9d2f23
[gaim-migrate @ 2784]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2741
diff
changeset
|
417 } |
450f4f9d2f23
[gaim-migrate @ 2784]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2741
diff
changeset
|
418 break; |
2979 | 419 case 16: /* Custom error message */ |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5367
diff
changeset
|
420 gaim_notify_error(gc, NULL, pair->value, NULL); |
2951 | 421 break; |
2681 | 422 default: |
5220
7b9d78fa051e
[gaim-migrate @ 5590]
Christian Hammond <chipx86@chipx86.com>
parents:
5216
diff
changeset
|
423 gaim_debug(GAIM_DEBUG_ERROR, "yahoo", |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
424 "Unknown status key %d\n", pair->key); |
2681 | 425 break; |
426 } | |
427 | |
428 l = l->next; | |
429 } | |
430 } | |
431 | |
5583 | 432 static void yahoo_process_list(GaimConnection *gc, struct yahoo_packet *pkt) |
2681 | 433 { |
434 GSList *l = pkt->hash; | |
435 gboolean export = FALSE; | |
6760 | 436 gboolean got_serv_list = FALSE; |
6695 | 437 GaimBuddy *b; |
438 GaimGroup *g; | |
6784 | 439 struct yahoo_friend *f = NULL; |
440 struct yahoo_data *yd = gc->proto_data; | |
441 | |
442 char **lines; | |
443 char **split; | |
444 char **buddies; | |
445 char **tmp, **bud; | |
2681 | 446 |
6691
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
447 while (l) { |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
448 struct yahoo_pair *pair = l->data; |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
449 l = l->next; |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
450 |
6760 | 451 switch (pair->key) { |
452 case 87: | |
6784 | 453 if (!yd->tmp_serv_blist) |
454 yd->tmp_serv_blist = g_string_new(pair->value); | |
455 else | |
456 g_string_append(yd->tmp_serv_blist, pair->value); | |
6760 | 457 break; |
458 case 88: | |
6784 | 459 if (!yd->tmp_serv_ilist) |
460 yd->tmp_serv_ilist = g_string_new(pair->value); | |
461 else | |
462 g_string_append(yd->tmp_serv_ilist, pair->value); | |
6760 | 463 break; |
6691
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
464 } |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
465 } |
2681 | 466 |
6784 | 467 if (pkt->status != 0) |
468 return; | |
469 | |
470 if (yd->tmp_serv_blist) { | |
471 lines = g_strsplit(yd->tmp_serv_blist->str, "\n", -1); | |
472 for (tmp = lines; *tmp; tmp++) { | |
473 split = g_strsplit(*tmp, ":", 2); | |
474 if (!split) | |
475 continue; | |
476 if (!split[0] || !split[1]) { | |
477 g_strfreev(split); | |
478 continue; | |
479 } | |
480 buddies = g_strsplit(split[1], ",", -1); | |
481 for (bud = buddies; bud && *bud; bud++) { | |
482 if (!(f = g_hash_table_lookup(yd->friends, *bud))) { | |
483 f = yahoo_friend_new(*bud); | |
484 g_hash_table_insert(yd->friends, g_strdup(*bud), f); | |
485 } | |
486 if (!(b = gaim_find_buddy(gc->account, *bud))) { | |
487 if (!(g = gaim_find_group(split[0]))) { | |
488 g = gaim_group_new(split[0]); | |
489 gaim_blist_add_group(g, NULL); | |
490 } | |
491 b = gaim_buddy_new(gc->account, *bud, NULL); | |
492 gaim_blist_add_buddy(b, NULL, g, NULL); | |
493 export = TRUE; | |
494 } /*else { do something here is gaim and yahoo don't agree on the buddies group | |
495 GaimGroup *tmpgp; | |
496 | |
497 tmpgp = gaim_find_buddys_group(b); | |
498 if (!tmpgp || !gaim_utf8_strcasecmp(tmpgp->name, split[0])) { | |
499 GaimGroup *ng; | |
500 if (!(ng = gaim_find_group(split[0])) { | |
501 g = gaim_group_new(split[0]); | |
502 gaim_blist_add_group(g, NULL); | |
503 } */ | |
504 | |
505 } | |
506 g_strfreev(buddies); | |
507 g_strfreev(split); | |
508 } | |
509 g_strfreev(lines); | |
510 | |
511 g_string_free(yd->tmp_serv_blist, TRUE); | |
512 yd->tmp_serv_blist = NULL; | |
513 } | |
514 | |
515 | |
516 if (yd->tmp_serv_ilist) { | |
517 buddies = g_strsplit(yd->tmp_serv_ilist->str, ",", -1); | |
518 for (bud = buddies; bud && *bud; bud++) { | |
519 /* The server is already ignoring the user */ | |
520 got_serv_list = TRUE; | |
521 gaim_privacy_deny_add(gc->account, *bud, 1); | |
522 } | |
523 g_strfreev(buddies); | |
524 | |
525 g_string_free(yd->tmp_serv_ilist, TRUE); | |
526 yd->tmp_serv_ilist = NULL; | |
527 } | |
528 | |
529 if (got_serv_list) { | |
530 gc->account->perm_deny = 4; | |
531 serv_set_permit_deny(gc); | |
532 } | |
2681 | 533 if (export) |
4349 | 534 gaim_blist_save(); |
2681 | 535 } |
536 | |
5583 | 537 static void yahoo_process_notify(GaimConnection *gc, struct yahoo_packet *pkt) |
2993 | 538 { |
539 char *msg = NULL; | |
540 char *from = NULL; | |
3019 | 541 char *stat = NULL; |
542 char *game = NULL; | |
6784 | 543 struct yahoo_friend *f = NULL; |
2993 | 544 GSList *l = pkt->hash; |
3019 | 545 struct yahoo_data *yd = (struct yahoo_data*) gc->proto_data; |
6784 | 546 |
2993 | 547 while (l) { |
548 struct yahoo_pair *pair = l->data; | |
549 if (pair->key == 4) | |
550 from = pair->value; | |
551 if (pair->key == 49) | |
552 msg = pair->value; | |
3001 | 553 if (pair->key == 13) |
3019 | 554 stat = pair->value; |
555 if (pair->key == 14) | |
556 game = pair->value; | |
2993 | 557 l = l->next; |
558 } | |
3640 | 559 |
6784 | 560 if (!from || !msg) |
3640 | 561 return; |
6686 | 562 |
4793 | 563 if (!g_ascii_strncasecmp(msg, "TYPING", strlen("TYPING"))) { |
3019 | 564 if (*stat == '1') |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
565 serv_got_typing(gc, from, 0, GAIM_TYPING); |
3019 | 566 else |
567 serv_got_typing_stopped(gc, from); | |
4793 | 568 } else if (!g_ascii_strncasecmp(msg, "GAME", strlen("GAME"))) { |
6695 | 569 GaimBuddy *bud = gaim_find_buddy(gc->account, from); |
6784 | 570 |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
571 if (!bud) { |
5220
7b9d78fa051e
[gaim-migrate @ 5590]
Christian Hammond <chipx86@chipx86.com>
parents:
5216
diff
changeset
|
572 gaim_debug(GAIM_DEBUG_WARNING, "yahoo", |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
573 "%s is playing a game, and doesn't want " |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
574 "you to know.\n", from); |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
575 } |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
576 |
6784 | 577 f = g_hash_table_lookup(yd->friends, from); |
578 if (!f) | |
579 return; /* if they're not on the list, don't bother */ | |
580 | |
581 if (f->game) { | |
582 g_free(f->game); | |
583 f->game = NULL; | |
584 } | |
585 | |
3019 | 586 if (*stat == '1') { |
6784 | 587 f->game = g_strdup(game); |
3020 | 588 if (bud) |
6784 | 589 yahoo_update_status(gc, from, f); |
3019 | 590 } |
591 } | |
2993 | 592 } |
593 | |
5583 | 594 static void yahoo_process_message(GaimConnection *gc, struct yahoo_packet *pkt) |
2681 | 595 { |
596 char *msg = NULL; | |
597 char *from = NULL; | |
598 time_t tm = time(NULL); | |
6691
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
599 GSList *l = pkt->hash; |
6069 | 600 |
6691
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
601 if (pkt->status <= 1 || pkt->status == 5) { |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
602 while (l) { |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
603 struct yahoo_pair *pair = l->data; |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
604 if (pair->key == 4) |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
605 from = pair->value; |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
606 if (pair->key == 15) |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
607 tm = strtol(pair->value, NULL, 10); |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
608 if (pair->key == 14) { |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
609 char *m; |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
610 |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
611 msg = pair->value; |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
612 |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
613 strip_linefeed(msg); |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
614 m = yahoo_codes_to_html(msg); |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
615 serv_got_im(gc, from, m, 0, tm, -1); |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
616 g_free(m); |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
617 |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
618 tm = time(NULL); |
6687 | 619 } |
6691
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
620 l = l->next; |
6687 | 621 } |
2681 | 622 } else if (pkt->status == 2) { |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5367
diff
changeset
|
623 gaim_notify_error(gc, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5367
diff
changeset
|
624 _("Your Yahoo! message did not get sent."), NULL); |
2681 | 625 } |
626 } | |
627 | |
6686 | 628 static void yahoo_buddy_added_us(GaimConnection *gc, struct yahoo_packet *pkt) { |
2681 | 629 char *id = NULL; |
630 char *who = NULL; | |
631 char *msg = NULL; | |
632 GSList *l = pkt->hash; | |
633 | |
634 while (l) { | |
635 struct yahoo_pair *pair = l->data; | |
6686 | 636 |
637 switch (pair->key) { | |
638 case 1: | |
2681 | 639 id = pair->value; |
6686 | 640 break; |
641 case 3: | |
2681 | 642 who = pair->value; |
6686 | 643 break; |
644 case 15: /* time, for when they add us and we're offline */ | |
645 break; | |
646 case 14: | |
2681 | 647 msg = pair->value; |
6686 | 648 break; |
649 } | |
2681 | 650 l = l->next; |
651 } | |
652 | |
2682
db2b0b733732
[gaim-migrate @ 2695]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
653 if (id) |
db2b0b733732
[gaim-migrate @ 2695]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
654 show_got_added(gc, id, who, NULL, msg); |
6686 | 655 } |
656 | |
657 static void yahoo_buddy_denied_our_add(GaimConnection *gc, struct yahoo_packet *pkt) | |
658 { | |
659 char *who = NULL; | |
660 char *msg = NULL; | |
661 GSList *l = pkt->hash; | |
662 GString *buf = NULL; | |
6784 | 663 struct yahoo_data *yd = gc->proto_data; |
6686 | 664 |
665 while (l) { | |
666 struct yahoo_pair *pair = l->data; | |
667 | |
668 switch (pair->key) { | |
669 case 3: | |
670 who = pair->value; | |
671 break; | |
672 case 14: | |
673 msg = pair->value; | |
674 break; | |
675 } | |
676 l = l->next; | |
677 } | |
678 | |
679 if (who) { | |
680 buf = g_string_sized_new(0); | |
681 if (!msg) | |
682 g_string_printf(buf, _("%s has (retroactively) denied your request to add them to your list."), who); | |
2683
4836eae8dd8c
[gaim-migrate @ 2696]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2682
diff
changeset
|
683 else |
6686 | 684 g_string_printf(buf, _("%s has (retroactively) denied your request to add them to your list for the following reason: %s."), who, msg); |
685 gaim_notify_info(gc, NULL, buf->str, NULL); | |
686 g_string_free(buf, TRUE); | |
6784 | 687 g_hash_table_remove(yd->friends, who); |
688 serv_got_update(gc, who, 0, 0, 0, 0, 0); | |
6686 | 689 } |
690 } | |
691 | |
692 static void yahoo_process_contact(GaimConnection *gc, struct yahoo_packet *pkt) | |
693 { | |
694 | |
695 | |
696 switch (pkt->status) { | |
697 case 1: | |
698 yahoo_process_status(gc, pkt); | |
699 return; | |
700 case 3: | |
701 yahoo_buddy_added_us(gc, pkt); | |
702 break; | |
703 case 7: | |
704 yahoo_buddy_denied_our_add(gc, pkt); | |
705 break; | |
706 default: | |
707 break; | |
2683
4836eae8dd8c
[gaim-migrate @ 2696]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2682
diff
changeset
|
708 } |
2681 | 709 } |
710 | |
5583 | 711 static void yahoo_process_mail(GaimConnection *gc, struct yahoo_packet *pkt) |
2681 | 712 { |
5583 | 713 GaimAccount *account = gaim_connection_get_account(gc); |
2681 | 714 char *who = NULL; |
715 char *email = NULL; | |
716 char *subj = NULL; | |
717 int count = 0; | |
718 GSList *l = pkt->hash; | |
719 | |
5583 | 720 if (!gaim_account_get_check_mail(account)) |
5521
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
721 return; |
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
722 |
2681 | 723 while (l) { |
724 struct yahoo_pair *pair = l->data; | |
725 if (pair->key == 9) | |
726 count = strtol(pair->value, NULL, 10); | |
727 else if (pair->key == 43) | |
728 who = pair->value; | |
729 else if (pair->key == 42) | |
730 email = pair->value; | |
731 else if (pair->key == 18) | |
732 subj = pair->value; | |
733 l = l->next; | |
734 } | |
735 | |
4001 | 736 if (who && subj && email && *email) { |
2850
cbe6a1e63a72
[gaim-migrate @ 2863]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2813
diff
changeset
|
737 char *from = g_strdup_printf("%s (%s)", who, email); |
5521
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
738 |
5583 | 739 gaim_notify_email(gc, subj, from, gaim_account_get_username(account), |
5521
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
740 "http://mail.yahoo.com/", NULL, NULL); |
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
741 |
2850
cbe6a1e63a72
[gaim-migrate @ 2863]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2813
diff
changeset
|
742 g_free(from); |
5521
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
743 } else if (count > 0) { |
5583 | 744 const char *to = gaim_account_get_username(account); |
5521
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
745 const char *url = "http://mail.yahoo.com/"; |
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
746 |
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
747 gaim_notify_emails(gc, count, FALSE, NULL, NULL, &to, &url, |
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
748 NULL, NULL); |
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
749 } |
2681 | 750 } |
3147 | 751 /* This is the y64 alphabet... it's like base64, but has a . and a _ */ |
752 char base64digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._"; | |
753 | |
754 /* This is taken from Sylpheed by Hiroyuki Yamamoto. We have our own tobase64 function | |
755 * in util.c, but it has a bug I don't feel like finding right now ;) */ | |
756 void to_y64(unsigned char *out, const unsigned char *in, int inlen) | |
757 /* raw bytes in quasi-big-endian order to base 64 string (NUL-terminated) */ | |
758 { | |
759 for (; inlen >= 3; inlen -= 3) | |
760 { | |
761 *out++ = base64digits[in[0] >> 2]; | |
762 *out++ = base64digits[((in[0] << 4) & 0x30) | (in[1] >> 4)]; | |
763 *out++ = base64digits[((in[1] << 2) & 0x3c) | (in[2] >> 6)]; | |
764 *out++ = base64digits[in[2] & 0x3f]; | |
765 in += 3; | |
766 } | |
767 if (inlen > 0) | |
768 { | |
769 unsigned char fragment; | |
770 | |
771 *out++ = base64digits[in[0] >> 2]; | |
772 fragment = (in[0] << 4) & 0x30; | |
773 if (inlen > 1) | |
774 fragment |= in[1] >> 4; | |
775 *out++ = base64digits[fragment]; | |
776 *out++ = (inlen < 2) ? '-' : base64digits[(in[1] << 2) & 0x3c]; | |
777 *out++ = '-'; | |
778 } | |
779 *out = '\0'; | |
780 } | |
781 | |
5583 | 782 static void yahoo_process_auth(GaimConnection *gc, struct yahoo_packet *pkt) |
3147 | 783 { |
784 char *seed = NULL; | |
785 char *sn = NULL; | |
786 GSList *l = pkt->hash; | |
787 struct yahoo_data *yd = gc->proto_data; | |
6784 | 788 GaimAccount *account = gaim_connection_get_account(gc); |
6761 | 789 |
3147 | 790 while (l) { |
791 struct yahoo_pair *pair = l->data; | |
792 if (pair->key == 94) | |
793 seed = pair->value; | |
794 if (pair->key == 1) | |
795 sn = pair->value; | |
796 l = l->next; | |
797 } | |
798 | |
799 if (seed) { | |
800 struct yahoo_packet *pack; | |
5921 | 801 const char *name = normalize(gaim_account_get_username(account)); |
5583 | 802 const char *pass = gaim_account_get_password(account); |
803 | |
3147 | 804 /* So, Yahoo has stopped supporting its older clients in India, and undoubtedly |
805 * will soon do so in the rest of the world. | |
6686 | 806 * |
3147 | 807 * The new clients use this authentication method. I warn you in advance, it's |
808 * bizzare, convoluted, inordinately complicated. It's also no more secure than | |
809 * crypt() was. The only purpose this scheme could serve is to prevent third | |
810 * part clients from connecting to their servers. | |
811 * | |
812 * Sorry, Yahoo. | |
813 */ | |
814 | |
815 md5_byte_t result[16]; | |
816 md5_state_t ctx; | |
5583 | 817 |
3147 | 818 char *crypt_result; |
5583 | 819 char password_hash[25]; |
820 char crypt_hash[25]; | |
3147 | 821 char *hash_string_p = g_malloc(50 + strlen(sn)); |
822 char *hash_string_c = g_malloc(50 + strlen(sn)); | |
823 | |
824 char checksum; | |
825 | |
3157 | 826 int sv; |
3147 | 827 |
5583 | 828 char result6[25]; |
829 char result96[25]; | |
3147 | 830 |
831 sv = seed[15]; | |
3157 | 832 sv = sv % 8; |
3147 | 833 |
834 md5_init(&ctx); | |
5583 | 835 md5_append(&ctx, pass, strlen(pass)); |
3147 | 836 md5_finish(&ctx, result); |
837 to_y64(password_hash, result, 16); | |
838 | |
839 md5_init(&ctx); | |
5583 | 840 crypt_result = yahoo_crypt(pass, "$1$_2S43d5f$"); |
3147 | 841 md5_append(&ctx, crypt_result, strlen(crypt_result)); |
842 md5_finish(&ctx, result); | |
843 to_y64(crypt_hash, result, 16); | |
3157 | 844 |
845 switch (sv) { | |
3147 | 846 case 1: |
847 case 6: | |
3157 | 848 checksum = seed[seed[9] % 16]; |
3147 | 849 g_snprintf(hash_string_p, strlen(sn) + 50, |
5583 | 850 "%c%s%s%s", checksum, name, seed, password_hash); |
3157 | 851 g_snprintf(hash_string_c, strlen(sn) + 50, |
5583 | 852 "%c%s%s%s", checksum, name, seed, crypt_hash); |
3147 | 853 break; |
854 case 2: | |
855 case 7: | |
3157 | 856 checksum = seed[seed[15] % 16]; |
3147 | 857 g_snprintf(hash_string_p, strlen(sn) + 50, |
5583 | 858 "%c%s%s%s", checksum, seed, password_hash, name); |
3157 | 859 g_snprintf(hash_string_c, strlen(sn) + 50, |
5583 | 860 "%c%s%s%s", checksum, seed, crypt_hash, name); |
3157 | 861 break; |
3147 | 862 case 3: |
3157 | 863 checksum = seed[seed[1] % 16]; |
3147 | 864 g_snprintf(hash_string_p, strlen(sn) + 50, |
5583 | 865 "%c%s%s%s", checksum, name, password_hash, seed); |
3157 | 866 g_snprintf(hash_string_c, strlen(sn) + 50, |
5583 | 867 "%c%s%s%s", checksum, name, crypt_hash, seed); |
3157 | 868 break; |
869 case 4: | |
870 checksum = seed[seed[3] % 16]; | |
871 g_snprintf(hash_string_p, strlen(sn) + 50, | |
5583 | 872 "%c%s%s%s", checksum, password_hash, seed, name); |
3147 | 873 g_snprintf(hash_string_c, strlen(sn) + 50, |
5583 | 874 "%c%s%s%s", checksum, crypt_hash, seed, name); |
3157 | 875 break; |
3147 | 876 case 0: |
877 case 5: | |
3157 | 878 checksum = seed[seed[7] % 16]; |
3147 | 879 g_snprintf(hash_string_p, strlen(sn) + 50, |
5583 | 880 "%c%s%s%s", checksum, password_hash, name, seed); |
3157 | 881 g_snprintf(hash_string_c, strlen(sn) + 50, |
5583 | 882 "%c%s%s%s", checksum, crypt_hash, name, seed); |
3157 | 883 break; |
3147 | 884 } |
3157 | 885 |
3147 | 886 md5_init(&ctx); |
3157 | 887 md5_append(&ctx, hash_string_p, strlen(hash_string_p)); |
3147 | 888 md5_finish(&ctx, result); |
889 to_y64(result6, result, 16); | |
890 | |
891 md5_init(&ctx); | |
892 md5_append(&ctx, hash_string_c, strlen(hash_string_c)); | |
893 md5_finish(&ctx, result); | |
894 to_y64(result96, result, 16); | |
895 | |
6784 | 896 pack = yahoo_packet_new(YAHOO_SERVICE_AUTHRESP, YAHOO_STATUS_AVAILABLE, 0); |
5583 | 897 yahoo_packet_hash(pack, 0, name); |
3147 | 898 yahoo_packet_hash(pack, 6, result6); |
899 yahoo_packet_hash(pack, 96, result96); | |
5583 | 900 yahoo_packet_hash(pack, 1, name); |
3147 | 901 |
902 yahoo_send_packet(yd, pack); | |
903 | |
904 g_free(hash_string_p); | |
905 g_free(hash_string_c); | |
906 | |
907 yahoo_packet_free(pack); | |
908 } | |
909 } | |
2681 | 910 |
6760 | 911 static void ignore_buddy(GaimBuddy *b) { |
912 GaimGroup *g; | |
913 GaimConversation *c; | |
914 GaimAccount *account; | |
915 gchar *name; | |
916 | |
6792 | 917 if (!b) |
918 return; | |
6760 | 919 |
6792 | 920 g = gaim_find_buddys_group(b); |
921 name = g_strdup(b->name); | |
922 account = b->account; | |
6760 | 923 |
6792 | 924 gaim_debug(GAIM_DEBUG_INFO, "blist", |
925 "Removing '%s' from buddy list.\n", b->name); | |
926 serv_remove_buddy(account->gc, name, g->name); | |
927 gaim_blist_remove_buddy(b); | |
6760 | 928 |
6792 | 929 serv_add_deny(account->gc, name); |
930 gaim_blist_save(); | |
6760 | 931 |
6792 | 932 c = gaim_find_conversation_with_account(name, account); |
6760 | 933 |
6792 | 934 if (c != NULL) |
935 gaim_conversation_update(c, GAIM_CONV_UPDATE_REMOVE); | |
6760 | 936 |
937 g_free(name); | |
938 } | |
939 | |
940 static void keep_buddy(GaimBuddy *b) { | |
941 gaim_privacy_deny_remove(b->account, b->name, 1); | |
942 } | |
943 | |
944 static void yahoo_process_ignore(GaimConnection *gc, struct yahoo_packet *pkt) { | |
945 GaimBuddy *b; | |
946 GSList *l; | |
947 gchar *who = NULL; | |
948 gchar *sn = NULL; | |
949 gchar buf[BUF_LONG]; | |
950 gint ignore = 0; | |
951 gint status = 0; | |
952 | |
953 for (l = pkt->hash; l; l = l->next) { | |
954 struct yahoo_pair *pair = l->data; | |
955 switch (pair->key) { | |
956 case 0: | |
957 who = pair->value; | |
958 break; | |
959 case 1: | |
960 sn = pair->value; | |
961 break; | |
962 case 13: | |
963 ignore = strtol(pair->value, NULL, 10); | |
964 break; | |
965 case 66: | |
966 status = strtol(pair->value, NULL, 10); | |
967 break; | |
968 default: | |
969 break; | |
970 } | |
971 } | |
972 | |
973 switch (status) { | |
974 case 12: | |
975 b = gaim_find_buddy(gc->account, who); | |
976 g_snprintf(buf, sizeof(buf), _("You have tried to ignore %s, but the " | |
977 "user is on your buddy list. Clicking \"Yes\" " | |
978 "will remove and ignore the buddy."), who); | |
979 gaim_request_yes_no(gc, NULL, _("Ignore buddy?"), buf, 0, b, | |
980 G_CALLBACK(ignore_buddy), | |
981 G_CALLBACK(keep_buddy)); | |
982 break; | |
983 case 2: | |
984 case 3: | |
985 case 0: | |
986 default: | |
987 break; | |
988 } | |
989 } | |
990 | |
6761 | 991 static void yahoo_process_authresp(GaimConnection *gc, struct yahoo_packet *pkt) |
992 { | |
993 GSList *l = pkt->hash; | |
994 int err = 0; | |
995 char *msg; | |
996 | |
997 while (l) { | |
998 struct yahoo_pair *pair = l->data; | |
999 | |
1000 if (pair->key == 66) | |
1001 err = strtol(pair->value, NULL, 10); | |
1002 | |
1003 l = l->next; | |
1004 } | |
1005 | |
1006 switch (err) { | |
1007 case 3: | |
1008 msg = _("Invalid username."); | |
1009 break; | |
1010 case 13: | |
1011 msg = _("Incorrect password."); | |
1012 break; | |
1013 default: | |
1014 msg = _("Unknown error."); | |
1015 } | |
1016 | |
1017 gaim_connection_error(gc, msg); | |
1018 } | |
1019 | |
5583 | 1020 static void yahoo_packet_process(GaimConnection *gc, struct yahoo_packet *pkt) |
2681 | 1021 { |
6760 | 1022 switch (pkt->service) { |
2681 | 1023 case YAHOO_SERVICE_LOGON: |
2771
450f4f9d2f23
[gaim-migrate @ 2784]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2741
diff
changeset
|
1024 case YAHOO_SERVICE_LOGOFF: |
2681 | 1025 case YAHOO_SERVICE_ISAWAY: |
2737
f61c1f3a6afa
[gaim-migrate @ 2750]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2724
diff
changeset
|
1026 case YAHOO_SERVICE_ISBACK: |
3019 | 1027 case YAHOO_SERVICE_GAMELOGON: |
1028 case YAHOO_SERVICE_GAMELOGOFF: | |
6686 | 1029 case YAHOO_SERVICE_CHATLOGON: |
1030 case YAHOO_SERVICE_CHATLOGOFF: | |
2681 | 1031 yahoo_process_status(gc, pkt); |
1032 break; | |
3019 | 1033 case YAHOO_SERVICE_NOTIFY: |
1034 yahoo_process_notify(gc, pkt); | |
2993 | 1035 break; |
2681 | 1036 case YAHOO_SERVICE_MESSAGE: |
2786
318f846120e2
[gaim-migrate @ 2799]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2772
diff
changeset
|
1037 case YAHOO_SERVICE_GAMEMSG: |
5939 | 1038 case YAHOO_SERVICE_CHATMSG: |
2681 | 1039 yahoo_process_message(gc, pkt); |
1040 break; | |
1041 case YAHOO_SERVICE_NEWMAIL: | |
1042 yahoo_process_mail(gc, pkt); | |
1043 break; | |
1044 case YAHOO_SERVICE_NEWCONTACT: | |
1045 yahoo_process_contact(gc, pkt); | |
1046 break; | |
6784 | 1047 case YAHOO_SERVICE_AUTHRESP: |
1048 yahoo_process_authresp(gc, pkt); | |
1049 break; | |
2681 | 1050 case YAHOO_SERVICE_LIST: |
1051 yahoo_process_list(gc, pkt); | |
1052 break; | |
3147 | 1053 case YAHOO_SERVICE_AUTH: |
1054 yahoo_process_auth(gc, pkt); | |
1055 break; | |
6760 | 1056 case YAHOO_SERVICE_IGNORECONTACT: |
1057 yahoo_process_ignore(gc, pkt); | |
1058 break; | |
6729 | 1059 case YAHOO_SERVICE_CONFINVITE: |
1060 case YAHOO_SERVICE_CONFADDINVITE: | |
1061 yahoo_process_conference_invite(gc, pkt); | |
1062 break; | |
1063 case YAHOO_SERVICE_CONFDECLINE: | |
1064 yahoo_process_conference_decline(gc, pkt); | |
1065 break; | |
1066 case YAHOO_SERVICE_CONFLOGON: | |
1067 yahoo_process_conference_logon(gc, pkt); | |
1068 break; | |
1069 case YAHOO_SERVICE_CONFLOGOFF: | |
1070 yahoo_process_conference_logoff(gc, pkt); | |
1071 break; | |
1072 case YAHOO_SERVICE_CONFMSG: | |
1073 yahoo_process_conference_message(gc, pkt); | |
1074 break; | |
1075 case YAHOO_SERVICE_CHATONLINE: | |
1076 yahoo_process_chat_online(gc, pkt); | |
1077 break; | |
1078 case YAHOO_SERVICE_CHATLOGOUT: | |
1079 yahoo_process_chat_logout(gc, pkt); | |
1080 break; | |
1081 case YAHOO_SERVICE_CHATGOTO: | |
1082 yahoo_process_chat_goto(gc, pkt); | |
1083 break; | |
1084 case YAHOO_SERVICE_CHATJOIN: | |
1085 yahoo_process_chat_join(gc, pkt); | |
1086 break; | |
1087 case YAHOO_SERVICE_CHATLEAVE: /* XXX is this right? */ | |
1088 case YAHOO_SERVICE_CHATEXIT: | |
1089 yahoo_process_chat_exit(gc, pkt); | |
1090 break; | |
1091 case YAHOO_SERVICE_CHATINVITE: /* XXX never seen this one, might not do it right */ | |
1092 case YAHOO_SERVICE_CHATADDINVITE: | |
1093 yahoo_process_chat_addinvite(gc, pkt); | |
1094 break; | |
1095 case YAHOO_SERVICE_COMMENT: | |
1096 yahoo_process_chat_message(gc, pkt); | |
1097 break; | |
2681 | 1098 default: |
5220
7b9d78fa051e
[gaim-migrate @ 5590]
Christian Hammond <chipx86@chipx86.com>
parents:
5216
diff
changeset
|
1099 gaim_debug(GAIM_DEBUG_ERROR, "yahoo", |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
1100 "Unhandled service 0x%02x\n", pkt->service); |
2681 | 1101 break; |
1102 } | |
1103 } | |
1104 | |
1105 static void yahoo_pending(gpointer data, gint source, GaimInputCondition cond) | |
1106 { | |
5583 | 1107 GaimConnection *gc = data; |
2681 | 1108 struct yahoo_data *yd = gc->proto_data; |
1109 char buf[1024]; | |
1110 int len; | |
1111 | |
1112 len = read(yd->fd, buf, sizeof(buf)); | |
1113 | |
1114 if (len <= 0) { | |
6321 | 1115 gaim_connection_error(gc, _("Unable to read")); |
2681 | 1116 return; |
1117 } | |
1118 | |
1119 yd->rxqueue = g_realloc(yd->rxqueue, len + yd->rxlen); | |
1120 memcpy(yd->rxqueue + yd->rxlen, buf, len); | |
1121 yd->rxlen += len; | |
1122 | |
1123 while (1) { | |
1124 struct yahoo_packet *pkt; | |
1125 int pos = 0; | |
1126 int pktlen; | |
1127 | |
1128 if (yd->rxlen < YAHOO_PACKET_HDRLEN) | |
1129 return; | |
1130 | |
1131 pos += 4; /* YMSG */ | |
1132 pos += 2; | |
1133 pos += 2; | |
1134 | |
1135 pktlen = yahoo_get16(yd->rxqueue + pos); pos += 2; | |
5220
7b9d78fa051e
[gaim-migrate @ 5590]
Christian Hammond <chipx86@chipx86.com>
parents:
5216
diff
changeset
|
1136 gaim_debug(GAIM_DEBUG_MISC, "yahoo", |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
1137 "%d bytes to read, rxlen is %d\n", pktlen, yd->rxlen); |
2681 | 1138 |
1139 if (yd->rxlen < (YAHOO_PACKET_HDRLEN + pktlen)) | |
1140 return; | |
1141 | |
1142 yahoo_packet_dump(yd->rxqueue, YAHOO_PACKET_HDRLEN + pktlen); | |
1143 | |
1144 pkt = yahoo_packet_new(0, 0, 0); | |
1145 | |
1146 pkt->service = yahoo_get16(yd->rxqueue + pos); pos += 2; | |
3021 | 1147 pkt->status = yahoo_get32(yd->rxqueue + pos); pos += 4; |
5220
7b9d78fa051e
[gaim-migrate @ 5590]
Christian Hammond <chipx86@chipx86.com>
parents:
5216
diff
changeset
|
1148 gaim_debug(GAIM_DEBUG_MISC, "yahoo", |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
1149 "Yahoo Service: 0x%02x Status: %d\n", |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
1150 pkt->service, pkt->status); |
2681 | 1151 pkt->id = yahoo_get32(yd->rxqueue + pos); pos += 4; |
1152 | |
1153 yahoo_packet_read(pkt, yd->rxqueue + pos, pktlen); | |
1154 | |
1155 yd->rxlen -= YAHOO_PACKET_HDRLEN + pktlen; | |
1156 if (yd->rxlen) { | |
1157 char *tmp = g_memdup(yd->rxqueue + YAHOO_PACKET_HDRLEN + pktlen, yd->rxlen); | |
1158 g_free(yd->rxqueue); | |
1159 yd->rxqueue = tmp; | |
1160 } else { | |
1161 g_free(yd->rxqueue); | |
1162 yd->rxqueue = NULL; | |
1163 } | |
1164 | |
1165 yahoo_packet_process(gc, pkt); | |
1166 | |
1167 yahoo_packet_free(pkt); | |
1168 } | |
1169 } | |
1170 | |
1171 static void yahoo_got_connected(gpointer data, gint source, GaimInputCondition cond) | |
1172 { | |
5583 | 1173 GaimConnection *gc = data; |
2681 | 1174 struct yahoo_data *yd; |
1175 struct yahoo_packet *pkt; | |
1176 | |
5590
011a0a975060
[gaim-migrate @ 5994]
Christian Hammond <chipx86@chipx86.com>
parents:
5583
diff
changeset
|
1177 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2681 | 1178 close(source); |
1179 return; | |
1180 } | |
1181 | |
1182 if (source < 0) { | |
6321 | 1183 gaim_connection_error(gc, _("Unable to connect")); |
2681 | 1184 return; |
1185 } | |
1186 | |
1187 yd = gc->proto_data; | |
1188 yd->fd = source; | |
1189 | |
3147 | 1190 pkt = yahoo_packet_new(YAHOO_SERVICE_AUTH, YAHOO_STATUS_AVAILABLE, 0); |
2681 | 1191 |
5921 | 1192 yahoo_packet_hash(pkt, 1, normalize(gaim_account_get_username(gaim_connection_get_account(gc)))); |
2681 | 1193 yahoo_send_packet(yd, pkt); |
1194 | |
1195 yahoo_packet_free(pkt); | |
1196 | |
1197 gc->inpa = gaim_input_add(yd->fd, GAIM_INPUT_READ, yahoo_pending, gc); | |
1198 } | |
1199 | |
5583 | 1200 static void yahoo_login(GaimAccount *account) { |
1201 GaimConnection *gc = gaim_account_get_connection(account); | |
2681 | 1202 struct yahoo_data *yd = gc->proto_data = g_new0(struct yahoo_data, 1); |
1203 | |
6629 | 1204 gc->flags |= GAIM_CONNECTION_HTML | GAIM_CONNECTION_NO_BGCOLOR; |
1205 | |
5583 | 1206 gaim_connection_update_progress(gc, _("Connecting"), 1, 2); |
2681 | 1207 |
1208 yd->fd = -1; | |
6784 | 1209 yd->friends = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, yahoo_friend_free); |
6729 | 1210 yd->confs = NULL; |
1211 yd->conf_id = 2; | |
2681 | 1212 |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5638
diff
changeset
|
1213 if (gaim_proxy_connect(account, gaim_account_get_string(account, "server", YAHOO_PAGER_HOST), |
5583 | 1214 gaim_account_get_int(account, "port", YAHOO_PAGER_PORT), |
1215 yahoo_got_connected, gc) != 0) { | |
6321 | 1216 gaim_connection_error(gc, _("Connection problem")); |
2681 | 1217 return; |
1218 } | |
1219 | |
1220 } | |
1221 | |
5583 | 1222 static void yahoo_close(GaimConnection *gc) { |
2681 | 1223 struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; |
6729 | 1224 |
6784 | 1225 g_hash_table_destroy(yd->friends); |
6729 | 1226 g_slist_free(yd->confs); |
6784 | 1227 if (yd->chat_name) |
1228 g_free(yd->chat_name); | |
6729 | 1229 |
2681 | 1230 if (yd->fd >= 0) |
1231 close(yd->fd); | |
3720
34c95669952f
[gaim-migrate @ 3853]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3642
diff
changeset
|
1232 |
2681 | 1233 if (yd->rxqueue) |
1234 g_free(yd->rxqueue); | |
2687
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2686
diff
changeset
|
1235 yd->rxlen = 0; |
2681 | 1236 if (gc->inpa) |
1237 gaim_input_remove(gc->inpa); | |
1238 g_free(yd); | |
1239 } | |
1240 | |
6695 | 1241 static const char *yahoo_list_icon(GaimAccount *a, GaimBuddy *b) |
2681 | 1242 { |
4687 | 1243 return "yahoo"; |
2681 | 1244 } |
4916 | 1245 |
6695 | 1246 static void yahoo_list_emblems(GaimBuddy *b, char **se, char **sw, char **nw, char **ne) |
4916 | 1247 { |
1248 int i = 0; | |
1249 char *emblems[4] = {NULL,NULL,NULL,NULL}; | |
6784 | 1250 GaimAccount *account; |
1251 GaimConnection *gc; | |
1252 struct yahoo_data *yd; | |
1253 struct yahoo_friend *f; | |
1254 | |
1255 if (!b || !(account = b->account) || !(gc = gaim_account_get_connection(account)) || | |
1256 !(yd = gc->proto_data)) | |
1257 return; | |
1258 | |
1259 f = g_hash_table_lookup(yd->friends, b->name); | |
1260 if (!f) { | |
1261 *se = "notauthorized"; | |
1262 return; | |
1263 } | |
1264 | |
5068 | 1265 if (b->present == GAIM_BUDDY_OFFLINE) { |
4916 | 1266 *se = "offline"; |
1267 return; | |
1268 } else { | |
6784 | 1269 if (f->away) |
6691
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
1270 emblems[i++] = "away"; |
6784 | 1271 if (f->sms) |
1272 emblems[i++] = "wireless"; | |
1273 if (f->game) | |
4916 | 1274 emblems[i++] = "game"; |
1275 } | |
1276 *se = emblems[0]; | |
1277 *sw = emblems[1]; | |
1278 *nw = emblems[2]; | |
1279 *ne = emblems[3]; | |
1280 } | |
2681 | 1281 |
1282 static char *yahoo_get_status_string(enum yahoo_status a) | |
1283 { | |
1284 switch (a) { | |
1285 case YAHOO_STATUS_BRB: | |
4596 | 1286 return _("Be Right Back"); |
2681 | 1287 case YAHOO_STATUS_BUSY: |
4596 | 1288 return _("Busy"); |
2681 | 1289 case YAHOO_STATUS_NOTATHOME: |
4596 | 1290 return _("Not At Home"); |
2681 | 1291 case YAHOO_STATUS_NOTATDESK: |
4596 | 1292 return _("Not At Desk"); |
2681 | 1293 case YAHOO_STATUS_NOTINOFFICE: |
4596 | 1294 return _("Not In Office"); |
2681 | 1295 case YAHOO_STATUS_ONPHONE: |
4606 | 1296 return _("On The Phone"); |
2681 | 1297 case YAHOO_STATUS_ONVACATION: |
4596 | 1298 return _("On Vacation"); |
2681 | 1299 case YAHOO_STATUS_OUTTOLUNCH: |
4596 | 1300 return _("Out To Lunch"); |
2681 | 1301 case YAHOO_STATUS_STEPPEDOUT: |
4596 | 1302 return _("Stepped Out"); |
2873
26be84883f91
[gaim-migrate @ 2886]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2856
diff
changeset
|
1303 case YAHOO_STATUS_INVISIBLE: |
4596 | 1304 return _("Invisible"); |
4730 | 1305 case YAHOO_STATUS_IDLE: |
1306 return _("Idle"); | |
6784 | 1307 case YAHOO_STATUS_OFFLINE: |
1308 return _("Offline"); | |
2879
5fc5123b7098
[gaim-migrate @ 2892]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2878
diff
changeset
|
1309 default: |
4596 | 1310 return _("Online"); |
2681 | 1311 } |
1312 } | |
1313 | |
6729 | 1314 static void yahoo_initiate_conference(GaimConnection *gc, const char *name) |
1315 { | |
1316 GHashTable *components; | |
1317 struct yahoo_data *yd; | |
1318 int id; | |
1319 | |
1320 yd = gc->proto_data; | |
1321 id = yd->conf_id; | |
1322 | |
1323 components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); | |
1324 g_hash_table_replace(components, g_strdup("room"), | |
1325 g_strdup_printf("%s-%d", gaim_connection_get_display_name(gc), id)); | |
1326 g_hash_table_replace(components, g_strdup("topic"), g_strdup("Join my conference...")); | |
1327 g_hash_table_replace(components, g_strdup("type"), g_strdup("Conference")); | |
1328 yahoo_c_join(gc, components); | |
1329 g_hash_table_destroy(components); | |
1330 | |
1331 yahoo_c_invite(gc, id, "Join my conference...", name); | |
1332 } | |
1333 | |
5583 | 1334 static void yahoo_game(GaimConnection *gc, const char *name) { |
3019 | 1335 struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; |
6784 | 1336 char *game = NULL; |
3019 | 1337 char *t; |
1338 char url[256]; | |
6784 | 1339 struct yahoo_friend *f; |
3019 | 1340 |
6784 | 1341 f = g_hash_table_lookup(yd->friends, name); |
1342 if (!f) | |
1343 return; | |
1344 | |
1345 game = f->game; | |
3019 | 1346 if (!game) |
1347 return; | |
6784 | 1348 |
3019 | 1349 t = game = g_strdup(strstr(game, "ante?room=")); |
1350 while (*t != '\t') | |
1351 t++; | |
1352 *t = 0; | |
1353 g_snprintf(url, sizeof url, "http://games.yahoo.com/games/%s", game); | |
6465
fb64cc87bc96
[gaim-migrate @ 6974]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
1354 gaim_notify_uri(gc, url); |
3019 | 1355 g_free(game); |
1356 } | |
4722 | 1357 |
6695 | 1358 static char *yahoo_status_text(GaimBuddy *b) |
4722 | 1359 { |
1360 struct yahoo_data *yd = (struct yahoo_data*)b->account->gc->proto_data; | |
6784 | 1361 struct yahoo_friend *f = NULL; |
1362 char *stripped = NULL; | |
6691
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
1363 |
6784 | 1364 f = g_hash_table_lookup(yd->friends, b->name); |
1365 if (!f) | |
1366 return g_strdup(_("Not on server list")); | |
1367 | |
1368 switch (f->status) { | |
1369 case YAHOO_STATUS_AVAILABLE: | |
1370 return NULL; | |
1371 case YAHOO_STATUS_IDLE: | |
1372 if (f->idle == -1) | |
1373 return g_strdup(yahoo_get_status_string(f->status)); | |
1374 return NULL; | |
1375 case YAHOO_STATUS_CUSTOM: | |
1376 if (!f->msg) | |
1377 return NULL; | |
1378 stripped = strip_html(f->msg); | |
1379 if (stripped) { | |
1380 char *ret = g_markup_escape_text(stripped, strlen(stripped)); | |
1381 g_free(stripped); | |
1382 return ret; | |
1383 } | |
1384 return NULL; | |
1385 default: | |
1386 return g_strdup(yahoo_get_status_string(f->status)); | |
1387 } | |
1388 | |
4729 | 1389 return NULL; |
4722 | 1390 } |
1391 | |
6695 | 1392 static char *yahoo_tooltip_text(GaimBuddy *b) |
4724 | 1393 { |
1394 struct yahoo_data *yd = (struct yahoo_data*)b->account->gc->proto_data; | |
6784 | 1395 struct yahoo_friend *f; |
1396 char *escaped, *status, *ret; | |
1397 | |
1398 f = g_hash_table_lookup(yd->friends, b->name); | |
1399 if (!f) | |
1400 status = g_strdup(_("Not on server list")); | |
1401 else | |
1402 switch (f->status) { | |
1403 case YAHOO_STATUS_IDLE: | |
1404 if (f->idle == -1) { | |
1405 status = g_strdup(yahoo_get_status_string(f->status)); | |
1406 break; | |
1407 } | |
1408 return NULL; | |
1409 case YAHOO_STATUS_CUSTOM: | |
1410 if (!f->msg) | |
1411 return NULL; | |
1412 status = strip_html(f->msg); | |
1413 break; | |
1414 default: | |
1415 status = g_strdup(yahoo_get_status_string(f->status)); | |
1416 break; | |
4745 | 1417 } |
6784 | 1418 |
1419 escaped = g_markup_escape_text(status, strlen(status)); | |
1420 ret = g_strdup_printf(_("<b>Status:</b> %s"), escaped); | |
1421 g_free(status); | |
1422 g_free(escaped); | |
1423 | |
1424 return ret; | |
4729 | 1425 } |
1426 | |
5583 | 1427 static GList *yahoo_buddy_menu(GaimConnection *gc, const char *who) |
2681 | 1428 { |
1429 GList *m = NULL; | |
1430 struct proto_buddy_menu *pbm; | |
1431 struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; | |
3019 | 1432 static char buf2[1024]; |
6784 | 1433 struct yahoo_friend *f; |
1434 | |
1435 f = g_hash_table_lookup(yd->friends, who); | |
1436 | |
1437 if (!f) { | |
1438 pbm = g_new0(struct proto_buddy_menu, 1); | |
1439 pbm->label = _("Add Buddy"); | |
1440 pbm->callback = yahoo_add_buddy; | |
1441 pbm->gc = gc; | |
1442 m = g_list_append(m, pbm); | |
1443 | |
1444 return m; | |
1445 } | |
1446 | |
1447 if (f->status == YAHOO_STATUS_OFFLINE) | |
1448 return NULL; | |
4722 | 1449 |
6729 | 1450 pbm = g_new0(struct proto_buddy_menu, 1); |
1451 pbm->label = _("Join in Chat"); | |
1452 pbm->callback = yahoo_chat_goto; | |
1453 pbm->gc = gc; | |
1454 m = g_list_append(m, pbm); | |
1455 | |
1456 pbm = g_new0(struct proto_buddy_menu, 1); | |
1457 pbm->label = _("Initiate Conference"); | |
1458 pbm->callback = yahoo_initiate_conference; | |
1459 pbm->gc = gc; | |
1460 m = g_list_append(m, pbm); | |
1461 | |
6784 | 1462 if (f->game) { |
1463 char *game = f->game; | |
3019 | 1464 char *room; |
6784 | 1465 char *t; |
1466 | |
3019 | 1467 if (!game) |
1468 return m; | |
6784 | 1469 |
1470 pbm = g_new0(struct proto_buddy_menu, 1); | |
1471 if (!(room = strstr(game, "&follow="))) /* skip ahead to the url */ | |
1472 return m; | |
1473 while (*room && *room != '\t') /* skip to the tab */ | |
1474 room++; | |
1475 t = room++; /* room as now at the name */ | |
1476 while (*t != '\n') | |
1477 t++; /* replace the \n with a space */ | |
1478 *t = ' '; | |
1479 g_snprintf(buf2, sizeof buf2, "%s", room); | |
1480 pbm->label = buf2; | |
1481 pbm->callback = yahoo_game; | |
1482 pbm->gc = gc; | |
1483 m = g_list_append(m, pbm); | |
3019 | 1484 } |
6729 | 1485 |
2681 | 1486 return m; |
1487 } | |
1488 | |
5583 | 1489 static void yahoo_act_id(GaimConnection *gc, const char *entry) |
2681 | 1490 { |
1491 struct yahoo_data *yd = gc->proto_data; | |
1492 | |
1493 struct yahoo_packet *pkt = yahoo_packet_new(YAHOO_SERVICE_IDACT, YAHOO_STATUS_AVAILABLE, 0); | |
1494 yahoo_packet_hash(pkt, 3, entry); | |
1495 yahoo_send_packet(yd, pkt); | |
1496 yahoo_packet_free(pkt); | |
1497 | |
5583 | 1498 gaim_connection_set_display_name(gc, entry); |
2681 | 1499 } |
1500 | |
5583 | 1501 static void yahoo_show_act_id(GaimConnection *gc) |
2681 | 1502 { |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
1503 gaim_request_input(gc, NULL, _("Active which ID?"), NULL, |
6035
8c44020a958e
[gaim-migrate @ 6485]
Christian Hammond <chipx86@chipx86.com>
parents:
5939
diff
changeset
|
1504 gaim_connection_get_display_name(gc), FALSE, FALSE, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
1505 _("OK"), G_CALLBACK(yahoo_act_id), |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
1506 _("Cancel"), NULL, gc); |
2681 | 1507 } |
1508 | |
5583 | 1509 static GList *yahoo_actions(GaimConnection *gc) { |
2681 | 1510 GList *m = NULL; |
4333 | 1511 struct proto_actions_menu *pam; |
2681 | 1512 |
4333 | 1513 pam = g_new0(struct proto_actions_menu, 1); |
1514 pam->label = _("Activate ID"); | |
1515 pam->callback = yahoo_show_act_id; | |
1516 pam->gc = gc; | |
1517 m = g_list_append(m, pam); | |
2681 | 1518 |
1519 return m; | |
1520 } | |
1521 | |
6622 | 1522 static int yahoo_send_im(GaimConnection *gc, const char *who, const char *what, int len, GaimImFlags flags) |
2681 | 1523 { |
1524 struct yahoo_data *yd = gc->proto_data; | |
1525 struct yahoo_packet *pkt = yahoo_packet_new(YAHOO_SERVICE_MESSAGE, YAHOO_STATUS_OFFLINE, 0); | |
6629 | 1526 char *msg = yahoo_html_to_codes(what); |
2681 | 1527 |
5583 | 1528 yahoo_packet_hash(pkt, 1, gaim_connection_get_display_name(gc)); |
2681 | 1529 yahoo_packet_hash(pkt, 5, who); |
3493 | 1530 yahoo_packet_hash(pkt, 14, msg); |
6044 | 1531 yahoo_packet_hash(pkt, 97, "1"); |
2681 | 1532 |
1533 yahoo_send_packet(yd, pkt); | |
1534 | |
1535 yahoo_packet_free(pkt); | |
6629 | 1536 |
1537 g_free(msg); | |
1538 | |
2681 | 1539 return 1; |
1540 } | |
1541 | |
6059 | 1542 int yahoo_send_typing(GaimConnection *gc, const char *who, int typ) |
2993 | 1543 { |
1544 struct yahoo_data *yd = gc->proto_data; | |
3019 | 1545 struct yahoo_packet *pkt = yahoo_packet_new(YAHOO_SERVICE_NOTIFY, YAHOO_STATUS_TYPING, 0); |
2993 | 1546 yahoo_packet_hash(pkt, 49, "TYPING"); |
5583 | 1547 yahoo_packet_hash(pkt, 1, gaim_connection_get_display_name(gc)); |
2993 | 1548 yahoo_packet_hash(pkt, 14, " "); |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
1549 yahoo_packet_hash(pkt, 13, typ == GAIM_TYPING ? "1" : "0"); |
2993 | 1550 yahoo_packet_hash(pkt, 5, who); |
1551 yahoo_packet_hash(pkt, 1002, "1"); | |
1552 | |
1553 yahoo_send_packet(yd, pkt); | |
1554 | |
1555 yahoo_packet_free(pkt); | |
1556 | |
3001 | 1557 return 0; |
2993 | 1558 } |
1559 | |
6059 | 1560 static void yahoo_set_away(GaimConnection *gc, const char *state, const char *msg) |
2681 | 1561 { |
1562 struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; | |
1563 struct yahoo_packet *pkt; | |
2772
f9227268db25
[gaim-migrate @ 2785]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2771
diff
changeset
|
1564 int service; |
2681 | 1565 char s[4]; |
6691
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
1566 |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4044
diff
changeset
|
1567 if (gc->away) { |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4044
diff
changeset
|
1568 g_free(gc->away); |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4044
diff
changeset
|
1569 gc->away = NULL; |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4044
diff
changeset
|
1570 } |
2681 | 1571 |
1572 if (msg) { | |
1573 yd->current_status = YAHOO_STATUS_CUSTOM; | |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4044
diff
changeset
|
1574 gc->away = g_strdup(msg); |
2681 | 1575 } else if (state) { |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4044
diff
changeset
|
1576 gc->away = g_strdup(""); |
4596 | 1577 if (!strcmp(state, _("Available"))) { |
2681 | 1578 yd->current_status = YAHOO_STATUS_AVAILABLE; |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4044
diff
changeset
|
1579 g_free(gc->away); |
2681 | 1580 gc->away = NULL; |
4596 | 1581 } else if (!strcmp(state, _("Be Right Back"))) { |
2681 | 1582 yd->current_status = YAHOO_STATUS_BRB; |
4596 | 1583 } else if (!strcmp(state, _("Busy"))) { |
2681 | 1584 yd->current_status = YAHOO_STATUS_BUSY; |
4596 | 1585 } else if (!strcmp(state, _("Not At Home"))) { |
2681 | 1586 yd->current_status = YAHOO_STATUS_NOTATHOME; |
4596 | 1587 } else if (!strcmp(state, _("Not At Desk"))) { |
2681 | 1588 yd->current_status = YAHOO_STATUS_NOTATDESK; |
4596 | 1589 } else if (!strcmp(state, _("Not In Office"))) { |
2681 | 1590 yd->current_status = YAHOO_STATUS_NOTINOFFICE; |
4606 | 1591 } else if (!strcmp(state, _("On The Phone"))) { |
2681 | 1592 yd->current_status = YAHOO_STATUS_ONPHONE; |
4596 | 1593 } else if (!strcmp(state, _("On Vacation"))) { |
2681 | 1594 yd->current_status = YAHOO_STATUS_ONVACATION; |
4596 | 1595 } else if (!strcmp(state, _("Out To Lunch"))) { |
2681 | 1596 yd->current_status = YAHOO_STATUS_OUTTOLUNCH; |
4596 | 1597 } else if (!strcmp(state, _("Stepped Out"))) { |
2681 | 1598 yd->current_status = YAHOO_STATUS_STEPPEDOUT; |
4596 | 1599 } else if (!strcmp(state, _("Invisible"))) { |
2681 | 1600 yd->current_status = YAHOO_STATUS_INVISIBLE; |
1601 } else if (!strcmp(state, GAIM_AWAY_CUSTOM)) { | |
1602 if (gc->is_idle) { | |
1603 yd->current_status = YAHOO_STATUS_IDLE; | |
1604 } else { | |
1605 yd->current_status = YAHOO_STATUS_AVAILABLE; | |
1606 } | |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4044
diff
changeset
|
1607 g_free(gc->away); |
2681 | 1608 gc->away = NULL; |
1609 } | |
1610 } else if (gc->is_idle) { | |
1611 yd->current_status = YAHOO_STATUS_IDLE; | |
1612 } else { | |
1613 yd->current_status = YAHOO_STATUS_AVAILABLE; | |
1614 } | |
1615 | |
2772
f9227268db25
[gaim-migrate @ 2785]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2771
diff
changeset
|
1616 if (yd->current_status == YAHOO_STATUS_AVAILABLE) |
f9227268db25
[gaim-migrate @ 2785]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2771
diff
changeset
|
1617 service = YAHOO_SERVICE_ISBACK; |
f9227268db25
[gaim-migrate @ 2785]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2771
diff
changeset
|
1618 else |
f9227268db25
[gaim-migrate @ 2785]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2771
diff
changeset
|
1619 service = YAHOO_SERVICE_ISAWAY; |
f9227268db25
[gaim-migrate @ 2785]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2771
diff
changeset
|
1620 pkt = yahoo_packet_new(service, yd->current_status, 0); |
2681 | 1621 g_snprintf(s, sizeof(s), "%d", yd->current_status); |
1622 yahoo_packet_hash(pkt, 10, s); | |
6691
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
1623 if (yd->current_status == YAHOO_STATUS_CUSTOM) { |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
1624 yahoo_packet_hash(pkt, 19, msg); |
6784 | 1625 if (gc->is_idle) |
1626 yahoo_packet_hash(pkt, 47, "2"); | |
1627 else | |
1628 yahoo_packet_hash(pkt, 47, "1"); | |
6686 | 1629 } |
2681 | 1630 |
1631 yahoo_send_packet(yd, pkt); | |
1632 yahoo_packet_free(pkt); | |
1633 } | |
1634 | |
5583 | 1635 static void yahoo_set_idle(GaimConnection *gc, int idle) |
2681 | 1636 { |
1637 struct yahoo_data *yd = gc->proto_data; | |
1638 struct yahoo_packet *pkt = NULL; | |
1639 | |
1640 if (idle && yd->current_status == YAHOO_STATUS_AVAILABLE) { | |
1641 pkt = yahoo_packet_new(YAHOO_SERVICE_ISAWAY, YAHOO_STATUS_IDLE, 0); | |
1642 yd->current_status = YAHOO_STATUS_IDLE; | |
1643 } else if (!idle && yd->current_status == YAHOO_STATUS_IDLE) { | |
1644 pkt = yahoo_packet_new(YAHOO_SERVICE_ISAWAY, YAHOO_STATUS_AVAILABLE, 0); | |
1645 yd->current_status = YAHOO_STATUS_AVAILABLE; | |
6784 | 1646 } else if (idle && gc->away && yd->current_status == YAHOO_STATUS_CUSTOM) { |
1647 pkt = yahoo_packet_new(YAHOO_SERVICE_ISAWAY, YAHOO_STATUS_IDLE, 0); | |
1648 } else if (!idle && gc->away && yd->current_status == YAHOO_STATUS_CUSTOM) { | |
1649 pkt = yahoo_packet_new(YAHOO_SERVICE_ISAWAY, YAHOO_STATUS_AVAILABLE, 0); | |
2681 | 1650 } |
1651 | |
1652 if (pkt) { | |
1653 char buf[4]; | |
1654 g_snprintf(buf, sizeof(buf), "%d", yd->current_status); | |
1655 yahoo_packet_hash(pkt, 10, buf); | |
6784 | 1656 if (gc->away && yd->current_status == YAHOO_STATUS_CUSTOM) { |
1657 yahoo_packet_hash(pkt, 19, gc->away); | |
1658 if (idle) | |
1659 yahoo_packet_hash(pkt, 47, "2"); | |
1660 else | |
1661 yahoo_packet_hash(pkt, 47, "1"); /* fixme when available messages are possible */ | |
1662 } | |
2681 | 1663 yahoo_send_packet(yd, pkt); |
1664 yahoo_packet_free(pkt); | |
1665 } | |
1666 } | |
1667 | |
5583 | 1668 static GList *yahoo_away_states(GaimConnection *gc) |
2681 | 1669 { |
1670 GList *m = NULL; | |
1671 | |
4596 | 1672 m = g_list_append(m, _("Available")); |
1673 m = g_list_append(m, _("Be Right Back")); | |
1674 m = g_list_append(m, _("Busy")); | |
1675 m = g_list_append(m, _("Not At Home")); | |
1676 m = g_list_append(m, _("Not At Desk")); | |
1677 m = g_list_append(m, _("Not In Office")); | |
4606 | 1678 m = g_list_append(m, _("On The Phone")); |
4596 | 1679 m = g_list_append(m, _("On Vacation")); |
1680 m = g_list_append(m, _("Out To Lunch")); | |
1681 m = g_list_append(m, _("Stepped Out")); | |
1682 m = g_list_append(m, _("Invisible")); | |
2681 | 1683 m = g_list_append(m, GAIM_AWAY_CUSTOM); |
1684 | |
1685 return m; | |
1686 } | |
1687 | |
5583 | 1688 static void yahoo_keepalive(GaimConnection *gc) |
2681 | 1689 { |
1690 struct yahoo_data *yd = gc->proto_data; | |
1691 struct yahoo_packet *pkt = yahoo_packet_new(YAHOO_SERVICE_PING, YAHOO_STATUS_AVAILABLE, 0); | |
1692 yahoo_send_packet(yd, pkt); | |
1693 yahoo_packet_free(pkt); | |
6729 | 1694 |
1695 if (!yd->chat_online) | |
1696 return; | |
1697 | |
1698 pkt = yahoo_packet_new(YAHOO_SERVICE_CHATPING, YAHOO_STATUS_AVAILABLE, 0); | |
1699 yahoo_packet_hash(pkt, 109, gaim_connection_get_display_name(gc)); | |
1700 yahoo_send_packet(yd, pkt); | |
1701 yahoo_packet_free(pkt); | |
2681 | 1702 } |
1703 | |
6787
faa491042c66
[gaim-migrate @ 7326]
Christian Hammond <chipx86@chipx86.com>
parents:
6784
diff
changeset
|
1704 static void yahoo_add_buddy(GaimConnection *gc, const char *who, GaimGroup *foo) |
2681 | 1705 { |
1706 struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; | |
1707 struct yahoo_packet *pkt; | |
6695 | 1708 GaimGroup *g; |
2681 | 1709 char *group = NULL; |
1710 | |
1711 if (!yd->logged_in) | |
1712 return; | |
1713 | |
4687 | 1714 g = gaim_find_buddys_group(gaim_find_buddy(gc->account, who)); |
2681 | 1715 if (g) |
1716 group = g->name; | |
1717 else | |
1718 group = "Buddies"; | |
1719 | |
1720 pkt = yahoo_packet_new(YAHOO_SERVICE_ADDBUDDY, YAHOO_STATUS_AVAILABLE, 0); | |
5583 | 1721 yahoo_packet_hash(pkt, 1, gaim_connection_get_display_name(gc)); |
2681 | 1722 yahoo_packet_hash(pkt, 7, who); |
1723 yahoo_packet_hash(pkt, 65, group); | |
1724 yahoo_send_packet(yd, pkt); | |
1725 yahoo_packet_free(pkt); | |
1726 } | |
1727 | |
6059 | 1728 static void yahoo_remove_buddy(GaimConnection *gc, const char *who, const char *group) |
2681 | 1729 { |
1730 struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; | |
6784 | 1731 struct yahoo_friend *f; |
1732 | |
1733 if (!(f = g_hash_table_lookup(yd->friends, who))) | |
1734 return; | |
1735 | |
1736 g_hash_table_remove(yd->friends, who); | |
2681 | 1737 |
1738 struct yahoo_packet *pkt = yahoo_packet_new(YAHOO_SERVICE_REMBUDDY, YAHOO_STATUS_AVAILABLE, 0); | |
5583 | 1739 yahoo_packet_hash(pkt, 1, gaim_connection_get_display_name(gc)); |
2681 | 1740 yahoo_packet_hash(pkt, 7, who); |
1741 yahoo_packet_hash(pkt, 65, group); | |
1742 yahoo_send_packet(yd, pkt); | |
1743 yahoo_packet_free(pkt); | |
1744 } | |
1745 | |
6760 | 1746 static void yahoo_add_deny(GaimConnection *gc, const char *who) { |
1747 struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; | |
1748 struct yahoo_packet *pkt; | |
1749 | |
1750 if (!yd->logged_in) | |
1751 return; | |
1752 | |
1753 if (gc->account->perm_deny != 4) | |
1754 return; | |
1755 | |
1756 if (!who || who[0] == '\0') | |
1757 return; | |
1758 | |
1759 pkt = yahoo_packet_new(YAHOO_SERVICE_IGNORECONTACT, YAHOO_STATUS_AVAILABLE, 0); | |
1760 yahoo_packet_hash(pkt, 1, gaim_connection_get_display_name(gc)); | |
1761 yahoo_packet_hash(pkt, 7, who); | |
1762 yahoo_packet_hash(pkt, 13, "1"); | |
1763 yahoo_send_packet(yd, pkt); | |
1764 yahoo_packet_free(pkt); | |
1765 } | |
1766 | |
1767 static void yahoo_rem_deny(GaimConnection *gc, const char *who) { | |
1768 struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; | |
1769 struct yahoo_packet *pkt; | |
1770 | |
1771 if (!yd->logged_in) | |
1772 return; | |
1773 | |
1774 if (!who || who[0] == '\0') | |
1775 return; | |
1776 | |
1777 pkt = yahoo_packet_new(YAHOO_SERVICE_IGNORECONTACT, YAHOO_STATUS_AVAILABLE, 0); | |
1778 yahoo_packet_hash(pkt, 1, gaim_connection_get_display_name(gc)); | |
1779 yahoo_packet_hash(pkt, 7, who); | |
1780 yahoo_packet_hash(pkt, 13, "2"); | |
1781 yahoo_send_packet(yd, pkt); | |
1782 yahoo_packet_free(pkt); | |
1783 } | |
1784 | |
1785 static void yahoo_set_permit_deny(GaimConnection *gc) { | |
1786 GaimAccount *acct; | |
1787 GSList *deny; | |
1788 | |
1789 acct = gc->account; | |
1790 | |
1791 switch (acct->perm_deny) { | |
1792 case 1: | |
1793 case 3: | |
1794 case 5: | |
1795 for (deny = acct->deny;deny;deny = deny->next) | |
1796 yahoo_rem_deny(gc, deny->data); | |
1797 break; | |
1798 case 4: | |
1799 for (deny = acct->deny;deny;deny = deny->next) | |
1800 yahoo_add_deny(gc, deny->data); | |
1801 break; | |
1802 case 2: | |
1803 default: | |
1804 break; | |
1805 } | |
1806 } | |
1807 | |
6513 | 1808 static gboolean yahoo_unload_plugin(GaimPlugin *plugin) |
1809 { | |
1810 yahoo_dest_colorht(); | |
1811 return TRUE; | |
1812 } | |
1813 | |
6514 | 1814 static void yahoo_got_info(gpointer data, char *url_text, unsigned long len) |
1815 { | |
1816 char *stripped,*p; | |
1817 char buf[1024]; | |
1818 | |
1819 /* we failed to grab the profile URL */ | |
1820 if (!url_text) { | |
1821 g_show_info_text(NULL, NULL, 2, | |
6573 | 1822 _("<html><body><b>Error retrieving profile</b></body></html>"), NULL); |
6514 | 1823 return; |
1824 } | |
1825 | |
1826 /* we don't yet support the multiple link level of the warning page for | |
1827 * 'adult' profiles, not to mention the fact that yahoo wants you to be | |
1828 * logged in (on the website) to be able to view an 'adult' profile. for | |
1829 * now, just tell them that we can't help them, and provide a link to the | |
1830 * profile if they want to do the web browser thing. | |
1831 */ | |
1832 p = strstr(url_text, "Adult Profiles Warning Message"); | |
1833 if (p) { | |
6573 | 1834 strcpy(buf, _("<b>Sorry, profiles marked as containing adult content are not supported at this time.</b><br><br>\n")); |
6514 | 1835 info_extract_field(url_text, buf, ".idname=", 0, "%26", 0, NULL, |
6573 | 1836 _("If you wish to view this profile, you will need to visit this link in your web browser"), |
6514 | 1837 1, YAHOO_PROFILE_URL); |
1838 strcat(buf, "</body></html>\n"); | |
1839 g_show_info_text(NULL, NULL, 2, buf, NULL); | |
1840 return; | |
1841 } | |
1842 | |
6630 | 1843 /* at the moment we don't support profile pages with languages other than |
1844 * english. the problem is, that every user may choose his/her own profile | |
1845 * language. this language has nothing to do with the preferences of the | |
1846 * user which looks at the profile | |
1847 */ | |
1848 p = strstr(url_text, "Last Updated:"); | |
1849 if (!p) { | |
1850 strcpy(buf, _("<b>Sorry, non-English profiles are not supported at this time.</b><br><br>\n")); | |
1851 info_extract_field(url_text, buf, "<title>", 0, "'s Yahoo! Profile", 0, NULL, | |
1852 _("If you wish to view this profile, you will need to visit this link in your web browser"), | |
1853 1, YAHOO_PROFILE_URL); | |
1854 strcat(buf, "</body></html>\n"); | |
1855 g_show_info_text(NULL, NULL, 2, buf, NULL); | |
1856 return; | |
1857 } | |
1858 | |
6514 | 1859 /* strip_html() doesn't strip out character entities like and · |
1860 */ | |
1861 while ((p = strstr(url_text, " ")) != NULL) { | |
1862 memmove(p, p + 6, strlen(p + 6)); | |
1863 url_text[strlen(url_text) - 6] = '\0'; | |
1864 } | |
1865 while ((p = strstr(url_text, "·")) != NULL) { | |
1866 memmove(p, p + 6, strlen(p + 6)); | |
1867 url_text[strlen(url_text) - 6] = '\0'; | |
1868 } | |
1869 | |
1870 /* nuke the nasty \r's */ | |
1871 while ((p = strchr(url_text, '\r')) != NULL) { | |
1872 memmove(p, p + 1, strlen(p + 1)); | |
1873 url_text[strlen(url_text) - 1] = '\0'; | |
1874 } | |
1875 | |
1876 /* nuke the html, it's easier than trying to parse the horrid stuff */ | |
1877 stripped = strip_html(url_text); | |
1878 | |
1879 /* gonna re-use the memory we've already got for url_text */ | |
1880 strcpy(url_text, "<html><body>\n"); | |
1881 | |
1882 /* extract their Yahoo! ID and put it in */ | |
1883 info_extract_field(stripped, url_text, "Yahoo! ID:", 2, "\n", 0, | |
6573 | 1884 NULL, _("Yahoo! ID"), 0, NULL); |
6514 | 1885 |
1886 /* extract their Email address and put it in */ | |
1887 info_extract_field(stripped, url_text, "My Email", 5, "\n", 0, | |
6657 | 1888 "Private", _("Email"), 0, NULL); |
6514 | 1889 |
1890 /* extract the Nickname if it exists */ | |
1891 info_extract_field(stripped, url_text, "Nickname:", 1, "\n", '\n', | |
6573 | 1892 NULL, _("Nickname"), 0, NULL); |
6514 | 1893 |
1894 /* extract their RealName and put it in */ | |
1895 info_extract_field(stripped, url_text, "RealName:", 1, "\n", '\n', | |
6623 | 1896 NULL, _("Realname"), 0, NULL); |
6514 | 1897 |
1898 /* extract their Location and put it in */ | |
1899 info_extract_field(stripped, url_text, "Location:", 2, "\n", '\n', | |
6573 | 1900 NULL, _("Location"), 0, NULL); |
6514 | 1901 |
1902 /* extract their Age and put it in */ | |
1903 info_extract_field(stripped, url_text, "Age:", 3, "\n", '\n', | |
6573 | 1904 NULL, _("Age"), 0, NULL); |
6514 | 1905 |
1906 /* extract their MaritalStatus and put it in */ | |
1907 info_extract_field(stripped, url_text, "MaritalStatus:", 3, "\n", '\n', | |
6657 | 1908 "No Answer", _("Marital Status"), 0, NULL); |
6514 | 1909 |
1910 /* extract their Gender and put it in */ | |
1911 info_extract_field(stripped, url_text, "Gender:", 3, "\n", '\n', | |
6657 | 1912 "No Answer", _("Gender"), 0, NULL); |
6514 | 1913 |
1914 /* extract their Occupation and put it in */ | |
1915 info_extract_field(stripped, url_text, "Occupation:", 2, "\n", '\n', | |
6573 | 1916 NULL, _("Occupation"), 0, NULL); |
6514 | 1917 |
1918 /* Hobbies, Latest News, and Favorite Quote are a bit different, since the | |
1919 * values can contain embedded newlines... but any or all of them can also | |
1920 * not appear. The way we delimit them is to successively look for the next | |
1921 * one that _could_ appear, and if all else fails, we end the section by | |
1922 * looking for the 'Links' heading, which is the next thing to follow this | |
1923 * bunch. | |
1924 */ | |
1925 if (!info_extract_field(stripped, url_text, "Hobbies:", 1, "Latest News", | |
6573 | 1926 '\n', NULL, _("Hobbies"), 0, NULL)) |
6514 | 1927 if (!info_extract_field(stripped, url_text, "Hobbies:", 1, "Favorite Quote", |
6573 | 1928 '\n', NULL, _("Hobbies"), 0, NULL)) |
6514 | 1929 info_extract_field(stripped, url_text, "Hobbies:", 1, "Links", |
6573 | 1930 '\n', NULL, _("Hobbies"), 0, NULL); |
6514 | 1931 if (!info_extract_field(stripped, url_text, "Latest News:", 1, "Favorite Quote", |
6573 | 1932 '\n', NULL, _("Latest News"), 0, NULL)) |
6514 | 1933 info_extract_field(stripped, url_text, "Latest News:", 1, "Links", |
6573 | 1934 '\n', NULL, _("Latest News"), 0, NULL); |
6514 | 1935 info_extract_field(stripped, url_text, "Favorite Quote:", 0, "Links", |
6573 | 1936 '\n', NULL, _("Favorite Quote"), 0, NULL); |
6514 | 1937 |
1938 /* Home Page will either be "No home page specified", | |
1939 * or "Home Page: " and a link. */ | |
1940 p = strstr(stripped, "No home page specified"); | |
1941 if (!p) | |
1942 info_extract_field(stripped, url_text, "Home Page:", 1, " ", 0, NULL, | |
6573 | 1943 _("Home Page"), 1, NULL); |
6514 | 1944 |
1945 /* Cool Link {1,2,3} is also different. If "No cool link specified" exists, | |
1946 * then we have none. If we have one however, we'll need to check and see if | |
1947 * we have a second one. If we have a second one, we have to check to see if | |
1948 * we have a third one. | |
1949 */ | |
1950 p = strstr(stripped,"No cool link specified"); | |
1951 if (!p) | |
1952 if (info_extract_field(stripped, url_text, "Cool Link 1:", 1, " ", 0, NULL, | |
6573 | 1953 _("Cool Link 1"), 1, NULL)) |
6514 | 1954 if (info_extract_field(stripped, url_text, "Cool Link 2:", 1, " ", 0, NULL, |
6573 | 1955 _("Cool Link 2"), 1, NULL)) |
6514 | 1956 info_extract_field(stripped, url_text, "Cool Link 3:", 1, " ", 0, NULL, |
6573 | 1957 _("Cool Link 3"), 1, NULL); |
6514 | 1958 |
1959 /* see if Member Since is there, and if so, extract it. */ | |
1960 info_extract_field(stripped, url_text, "Member Since:", 1, "Last Updated:", | |
6573 | 1961 '\n', NULL, _("Member Since"), 0, NULL); |
6514 | 1962 |
1963 /* extract the Last Updated date and put it in */ | |
1964 info_extract_field(stripped, url_text, "Last Updated:", 1, "\n", '\n', NULL, | |
6573 | 1965 _("Last Updated"), 0, NULL); |
6514 | 1966 |
1967 /* finish off the html */ | |
1968 strcat(url_text, "</body></html>\n"); | |
1969 g_free(stripped); | |
1970 | |
1971 /* show it to the user */ | |
1972 g_show_info_text(NULL, NULL, 2, url_text, NULL); | |
1973 } | |
1974 | |
1975 static void yahoo_get_info(GaimConnection *gc, const char *name) | |
1976 { | |
1977 /* struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; */ | |
1978 char url[256]; | |
1979 g_snprintf(url, sizeof url, "%s%s", YAHOO_PROFILE_URL, name); | |
6516 | 1980 grab_url(url, FALSE, yahoo_got_info, NULL, NULL, 0); |
6514 | 1981 } |
1982 | |
6793 | 1983 static void yahoo_change_buddys_group(GaimConnection *gc, const char *who, |
1984 const char *old_group, const char *new_group) | |
1985 { | |
1986 struct yahoo_data *yd = gc->proto_data; | |
1987 struct yahoo_packet *pkt; | |
1988 | |
1989 /* Step 0: If they aren't on the server list anyway, | |
1990 * don't bother letting the server know. | |
1991 */ | |
1992 if (!g_hash_table_lookup(yd->friends, who)) | |
1993 return; | |
1994 | |
1995 /* Step 1: Add buddy to new group. */ | |
1996 pkt = yahoo_packet_new(YAHOO_SERVICE_ADDBUDDY, YAHOO_STATUS_AVAILABLE, 0); | |
1997 yahoo_packet_hash(pkt, 1, gaim_connection_get_display_name(gc)); | |
1998 yahoo_packet_hash(pkt, 7, who); | |
1999 yahoo_packet_hash(pkt, 65, new_group); | |
2000 yahoo_packet_hash(pkt, 14, ""); | |
2001 yahoo_send_packet(yd, pkt); | |
2002 yahoo_packet_free(pkt); | |
2003 | |
2004 /* Step 2: Remove buddy from old group */ | |
2005 pkt = yahoo_packet_new(YAHOO_SERVICE_REMBUDDY, YAHOO_STATUS_AVAILABLE, 0); | |
2006 yahoo_packet_hash(pkt, 1, gaim_connection_get_display_name(gc)); | |
2007 yahoo_packet_hash(pkt, 7, who); | |
2008 yahoo_packet_hash(pkt, 65, old_group); | |
2009 yahoo_send_packet(yd, pkt); | |
2010 yahoo_packet_free(pkt); | |
2011 } | |
2012 | |
2013 static void yahoo_rename_group(GaimConnection *gc, const char *old_group, | |
2014 const char *new_group, GList *whocares) | |
2015 { | |
2016 struct yahoo_data *yd = gc->proto_data; | |
2017 struct yahoo_packet *pkt; | |
2018 | |
2019 pkt = yahoo_packet_new(YAHOO_SERVICE_GROUPRENAME, YAHOO_STATUS_AVAILABLE, 0); | |
2020 yahoo_packet_hash(pkt, 1, gaim_connection_get_display_name(gc)); | |
2021 yahoo_packet_hash(pkt, 65, old_group); | |
2022 yahoo_packet_hash(pkt, 67, new_group); | |
2023 yahoo_send_packet(yd, pkt); | |
2024 yahoo_packet_free(pkt); | |
2025 } | |
2026 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2027 static GaimPlugin *my_protocol = NULL; |
2681 | 2028 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2029 static GaimPluginProtocolInfo prpl_info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2030 { |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2031 GAIM_PROTO_YAHOO, |
6729 | 2032 OPT_PROTO_MAIL_CHECK | OPT_PROTO_CHAT_TOPIC, |
2033 NULL, /* user_splits */ | |
2034 NULL, /* protocol_options */ | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2035 yahoo_list_icon, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2036 yahoo_list_emblems, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2037 yahoo_status_text, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2038 yahoo_tooltip_text, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2039 yahoo_away_states, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2040 yahoo_actions, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2041 yahoo_buddy_menu, |
6729 | 2042 yahoo_c_info, |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2043 yahoo_login, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2044 yahoo_close, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2045 yahoo_send_im, |
6729 | 2046 NULL, /* set info */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2047 yahoo_send_typing, |
6514 | 2048 yahoo_get_info, |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2049 yahoo_set_away, |
6729 | 2050 NULL, /* get_away */ |
2051 NULL, /* set_dir */ | |
2052 NULL, /* get_dir */ | |
2053 NULL, /* dir_search */ | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2054 yahoo_set_idle, |
6729 | 2055 NULL, /* change_passwd*/ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2056 yahoo_add_buddy, |
6729 | 2057 NULL, /* add_buddies */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2058 yahoo_remove_buddy, |
6729 | 2059 NULL, /*remove_buddies */ |
2060 NULL, /* add_permit */ | |
6760 | 2061 yahoo_add_deny, |
6729 | 2062 NULL, /* rem_permit */ |
6760 | 2063 yahoo_rem_deny, |
2064 yahoo_set_permit_deny, | |
6729 | 2065 NULL, /* warn */ |
2066 yahoo_c_join, | |
2067 yahoo_c_invite, | |
2068 yahoo_c_leave, | |
2069 NULL, /* chat whisper */ | |
2070 yahoo_c_send, | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2071 yahoo_keepalive, |
6729 | 2072 NULL, /* register_user */ |
2073 NULL, /* get_cb_info */ | |
2074 NULL, /* get_cb_away */ | |
2075 NULL, /* alias_buddy */ | |
6793 | 2076 yahoo_change_buddys_group, |
2077 yahoo_rename_group, | |
6729 | 2078 NULL, /* buddy_free */ |
2079 NULL, /* convo_closed */ | |
2080 NULL, /* normalize */ | |
2081 NULL /* set_buddy_icon */ | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2082 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2083 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2084 static GaimPluginInfo info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2085 { |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2086 2, /**< api_version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2087 GAIM_PLUGIN_PROTOCOL, /**< type */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2088 NULL, /**< ui_requirement */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2089 0, /**< flags */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2090 NULL, /**< dependencies */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2091 GAIM_PRIORITY_DEFAULT, /**< priority */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2092 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2093 "prpl-yahoo", /**< id */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2094 "Yahoo", /**< name */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2095 VERSION, /**< version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2096 /** summary */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2097 N_("Yahoo Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2098 /** description */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2099 N_("Yahoo Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2100 NULL, /**< author */ |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6321
diff
changeset
|
2101 GAIM_WEBSITE, /**< homepage */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2102 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2103 NULL, /**< load */ |
6513 | 2104 yahoo_unload_plugin, /**< unload */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2105 NULL, /**< destroy */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2106 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2107 NULL, /**< ui_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2108 &prpl_info /**< extra_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2109 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2110 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2111 static void |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
2112 init_plugin(GaimPlugin *plugin) |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2113 { |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5590
diff
changeset
|
2114 GaimAccountOption *option; |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2115 |
5685
43ea75092684
[gaim-migrate @ 6106]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
2116 option = gaim_account_option_string_new(_("Pager host"), "server", |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5590
diff
changeset
|
2117 YAHOO_PAGER_HOST); |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5590
diff
changeset
|
2118 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5590
diff
changeset
|
2119 option); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2120 |
5685
43ea75092684
[gaim-migrate @ 6106]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
2121 option = gaim_account_option_int_new(_("Pager port"), "port", |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5590
diff
changeset
|
2122 YAHOO_PAGER_PORT); |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5590
diff
changeset
|
2123 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5590
diff
changeset
|
2124 option); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2125 my_protocol = plugin; |
6513 | 2126 |
2127 yahoo_init_colorht(); | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2128 } |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
2129 |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
2130 GAIM_INIT_PLUGIN(yahoo, init_plugin, info); |