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