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