Mercurial > pidgin.yaz
annotate src/protocols/napster/napster.c @ 5638:0bdfa28c678e
[gaim-migrate @ 6047]
We're slowly killing off multi.h. The proto_user_split and proto_user_opt
have been replaced with GaimAccountOption and GaimAccountUserSplit
structures, which of course have an API. The account dialog is being
rewritten as well, and will soon allow you to add and modify accounts again.
committer: Tailor Script <tailor@pidgin.im>
author | Christian Hammond <chipx86@chipx86.com> |
---|---|
date | Sun, 01 Jun 2003 17:40:20 +0000 |
parents | 4fa8ca4f4259 |
children | 0a0116686d51 |
rev | line source |
---|---|
2086 | 1 /* |
2 * gaim - Napster Protocol Plugin | |
3 * | |
3322 | 4 * Copyright (C) 2000-2001, Rob Flynn <rob@marko.net> |
2086 | 5 * |
6 * This program is free software; you can redistribute it and/or modify | |
7 * it under the terms of the GNU General Public License as published by | |
8 * the Free Software Foundation; either version 2 of the License, or | |
9 * (at your option) any later version. | |
10 * | |
11 * This program is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 * GNU General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License | |
17 * along with this program; if not, write to the Free Software | |
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
19 * | |
20 */ | |
21 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
22 #include <config.h> |
2086 | 23 |
3630 | 24 #ifndef _WIN32 |
2086 | 25 #include <netdb.h> |
26 #include <unistd.h> | |
27 #include <netinet/in.h> | |
28 #include <arpa/inet.h> | |
3630 | 29 #include <sys/socket.h> |
30 #else | |
31 #include <winsock.h> | |
32 #endif | |
33 | |
34 #include <errno.h> | |
2086 | 35 #include <time.h> |
36 #include <string.h> | |
37 #include <stdlib.h> | |
38 #include <stdio.h> | |
39 #include <time.h> | |
40 #include <sys/stat.h> | |
4608 | 41 #include "gaim.h" |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5605
diff
changeset
|
42 #include "accountopt.h" |
2086 | 43 #include "multi.h" |
44 #include "prpl.h" | |
45 #include "proxy.h" | |
3630 | 46 |
47 #ifdef _WIN32 | |
48 #include "win32dep.h" | |
49 #endif | |
50 | |
3322 | 51 #define NAP_SERVER "64.124.41.187" |
52 #define NAP_PORT 8888 | |
53 | |
5604 | 54 #define NAPSTER_CONNECT_STEPS 2 |
55 | |
2086 | 56 GSList *nap_connections = NULL; |
57 | |
58 struct nap_data { | |
59 int fd; | |
60 gchar *email; | |
61 }; | |
62 | |
5604 | 63 static struct gaim_conversation *nap_find_chat(GaimConnection *gc, const char *name) |
2086 | 64 { |
5402 | 65 GSList *bcs = gc->buddy_chats; |
2086 | 66 |
5402 | 67 while (bcs) { |
68 struct gaim_conversation *b = bcs->data; | |
69 if (!gaim_utf8_strcasecmp(b->name, name)) | |
5388 | 70 return b; |
5402 | 71 bcs = bcs->next; |
5388 | 72 } |
73 | |
74 return NULL; | |
75 } | |
76 | |
5604 | 77 static void nap_write_packet(GaimConnection *gc, unsigned short command, const char *format, ...) |
5388 | 78 { |
79 struct nap_data *ndata = (struct nap_data *)gc->proto_data; | |
80 va_list ap; | |
81 gchar *message; | |
82 unsigned short size; | |
83 | |
84 va_start(ap, format); | |
85 message = g_strdup_vprintf(format, ap); | |
86 va_end(ap); | |
87 | |
88 size = strlen(message); | |
89 gaim_debug(GAIM_DEBUG_MISC, "napster", "S %3hd: %s\n", command, message); | |
90 | |
91 write(ndata->fd, &size, 2); | |
92 write(ndata->fd, &command, 2); | |
93 write(ndata->fd, message, size); | |
94 | |
95 g_free(message); | |
96 } | |
97 | |
5604 | 98 static int nap_do_irc_style(GaimConnection *gc, const char *message, const char *name) |
5388 | 99 { |
100 gchar **res; | |
101 | |
102 gaim_debug(GAIM_DEBUG_MISC, "napster", "C %s\n", message); | |
103 | |
104 res = g_strsplit(message, " ", 2); | |
105 | |
106 if (!strcasecmp(res[0], "/ME")) { /* MSG_CLIENT_PUBLIC */ | |
5402 | 107 nap_write_packet(gc, 824, "%s \"%s\"", name, res[1]); |
5388 | 108 |
109 } else if (!strcasecmp(res[0], "/MSG")) { /* MSG_CLIENT_PUBLIC */ | |
110 nap_write_packet(gc, 205, "%s", res[1]); | |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4349
diff
changeset
|
111 |
5388 | 112 } else if (!strcasecmp(res[0], "/JOIN")) { /* join chatroom MSG_CLIENT_JOIN */ |
113 if (!res[1]) { | |
114 g_strfreev(res); | |
115 return 1; | |
116 } | |
117 if (res[1][0] != '#') | |
118 nap_write_packet(gc, 400, "#%s", res[1]); | |
119 else | |
120 nap_write_packet(gc, 400, "%s", res[1]); | |
121 | |
122 } else if (!strcasecmp(res[0], "/PART")) { /* partchatroom MSG_CLIENT_PART */ | |
5402 | 123 nap_write_packet(gc, 401, "%s", res[1] ? res[1] : name); |
5388 | 124 |
125 } else if (!strcasecmp(res[0], "/TOPIC")) { /* set topic MSG_SERVER_TOPIC */ | |
5402 | 126 nap_write_packet(gc, 410, "%s", res[1] ? res[1] : name); |
5388 | 127 |
128 } else if (!strcasecmp(res[0], "/WHOIS")) { /* whois request MSG_CLIENT_WHOIS */ | |
129 nap_write_packet(gc, 603, "%s", res[1]); | |
130 | |
131 } else if (!strcasecmp(res[0], "/PING")) { /* send ping MSG_CLIENT_PING */ | |
132 nap_write_packet(gc, 751, "%s", res[1]); | |
133 | |
134 } else if (!strcasecmp(res[0], "/KICK")) { /* kick asswipe MSG_CLIENT_KICK */ | |
135 nap_write_packet(gc, 829, "%s", res[1]); | |
136 | |
137 } else { | |
138 g_strfreev(res); | |
139 return 1; | |
140 } | |
141 | |
142 g_strfreev(res); | |
143 return 0; | |
144 } | |
145 | |
146 /* 205 - MSG_CLIENT_PRIVMSG */ | |
5604 | 147 static int nap_send_im(GaimConnection *gc, const char *who, const char *message, int len, int flags) |
5388 | 148 { |
149 | |
150 if ((strlen(message) < 2) || (message[0] != '/' ) || (message[1] == '/')) { | |
151 /* Actually send a chat message */ | |
152 nap_write_packet(gc, 205, "%s %s", who, message); | |
153 } else { | |
154 /* user typed an IRC-style command */ | |
155 nap_do_irc_style(gc, message, who); | |
2086 | 156 } |
157 | |
5388 | 158 return 1; |
159 } | |
160 | |
161 /* 207 - MSG_CLIENT_ADD_HOTLIST */ | |
5604 | 162 static void nap_add_buddy(GaimConnection *gc, const char *name) |
5388 | 163 { |
164 nap_write_packet(gc, 207, "%s", name); | |
165 } | |
166 | |
167 /* 208 - MSG_CLIENT_ADD_HOTLIST_SEQ */ | |
5604 | 168 static void nap_add_buddies(GaimConnection *gc, GList *buddies) |
5388 | 169 { |
170 while (buddies) { | |
171 nap_write_packet(gc, 208, "%s", (char *)buddies->data); | |
172 buddies = buddies -> next; | |
173 } | |
174 } | |
175 | |
176 /* 303 - MSG_CLIENT_REMOVE_HOTLIST */ | |
5604 | 177 static void nap_remove_buddy(GaimConnection *gc, char *name, char *group) |
5388 | 178 { |
179 nap_write_packet(gc, 303, "%s", name); | |
180 } | |
181 | |
182 /* 400 - MSG_CLIENT_JOIN */ | |
5604 | 183 static void nap_join_chat(GaimConnection *gc, GHashTable *data) |
5388 | 184 { |
185 char *name; | |
186 | |
187 if (!data) | |
188 return; | |
189 | |
190 name = g_hash_table_lookup(data, "group"); | |
191 | |
192 /* Make sure the name has a # preceeding it */ | |
193 if (name[0] != '#') | |
194 nap_write_packet(gc, 400, "#%s", name); | |
195 else | |
196 nap_write_packet(gc, 400, "%s", name); | |
197 } | |
198 | |
199 /* 401 - MSG_CLIENT_PART */ | |
5604 | 200 static void nap_chat_leave(GaimConnection *gc, int id) |
5388 | 201 { |
5402 | 202 struct gaim_conversation *c = gaim_find_chat(gc, id); |
5388 | 203 |
5402 | 204 if (!c) |
5388 | 205 return; |
206 | |
5402 | 207 nap_write_packet(gc, 401, "%s", c->name); |
5388 | 208 } |
209 | |
210 /* 402 - MSG_CLIENT_PUBLIC */ | |
5604 | 211 static int nap_chat_send(GaimConnection *gc, int id, char *message) |
5388 | 212 { |
5402 | 213 struct gaim_conversation *c = gaim_find_chat(gc, id); |
5388 | 214 |
5402 | 215 if (!c) |
5388 | 216 return -EINVAL; |
217 | |
218 if ((strlen(message) < 2) || (message[0] != '/' ) || (message[1] == '/')) { | |
219 /* Actually send a chat message */ | |
5402 | 220 nap_write_packet(gc, 402, "%s %s", c->name, message); |
5388 | 221 } else { |
222 /* user typed an IRC-style command */ | |
5402 | 223 nap_do_irc_style(gc, message, c->name); |
5388 | 224 } |
225 | |
226 return 0; | |
227 } | |
228 | |
229 /* 603 - MSG_CLIENT_WHOIS */ | |
5604 | 230 static void nap_get_info(GaimConnection *gc, const char *who) |
5388 | 231 { |
232 nap_write_packet(gc, 603, "%s", who); | |
2086 | 233 } |
234 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
235 static void nap_callback(gpointer data, gint source, GaimInputCondition condition) |
2086 | 236 { |
5604 | 237 GaimConnection *gc = data; |
2086 | 238 struct nap_data *ndata = gc->proto_data; |
5402 | 239 struct gaim_conversation *c; |
240 gchar *buf, *buf2, *buf3, **res; | |
2086 | 241 unsigned short header[2]; |
242 int len; | |
243 int command; | |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
244 int i; |
2086 | 245 |
5388 | 246 if (read(source, (void*)header, 4) != 4) { |
5604 | 247 gaim_connection_error(gc, _("Unable to read header from server")); |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
248 return; |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
249 } |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
250 |
2086 | 251 len = header[0]; |
252 command = header[1]; | |
5388 | 253 buf = (gchar *)g_malloc((len + 1) * sizeof(gchar)); |
254 buf[len] = '\0'; | |
2086 | 255 |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
256 i = 0; |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
257 do { |
5388 | 258 int tmp = read(source, buf + i, len - i); |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
259 if (tmp <= 0) { |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
260 g_free(buf); |
5388 | 261 buf = g_strdup_printf("Unable to read mesage from server. Command is %hd, length is %hd.", len, command); |
5604 | 262 gaim_connection_error(gc, buf); |
5388 | 263 g_free(buf); |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
264 return; |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
265 } |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
266 i += tmp; |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
267 } while (i != len); |
2086 | 268 |
5388 | 269 gaim_debug(GAIM_DEBUG_MISC, "napster", "R %3hd: %s\n", command, buf); |
2086 | 270 |
5388 | 271 switch (command) { |
272 case 000: /* MSG_SERVER_ERROR */ | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5402
diff
changeset
|
273 gaim_notify_error(gc, NULL, buf, NULL); |
5388 | 274 gaim_input_remove(gc->inpa); |
275 gc->inpa = 0; | |
2086 | 276 close(source); |
5604 | 277 gaim_connection_destroy(gc); |
5388 | 278 break; |
2086 | 279 |
5388 | 280 case 003: /* MSG_SERVER_EMAIL */ |
281 gaim_debug(GAIM_DEBUG_MISC, "napster", "Registered with e-mail address: %s\n", buf); | |
2086 | 282 ndata->email = g_strdup(buf); |
283 | |
284 /* Our signon is complete */ | |
5604 | 285 gaim_connection_set_state(gc, GAIM_CONNECTED); |
2086 | 286 serv_finish_login(gc); |
287 | |
5388 | 288 break; |
289 | |
290 case 201: /* MSG_SERVER_SEARCH_RESULT */ | |
291 res = g_strsplit(buf, " ", 0); | |
292 serv_got_update(gc, res[0], 1, 0, 0, 0, 0); | |
293 g_strfreev(res); | |
294 break; | |
295 | |
296 case 202: /* MSG_SERVER_SEARCH_END */ | |
297 serv_got_update(gc, buf, 0, 0, 0, 0, 0); | |
298 break; | |
299 | |
300 case 205: /* MSG_CLIENT_PRIVMSG */ | |
301 res = g_strsplit(buf, " ", 2); | |
302 serv_got_im(gc, res[0], res[1], 0, time(NULL), -1); | |
303 g_strfreev(res); | |
304 break; | |
305 | |
306 case 209: /* MSG_SERVER_USER_SIGNON */ | |
307 /* USERNAME SPEED */ | |
308 res = g_strsplit(buf, " ", 2); | |
309 serv_got_update(gc, res[0], 1, 0, 0, 0, 0); | |
310 g_strfreev(res); | |
311 break; | |
312 | |
313 case 210: /* MSG_SERVER_USER_SIGNOFF */ | |
314 /* USERNAME SPEED */ | |
315 res = g_strsplit(buf, " ", 2); | |
316 serv_got_update(gc, res[0], 0, 0, 0, 0, 0); | |
317 g_strfreev(res); | |
318 break; | |
319 | |
320 case 214: /* MSG_SERVER_STATS */ | |
321 res = g_strsplit(buf, " ", 3); | |
322 buf2 = g_strdup_printf(_("users: %s, files: %s, size: %sGB"), res[0], res[1], res[2]); | |
323 serv_got_im(gc, "server", buf2, 0, time(NULL), -1); | |
324 g_free(buf2); | |
325 g_strfreev(res); | |
326 break; | |
327 | |
328 case 301: /* MSG_SERVER_HOTLIST_ACK */ | |
329 /* Our buddy was added successfully */ | |
330 break; | |
331 | |
332 case 302: /* MSG_SERVER_HOTLIST_ERROR */ | |
333 buf2 = g_strdup_printf(_("Unable to add \"%s\" to your Napster hotlist"), buf); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5402
diff
changeset
|
334 gaim_notify_error(gc, NULL, buf2, NULL); |
5388 | 335 g_free(buf2); |
336 break; | |
337 | |
338 case 316: /* MSG_SERVER_DISCONNECTING */ | |
339 /* we have been kicked off =^( */ | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5402
diff
changeset
|
340 gaim_notify_error(gc, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5402
diff
changeset
|
341 _("You were disconnected from the server."), NULL); |
5604 | 342 gaim_connection_destroy(gc); |
5388 | 343 break; |
344 | |
345 case 401: /* MSG_CLIENT_PART */ | |
5402 | 346 c = nap_find_chat(gc, buf); |
347 if (c) | |
348 serv_got_chat_left(gc, gaim_chat_get_id(GAIM_CHAT(c))); | |
5388 | 349 break; |
350 | |
351 case 403: /* MSG_SERVER_PUBLIC */ | |
352 res = g_strsplit(buf, " ", 3); | |
5402 | 353 c = nap_find_chat(gc, res[0]); |
354 if (c) | |
355 serv_got_chat_in(gc, gaim_chat_get_id(GAIM_CHAT(c)), res[1], 0, res[2], time((time_t)NULL)); | |
5388 | 356 g_strfreev(res); |
357 break; | |
358 | |
359 case 404: /* MSG_SERVER_NOSUCH */ | |
360 /* abused by opennap servers to broadcast stuff */ | |
361 serv_got_im(gc, "server", buf, 0, time(NULL), -1); | |
362 break; | |
363 | |
364 case 405: /* MSG_SERVER_JOIN_ACK */ | |
5402 | 365 c = nap_find_chat(gc, buf); |
366 if (!c) | |
367 serv_got_joined_chat(gc, gaim_chat_get_id(GAIM_CHAT(c)), buf); | |
5388 | 368 break; |
369 | |
370 case 407: /* MSG_SERVER_PART */ | |
371 res = g_strsplit(buf, " ", 0); | |
5402 | 372 c = nap_find_chat(gc, res[0]); |
373 gaim_chat_remove_user(GAIM_CHAT(c), res[1], NULL); | |
5388 | 374 g_strfreev(res); |
375 break; | |
376 | |
377 case 406: /* MSG_SERVER_JOIN */ | |
378 case 408: /* MSG_SERVER_CHANNEL_USER_LIST */ | |
379 res = g_strsplit(buf, " ", 4); | |
5402 | 380 c = nap_find_chat(gc, res[0]); |
381 gaim_chat_add_user(GAIM_CHAT(c), res[1], NULL); | |
5388 | 382 g_strfreev(res); |
383 break; | |
384 | |
385 case 409: /* MSG_SERVER_CHANNEL_USER_LIST_END */ | |
386 break; | |
387 | |
388 case 410: /* MSG_SERVER_TOPIC */ | |
389 /* display the topic in the channel */ | |
390 res = g_strsplit(buf, " ", 2); | |
5402 | 391 c = nap_find_chat(gc, res[0]); |
392 gaim_chat_set_topic(GAIM_CHAT(c), res[0], res[1]); | |
5388 | 393 g_strfreev(res); |
394 break; | |
395 | |
396 case 603: /* MSG_CLIENT_WHOIS */ | |
397 buf2 = g_strdup_printf(_("%s requested your information"), buf); | |
398 serv_got_im(gc, "server", buf2, 0, time(NULL), -1); | |
399 g_free(buf2); | |
400 break; | |
401 | |
402 case 604: /* MSG_SERVER_WHOIS_RESPONSE */ | |
403 /* XXX - Format is: "Elite" 37 " " "Active" 0 0 0 0 "gaim 0.63cvs" 0 0 192.168.1.41 32798 0 unknown flounder */ | |
404 res = g_strsplit(buf, " ", 2); | |
405 g_show_info_text(gc, res[0], 2, res[1], NULL); | |
406 g_strfreev(res); | |
407 break; | |
408 | |
409 case 621: | |
410 case 622: /* MSG_CLIENT_MOTD */ | |
411 /* also replaces MSG_SERVER_MOTD, so we should display it */ | |
412 serv_got_im(gc, "motd", buf, 0, time(NULL), -1); | |
413 break; | |
414 | |
415 case 627: /* MSG_CLIENT_WALLOP */ | |
416 /* abused by opennap server maintainers to broadcast stuff */ | |
417 serv_got_im(gc, "wallop", buf, 0, time(NULL), -1); | |
418 break; | |
419 | |
420 case 628: /* MSG_CLIENT_ANNOUNCE */ | |
421 serv_got_im(gc, "announce", buf, 0, time(NULL), -1); | |
422 break; | |
423 | |
424 case 748: /* MSG_SERVER_GHOST */ | |
425 /* Looks like someone logged in as us! =-O */ | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5402
diff
changeset
|
426 gaim_notify_error(gc, NULL, |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5402
diff
changeset
|
427 _("You were disconnected from the server, because " |
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5402
diff
changeset
|
428 "you logged on from a different location"), NULL); |
5604 | 429 gaim_connection_destroy(gc); |
5388 | 430 break; |
431 | |
432 case 751: /* MSG_CLIENT_PING */ | |
433 buf2 = g_strdup_printf(_("%s requested a PING"), buf); | |
434 serv_got_im(gc, "server", buf2, 0, time(NULL), -1); | |
435 g_free(buf2); | |
436 /* send back a pong */ | |
437 /* MSG_CLIENT_PONG */ | |
438 nap_write_packet(gc, 752, "%s", buf); | |
439 break; | |
440 | |
441 case 752: /* MSG_CLIENT_PONG */ | |
442 buf2 = g_strdup_printf("Received pong from %s", buf); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5402
diff
changeset
|
443 gaim_notify_info(gc, NULL, buf2, NULL); |
5388 | 444 g_free(buf2); |
445 break; | |
446 | |
447 case 824: /* MSG_CLIENT_EMOTE */ | |
448 res = g_strsplit(buf, " ", 3); | |
449 buf2 = g_strndup(res[2]+1, strlen(res[2]) - 2); /* chomp off the surround quotes */ | |
450 buf3 = g_strdup_printf("/me %s", buf2); | |
451 g_free(buf2); | |
5402 | 452 if ((c = nap_find_chat(gc, res[0]))) { |
453 gaim_chat_write(GAIM_CHAT(c), res[1], buf3, WFLAG_NICK, time(NULL)); | |
5388 | 454 } |
455 g_free(buf3); | |
456 g_strfreev(res); | |
457 break; | |
458 | |
459 default: | |
460 gaim_debug(GAIM_DEBUG_MISC, "napster", "Unknown packet %hd: %s\n", command, buf); | |
461 break; | |
2086 | 462 } |
5388 | 463 |
464 g_free(buf); | |
2086 | 465 } |
466 | |
5388 | 467 /* 002 - MSG_CLIENT_LOGIN */ |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
468 static void nap_login_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 469 { |
5604 | 470 GaimConnection *gc = data; |
5388 | 471 struct nap_data *ndata = (struct nap_data *)gc->proto_data; |
472 gchar *buf; | |
2086 | 473 |
5605 | 474 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2701
8a84f2bb1716
[gaim-migrate @ 2714]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
475 close(source); |
8a84f2bb1716
[gaim-migrate @ 2714]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
476 return; |
8a84f2bb1716
[gaim-migrate @ 2714]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
477 } |
8a84f2bb1716
[gaim-migrate @ 2714]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
478 |
2086 | 479 if (source < 0) { |
5604 | 480 gaim_connection_error(gc, "Unable to connect"); |
2086 | 481 return; |
482 } | |
483 | |
4452 | 484 ndata->fd = source; |
2086 | 485 |
5388 | 486 /* Update the login progress status display */ |
5604 | 487 buf = g_strdup_printf("Logging in: %s", gaim_account_get_username(gc->account)); |
488 gaim_connection_update_progress(gc, buf, 2, NAPSTER_CONNECT_STEPS); | |
5388 | 489 g_free(buf); |
490 | |
491 /* Write our signon data */ | |
5604 | 492 nap_write_packet(gc, 2, "%s %s 0 \"gaim %s\" 0", |
493 gaim_account_get_username(gc->account), | |
494 gaim_account_get_password(gc->account), VERSION); | |
5388 | 495 |
2086 | 496 /* And set up the input watcher */ |
5388 | 497 gc->inpa = gaim_input_add(ndata->fd, GAIM_INPUT_READ, nap_callback, gc); |
2086 | 498 } |
499 | |
5604 | 500 static void nap_login(GaimAccount *account) |
2086 | 501 { |
5604 | 502 GaimConnection *gc = gaim_account_get_connection(account); |
5388 | 503 |
5604 | 504 gaim_connection_update_progress(gc, _("Connecting"), 1, NAPSTER_CONNECT_STEPS); |
5388 | 505 |
4460 | 506 gc->proto_data = g_new0(struct nap_data, 1); |
5604 | 507 if (proxy_connect(account, |
508 gaim_account_get_string(account, "server", NAP_SERVER), | |
509 gaim_account_get_int(account, "port", NAP_PORT), | |
4491 | 510 nap_login_connect, gc) != 0) { |
5604 | 511 gaim_connection_error(gc, _("Unable to connect")); |
2086 | 512 } |
513 } | |
514 | |
5604 | 515 static void nap_close(GaimConnection *gc) |
2086 | 516 { |
517 struct nap_data *ndata = (struct nap_data *)gc->proto_data; | |
5388 | 518 |
2086 | 519 if (gc->inpa) |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
520 gaim_input_remove(gc->inpa); |
2086 | 521 |
5388 | 522 if (!ndata) |
523 return; | |
524 | |
525 g_free(ndata->email); | |
526 g_free(ndata); | |
2086 | 527 } |
528 | |
5604 | 529 static const char* nap_list_icon(GaimAccount *a, struct buddy *b) |
2086 | 530 { |
4687 | 531 return "napster"; |
2086 | 532 } |
533 | |
4916 | 534 static void nap_list_emblems(struct buddy *b, char **se, char **sw, char **nw, char **ne) |
535 { | |
5068 | 536 if (b->present == GAIM_BUDDY_OFFLINE) |
4916 | 537 *se = "offline"; |
538 } | |
539 | |
5604 | 540 static GList *nap_buddy_menu(GaimConnection *gc, const char *who) |
2086 | 541 { |
5388 | 542 GList *m = NULL; |
543 struct proto_buddy_menu *pbm; | |
2086 | 544 |
5388 | 545 pbm = g_new0(struct proto_buddy_menu, 1); |
546 pbm->label = _("Get Info"); | |
547 pbm->callback = nap_get_info; | |
548 pbm->gc = gc; | |
549 m = g_list_append(m, pbm); | |
3572 | 550 |
5388 | 551 return m; |
2086 | 552 } |
553 | |
5604 | 554 static GList *nap_chat_info(GaimConnection *gc) |
2086 | 555 { |
5388 | 556 GList *m = NULL; |
557 struct proto_chat_entry *pce; | |
558 | |
559 pce = g_new0(struct proto_chat_entry, 1); | |
560 pce->label = _("Join what group:"); | |
561 pce->identifier = "group"; | |
562 m = g_list_append(m, pce); | |
563 | |
564 return m; | |
2086 | 565 } |
5388 | 566 |
567 static GaimPlugin *my_protocol = NULL; | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
568 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
569 static GaimPluginProtocolInfo prpl_info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
570 { |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
571 GAIM_PROTO_NAPSTER, |
5388 | 572 OPT_PROTO_CHAT_TOPIC, |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
573 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
574 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
575 nap_list_icon, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
576 nap_list_emblems, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
577 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
578 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
579 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
580 NULL, |
5388 | 581 nap_buddy_menu, |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
582 nap_chat_info, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
583 nap_login, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
584 nap_close, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
585 nap_send_im, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
586 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
587 NULL, |
5388 | 588 nap_get_info, |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
589 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
590 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
591 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
592 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
593 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
594 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
595 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
596 nap_add_buddy, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
597 nap_add_buddies, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
598 nap_remove_buddy, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
599 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
600 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
601 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
602 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
603 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
604 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
605 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
606 nap_join_chat, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
607 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
608 nap_chat_leave, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
609 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
610 nap_chat_send, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
611 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
612 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
613 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
614 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
615 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
616 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
617 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
618 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
619 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
620 NULL |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
621 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
622 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
623 static GaimPluginInfo info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
624 { |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
625 2, /**< api_version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
626 GAIM_PLUGIN_PROTOCOL, /**< type */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
627 NULL, /**< ui_requirement */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
628 0, /**< flags */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
629 NULL, /**< dependencies */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
630 GAIM_PRIORITY_DEFAULT, /**< priority */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
631 |
5388 | 632 "prpl-napster", /**< id */ |
633 "Napster", /**< name */ | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
634 VERSION, /**< version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
635 /** summary */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
636 N_("NAPSTER Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
637 /** description */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
638 N_("NAPSTER Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
639 NULL, /**< author */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
640 WEBSITE, /**< homepage */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
641 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
642 NULL, /**< load */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
643 NULL, /**< unload */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
644 NULL, /**< destroy */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
645 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
646 NULL, /**< ui_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
647 &prpl_info /**< extra_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
648 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
649 |
5388 | 650 static void __init_plugin(GaimPlugin *plugin) |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
651 { |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5605
diff
changeset
|
652 GaimAccountOption *option; |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
653 |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5605
diff
changeset
|
654 option = gaim_account_option_string_new(_("Server"), "server", |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5605
diff
changeset
|
655 NAP_SERVER); |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5605
diff
changeset
|
656 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5605
diff
changeset
|
657 option); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
658 |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5605
diff
changeset
|
659 option = gaim_account_option_int_new(_("Port"), "port", 8888); |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5605
diff
changeset
|
660 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, |
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5605
diff
changeset
|
661 option); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
662 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
663 my_protocol = plugin; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
664 } |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
665 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
666 GAIM_INIT_PLUGIN(napster, __init_plugin, info); |