Mercurial > pidgin
annotate src/protocols/yahoo/yahoo.c @ 6629:bdc448cf4cb6
[gaim-migrate @ 7153]
Tim Ringenbach (marv_sf) writes:
" This patch makes sending colors in yahoo work. It also
makes a few changing to receiving them, and addresses
most of the problems with that patch (which I think
were all related to the fact it didn't do outgoing colors).
It now handles bold, italic, underline, font face, font
size, and font color in both directions. It disables
the background color button if the prpl is yahoo (in a
generic way), and farthermore strips out any <body>
tags that the user might try to type anyway (the yahoo
server purposely mangles them).
It also adds a line to g_strescape some debug messages
because I got tired them of changing the color of my
terminal.
I think I got all the bugs out. If you run with -d or
open the debug window, it will show you what both
conversion function returned, which should help track
down any problems."
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Tue, 26 Aug 2003 01:34:51 +0000 |
parents | 156e6643f9db |
children | 889279abb909 |
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" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
26 #include "debug.h" |
2681 | 27 #include "multi.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
28 #include "notify.h" |
2681 | 29 #include "prpl.h" |
30 #include "proxy.h" | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
31 #include "request.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
32 #include "server.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
33 #include "util.h" |
6115
11bedb793a44
[gaim-migrate @ 6578]
Christian Hammond <chipx86@chipx86.com>
parents:
6069
diff
changeset
|
34 #include "html.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
35 |
6513 | 36 #include "yahoo.h" |
3147 | 37 #include "md5.h" |
2681 | 38 |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
39 /* XXX */ |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6321
diff
changeset
|
40 #include "gtkinternal.h" |
6546 | 41 #include "gaim.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
42 #include "ui.h" |
3630 | 43 |
5583 | 44 extern char *yahoo_crypt(const char *, const char *); |
2795
536bb833fdeb
[gaim-migrate @ 2808]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2786
diff
changeset
|
45 |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
46 /* #define YAHOO_DEBUG */ |
2681 | 47 |
48 #define USEROPT_MAIL 0 | |
49 | |
3147 | 50 #define YAHOO_PAGER_HOST "scs.yahoo.com" |
2681 | 51 #define YAHOO_PAGER_PORT 5050 |
6514 | 52 #define YAHOO_PROFILE_URL "http://profiles.yahoo.com/" |
2681 | 53 |
3467 | 54 #define YAHOO_PROTO_VER 0x0900 |
55 | |
2686
7b21c5446baf
[gaim-migrate @ 2699]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2683
diff
changeset
|
56 enum yahoo_service { /* these are easier to see in hex */ |
2681 | 57 YAHOO_SERVICE_LOGON = 1, |
58 YAHOO_SERVICE_LOGOFF, | |
59 YAHOO_SERVICE_ISAWAY, | |
60 YAHOO_SERVICE_ISBACK, | |
2686
7b21c5446baf
[gaim-migrate @ 2699]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2683
diff
changeset
|
61 YAHOO_SERVICE_IDLE, /* 5 (placemarker) */ |
2681 | 62 YAHOO_SERVICE_MESSAGE, |
63 YAHOO_SERVICE_IDACT, | |
64 YAHOO_SERVICE_IDDEACT, | |
65 YAHOO_SERVICE_MAILSTAT, | |
2686
7b21c5446baf
[gaim-migrate @ 2699]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2683
diff
changeset
|
66 YAHOO_SERVICE_USERSTAT, /* 0xa */ |
2681 | 67 YAHOO_SERVICE_NEWMAIL, |
68 YAHOO_SERVICE_CHATINVITE, | |
69 YAHOO_SERVICE_CALENDAR, | |
70 YAHOO_SERVICE_NEWPERSONALMAIL, | |
71 YAHOO_SERVICE_NEWCONTACT, | |
2686
7b21c5446baf
[gaim-migrate @ 2699]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2683
diff
changeset
|
72 YAHOO_SERVICE_ADDIDENT, /* 0x10 */ |
2681 | 73 YAHOO_SERVICE_ADDIGNORE, |
74 YAHOO_SERVICE_PING, | |
75 YAHOO_SERVICE_GROUPRENAME, | |
2686
7b21c5446baf
[gaim-migrate @ 2699]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2683
diff
changeset
|
76 YAHOO_SERVICE_SYSMESSAGE = 0x14, |
7b21c5446baf
[gaim-migrate @ 2699]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2683
diff
changeset
|
77 YAHOO_SERVICE_PASSTHROUGH2 = 0x16, |
7b21c5446baf
[gaim-migrate @ 2699]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2683
diff
changeset
|
78 YAHOO_SERVICE_CONFINVITE = 0x18, |
2681 | 79 YAHOO_SERVICE_CONFLOGON, |
80 YAHOO_SERVICE_CONFDECLINE, | |
81 YAHOO_SERVICE_CONFLOGOFF, | |
82 YAHOO_SERVICE_CONFADDINVITE, | |
83 YAHOO_SERVICE_CONFMSG, | |
84 YAHOO_SERVICE_CHATLOGON, | |
85 YAHOO_SERVICE_CHATLOGOFF, | |
2686
7b21c5446baf
[gaim-migrate @ 2699]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2683
diff
changeset
|
86 YAHOO_SERVICE_CHATMSG = 0x20, |
7b21c5446baf
[gaim-migrate @ 2699]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2683
diff
changeset
|
87 YAHOO_SERVICE_GAMELOGON = 0x28, |
2786
318f846120e2
[gaim-migrate @ 2799]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2772
diff
changeset
|
88 YAHOO_SERVICE_GAMELOGOFF, |
318f846120e2
[gaim-migrate @ 2799]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2772
diff
changeset
|
89 YAHOO_SERVICE_GAMEMSG = 0x2a, |
2686
7b21c5446baf
[gaim-migrate @ 2699]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2683
diff
changeset
|
90 YAHOO_SERVICE_FILETRANSFER = 0x46, |
3019 | 91 YAHOO_SERVICE_NOTIFY = 0x4B, |
3147 | 92 YAHOO_SERVICE_AUTHRESP = 0x54, |
2686
7b21c5446baf
[gaim-migrate @ 2699]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2683
diff
changeset
|
93 YAHOO_SERVICE_LIST = 0x55, |
3147 | 94 YAHOO_SERVICE_AUTH = 0x57, |
2686
7b21c5446baf
[gaim-migrate @ 2699]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2683
diff
changeset
|
95 YAHOO_SERVICE_ADDBUDDY = 0x83, |
7b21c5446baf
[gaim-migrate @ 2699]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2683
diff
changeset
|
96 YAHOO_SERVICE_REMBUDDY = 0x84 |
2681 | 97 }; |
98 | |
99 enum yahoo_status { | |
2686
7b21c5446baf
[gaim-migrate @ 2699]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2683
diff
changeset
|
100 YAHOO_STATUS_AVAILABLE = 0, |
2681 | 101 YAHOO_STATUS_BRB, |
102 YAHOO_STATUS_BUSY, | |
103 YAHOO_STATUS_NOTATHOME, | |
104 YAHOO_STATUS_NOTATDESK, | |
105 YAHOO_STATUS_NOTINOFFICE, | |
106 YAHOO_STATUS_ONPHONE, | |
107 YAHOO_STATUS_ONVACATION, | |
108 YAHOO_STATUS_OUTTOLUNCH, | |
109 YAHOO_STATUS_STEPPEDOUT, | |
110 YAHOO_STATUS_INVISIBLE = 12, | |
111 YAHOO_STATUS_CUSTOM = 99, | |
112 YAHOO_STATUS_IDLE = 999, | |
2993 | 113 YAHOO_STATUS_OFFLINE = 0x5a55aa56, /* don't ask */ |
114 YAHOO_STATUS_TYPING = 0x16 | |
2681 | 115 }; |
3019 | 116 #define YAHOO_STATUS_GAME 0x2 /* Games don't fit into the regular status model */ |
2681 | 117 |
118 struct yahoo_data { | |
119 int fd; | |
120 guchar *rxqueue; | |
121 int rxlen; | |
122 GHashTable *hash; | |
3019 | 123 GHashTable *games; |
2681 | 124 int current_status; |
125 gboolean logged_in; | |
126 }; | |
127 | |
128 struct yahoo_pair { | |
129 int key; | |
130 char *value; | |
131 }; | |
132 | |
133 struct yahoo_packet { | |
134 guint16 service; | |
135 guint32 status; | |
136 guint32 id; | |
137 GSList *hash; | |
138 }; | |
139 | |
140 #define YAHOO_PACKET_HDRLEN (4 + 2 + 2 + 2 + 2 + 4 + 4) | |
141 | |
142 static struct yahoo_packet *yahoo_packet_new(enum yahoo_service service, enum yahoo_status status, int id) | |
143 { | |
144 struct yahoo_packet *pkt = g_new0(struct yahoo_packet, 1); | |
145 | |
146 pkt->service = service; | |
147 pkt->status = status; | |
148 pkt->id = id; | |
149 | |
150 return pkt; | |
151 } | |
152 | |
3466 | 153 static void yahoo_packet_hash(struct yahoo_packet *pkt, int key, const char *value) |
2681 | 154 { |
155 struct yahoo_pair *pair = g_new0(struct yahoo_pair, 1); | |
156 pair->key = key; | |
157 pair->value = g_strdup(value); | |
158 pkt->hash = g_slist_append(pkt->hash, pair); | |
159 } | |
160 | |
161 static int yahoo_packet_length(struct yahoo_packet *pkt) | |
162 { | |
163 GSList *l; | |
164 | |
165 int len = 0; | |
166 | |
167 l = pkt->hash; | |
168 while (l) { | |
169 struct yahoo_pair *pair = l->data; | |
170 int tmp = pair->key; | |
171 do { | |
172 tmp /= 10; | |
173 len++; | |
174 } while (tmp); | |
175 len += 2; | |
176 len += strlen(pair->value); | |
177 len += 2; | |
178 l = l->next; | |
179 } | |
180 | |
181 return len; | |
182 } | |
183 | |
184 /* sometimes i wish prpls could #include things from other prpls. then i could just | |
185 * use the routines from libfaim and not have to admit to knowing how they work. */ | |
186 #define yahoo_put16(buf, data) ( \ | |
187 (*(buf) = (u_char)((data)>>8)&0xff), \ | |
188 (*((buf)+1) = (u_char)(data)&0xff), \ | |
189 2) | |
190 #define yahoo_get16(buf) ((((*(buf))<<8)&0xff00) + ((*((buf)+1)) & 0xff)) | |
191 #define yahoo_put32(buf, data) ( \ | |
192 (*((buf)) = (u_char)((data)>>24)&0xff), \ | |
193 (*((buf)+1) = (u_char)((data)>>16)&0xff), \ | |
194 (*((buf)+2) = (u_char)((data)>>8)&0xff), \ | |
195 (*((buf)+3) = (u_char)(data)&0xff), \ | |
196 4) | |
197 #define yahoo_get32(buf) ((((*(buf))<<24)&0xff000000) + \ | |
198 (((*((buf)+1))<<16)&0x00ff0000) + \ | |
199 (((*((buf)+2))<< 8)&0x0000ff00) + \ | |
200 (((*((buf)+3) )&0x000000ff))) | |
201 | |
202 static void yahoo_packet_read(struct yahoo_packet *pkt, guchar *data, int len) | |
203 { | |
204 int pos = 0; | |
205 | |
206 while (pos + 1 < len) { | |
6629 | 207 char key[64], *value = NULL, *esc; |
2724
7f3f4aa114ad
[gaim-migrate @ 2737]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2723
diff
changeset
|
208 int accept; |
2681 | 209 int x; |
210 | |
211 struct yahoo_pair *pair = g_new0(struct yahoo_pair, 1); | |
212 | |
213 x = 0; | |
214 while (pos + 1 < len) { | |
215 if (data[pos] == 0xc0 && data[pos + 1] == 0x80) | |
216 break; | |
217 key[x++] = data[pos++]; | |
218 } | |
219 key[x] = 0; | |
220 pos += 2; | |
221 pair->key = strtol(key, NULL, 10); | |
2724
7f3f4aa114ad
[gaim-migrate @ 2737]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2723
diff
changeset
|
222 accept = x; /* if x is 0 there was no key, so don't accept it */ |
2681 | 223 |
3996
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
224 if (len - pos + 1 <= 0) { |
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
225 /* Truncated. Garbage or something. */ |
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
226 accept = 0; |
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
227 } |
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
228 |
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
229 if (accept) { |
2724
7f3f4aa114ad
[gaim-migrate @ 2737]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2723
diff
changeset
|
230 value = g_malloc(len - pos + 1); |
3996
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
231 x = 0; |
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
232 while (pos + 1 < len) { |
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
233 if (data[pos] == 0xc0 && data[pos + 1] == 0x80) |
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
234 break; |
2724
7f3f4aa114ad
[gaim-migrate @ 2737]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2723
diff
changeset
|
235 value[x++] = data[pos++]; |
3996
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
236 } |
2724
7f3f4aa114ad
[gaim-migrate @ 2737]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2723
diff
changeset
|
237 value[x] = 0; |
7f3f4aa114ad
[gaim-migrate @ 2737]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2723
diff
changeset
|
238 pair->value = g_strdup(value); |
7f3f4aa114ad
[gaim-migrate @ 2737]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2723
diff
changeset
|
239 g_free(value); |
7f3f4aa114ad
[gaim-migrate @ 2737]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2723
diff
changeset
|
240 pkt->hash = g_slist_append(pkt->hash, pair); |
6629 | 241 esc = g_strescape(pair->value, NULL); |
5220
7b9d78fa051e
[gaim-migrate @ 5590]
Christian Hammond <chipx86@chipx86.com>
parents:
5216
diff
changeset
|
242 gaim_debug(GAIM_DEBUG_MISC, "yahoo", |
6629 | 243 "Key: %d \tValue: %s\n", pair->key, esc); |
244 g_free(esc); | |
2724
7f3f4aa114ad
[gaim-migrate @ 2737]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2723
diff
changeset
|
245 } else { |
7f3f4aa114ad
[gaim-migrate @ 2737]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2723
diff
changeset
|
246 g_free(pair); |
7f3f4aa114ad
[gaim-migrate @ 2737]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2723
diff
changeset
|
247 } |
3996
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
248 pos += 2; |
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
249 |
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
250 /* Skip over garbage we've noticed in the mail notifications */ |
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
251 if (data[0] == '9' && data[pos] == 0x01) |
3fdfe7872118
[gaim-migrate @ 4191]
Christian Hammond <chipx86@chipx86.com>
parents:
3768
diff
changeset
|
252 pos++; |
2681 | 253 } |
254 } | |
255 | |
256 static void yahoo_packet_write(struct yahoo_packet *pkt, guchar *data) | |
257 { | |
258 GSList *l = pkt->hash; | |
259 int pos = 0; | |
260 | |
261 while (l) { | |
262 struct yahoo_pair *pair = l->data; | |
263 guchar buf[100]; | |
264 | |
265 g_snprintf(buf, sizeof(buf), "%d", pair->key); | |
266 strcpy(data + pos, buf); | |
267 pos += strlen(buf); | |
268 data[pos++] = 0xc0; | |
269 data[pos++] = 0x80; | |
270 | |
271 strcpy(data + pos, pair->value); | |
272 pos += strlen(pair->value); | |
273 data[pos++] = 0xc0; | |
274 data[pos++] = 0x80; | |
275 | |
276 l = l->next; | |
277 } | |
278 } | |
279 | |
280 static void yahoo_packet_dump(guchar *data, int len) | |
281 { | |
282 #ifdef YAHOO_DEBUG | |
283 int i; | |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
284 |
5220
7b9d78fa051e
[gaim-migrate @ 5590]
Christian Hammond <chipx86@chipx86.com>
parents:
5216
diff
changeset
|
285 gaim_debug(GAIM_DEBUG_MISC, "yahoo", ""); |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
286 |
2681 | 287 for (i = 0; i + 1 < len; i += 2) { |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
288 if ((i % 16 == 0) && i) { |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
289 gaim_debug(GAIM_DEBUG_MISC, NULL, "\n"); |
5220
7b9d78fa051e
[gaim-migrate @ 5590]
Christian Hammond <chipx86@chipx86.com>
parents:
5216
diff
changeset
|
290 gaim_debug(GAIM_DEBUG_MISC, "yahoo", ""); |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
291 } |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
292 |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
293 gaim_debug(GAIM_DEBUG_MISC, NULL, "%02x%02x ", data[i], data[i + 1]); |
2681 | 294 } |
295 if (i < len) | |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
296 gaim_debug(GAIM_DEBUG_MISC, NULL, "%02x", data[i]); |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
297 |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
298 gaim_debug(GAIM_DEBUG_MISC, NULL, "\n"); |
5220
7b9d78fa051e
[gaim-migrate @ 5590]
Christian Hammond <chipx86@chipx86.com>
parents:
5216
diff
changeset
|
299 gaim_debug(GAIM_DEBUG_MISC, "yahoo", ""); |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
300 |
2681 | 301 for (i = 0; i < len; i++) { |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
302 if ((i % 16 == 0) && i) { |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
303 gaim_debug(GAIM_DEBUG_MISC, NULL, "\n"); |
5220
7b9d78fa051e
[gaim-migrate @ 5590]
Christian Hammond <chipx86@chipx86.com>
parents:
5216
diff
changeset
|
304 gaim_debug(GAIM_DEBUG_MISC, "yahoo", ""); |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
305 } |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
306 |
2681 | 307 if (isprint(data[i])) |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
308 gaim_debug(GAIM_DEBUG_MISC, NULL, "%c ", data[i]); |
2681 | 309 else |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
310 gaim_debug(GAIM_DEBUG_MISC, NULL, ". "); |
2681 | 311 } |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
312 |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
313 gaim_debug(GAIM_DEBUG_MISC, NULL, "\n"); |
2681 | 314 #endif |
315 } | |
316 | |
317 static int yahoo_send_packet(struct yahoo_data *yd, struct yahoo_packet *pkt) | |
318 { | |
319 int pktlen = yahoo_packet_length(pkt); | |
320 int len = YAHOO_PACKET_HDRLEN + pktlen; | |
321 int ret; | |
322 | |
323 guchar *data; | |
324 int pos = 0; | |
325 | |
326 if (yd->fd < 0) | |
327 return -1; | |
328 | |
329 data = g_malloc0(len + 1); | |
330 | |
331 memcpy(data + pos, "YMSG", 4); pos += 4; | |
3467 | 332 pos += yahoo_put16(data + pos, YAHOO_PROTO_VER); |
2681 | 333 pos += yahoo_put16(data + pos, 0x0000); |
334 pos += yahoo_put16(data + pos, pktlen); | |
335 pos += yahoo_put16(data + pos, pkt->service); | |
336 pos += yahoo_put32(data + pos, pkt->status); | |
337 pos += yahoo_put32(data + pos, pkt->id); | |
338 | |
339 yahoo_packet_write(pkt, data + pos); | |
340 | |
341 yahoo_packet_dump(data, len); | |
342 ret = write(yd->fd, data, len); | |
343 g_free(data); | |
344 | |
345 return ret; | |
346 } | |
347 | |
348 static void yahoo_packet_free(struct yahoo_packet *pkt) | |
349 { | |
350 while (pkt->hash) { | |
351 struct yahoo_pair *pair = pkt->hash->data; | |
352 g_free(pair->value); | |
353 g_free(pair); | |
354 pkt->hash = g_slist_remove(pkt->hash, pair); | |
355 } | |
356 g_free(pkt); | |
357 } | |
358 | |
5583 | 359 static void yahoo_process_status(GaimConnection *gc, struct yahoo_packet *pkt) |
2681 | 360 { |
361 struct yahoo_data *yd = gc->proto_data; | |
362 GSList *l = pkt->hash; | |
363 char *name = NULL; | |
364 int state = 0; | |
3019 | 365 int gamestate = 0; |
2681 | 366 char *msg = NULL; |
3019 | 367 |
2681 | 368 while (l) { |
369 struct yahoo_pair *pair = l->data; | |
370 | |
371 switch (pair->key) { | |
372 case 0: /* we won't actually do anything with this */ | |
373 break; | |
374 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
|
375 if (!yd->logged_in) { |
5583 | 376 gaim_connection_set_state(gc, GAIM_CONNECTED); |
2805
9b3c7d2a6e9a
[gaim-migrate @ 2818]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2795
diff
changeset
|
377 serv_finish_login(gc); |
5583 | 378 gaim_connection_set_display_name(gc, pair->value); |
2805
9b3c7d2a6e9a
[gaim-migrate @ 2818]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2795
diff
changeset
|
379 yd->logged_in = TRUE; |
2681 | 380 |
3147 | 381 /* this requests the list. i have a feeling that this is very evil |
382 * | |
383 * scs.yahoo.com sends you the list before this packet without it being | |
384 * requested | |
385 * | |
386 * do_import(gc, NULL); | |
387 * newpkt = yahoo_packet_new(YAHOO_SERVICE_LIST, YAHOO_STATUS_OFFLINE, 0); | |
388 * yahoo_send_packet(yd, newpkt); | |
389 * yahoo_packet_free(newpkt); | |
390 */ | |
391 | |
392 } | |
2681 | 393 break; |
394 case 8: /* how many online buddies we have */ | |
395 break; | |
396 case 7: /* the current buddy */ | |
397 name = pair->value; | |
398 break; | |
399 case 10: /* state */ | |
400 state = strtol(pair->value, NULL, 10); | |
401 break; | |
402 case 19: /* custom message */ | |
403 msg = pair->value; | |
404 break; | |
405 case 11: /* i didn't know what this was in the old protocol either */ | |
406 break; | |
407 case 17: /* in chat? */ | |
408 break; | |
2805
9b3c7d2a6e9a
[gaim-migrate @ 2818]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2795
diff
changeset
|
409 case 13: /* in pager? */ |
9b3c7d2a6e9a
[gaim-migrate @ 2818]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2795
diff
changeset
|
410 if (pkt->service == YAHOO_SERVICE_LOGOFF || |
9b3c7d2a6e9a
[gaim-migrate @ 2818]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2795
diff
changeset
|
411 strtol(pair->value, NULL, 10) == 0) { |
4732 | 412 serv_got_update(gc, name, 0, 0, 0, 0, 0); |
2807
f01e6a425136
[gaim-migrate @ 2820]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2805
diff
changeset
|
413 break; |
2805
9b3c7d2a6e9a
[gaim-migrate @ 2818]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2795
diff
changeset
|
414 } |
3019 | 415 if (g_hash_table_lookup(yd->games, name)) |
416 gamestate = YAHOO_STATUS_GAME; | |
2805
9b3c7d2a6e9a
[gaim-migrate @ 2818]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2795
diff
changeset
|
417 if (state == YAHOO_STATUS_CUSTOM) { |
9b3c7d2a6e9a
[gaim-migrate @ 2818]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2795
diff
changeset
|
418 gpointer val = g_hash_table_lookup(yd->hash, name); |
9b3c7d2a6e9a
[gaim-migrate @ 2818]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2795
diff
changeset
|
419 if (val) { |
9b3c7d2a6e9a
[gaim-migrate @ 2818]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2795
diff
changeset
|
420 g_free(val); |
2873
26be84883f91
[gaim-migrate @ 2886]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2856
diff
changeset
|
421 g_hash_table_insert(yd->hash, name, |
26be84883f91
[gaim-migrate @ 2886]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2856
diff
changeset
|
422 msg ? g_strdup(msg) : g_malloc0(1)); |
2805
9b3c7d2a6e9a
[gaim-migrate @ 2818]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2795
diff
changeset
|
423 } else |
2873
26be84883f91
[gaim-migrate @ 2886]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2856
diff
changeset
|
424 g_hash_table_insert(yd->hash, g_strdup(name), |
26be84883f91
[gaim-migrate @ 2886]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2856
diff
changeset
|
425 msg ? g_strdup(msg) : g_malloc0(1)); |
2771
450f4f9d2f23
[gaim-migrate @ 2784]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2741
diff
changeset
|
426 } |
4777 | 427 if (state == YAHOO_STATUS_AVAILABLE) |
428 serv_got_update(gc, name, 1, 0, 0, 0, gamestate); | |
5002 | 429 else if (state == YAHOO_STATUS_IDLE) |
430 serv_got_update(gc, name, 1, 0, 0, -1, (state << 2) | UC_UNAVAILABLE | gamestate); | |
4777 | 431 else |
432 serv_got_update(gc, name, 1, 0, 0, 0, (state << 2) | UC_UNAVAILABLE | gamestate); | |
2771
450f4f9d2f23
[gaim-migrate @ 2784]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2741
diff
changeset
|
433 break; |
2805
9b3c7d2a6e9a
[gaim-migrate @ 2818]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2795
diff
changeset
|
434 case 60: /* no clue */ |
9b3c7d2a6e9a
[gaim-migrate @ 2818]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2795
diff
changeset
|
435 break; |
2979 | 436 case 16: /* Custom error message */ |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5367
diff
changeset
|
437 gaim_notify_error(gc, NULL, pair->value, NULL); |
2951 | 438 break; |
2681 | 439 default: |
5220
7b9d78fa051e
[gaim-migrate @ 5590]
Christian Hammond <chipx86@chipx86.com>
parents:
5216
diff
changeset
|
440 gaim_debug(GAIM_DEBUG_ERROR, "yahoo", |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
441 "Unknown status key %d\n", pair->key); |
2681 | 442 break; |
443 } | |
444 | |
445 l = l->next; | |
446 } | |
447 } | |
448 | |
5583 | 449 static void yahoo_process_list(GaimConnection *gc, struct yahoo_packet *pkt) |
2681 | 450 { |
451 GSList *l = pkt->hash; | |
452 gboolean export = FALSE; | |
4775 | 453 struct buddy *b; |
454 struct group *g; | |
2681 | 455 |
456 while (l) { | |
457 char **lines; | |
458 char **split; | |
459 char **buddies; | |
460 char **tmp, **bud; | |
461 | |
462 struct yahoo_pair *pair = l->data; | |
463 l = l->next; | |
464 | |
465 if (pair->key != 87) | |
466 continue; | |
467 | |
468 lines = g_strsplit(pair->value, "\n", -1); | |
469 for (tmp = lines; *tmp; tmp++) { | |
470 split = g_strsplit(*tmp, ":", 2); | |
2697
7759f914a009
[gaim-migrate @ 2710]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2688
diff
changeset
|
471 if (!split) |
7759f914a009
[gaim-migrate @ 2710]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2688
diff
changeset
|
472 continue; |
2702
94b4271b9567
[gaim-migrate @ 2715]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2697
diff
changeset
|
473 if (!split[0] || !split[1]) { |
2697
7759f914a009
[gaim-migrate @ 2710]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2688
diff
changeset
|
474 g_strfreev(split); |
7759f914a009
[gaim-migrate @ 2710]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2688
diff
changeset
|
475 continue; |
7759f914a009
[gaim-migrate @ 2710]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2688
diff
changeset
|
476 } |
2681 | 477 buddies = g_strsplit(split[1], ",", -1); |
2697
7759f914a009
[gaim-migrate @ 2710]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2688
diff
changeset
|
478 for (bud = buddies; bud && *bud; bud++) |
4775 | 479 if (!(b = gaim_find_buddy(gc->account, *bud))) { |
480 if (!(g = gaim_find_group(split[0]))) { | |
481 g = gaim_group_new(split[0]); | |
482 gaim_blist_add_group(g, NULL); | |
483 } | |
484 b = gaim_buddy_new(gc->account, *bud, NULL); | |
485 gaim_blist_add_buddy(b, g, NULL); | |
2681 | 486 export = TRUE; |
487 } | |
488 g_strfreev(buddies); | |
489 g_strfreev(split); | |
490 } | |
491 g_strfreev(lines); | |
492 } | |
493 | |
494 if (export) | |
4349 | 495 gaim_blist_save(); |
2681 | 496 } |
497 | |
5583 | 498 static void yahoo_process_notify(GaimConnection *gc, struct yahoo_packet *pkt) |
2993 | 499 { |
500 char *msg = NULL; | |
501 char *from = NULL; | |
3019 | 502 char *stat = NULL; |
503 char *game = NULL; | |
2993 | 504 GSList *l = pkt->hash; |
3019 | 505 struct yahoo_data *yd = (struct yahoo_data*) gc->proto_data; |
2993 | 506 while (l) { |
507 struct yahoo_pair *pair = l->data; | |
508 if (pair->key == 4) | |
509 from = pair->value; | |
510 if (pair->key == 49) | |
511 msg = pair->value; | |
3001 | 512 if (pair->key == 13) |
3019 | 513 stat = pair->value; |
514 if (pair->key == 14) | |
515 game = pair->value; | |
2993 | 516 l = l->next; |
517 } | |
3640 | 518 |
519 if (!msg) | |
520 return; | |
3019 | 521 |
4793 | 522 if (!g_ascii_strncasecmp(msg, "TYPING", strlen("TYPING"))) { |
3019 | 523 if (*stat == '1') |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
524 serv_got_typing(gc, from, 0, GAIM_TYPING); |
3019 | 525 else |
526 serv_got_typing_stopped(gc, from); | |
4793 | 527 } else if (!g_ascii_strncasecmp(msg, "GAME", strlen("GAME"))) { |
4687 | 528 struct buddy *bud = gaim_find_buddy(gc->account, from); |
3019 | 529 void *free1=NULL, *free2=NULL; |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
530 if (!bud) { |
5220
7b9d78fa051e
[gaim-migrate @ 5590]
Christian Hammond <chipx86@chipx86.com>
parents:
5216
diff
changeset
|
531 gaim_debug(GAIM_DEBUG_WARNING, "yahoo", |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
532 "%s is playing a game, and doesn't want " |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
533 "you to know.\n", from); |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
534 } |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
535 |
3019 | 536 if (*stat == '1') { |
537 if (g_hash_table_lookup_extended (yd->games, from, free1, free2)) { | |
538 g_free(free1); | |
539 g_free(free2); | |
540 } | |
541 g_hash_table_insert (yd->games, g_strdup(from), g_strdup(game)); | |
3020 | 542 if (bud) |
4732 | 543 serv_got_update(gc, from, 1, 0, 0, 0, bud->uc | YAHOO_STATUS_GAME); |
3019 | 544 } else { |
545 if (g_hash_table_lookup_extended (yd->games, from, free1, free2)) { | |
546 g_free(free1); | |
547 g_free(free2); | |
548 g_hash_table_remove (yd->games, from); | |
549 } | |
3020 | 550 if (bud) |
4732 | 551 serv_got_update(gc, from, 1, 0, 0, 0, bud->uc & ~YAHOO_STATUS_GAME); |
3019 | 552 } |
553 } | |
2993 | 554 } |
555 | |
5583 | 556 static void yahoo_process_message(GaimConnection *gc, struct yahoo_packet *pkt) |
2681 | 557 { |
558 char *msg = NULL; | |
559 char *from = NULL; | |
560 time_t tm = time(NULL); | |
561 GSList *l = pkt->hash; | |
562 | |
3021 | 563 if (pkt->status <= 1 || pkt->status == 5) { |
6069 | 564 while (l) { |
565 struct yahoo_pair *pair = l->data; | |
566 if (pair->key == 4) | |
567 from = pair->value; | |
568 if (pair->key == 15) | |
569 tm = strtol(pair->value, NULL, 10); | |
570 if (pair->key == 14) { | |
571 char *m; | |
572 | |
573 msg = pair->value; | |
574 | |
575 strip_linefeed(msg); | |
6513 | 576 m = yahoo_codes_to_html(msg); |
577 serv_got_im(gc, from, m, 0, tm, -1); | |
578 g_free(m); | |
6069 | 579 |
580 tm = time(NULL); | |
2715
e901fd3ebbad
[gaim-migrate @ 2728]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2708
diff
changeset
|
581 } |
6069 | 582 l = l->next; |
2715
e901fd3ebbad
[gaim-migrate @ 2728]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2708
diff
changeset
|
583 } |
2681 | 584 } else if (pkt->status == 2) { |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5367
diff
changeset
|
585 gaim_notify_error(gc, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5367
diff
changeset
|
586 _("Your Yahoo! message did not get sent."), NULL); |
2681 | 587 } |
588 } | |
589 | |
590 | |
5583 | 591 static void yahoo_process_contact(GaimConnection *gc, struct yahoo_packet *pkt) |
2681 | 592 { |
2683
4836eae8dd8c
[gaim-migrate @ 2696]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2682
diff
changeset
|
593 struct yahoo_data *yd = gc->proto_data; |
2681 | 594 char *id = NULL; |
595 char *who = NULL; | |
596 char *msg = NULL; | |
2683
4836eae8dd8c
[gaim-migrate @ 2696]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2682
diff
changeset
|
597 char *name = NULL; |
4836eae8dd8c
[gaim-migrate @ 2696]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2682
diff
changeset
|
598 int state = YAHOO_STATUS_AVAILABLE; |
4836eae8dd8c
[gaim-migrate @ 2696]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2682
diff
changeset
|
599 int online = FALSE; |
4836eae8dd8c
[gaim-migrate @ 2696]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2682
diff
changeset
|
600 |
2681 | 601 GSList *l = pkt->hash; |
602 | |
603 while (l) { | |
604 struct yahoo_pair *pair = l->data; | |
605 if (pair->key == 1) | |
606 id = pair->value; | |
607 else if (pair->key == 3) | |
608 who = pair->value; | |
609 else if (pair->key == 14) | |
610 msg = pair->value; | |
5002 | 611 else if (pair->key == 7) |
2683
4836eae8dd8c
[gaim-migrate @ 2696]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2682
diff
changeset
|
612 name = pair->value; |
4836eae8dd8c
[gaim-migrate @ 2696]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2682
diff
changeset
|
613 else if (pair->key == 10) |
4836eae8dd8c
[gaim-migrate @ 2696]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2682
diff
changeset
|
614 state = strtol(pair->value, NULL, 10); |
4836eae8dd8c
[gaim-migrate @ 2696]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2682
diff
changeset
|
615 else if (pair->key == 13) |
4836eae8dd8c
[gaim-migrate @ 2696]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2682
diff
changeset
|
616 online = strtol(pair->value, NULL, 10); |
2681 | 617 l = l->next; |
618 } | |
619 | |
2682
db2b0b733732
[gaim-migrate @ 2695]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
620 if (id) |
db2b0b733732
[gaim-migrate @ 2695]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
621 show_got_added(gc, id, who, NULL, msg); |
2683
4836eae8dd8c
[gaim-migrate @ 2696]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2682
diff
changeset
|
622 if (name) { |
4836eae8dd8c
[gaim-migrate @ 2696]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2682
diff
changeset
|
623 if (state == YAHOO_STATUS_AVAILABLE) |
4732 | 624 serv_got_update(gc, name, 1, 0, 0, 0, 0); |
2683
4836eae8dd8c
[gaim-migrate @ 2696]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2682
diff
changeset
|
625 else if (state == YAHOO_STATUS_IDLE) |
5002 | 626 serv_got_update(gc, name, 1, 0, 0, -1, (state << 2)); |
2683
4836eae8dd8c
[gaim-migrate @ 2696]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2682
diff
changeset
|
627 else |
4732 | 628 serv_got_update(gc, name, 1, 0, 0, 0, (state << 2) | UC_UNAVAILABLE); |
2683
4836eae8dd8c
[gaim-migrate @ 2696]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2682
diff
changeset
|
629 if (state == YAHOO_STATUS_CUSTOM) { |
4836eae8dd8c
[gaim-migrate @ 2696]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2682
diff
changeset
|
630 gpointer val = g_hash_table_lookup(yd->hash, name); |
4836eae8dd8c
[gaim-migrate @ 2696]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2682
diff
changeset
|
631 if (val) { |
4836eae8dd8c
[gaim-migrate @ 2696]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2682
diff
changeset
|
632 g_free(val); |
2873
26be84883f91
[gaim-migrate @ 2886]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2856
diff
changeset
|
633 g_hash_table_insert(yd->hash, name, |
26be84883f91
[gaim-migrate @ 2886]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2856
diff
changeset
|
634 msg ? g_strdup(msg) : g_malloc0(1)); |
2683
4836eae8dd8c
[gaim-migrate @ 2696]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2682
diff
changeset
|
635 } else |
2873
26be84883f91
[gaim-migrate @ 2886]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2856
diff
changeset
|
636 g_hash_table_insert(yd->hash, g_strdup(name), |
26be84883f91
[gaim-migrate @ 2886]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2856
diff
changeset
|
637 msg ? g_strdup(msg) : g_malloc0(1)); |
2683
4836eae8dd8c
[gaim-migrate @ 2696]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2682
diff
changeset
|
638 } |
4836eae8dd8c
[gaim-migrate @ 2696]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2682
diff
changeset
|
639 } |
2681 | 640 } |
641 | |
5583 | 642 static void yahoo_process_mail(GaimConnection *gc, struct yahoo_packet *pkt) |
2681 | 643 { |
5583 | 644 GaimAccount *account = gaim_connection_get_account(gc); |
2681 | 645 char *who = NULL; |
646 char *email = NULL; | |
647 char *subj = NULL; | |
648 int count = 0; | |
649 GSList *l = pkt->hash; | |
650 | |
5583 | 651 if (!gaim_account_get_check_mail(account)) |
5521
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
652 return; |
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
653 |
2681 | 654 while (l) { |
655 struct yahoo_pair *pair = l->data; | |
656 if (pair->key == 9) | |
657 count = strtol(pair->value, NULL, 10); | |
658 else if (pair->key == 43) | |
659 who = pair->value; | |
660 else if (pair->key == 42) | |
661 email = pair->value; | |
662 else if (pair->key == 18) | |
663 subj = pair->value; | |
664 l = l->next; | |
665 } | |
666 | |
4001 | 667 if (who && subj && email && *email) { |
2850
cbe6a1e63a72
[gaim-migrate @ 2863]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2813
diff
changeset
|
668 char *from = g_strdup_printf("%s (%s)", who, email); |
5521
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
669 |
5583 | 670 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
|
671 "http://mail.yahoo.com/", NULL, NULL); |
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
672 |
2850
cbe6a1e63a72
[gaim-migrate @ 2863]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2813
diff
changeset
|
673 g_free(from); |
5521
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
674 } else if (count > 0) { |
5583 | 675 const char *to = gaim_account_get_username(account); |
5521
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
676 const char *url = "http://mail.yahoo.com/"; |
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
677 |
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
678 gaim_notify_emails(gc, count, FALSE, NULL, NULL, &to, &url, |
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
679 NULL, NULL); |
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
680 } |
2681 | 681 } |
3147 | 682 /* This is the y64 alphabet... it's like base64, but has a . and a _ */ |
683 char base64digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._"; | |
684 | |
685 /* This is taken from Sylpheed by Hiroyuki Yamamoto. We have our own tobase64 function | |
686 * in util.c, but it has a bug I don't feel like finding right now ;) */ | |
687 void to_y64(unsigned char *out, const unsigned char *in, int inlen) | |
688 /* raw bytes in quasi-big-endian order to base 64 string (NUL-terminated) */ | |
689 { | |
690 for (; inlen >= 3; inlen -= 3) | |
691 { | |
692 *out++ = base64digits[in[0] >> 2]; | |
693 *out++ = base64digits[((in[0] << 4) & 0x30) | (in[1] >> 4)]; | |
694 *out++ = base64digits[((in[1] << 2) & 0x3c) | (in[2] >> 6)]; | |
695 *out++ = base64digits[in[2] & 0x3f]; | |
696 in += 3; | |
697 } | |
698 if (inlen > 0) | |
699 { | |
700 unsigned char fragment; | |
701 | |
702 *out++ = base64digits[in[0] >> 2]; | |
703 fragment = (in[0] << 4) & 0x30; | |
704 if (inlen > 1) | |
705 fragment |= in[1] >> 4; | |
706 *out++ = base64digits[fragment]; | |
707 *out++ = (inlen < 2) ? '-' : base64digits[(in[1] << 2) & 0x3c]; | |
708 *out++ = '-'; | |
709 } | |
710 *out = '\0'; | |
711 } | |
712 | |
5583 | 713 static void yahoo_process_auth(GaimConnection *gc, struct yahoo_packet *pkt) |
3147 | 714 { |
715 char *seed = NULL; | |
716 char *sn = NULL; | |
717 GSList *l = pkt->hash; | |
718 struct yahoo_data *yd = gc->proto_data; | |
719 | |
720 while (l) { | |
721 struct yahoo_pair *pair = l->data; | |
722 if (pair->key == 94) | |
723 seed = pair->value; | |
724 if (pair->key == 1) | |
725 sn = pair->value; | |
726 l = l->next; | |
727 } | |
728 | |
729 if (seed) { | |
730 struct yahoo_packet *pack; | |
5583 | 731 GaimAccount *account = gaim_connection_get_account(gc); |
5921 | 732 const char *name = normalize(gaim_account_get_username(account)); |
5583 | 733 const char *pass = gaim_account_get_password(account); |
734 | |
3147 | 735 /* So, Yahoo has stopped supporting its older clients in India, and undoubtedly |
736 * will soon do so in the rest of the world. | |
737 * | |
738 * The new clients use this authentication method. I warn you in advance, it's | |
739 * bizzare, convoluted, inordinately complicated. It's also no more secure than | |
740 * crypt() was. The only purpose this scheme could serve is to prevent third | |
741 * part clients from connecting to their servers. | |
742 * | |
743 * Sorry, Yahoo. | |
744 */ | |
745 | |
746 md5_byte_t result[16]; | |
747 md5_state_t ctx; | |
5583 | 748 |
3147 | 749 char *crypt_result; |
5583 | 750 char password_hash[25]; |
751 char crypt_hash[25]; | |
3147 | 752 char *hash_string_p = g_malloc(50 + strlen(sn)); |
753 char *hash_string_c = g_malloc(50 + strlen(sn)); | |
754 | |
755 char checksum; | |
756 | |
3157 | 757 int sv; |
3147 | 758 |
5583 | 759 char result6[25]; |
760 char result96[25]; | |
3147 | 761 |
762 sv = seed[15]; | |
3157 | 763 sv = sv % 8; |
3147 | 764 |
765 md5_init(&ctx); | |
5583 | 766 md5_append(&ctx, pass, strlen(pass)); |
3147 | 767 md5_finish(&ctx, result); |
768 to_y64(password_hash, result, 16); | |
769 | |
770 md5_init(&ctx); | |
5583 | 771 crypt_result = yahoo_crypt(pass, "$1$_2S43d5f$"); |
3147 | 772 md5_append(&ctx, crypt_result, strlen(crypt_result)); |
773 md5_finish(&ctx, result); | |
774 to_y64(crypt_hash, result, 16); | |
3157 | 775 |
776 switch (sv) { | |
3147 | 777 case 1: |
778 case 6: | |
3157 | 779 checksum = seed[seed[9] % 16]; |
3147 | 780 g_snprintf(hash_string_p, strlen(sn) + 50, |
5583 | 781 "%c%s%s%s", checksum, name, seed, password_hash); |
3157 | 782 g_snprintf(hash_string_c, strlen(sn) + 50, |
5583 | 783 "%c%s%s%s", checksum, name, seed, crypt_hash); |
3147 | 784 break; |
785 case 2: | |
786 case 7: | |
3157 | 787 checksum = seed[seed[15] % 16]; |
3147 | 788 g_snprintf(hash_string_p, strlen(sn) + 50, |
5583 | 789 "%c%s%s%s", checksum, seed, password_hash, name); |
3157 | 790 g_snprintf(hash_string_c, strlen(sn) + 50, |
5583 | 791 "%c%s%s%s", checksum, seed, crypt_hash, name); |
3157 | 792 break; |
3147 | 793 case 3: |
3157 | 794 checksum = seed[seed[1] % 16]; |
3147 | 795 g_snprintf(hash_string_p, strlen(sn) + 50, |
5583 | 796 "%c%s%s%s", checksum, name, password_hash, seed); |
3157 | 797 g_snprintf(hash_string_c, strlen(sn) + 50, |
5583 | 798 "%c%s%s%s", checksum, name, crypt_hash, seed); |
3157 | 799 break; |
800 case 4: | |
801 checksum = seed[seed[3] % 16]; | |
802 g_snprintf(hash_string_p, strlen(sn) + 50, | |
5583 | 803 "%c%s%s%s", checksum, password_hash, seed, name); |
3147 | 804 g_snprintf(hash_string_c, strlen(sn) + 50, |
5583 | 805 "%c%s%s%s", checksum, crypt_hash, seed, name); |
3157 | 806 break; |
3147 | 807 case 0: |
808 case 5: | |
3157 | 809 checksum = seed[seed[7] % 16]; |
3147 | 810 g_snprintf(hash_string_p, strlen(sn) + 50, |
5583 | 811 "%c%s%s%s", checksum, password_hash, name, seed); |
3157 | 812 g_snprintf(hash_string_c, strlen(sn) + 50, |
5583 | 813 "%c%s%s%s", checksum, crypt_hash, name, seed); |
3157 | 814 break; |
3147 | 815 } |
3157 | 816 |
3147 | 817 md5_init(&ctx); |
3157 | 818 md5_append(&ctx, hash_string_p, strlen(hash_string_p)); |
3147 | 819 md5_finish(&ctx, result); |
820 to_y64(result6, result, 16); | |
821 | |
822 md5_init(&ctx); | |
823 md5_append(&ctx, hash_string_c, strlen(hash_string_c)); | |
824 md5_finish(&ctx, result); | |
825 to_y64(result96, result, 16); | |
826 | |
827 pack = yahoo_packet_new(YAHOO_SERVICE_AUTHRESP, YAHOO_STATUS_AVAILABLE, 0); | |
5583 | 828 yahoo_packet_hash(pack, 0, name); |
3147 | 829 yahoo_packet_hash(pack, 6, result6); |
830 yahoo_packet_hash(pack, 96, result96); | |
5583 | 831 yahoo_packet_hash(pack, 1, name); |
3147 | 832 |
833 yahoo_send_packet(yd, pack); | |
834 | |
835 g_free(hash_string_p); | |
836 g_free(hash_string_c); | |
837 | |
838 yahoo_packet_free(pack); | |
839 } | |
840 } | |
2681 | 841 |
5583 | 842 static void yahoo_packet_process(GaimConnection *gc, struct yahoo_packet *pkt) |
2681 | 843 { |
844 switch (pkt->service) | |
845 { | |
846 case YAHOO_SERVICE_LOGON: | |
2771
450f4f9d2f23
[gaim-migrate @ 2784]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2741
diff
changeset
|
847 case YAHOO_SERVICE_LOGOFF: |
2681 | 848 case YAHOO_SERVICE_ISAWAY: |
2737
f61c1f3a6afa
[gaim-migrate @ 2750]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2724
diff
changeset
|
849 case YAHOO_SERVICE_ISBACK: |
3019 | 850 case YAHOO_SERVICE_GAMELOGON: |
851 case YAHOO_SERVICE_GAMELOGOFF: | |
2681 | 852 yahoo_process_status(gc, pkt); |
853 break; | |
3019 | 854 case YAHOO_SERVICE_NOTIFY: |
855 yahoo_process_notify(gc, pkt); | |
2993 | 856 break; |
2681 | 857 case YAHOO_SERVICE_MESSAGE: |
2786
318f846120e2
[gaim-migrate @ 2799]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2772
diff
changeset
|
858 case YAHOO_SERVICE_GAMEMSG: |
5939 | 859 case YAHOO_SERVICE_CHATMSG: |
2681 | 860 yahoo_process_message(gc, pkt); |
861 break; | |
862 case YAHOO_SERVICE_NEWMAIL: | |
863 yahoo_process_mail(gc, pkt); | |
864 break; | |
865 case YAHOO_SERVICE_NEWCONTACT: | |
866 yahoo_process_contact(gc, pkt); | |
867 break; | |
868 case YAHOO_SERVICE_LIST: | |
869 yahoo_process_list(gc, pkt); | |
870 break; | |
3147 | 871 case YAHOO_SERVICE_AUTH: |
872 yahoo_process_auth(gc, pkt); | |
873 break; | |
2681 | 874 default: |
5220
7b9d78fa051e
[gaim-migrate @ 5590]
Christian Hammond <chipx86@chipx86.com>
parents:
5216
diff
changeset
|
875 gaim_debug(GAIM_DEBUG_ERROR, "yahoo", |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
876 "Unhandled service 0x%02x\n", pkt->service); |
2681 | 877 break; |
878 } | |
879 } | |
880 | |
881 static void yahoo_pending(gpointer data, gint source, GaimInputCondition cond) | |
882 { | |
5583 | 883 GaimConnection *gc = data; |
2681 | 884 struct yahoo_data *yd = gc->proto_data; |
885 char buf[1024]; | |
886 int len; | |
887 | |
888 len = read(yd->fd, buf, sizeof(buf)); | |
889 | |
890 if (len <= 0) { | |
6321 | 891 gaim_connection_error(gc, _("Unable to read")); |
2681 | 892 return; |
893 } | |
894 | |
895 yd->rxqueue = g_realloc(yd->rxqueue, len + yd->rxlen); | |
896 memcpy(yd->rxqueue + yd->rxlen, buf, len); | |
897 yd->rxlen += len; | |
898 | |
899 while (1) { | |
900 struct yahoo_packet *pkt; | |
901 int pos = 0; | |
902 int pktlen; | |
903 | |
904 if (yd->rxlen < YAHOO_PACKET_HDRLEN) | |
905 return; | |
906 | |
907 pos += 4; /* YMSG */ | |
908 pos += 2; | |
909 pos += 2; | |
910 | |
911 pktlen = yahoo_get16(yd->rxqueue + pos); pos += 2; | |
5220
7b9d78fa051e
[gaim-migrate @ 5590]
Christian Hammond <chipx86@chipx86.com>
parents:
5216
diff
changeset
|
912 gaim_debug(GAIM_DEBUG_MISC, "yahoo", |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
913 "%d bytes to read, rxlen is %d\n", pktlen, yd->rxlen); |
2681 | 914 |
915 if (yd->rxlen < (YAHOO_PACKET_HDRLEN + pktlen)) | |
916 return; | |
917 | |
918 yahoo_packet_dump(yd->rxqueue, YAHOO_PACKET_HDRLEN + pktlen); | |
919 | |
920 pkt = yahoo_packet_new(0, 0, 0); | |
921 | |
922 pkt->service = yahoo_get16(yd->rxqueue + pos); pos += 2; | |
3021 | 923 pkt->status = yahoo_get32(yd->rxqueue + pos); pos += 4; |
5220
7b9d78fa051e
[gaim-migrate @ 5590]
Christian Hammond <chipx86@chipx86.com>
parents:
5216
diff
changeset
|
924 gaim_debug(GAIM_DEBUG_MISC, "yahoo", |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
925 "Yahoo Service: 0x%02x Status: %d\n", |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
926 pkt->service, pkt->status); |
2681 | 927 pkt->id = yahoo_get32(yd->rxqueue + pos); pos += 4; |
928 | |
929 yahoo_packet_read(pkt, yd->rxqueue + pos, pktlen); | |
930 | |
931 yd->rxlen -= YAHOO_PACKET_HDRLEN + pktlen; | |
932 if (yd->rxlen) { | |
933 char *tmp = g_memdup(yd->rxqueue + YAHOO_PACKET_HDRLEN + pktlen, yd->rxlen); | |
934 g_free(yd->rxqueue); | |
935 yd->rxqueue = tmp; | |
936 } else { | |
937 g_free(yd->rxqueue); | |
938 yd->rxqueue = NULL; | |
939 } | |
940 | |
941 yahoo_packet_process(gc, pkt); | |
942 | |
943 yahoo_packet_free(pkt); | |
944 } | |
945 } | |
946 | |
947 static void yahoo_got_connected(gpointer data, gint source, GaimInputCondition cond) | |
948 { | |
5583 | 949 GaimConnection *gc = data; |
2681 | 950 struct yahoo_data *yd; |
951 struct yahoo_packet *pkt; | |
952 | |
5590
011a0a975060
[gaim-migrate @ 5994]
Christian Hammond <chipx86@chipx86.com>
parents:
5583
diff
changeset
|
953 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2681 | 954 close(source); |
955 return; | |
956 } | |
957 | |
958 if (source < 0) { | |
6321 | 959 gaim_connection_error(gc, _("Unable to connect")); |
2681 | 960 return; |
961 } | |
962 | |
963 yd = gc->proto_data; | |
964 yd->fd = source; | |
965 | |
3147 | 966 pkt = yahoo_packet_new(YAHOO_SERVICE_AUTH, YAHOO_STATUS_AVAILABLE, 0); |
2681 | 967 |
5921 | 968 yahoo_packet_hash(pkt, 1, normalize(gaim_account_get_username(gaim_connection_get_account(gc)))); |
2681 | 969 yahoo_send_packet(yd, pkt); |
970 | |
971 yahoo_packet_free(pkt); | |
972 | |
973 gc->inpa = gaim_input_add(yd->fd, GAIM_INPUT_READ, yahoo_pending, gc); | |
974 } | |
975 | |
5583 | 976 static void yahoo_login(GaimAccount *account) { |
977 GaimConnection *gc = gaim_account_get_connection(account); | |
2681 | 978 struct yahoo_data *yd = gc->proto_data = g_new0(struct yahoo_data, 1); |
979 | |
6629 | 980 gc->flags |= GAIM_CONNECTION_HTML | GAIM_CONNECTION_NO_BGCOLOR; |
981 | |
5583 | 982 gaim_connection_update_progress(gc, _("Connecting"), 1, 2); |
2681 | 983 |
984 yd->fd = -1; | |
985 yd->hash = g_hash_table_new(g_str_hash, g_str_equal); | |
3019 | 986 yd->games = g_hash_table_new(g_str_hash, g_str_equal); |
2681 | 987 |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5638
diff
changeset
|
988 if (gaim_proxy_connect(account, gaim_account_get_string(account, "server", YAHOO_PAGER_HOST), |
5583 | 989 gaim_account_get_int(account, "port", YAHOO_PAGER_PORT), |
990 yahoo_got_connected, gc) != 0) { | |
6321 | 991 gaim_connection_error(gc, _("Connection problem")); |
2681 | 992 return; |
993 } | |
994 | |
995 } | |
996 | |
997 static gboolean yahoo_destroy_hash(gpointer key, gpointer val, gpointer data) | |
998 { | |
999 g_free(key); | |
1000 g_free(val); | |
1001 return TRUE; | |
1002 } | |
1003 | |
5583 | 1004 static void yahoo_close(GaimConnection *gc) { |
2681 | 1005 struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; |
1006 g_hash_table_foreach_remove(yd->hash, yahoo_destroy_hash, NULL); | |
1007 g_hash_table_destroy(yd->hash); | |
3019 | 1008 g_hash_table_foreach_remove(yd->games, yahoo_destroy_hash, NULL); |
1009 g_hash_table_destroy(yd->games); | |
2681 | 1010 if (yd->fd >= 0) |
1011 close(yd->fd); | |
3720
34c95669952f
[gaim-migrate @ 3853]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3642
diff
changeset
|
1012 |
2681 | 1013 if (yd->rxqueue) |
1014 g_free(yd->rxqueue); | |
2687
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2686
diff
changeset
|
1015 yd->rxlen = 0; |
2681 | 1016 if (gc->inpa) |
1017 gaim_input_remove(gc->inpa); | |
1018 g_free(yd); | |
1019 } | |
1020 | |
5583 | 1021 static const char *yahoo_list_icon(GaimAccount *a, struct buddy *b) |
2681 | 1022 { |
4687 | 1023 return "yahoo"; |
2681 | 1024 } |
4916 | 1025 |
1026 static void yahoo_list_emblems(struct buddy *b, char **se, char **sw, char **nw, char **ne) | |
1027 { | |
1028 int i = 0; | |
1029 char *emblems[4] = {NULL,NULL,NULL,NULL}; | |
5068 | 1030 if (b->present == GAIM_BUDDY_OFFLINE) { |
4916 | 1031 *se = "offline"; |
1032 return; | |
1033 } else { | |
1034 if (b->uc & UC_UNAVAILABLE) | |
1035 emblems[i++] = "away"; | |
1036 if (b->uc & YAHOO_STATUS_GAME) | |
1037 emblems[i++] = "game"; | |
1038 } | |
1039 *se = emblems[0]; | |
1040 *sw = emblems[1]; | |
1041 *nw = emblems[2]; | |
1042 *ne = emblems[3]; | |
1043 } | |
2681 | 1044 |
1045 static char *yahoo_get_status_string(enum yahoo_status a) | |
1046 { | |
1047 switch (a) { | |
1048 case YAHOO_STATUS_BRB: | |
4596 | 1049 return _("Be Right Back"); |
2681 | 1050 case YAHOO_STATUS_BUSY: |
4596 | 1051 return _("Busy"); |
2681 | 1052 case YAHOO_STATUS_NOTATHOME: |
4596 | 1053 return _("Not At Home"); |
2681 | 1054 case YAHOO_STATUS_NOTATDESK: |
4596 | 1055 return _("Not At Desk"); |
2681 | 1056 case YAHOO_STATUS_NOTINOFFICE: |
4596 | 1057 return _("Not In Office"); |
2681 | 1058 case YAHOO_STATUS_ONPHONE: |
4606 | 1059 return _("On The Phone"); |
2681 | 1060 case YAHOO_STATUS_ONVACATION: |
4596 | 1061 return _("On Vacation"); |
2681 | 1062 case YAHOO_STATUS_OUTTOLUNCH: |
4596 | 1063 return _("Out To Lunch"); |
2681 | 1064 case YAHOO_STATUS_STEPPEDOUT: |
4596 | 1065 return _("Stepped Out"); |
2873
26be84883f91
[gaim-migrate @ 2886]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2856
diff
changeset
|
1066 case YAHOO_STATUS_INVISIBLE: |
4596 | 1067 return _("Invisible"); |
4730 | 1068 case YAHOO_STATUS_IDLE: |
1069 return _("Idle"); | |
2879
5fc5123b7098
[gaim-migrate @ 2892]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2878
diff
changeset
|
1070 default: |
4596 | 1071 return _("Online"); |
2681 | 1072 } |
1073 } | |
1074 | |
5583 | 1075 static void yahoo_game(GaimConnection *gc, const char *name) { |
3019 | 1076 struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; |
1077 char *game = g_hash_table_lookup(yd->games, name); | |
1078 char *t; | |
1079 char url[256]; | |
1080 | |
1081 if (!game) | |
1082 return; | |
1083 t = game = g_strdup(strstr(game, "ante?room=")); | |
1084 while (*t != '\t') | |
1085 t++; | |
1086 *t = 0; | |
1087 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
|
1088 gaim_notify_uri(gc, url); |
3019 | 1089 g_free(game); |
1090 } | |
4722 | 1091 |
4732 | 1092 static char *yahoo_status_text(struct buddy *b) |
4722 | 1093 { |
1094 struct yahoo_data *yd = (struct yahoo_data*)b->account->gc->proto_data; | |
4730 | 1095 if (b->uc & UC_UNAVAILABLE) { |
4732 | 1096 if ((b->uc >> 2) != YAHOO_STATUS_CUSTOM) |
1097 return g_strdup(yahoo_get_status_string(b->uc >> 2)); | |
4777 | 1098 else { |
1099 char *stripped = strip_html(g_hash_table_lookup(yd->hash, b->name)); | |
1100 if(stripped) { | |
1101 char *ret = g_markup_escape_text(stripped, strlen(stripped)); | |
1102 g_free(stripped); | |
1103 return ret; | |
1104 } | |
1105 } | |
4722 | 1106 } |
4729 | 1107 return NULL; |
4722 | 1108 } |
1109 | |
4724 | 1110 static char *yahoo_tooltip_text(struct buddy *b) |
1111 { | |
1112 struct yahoo_data *yd = (struct yahoo_data*)b->account->gc->proto_data; | |
4730 | 1113 if (b->uc & UC_UNAVAILABLE) { |
4745 | 1114 char *status; |
1115 char *ret; | |
4731 | 1116 if ((b->uc >> 2) != YAHOO_STATUS_CUSTOM) |
4745 | 1117 status = g_strdup(yahoo_get_status_string(b->uc >> 2)); |
4724 | 1118 else |
4745 | 1119 status = strip_html(g_hash_table_lookup(yd->hash, b->name)); |
1120 if(status) { | |
4777 | 1121 char *escaped = g_markup_escape_text(status, strlen(status)); |
1122 ret = g_strdup_printf(_("<b>Status:</b> %s"), escaped); | |
4745 | 1123 g_free(status); |
4777 | 1124 g_free(escaped); |
4745 | 1125 return ret; |
1126 } | |
4724 | 1127 } |
4729 | 1128 return NULL; |
1129 } | |
1130 | |
5583 | 1131 static GList *yahoo_buddy_menu(GaimConnection *gc, const char *who) |
2681 | 1132 { |
1133 GList *m = NULL; | |
1134 struct proto_buddy_menu *pbm; | |
1135 struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; | |
4687 | 1136 struct buddy *b = gaim_find_buddy(gc->account, who); /* this should never be null. if it is, |
2681 | 1137 segfault and get the bug report. */ |
3019 | 1138 static char buf2[1024]; |
4722 | 1139 |
3019 | 1140 if (b->uc | YAHOO_STATUS_GAME) { |
1141 char *game = g_hash_table_lookup(yd->games, b->name); | |
1142 char *room; | |
1143 if (!game) | |
1144 return m; | |
1145 if (game) { | |
1146 char *t; | |
1147 pbm = g_new0(struct proto_buddy_menu, 1); | |
1148 if (!(room = strstr(game, "&follow="))) /* skip ahead to the url */ | |
1149 return NULL; | |
1150 while (*room && *room != '\t') /* skip to the tab */ | |
1151 room++; | |
1152 t = room++; /* room as now at the name */ | |
1153 while (*t != '\n') | |
1154 t++; /* replace the \n with a space */ | |
1155 *t = ' '; | |
1156 g_snprintf(buf2, sizeof buf2, "%s", room); | |
1157 pbm->label = buf2; | |
1158 pbm->callback = yahoo_game; | |
1159 pbm->gc = gc; | |
1160 m = g_list_append(m, pbm); | |
1161 } | |
1162 } | |
4722 | 1163 |
2681 | 1164 return m; |
1165 } | |
1166 | |
5583 | 1167 static void yahoo_act_id(GaimConnection *gc, const char *entry) |
2681 | 1168 { |
1169 struct yahoo_data *yd = gc->proto_data; | |
1170 | |
1171 struct yahoo_packet *pkt = yahoo_packet_new(YAHOO_SERVICE_IDACT, YAHOO_STATUS_AVAILABLE, 0); | |
1172 yahoo_packet_hash(pkt, 3, entry); | |
1173 yahoo_send_packet(yd, pkt); | |
1174 yahoo_packet_free(pkt); | |
1175 | |
5583 | 1176 gaim_connection_set_display_name(gc, entry); |
2681 | 1177 } |
1178 | |
5583 | 1179 static void yahoo_show_act_id(GaimConnection *gc) |
2681 | 1180 { |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
1181 gaim_request_input(gc, NULL, _("Active which ID?"), NULL, |
6035
8c44020a958e
[gaim-migrate @ 6485]
Christian Hammond <chipx86@chipx86.com>
parents:
5939
diff
changeset
|
1182 gaim_connection_get_display_name(gc), FALSE, FALSE, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
1183 _("OK"), G_CALLBACK(yahoo_act_id), |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
1184 _("Cancel"), NULL, gc); |
2681 | 1185 } |
1186 | |
5583 | 1187 static GList *yahoo_actions(GaimConnection *gc) { |
2681 | 1188 GList *m = NULL; |
4333 | 1189 struct proto_actions_menu *pam; |
2681 | 1190 |
4333 | 1191 pam = g_new0(struct proto_actions_menu, 1); |
1192 pam->label = _("Activate ID"); | |
1193 pam->callback = yahoo_show_act_id; | |
1194 pam->gc = gc; | |
1195 m = g_list_append(m, pam); | |
2681 | 1196 |
1197 return m; | |
1198 } | |
1199 | |
6622 | 1200 static int yahoo_send_im(GaimConnection *gc, const char *who, const char *what, int len, GaimImFlags flags) |
2681 | 1201 { |
1202 struct yahoo_data *yd = gc->proto_data; | |
1203 struct yahoo_packet *pkt = yahoo_packet_new(YAHOO_SERVICE_MESSAGE, YAHOO_STATUS_OFFLINE, 0); | |
6629 | 1204 char *msg = yahoo_html_to_codes(what); |
2681 | 1205 |
5583 | 1206 yahoo_packet_hash(pkt, 1, gaim_connection_get_display_name(gc)); |
2681 | 1207 yahoo_packet_hash(pkt, 5, who); |
3493 | 1208 yahoo_packet_hash(pkt, 14, msg); |
6044 | 1209 yahoo_packet_hash(pkt, 97, "1"); |
2681 | 1210 |
1211 yahoo_send_packet(yd, pkt); | |
1212 | |
1213 yahoo_packet_free(pkt); | |
6629 | 1214 |
1215 g_free(msg); | |
1216 | |
2681 | 1217 return 1; |
1218 } | |
1219 | |
6059 | 1220 int yahoo_send_typing(GaimConnection *gc, const char *who, int typ) |
2993 | 1221 { |
1222 struct yahoo_data *yd = gc->proto_data; | |
3019 | 1223 struct yahoo_packet *pkt = yahoo_packet_new(YAHOO_SERVICE_NOTIFY, YAHOO_STATUS_TYPING, 0); |
2993 | 1224 yahoo_packet_hash(pkt, 49, "TYPING"); |
5583 | 1225 yahoo_packet_hash(pkt, 1, gaim_connection_get_display_name(gc)); |
2993 | 1226 yahoo_packet_hash(pkt, 14, " "); |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
1227 yahoo_packet_hash(pkt, 13, typ == GAIM_TYPING ? "1" : "0"); |
2993 | 1228 yahoo_packet_hash(pkt, 5, who); |
1229 yahoo_packet_hash(pkt, 1002, "1"); | |
1230 | |
1231 yahoo_send_packet(yd, pkt); | |
1232 | |
1233 yahoo_packet_free(pkt); | |
1234 | |
3001 | 1235 return 0; |
2993 | 1236 } |
1237 | |
6059 | 1238 static void yahoo_set_away(GaimConnection *gc, const char *state, const char *msg) |
2681 | 1239 { |
1240 struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; | |
1241 struct yahoo_packet *pkt; | |
2772
f9227268db25
[gaim-migrate @ 2785]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2771
diff
changeset
|
1242 int service; |
2681 | 1243 char s[4]; |
1244 | |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4044
diff
changeset
|
1245 if (gc->away) { |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4044
diff
changeset
|
1246 g_free(gc->away); |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4044
diff
changeset
|
1247 gc->away = NULL; |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4044
diff
changeset
|
1248 } |
2681 | 1249 |
1250 if (msg) { | |
1251 yd->current_status = YAHOO_STATUS_CUSTOM; | |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4044
diff
changeset
|
1252 gc->away = g_strdup(msg); |
2681 | 1253 } else if (state) { |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4044
diff
changeset
|
1254 gc->away = g_strdup(""); |
4596 | 1255 if (!strcmp(state, _("Available"))) { |
2681 | 1256 yd->current_status = YAHOO_STATUS_AVAILABLE; |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4044
diff
changeset
|
1257 g_free(gc->away); |
2681 | 1258 gc->away = NULL; |
4596 | 1259 } else if (!strcmp(state, _("Be Right Back"))) { |
2681 | 1260 yd->current_status = YAHOO_STATUS_BRB; |
4596 | 1261 } else if (!strcmp(state, _("Busy"))) { |
2681 | 1262 yd->current_status = YAHOO_STATUS_BUSY; |
4596 | 1263 } else if (!strcmp(state, _("Not At Home"))) { |
2681 | 1264 yd->current_status = YAHOO_STATUS_NOTATHOME; |
4596 | 1265 } else if (!strcmp(state, _("Not At Desk"))) { |
2681 | 1266 yd->current_status = YAHOO_STATUS_NOTATDESK; |
4596 | 1267 } else if (!strcmp(state, _("Not In Office"))) { |
2681 | 1268 yd->current_status = YAHOO_STATUS_NOTINOFFICE; |
4606 | 1269 } else if (!strcmp(state, _("On The Phone"))) { |
2681 | 1270 yd->current_status = YAHOO_STATUS_ONPHONE; |
4596 | 1271 } else if (!strcmp(state, _("On Vacation"))) { |
2681 | 1272 yd->current_status = YAHOO_STATUS_ONVACATION; |
4596 | 1273 } else if (!strcmp(state, _("Out To Lunch"))) { |
2681 | 1274 yd->current_status = YAHOO_STATUS_OUTTOLUNCH; |
4596 | 1275 } else if (!strcmp(state, _("Stepped Out"))) { |
2681 | 1276 yd->current_status = YAHOO_STATUS_STEPPEDOUT; |
4596 | 1277 } else if (!strcmp(state, _("Invisible"))) { |
2681 | 1278 yd->current_status = YAHOO_STATUS_INVISIBLE; |
1279 } else if (!strcmp(state, GAIM_AWAY_CUSTOM)) { | |
1280 if (gc->is_idle) { | |
1281 yd->current_status = YAHOO_STATUS_IDLE; | |
1282 } else { | |
1283 yd->current_status = YAHOO_STATUS_AVAILABLE; | |
1284 } | |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
4044
diff
changeset
|
1285 g_free(gc->away); |
2681 | 1286 gc->away = NULL; |
1287 } | |
1288 } else if (gc->is_idle) { | |
1289 yd->current_status = YAHOO_STATUS_IDLE; | |
1290 } else { | |
1291 yd->current_status = YAHOO_STATUS_AVAILABLE; | |
1292 } | |
1293 | |
2772
f9227268db25
[gaim-migrate @ 2785]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2771
diff
changeset
|
1294 if (yd->current_status == YAHOO_STATUS_AVAILABLE) |
f9227268db25
[gaim-migrate @ 2785]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2771
diff
changeset
|
1295 service = YAHOO_SERVICE_ISBACK; |
f9227268db25
[gaim-migrate @ 2785]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2771
diff
changeset
|
1296 else |
f9227268db25
[gaim-migrate @ 2785]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2771
diff
changeset
|
1297 service = YAHOO_SERVICE_ISAWAY; |
f9227268db25
[gaim-migrate @ 2785]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2771
diff
changeset
|
1298 pkt = yahoo_packet_new(service, yd->current_status, 0); |
2681 | 1299 g_snprintf(s, sizeof(s), "%d", yd->current_status); |
1300 yahoo_packet_hash(pkt, 10, s); | |
1301 if (yd->current_status == YAHOO_STATUS_CUSTOM) | |
1302 yahoo_packet_hash(pkt, 19, msg); | |
1303 | |
1304 yahoo_send_packet(yd, pkt); | |
1305 yahoo_packet_free(pkt); | |
1306 } | |
1307 | |
5583 | 1308 static void yahoo_set_idle(GaimConnection *gc, int idle) |
2681 | 1309 { |
1310 struct yahoo_data *yd = gc->proto_data; | |
1311 struct yahoo_packet *pkt = NULL; | |
1312 | |
1313 if (idle && yd->current_status == YAHOO_STATUS_AVAILABLE) { | |
1314 pkt = yahoo_packet_new(YAHOO_SERVICE_ISAWAY, YAHOO_STATUS_IDLE, 0); | |
1315 yd->current_status = YAHOO_STATUS_IDLE; | |
1316 } else if (!idle && yd->current_status == YAHOO_STATUS_IDLE) { | |
1317 pkt = yahoo_packet_new(YAHOO_SERVICE_ISAWAY, YAHOO_STATUS_AVAILABLE, 0); | |
1318 yd->current_status = YAHOO_STATUS_AVAILABLE; | |
1319 } | |
1320 | |
1321 if (pkt) { | |
1322 char buf[4]; | |
1323 g_snprintf(buf, sizeof(buf), "%d", yd->current_status); | |
1324 yahoo_packet_hash(pkt, 10, buf); | |
1325 yahoo_send_packet(yd, pkt); | |
1326 yahoo_packet_free(pkt); | |
1327 } | |
1328 } | |
1329 | |
5583 | 1330 static GList *yahoo_away_states(GaimConnection *gc) |
2681 | 1331 { |
1332 GList *m = NULL; | |
1333 | |
4596 | 1334 m = g_list_append(m, _("Available")); |
1335 m = g_list_append(m, _("Be Right Back")); | |
1336 m = g_list_append(m, _("Busy")); | |
1337 m = g_list_append(m, _("Not At Home")); | |
1338 m = g_list_append(m, _("Not At Desk")); | |
1339 m = g_list_append(m, _("Not In Office")); | |
4606 | 1340 m = g_list_append(m, _("On The Phone")); |
4596 | 1341 m = g_list_append(m, _("On Vacation")); |
1342 m = g_list_append(m, _("Out To Lunch")); | |
1343 m = g_list_append(m, _("Stepped Out")); | |
1344 m = g_list_append(m, _("Invisible")); | |
2681 | 1345 m = g_list_append(m, GAIM_AWAY_CUSTOM); |
1346 | |
1347 return m; | |
1348 } | |
1349 | |
5583 | 1350 static void yahoo_keepalive(GaimConnection *gc) |
2681 | 1351 { |
1352 struct yahoo_data *yd = gc->proto_data; | |
1353 struct yahoo_packet *pkt = yahoo_packet_new(YAHOO_SERVICE_PING, YAHOO_STATUS_AVAILABLE, 0); | |
1354 yahoo_send_packet(yd, pkt); | |
1355 yahoo_packet_free(pkt); | |
1356 } | |
1357 | |
5583 | 1358 static void yahoo_add_buddy(GaimConnection *gc, const char *who) |
2681 | 1359 { |
1360 struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; | |
1361 struct yahoo_packet *pkt; | |
1362 struct group *g; | |
1363 char *group = NULL; | |
1364 | |
1365 if (!yd->logged_in) | |
1366 return; | |
1367 | |
4687 | 1368 g = gaim_find_buddys_group(gaim_find_buddy(gc->account, who)); |
2681 | 1369 if (g) |
1370 group = g->name; | |
1371 else | |
1372 group = "Buddies"; | |
1373 | |
1374 pkt = yahoo_packet_new(YAHOO_SERVICE_ADDBUDDY, YAHOO_STATUS_AVAILABLE, 0); | |
5583 | 1375 yahoo_packet_hash(pkt, 1, gaim_connection_get_display_name(gc)); |
2681 | 1376 yahoo_packet_hash(pkt, 7, who); |
1377 yahoo_packet_hash(pkt, 65, group); | |
1378 yahoo_send_packet(yd, pkt); | |
1379 yahoo_packet_free(pkt); | |
1380 } | |
1381 | |
6059 | 1382 static void yahoo_remove_buddy(GaimConnection *gc, const char *who, const char *group) |
2681 | 1383 { |
1384 struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; | |
1385 | |
1386 struct yahoo_packet *pkt = yahoo_packet_new(YAHOO_SERVICE_REMBUDDY, YAHOO_STATUS_AVAILABLE, 0); | |
5583 | 1387 yahoo_packet_hash(pkt, 1, gaim_connection_get_display_name(gc)); |
2681 | 1388 yahoo_packet_hash(pkt, 7, who); |
1389 yahoo_packet_hash(pkt, 65, group); | |
1390 yahoo_send_packet(yd, pkt); | |
1391 yahoo_packet_free(pkt); | |
1392 } | |
1393 | |
6513 | 1394 static gboolean yahoo_unload_plugin(GaimPlugin *plugin) |
1395 { | |
1396 yahoo_dest_colorht(); | |
1397 return TRUE; | |
1398 } | |
1399 | |
6514 | 1400 static void yahoo_got_info(gpointer data, char *url_text, unsigned long len) |
1401 { | |
1402 char *stripped,*p; | |
1403 char buf[1024]; | |
1404 | |
1405 /* we failed to grab the profile URL */ | |
1406 if (!url_text) { | |
1407 g_show_info_text(NULL, NULL, 2, | |
6573 | 1408 _("<html><body><b>Error retrieving profile</b></body></html>"), NULL); |
6514 | 1409 return; |
1410 } | |
1411 | |
1412 /* we don't yet support the multiple link level of the warning page for | |
1413 * 'adult' profiles, not to mention the fact that yahoo wants you to be | |
1414 * logged in (on the website) to be able to view an 'adult' profile. for | |
1415 * now, just tell them that we can't help them, and provide a link to the | |
1416 * profile if they want to do the web browser thing. | |
1417 */ | |
1418 p = strstr(url_text, "Adult Profiles Warning Message"); | |
1419 if (p) { | |
6573 | 1420 strcpy(buf, _("<b>Sorry, profiles marked as containing adult content are not supported at this time.</b><br><br>\n")); |
6514 | 1421 info_extract_field(url_text, buf, ".idname=", 0, "%26", 0, NULL, |
6573 | 1422 _("If you wish to view this profile, you will need to visit this link in your web browser"), |
6514 | 1423 1, YAHOO_PROFILE_URL); |
1424 strcat(buf, "</body></html>\n"); | |
1425 g_show_info_text(NULL, NULL, 2, buf, NULL); | |
1426 return; | |
1427 } | |
1428 | |
1429 /* strip_html() doesn't strip out character entities like and · | |
1430 */ | |
1431 while ((p = strstr(url_text, " ")) != NULL) { | |
1432 memmove(p, p + 6, strlen(p + 6)); | |
1433 url_text[strlen(url_text) - 6] = '\0'; | |
1434 } | |
1435 while ((p = strstr(url_text, "·")) != NULL) { | |
1436 memmove(p, p + 6, strlen(p + 6)); | |
1437 url_text[strlen(url_text) - 6] = '\0'; | |
1438 } | |
1439 | |
1440 /* nuke the nasty \r's */ | |
1441 while ((p = strchr(url_text, '\r')) != NULL) { | |
1442 memmove(p, p + 1, strlen(p + 1)); | |
1443 url_text[strlen(url_text) - 1] = '\0'; | |
1444 } | |
1445 | |
1446 /* nuke the html, it's easier than trying to parse the horrid stuff */ | |
1447 stripped = strip_html(url_text); | |
1448 | |
1449 /* gonna re-use the memory we've already got for url_text */ | |
1450 strcpy(url_text, "<html><body>\n"); | |
1451 | |
1452 /* extract their Yahoo! ID and put it in */ | |
1453 info_extract_field(stripped, url_text, "Yahoo! ID:", 2, "\n", 0, | |
6573 | 1454 NULL, _("Yahoo! ID"), 0, NULL); |
6514 | 1455 |
1456 /* extract their Email address and put it in */ | |
1457 info_extract_field(stripped, url_text, "My Email", 5, "\n", 0, | |
6573 | 1458 _("Private"), _("Email"), 0, NULL); |
6514 | 1459 |
1460 /* extract the Nickname if it exists */ | |
1461 info_extract_field(stripped, url_text, "Nickname:", 1, "\n", '\n', | |
6573 | 1462 NULL, _("Nickname"), 0, NULL); |
6514 | 1463 |
1464 /* extract their RealName and put it in */ | |
1465 info_extract_field(stripped, url_text, "RealName:", 1, "\n", '\n', | |
6623 | 1466 NULL, _("Realname"), 0, NULL); |
6514 | 1467 |
1468 /* extract their Location and put it in */ | |
1469 info_extract_field(stripped, url_text, "Location:", 2, "\n", '\n', | |
6573 | 1470 NULL, _("Location"), 0, NULL); |
6514 | 1471 |
1472 /* extract their Age and put it in */ | |
1473 info_extract_field(stripped, url_text, "Age:", 3, "\n", '\n', | |
6573 | 1474 NULL, _("Age"), 0, NULL); |
6514 | 1475 |
1476 /* extract their MaritalStatus and put it in */ | |
1477 info_extract_field(stripped, url_text, "MaritalStatus:", 3, "\n", '\n', | |
6573 | 1478 _("No Answer"), _("Marital Status"), 0, NULL); |
6514 | 1479 |
1480 /* extract their Gender and put it in */ | |
1481 info_extract_field(stripped, url_text, "Gender:", 3, "\n", '\n', | |
6573 | 1482 _("No Answer"), _("Gender"), 0, NULL); |
6514 | 1483 |
1484 /* extract their Occupation and put it in */ | |
1485 info_extract_field(stripped, url_text, "Occupation:", 2, "\n", '\n', | |
6573 | 1486 NULL, _("Occupation"), 0, NULL); |
6514 | 1487 |
1488 /* Hobbies, Latest News, and Favorite Quote are a bit different, since the | |
1489 * values can contain embedded newlines... but any or all of them can also | |
1490 * not appear. The way we delimit them is to successively look for the next | |
1491 * one that _could_ appear, and if all else fails, we end the section by | |
1492 * looking for the 'Links' heading, which is the next thing to follow this | |
1493 * bunch. | |
1494 */ | |
1495 if (!info_extract_field(stripped, url_text, "Hobbies:", 1, "Latest News", | |
6573 | 1496 '\n', NULL, _("Hobbies"), 0, NULL)) |
6514 | 1497 if (!info_extract_field(stripped, url_text, "Hobbies:", 1, "Favorite Quote", |
6573 | 1498 '\n', NULL, _("Hobbies"), 0, NULL)) |
6514 | 1499 info_extract_field(stripped, url_text, "Hobbies:", 1, "Links", |
6573 | 1500 '\n', NULL, _("Hobbies"), 0, NULL); |
6514 | 1501 if (!info_extract_field(stripped, url_text, "Latest News:", 1, "Favorite Quote", |
6573 | 1502 '\n', NULL, _("Latest News"), 0, NULL)) |
6514 | 1503 info_extract_field(stripped, url_text, "Latest News:", 1, "Links", |
6573 | 1504 '\n', NULL, _("Latest News"), 0, NULL); |
6514 | 1505 info_extract_field(stripped, url_text, "Favorite Quote:", 0, "Links", |
6573 | 1506 '\n', NULL, _("Favorite Quote"), 0, NULL); |
6514 | 1507 |
1508 /* Home Page will either be "No home page specified", | |
1509 * or "Home Page: " and a link. */ | |
1510 p = strstr(stripped, "No home page specified"); | |
1511 if (!p) | |
1512 info_extract_field(stripped, url_text, "Home Page:", 1, " ", 0, NULL, | |
6573 | 1513 _("Home Page"), 1, NULL); |
6514 | 1514 |
1515 /* Cool Link {1,2,3} is also different. If "No cool link specified" exists, | |
1516 * then we have none. If we have one however, we'll need to check and see if | |
1517 * we have a second one. If we have a second one, we have to check to see if | |
1518 * we have a third one. | |
1519 */ | |
1520 p = strstr(stripped,"No cool link specified"); | |
1521 if (!p) | |
1522 if (info_extract_field(stripped, url_text, "Cool Link 1:", 1, " ", 0, NULL, | |
6573 | 1523 _("Cool Link 1"), 1, NULL)) |
6514 | 1524 if (info_extract_field(stripped, url_text, "Cool Link 2:", 1, " ", 0, NULL, |
6573 | 1525 _("Cool Link 2"), 1, NULL)) |
6514 | 1526 info_extract_field(stripped, url_text, "Cool Link 3:", 1, " ", 0, NULL, |
6573 | 1527 _("Cool Link 3"), 1, NULL); |
6514 | 1528 |
1529 /* see if Member Since is there, and if so, extract it. */ | |
1530 info_extract_field(stripped, url_text, "Member Since:", 1, "Last Updated:", | |
6573 | 1531 '\n', NULL, _("Member Since"), 0, NULL); |
6514 | 1532 |
1533 /* extract the Last Updated date and put it in */ | |
1534 info_extract_field(stripped, url_text, "Last Updated:", 1, "\n", '\n', NULL, | |
6573 | 1535 _("Last Updated"), 0, NULL); |
6514 | 1536 |
1537 /* finish off the html */ | |
1538 strcat(url_text, "</body></html>\n"); | |
1539 g_free(stripped); | |
1540 | |
1541 /* show it to the user */ | |
1542 g_show_info_text(NULL, NULL, 2, url_text, NULL); | |
1543 } | |
1544 | |
1545 static void yahoo_get_info(GaimConnection *gc, const char *name) | |
1546 { | |
1547 /* struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; */ | |
1548 char url[256]; | |
1549 g_snprintf(url, sizeof url, "%s%s", YAHOO_PROFILE_URL, name); | |
6516 | 1550 grab_url(url, FALSE, yahoo_got_info, NULL, NULL, 0); |
6514 | 1551 } |
1552 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1553 static GaimPlugin *my_protocol = NULL; |
2681 | 1554 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1555 static GaimPluginProtocolInfo prpl_info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1556 { |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1557 GAIM_PROTO_YAHOO, |
6629 | 1558 OPT_PROTO_MAIL_CHECK, |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1559 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1560 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1561 yahoo_list_icon, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1562 yahoo_list_emblems, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1563 yahoo_status_text, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1564 yahoo_tooltip_text, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1565 yahoo_away_states, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1566 yahoo_actions, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1567 yahoo_buddy_menu, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1568 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1569 yahoo_login, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1570 yahoo_close, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1571 yahoo_send_im, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1572 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1573 yahoo_send_typing, |
6514 | 1574 yahoo_get_info, |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1575 yahoo_set_away, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1576 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1577 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1578 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1579 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1580 yahoo_set_idle, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1581 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1582 yahoo_add_buddy, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1583 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1584 yahoo_remove_buddy, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1585 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1586 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1587 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1588 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1589 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1590 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1591 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1592 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1593 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1594 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1595 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1596 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1597 yahoo_keepalive, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1598 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1599 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1600 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1601 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1602 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1603 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1604 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1605 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1606 NULL |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1607 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1608 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1609 static GaimPluginInfo info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1610 { |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1611 2, /**< api_version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1612 GAIM_PLUGIN_PROTOCOL, /**< type */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1613 NULL, /**< ui_requirement */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1614 0, /**< flags */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1615 NULL, /**< dependencies */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1616 GAIM_PRIORITY_DEFAULT, /**< priority */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1617 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1618 "prpl-yahoo", /**< id */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1619 "Yahoo", /**< name */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1620 VERSION, /**< version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1621 /** summary */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1622 N_("Yahoo Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1623 /** description */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1624 N_("Yahoo Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1625 NULL, /**< author */ |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6321
diff
changeset
|
1626 GAIM_WEBSITE, /**< homepage */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1627 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1628 NULL, /**< load */ |
6513 | 1629 yahoo_unload_plugin, /**< unload */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1630 NULL, /**< destroy */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1631 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1632 NULL, /**< ui_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1633 &prpl_info /**< extra_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1634 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1635 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1636 static void |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
1637 init_plugin(GaimPlugin *plugin) |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1638 { |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5590
diff
changeset
|
1639 GaimAccountOption *option; |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1640 |
5685
43ea75092684
[gaim-migrate @ 6106]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
1641 option = gaim_account_option_string_new(_("Pager host"), "server", |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5590
diff
changeset
|
1642 YAHOO_PAGER_HOST); |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5590
diff
changeset
|
1643 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5590
diff
changeset
|
1644 option); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1645 |
5685
43ea75092684
[gaim-migrate @ 6106]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
1646 option = gaim_account_option_int_new(_("Pager port"), "port", |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5590
diff
changeset
|
1647 YAHOO_PAGER_PORT); |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5590
diff
changeset
|
1648 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5590
diff
changeset
|
1649 option); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1650 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1651 my_protocol = plugin; |
6513 | 1652 |
1653 yahoo_init_colorht(); | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1654 } |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1655 |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
1656 GAIM_INIT_PLUGIN(yahoo, init_plugin, info); |