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