Mercurial > pidgin
annotate src/protocols/napster/napster.c @ 4102:c5ce82228a2f
[gaim-migrate @ 4317]
Cooley enough, @mac.com screen names can sign on without any additional
changes. There are a few problems, though. This fixes one of them:
-SNAC error saying "Not supported by host" or something similar at
signon, because gaim requests a redirect to the email notification
server, but this is not supported for ICQ and @mac.com accounts (I
don't know why ICQ accounts don't give the error). Anyway, so this
fixes the problem by only requesting the redirect if the screen name
has an email address associated with it. I made it so the auth
reply info is stored in the oscar session struct. There are some
other useful variables there, and I think it's just cleaner to
store the whole thing than the little bits and pieces.
I heard someone complain about your_uin@pager.icq.com spam, so I'm
thinking it'd be good if there were a way to disable those types of
messages. WinICQ has a nice little preferences thingy, I think.
I dunno, maybe I could add a checkbox to the account window?
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Thu, 19 Dec 2002 20:38:12 +0000 |
parents | 34c95669952f |
children | 474265997752 |
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> | |
41 #include "multi.h" | |
42 #include "prpl.h" | |
43 #include "gaim.h" | |
44 #include "proxy.h" | |
3630 | 45 |
46 #ifdef _WIN32 | |
47 #include "win32dep.h" | |
48 #endif | |
49 | |
3593 | 50 #include "pixmaps/protocols/napster/napster.xpm" |
2086 | 51 |
3630 | 52 /* for win32 compatability */ |
53 G_MODULE_IMPORT GSList *connections; | |
54 | |
2086 | 55 #define NAP_BUF_LEN 4096 |
56 | |
3322 | 57 #define USEROPT_NAPSERVER 3 |
58 #define NAP_SERVER "64.124.41.187" | |
59 #define USEROPT_NAPPORT 4 | |
60 #define NAP_PORT 8888 | |
61 | |
2086 | 62 GSList *nap_connections = NULL; |
63 | |
64 static unsigned int chat_id = 0; | |
65 | |
66 struct nap_channel { | |
67 unsigned int id; | |
68 gchar *name; | |
69 }; | |
70 | |
71 struct nap_data { | |
72 int fd; | |
73 int inpa; | |
74 | |
75 gchar *email; | |
76 GSList *channels; | |
77 }; | |
78 | |
79 /* FIXME: Make this use va_arg stuff */ | |
3466 | 80 static void nap_write_packet(struct gaim_connection *gc, unsigned short command, const char *message) |
2086 | 81 { |
82 struct nap_data *ndata = (struct nap_data *)gc->proto_data; | |
83 unsigned short size; | |
84 | |
85 size = strlen(message); | |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
86 |
2086 | 87 write(ndata->fd, &size, 2); |
88 write(ndata->fd, &command, 2); | |
89 write(ndata->fd, message, size); | |
90 } | |
91 | |
3033 | 92 static int nap_send_im(struct gaim_connection *gc, char *who, char *message, int len, int flags) |
2086 | 93 { |
94 gchar buf[NAP_BUF_LEN]; | |
95 | |
96 g_snprintf(buf, NAP_BUF_LEN, "%s %s", who, message); | |
97 nap_write_packet(gc, 0xCD, buf); | |
2123
56c4382f2909
[gaim-migrate @ 2133]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
98 |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2231
diff
changeset
|
99 return 1; |
2086 | 100 } |
101 | |
102 static struct nap_channel *find_channel_by_name(struct gaim_connection *gc, char *name) | |
103 { | |
104 struct nap_channel *channel; | |
105 struct nap_data *ndata = (struct nap_data *)gc->proto_data; | |
106 GSList *channels; | |
107 | |
108 channels = ndata->channels; | |
109 | |
110 while (channels) { | |
111 channel = (struct nap_channel *)channels->data; | |
112 | |
113 if (channel) { | |
114 if (!g_strcasecmp(name, channel->name)) { | |
115 return channel; | |
116 } | |
117 } | |
118 channels = g_slist_next(channels); | |
119 } | |
120 | |
121 return NULL; | |
122 } | |
123 | |
124 static struct nap_channel *find_channel_by_id(struct gaim_connection *gc, int id) | |
125 { | |
126 struct nap_channel *channel; | |
127 struct nap_data *ndata = (struct nap_data *)gc->proto_data; | |
128 GSList *channels; | |
129 | |
130 channels = ndata->channels; | |
131 | |
132 while (channels) { | |
133 channel = (struct nap_channel *)channels->data; | |
134 if (id == channel->id) { | |
135 return channel; | |
136 } | |
137 | |
138 channels = g_slist_next(channels); | |
139 } | |
140 | |
141 return NULL; | |
142 } | |
143 | |
144 static struct conversation *find_conversation_by_id(struct gaim_connection *gc, int id) | |
145 { | |
146 GSList *bc = gc->buddy_chats; | |
147 struct conversation *b = NULL; | |
148 | |
149 while (bc) { | |
150 b = (struct conversation *)bc->data; | |
151 if (id == b->id) { | |
152 break; | |
153 } | |
154 bc = bc->next; | |
155 b = NULL; | |
156 } | |
157 | |
158 return b; | |
159 } | |
160 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
161 static void nap_callback(gpointer data, gint source, GaimInputCondition condition) |
2086 | 162 { |
163 struct gaim_connection *gc = data; | |
164 struct nap_data *ndata = gc->proto_data; | |
165 gchar *buf; | |
166 unsigned short header[2]; | |
167 int len; | |
168 int command; | |
169 gchar **res; | |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
170 int i; |
2086 | 171 |
3720
34c95669952f
[gaim-migrate @ 3853]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3708
diff
changeset
|
172 if (recv(source, (void*)header, 4, 0) != 4) { |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
173 hide_login_progress(gc, "Unable to read"); |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
174 signoff(gc); |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
175 return; |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
176 } |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
177 |
2086 | 178 len = header[0]; |
179 command = header[1]; | |
180 | |
181 buf = (gchar *)g_malloc(sizeof(gchar) * (len + 1)); | |
182 | |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
183 i = 0; |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
184 do { |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
185 int tmp = recv(source, buf + i, len - i, 0); |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
186 if (tmp <= 0) { |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
187 g_free(buf); |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
188 hide_login_progress(gc, "Unable to read"); |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
189 signoff(gc); |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
190 return; |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
191 } |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
192 i += tmp; |
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
193 } while (i != len); |
2086 | 194 |
195 buf[len] = 0; | |
196 | |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
197 debug_printf("DEBUG: %s\n", buf); |
2086 | 198 |
199 if (command == 0xd6) { | |
200 res = g_strsplit(buf, " ", 0); | |
201 /* Do we want to report what the users are doing? */ | |
202 printf("users: %s, files: %s, size: %sGB\n", res[0], res[1], res[2]); | |
203 g_strfreev(res); | |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
204 g_free(buf); |
2086 | 205 return; |
206 } | |
207 | |
208 if (command == 0x26d) { | |
209 /* Do we want to use the MOTD? */ | |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
210 g_free(buf); |
2086 | 211 return; |
212 } | |
213 | |
214 if (command == 0xCD) { | |
215 res = g_strsplit(buf, " ", 1); | |
2856
b1e300a85678
[gaim-migrate @ 2869]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2820
diff
changeset
|
216 serv_got_im(gc, res[0], res[1], 0, time(NULL), -1); |
2086 | 217 g_strfreev(res); |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
218 g_free(buf); |
2086 | 219 return; |
220 } | |
221 | |
222 if (command == 0x195) { | |
223 struct nap_channel *channel; | |
224 | |
225 channel = find_channel_by_name(gc, buf); | |
226 | |
227 if (!channel) { | |
228 chat_id++; | |
229 | |
230 channel = g_new0(struct nap_channel, 1); | |
231 | |
232 channel->id = chat_id; | |
233 channel->name = g_strdup(buf); | |
234 | |
235 ndata->channels = g_slist_append(ndata->channels, channel); | |
236 | |
237 serv_got_joined_chat(gc, chat_id, buf); | |
238 } | |
239 | |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
240 g_free(buf); |
2086 | 241 return; |
242 } | |
243 | |
244 if (command == 0x198 || command == 0x196) { | |
245 struct nap_channel *channel; | |
246 struct conversation *convo; | |
247 gchar **res; | |
248 | |
249 res = g_strsplit(buf, " ", 0); | |
250 | |
251 channel = find_channel_by_name(gc, res[0]); | |
252 convo = find_conversation_by_id(gc, channel->id); | |
253 | |
3708 | 254 add_chat_buddy(convo, res[1], NULL); |
2086 | 255 |
256 g_strfreev(res); | |
257 | |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
258 g_free(buf); |
2086 | 259 return; |
260 } | |
261 | |
262 if (command == 0x197) { | |
263 struct nap_channel *channel; | |
264 struct conversation *convo; | |
265 gchar **res; | |
266 | |
267 res = g_strsplit(buf, " ", 0); | |
268 | |
269 channel = find_channel_by_name(gc, res[0]); | |
270 convo = find_conversation_by_id(gc, channel->id); | |
271 | |
2820
b917845dad3c
[gaim-migrate @ 2833]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2701
diff
changeset
|
272 remove_chat_buddy(convo, res[1], NULL); |
2086 | 273 |
274 g_strfreev(res); | |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
275 g_free(buf); |
2086 | 276 return; |
277 } | |
278 | |
279 if (command == 0x193) { | |
280 gchar **res; | |
281 struct nap_channel *channel; | |
282 | |
283 res = g_strsplit(buf, " ", 2); | |
284 | |
285 channel = find_channel_by_name(gc, res[0]); | |
286 | |
287 if (channel) | |
288 serv_got_chat_in(gc, channel->id, res[1], 0, res[2], time((time_t)NULL)); | |
289 | |
290 g_strfreev(res); | |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
291 g_free(buf); |
2086 | 292 return; |
293 } | |
294 | |
295 if (command == 0x194) { | |
3427 | 296 do_error_dialog(buf, NULL, GAIM_ERROR); |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
297 g_free(buf); |
2086 | 298 return; |
299 } | |
300 | |
301 if (command == 0x12e) { | |
302 gchar buf2[NAP_BUF_LEN]; | |
303 | |
3427 | 304 g_snprintf(buf2, NAP_BUF_LEN, "Unable to add '%s' to your Napster hotlist", buf); |
305 do_error_dialog(buf2, NULL, GAIM_ERROR); | |
2086 | 306 |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
307 g_free(buf); |
2086 | 308 return; |
309 | |
310 } | |
311 | |
312 if (command == 0x191) { | |
313 struct nap_channel *channel; | |
314 | |
315 channel = find_channel_by_name(gc, buf); | |
316 | |
317 if (!channel) /* I'm not sure how this would happen =) */ | |
318 return; | |
319 | |
320 serv_got_chat_left(gc, channel->id); | |
321 ndata->channels = g_slist_remove(ndata->channels, channel); | |
322 | |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
323 g_free(buf); |
2086 | 324 return; |
325 | |
326 } | |
327 | |
328 if (command == 0xd1) { | |
329 gchar **res; | |
330 | |
331 res = g_strsplit(buf, " ", 0); | |
332 | |
333 serv_got_update(gc, res[0], 1, 0, 0, 0, 0, 0); | |
334 | |
335 g_strfreev(res); | |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
336 g_free(buf); |
2086 | 337 return; |
338 } | |
339 | |
340 if (command == 0xd2) { | |
341 serv_got_update(gc, buf, 0, 0, 0, 0, 0, 0); | |
342 g_free(buf); | |
343 return; | |
344 } | |
345 | |
346 if (command == 0x12d) { | |
347 /* Our buddy was added successfully */ | |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
348 g_free(buf); |
2086 | 349 return; |
350 } | |
351 | |
352 if (command == 0x2ec) { | |
353 /* Looks like someone logged in as us! =-O */ | |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
354 g_free(buf); |
2086 | 355 |
356 signoff(gc); | |
357 return; | |
358 } | |
359 | |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
360 debug_printf("NAP: [COMMAND: 0x%04x] %s\n", command, buf); |
2086 | 361 |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
362 g_free(buf); |
2086 | 363 } |
364 | |
365 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
366 static void nap_login_callback(gpointer data, gint source, GaimInputCondition condition) |
2086 | 367 { |
368 struct gaim_connection *gc = data; | |
369 struct nap_data *ndata = gc->proto_data; | |
370 gchar buf[NAP_BUF_LEN]; | |
371 unsigned short header[2]; | |
372 int len; | |
373 int command; | |
3720
34c95669952f
[gaim-migrate @ 3853]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3708
diff
changeset
|
374 |
2086 | 375 read(source, header, 4); |
376 len = header[0]; | |
377 command = header[1]; | |
378 | |
379 read(source, buf, len); | |
380 buf[len] = 0; | |
381 | |
382 /* If we have some kind of error, get outta here */ | |
383 if (command == 0x00) | |
384 { | |
3427 | 385 do_error_dialog(buf, NULL, GAIM_ERROR); |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
386 gaim_input_remove(ndata->inpa); |
2086 | 387 ndata->inpa = 0; |
388 close(source); | |
389 signoff(gc); | |
390 return; | |
391 } | |
392 | |
393 if (command == 0x03) { | |
394 printf("Registered with E-Mail address of: %s\n", buf); | |
395 ndata->email = g_strdup(buf); | |
396 | |
397 /* Remove old inpa, add new one */ | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
398 gaim_input_remove(ndata->inpa); |
2086 | 399 ndata->inpa = 0; |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
400 gc->inpa = gaim_input_add(ndata->fd, GAIM_INPUT_READ, nap_callback, gc); |
2086 | 401 |
402 /* Our signon is complete */ | |
403 account_online(gc); | |
404 serv_finish_login(gc); | |
405 | |
406 if (bud_list_cache_exists(gc)) | |
2382
569ae9f2bb89
[gaim-migrate @ 2395]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2309
diff
changeset
|
407 do_import(gc, NULL); |
2086 | 408 |
409 return; | |
410 } | |
411 } | |
412 | |
413 | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
414 static void nap_login_connect(gpointer data, gint source, GaimInputCondition cond) |
2086 | 415 { |
416 struct gaim_connection *gc = data; | |
2701
8a84f2bb1716
[gaim-migrate @ 2714]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
417 struct nap_data *ndata; |
2086 | 418 char buf[NAP_BUF_LEN]; |
419 | |
2701
8a84f2bb1716
[gaim-migrate @ 2714]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
420 if (!g_slist_find(connections, gc)) { |
8a84f2bb1716
[gaim-migrate @ 2714]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
421 close(source); |
8a84f2bb1716
[gaim-migrate @ 2714]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
422 return; |
8a84f2bb1716
[gaim-migrate @ 2714]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
423 } |
8a84f2bb1716
[gaim-migrate @ 2714]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
424 |
2086 | 425 if (source < 0) { |
426 hide_login_progress(gc, "Unable to connect"); | |
427 signoff(gc); | |
428 return; | |
429 } | |
430 | |
2701
8a84f2bb1716
[gaim-migrate @ 2714]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2681
diff
changeset
|
431 ndata = gc->proto_data; |
2086 | 432 if (ndata->fd != source) |
433 ndata->fd = source; | |
434 | |
435 /* And write our signon data */ | |
436 g_snprintf(buf, NAP_BUF_LEN, "%s %s 0 \"gaimster\" 0", gc->username, gc->password); | |
437 nap_write_packet(gc, 0x02, buf); | |
438 | |
439 /* And set up the input watcher */ | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
440 ndata->inpa = gaim_input_add(ndata->fd, GAIM_INPUT_READ, nap_login_callback, gc); |
2086 | 441 } |
442 | |
443 | |
444 static void nap_login(struct aim_user *user) | |
445 { | |
446 struct gaim_connection *gc = new_gaim_conn(user); | |
447 struct nap_data *ndata = gc->proto_data = g_new0(struct nap_data, 1); | |
448 | |
3322 | 449 ndata->fd = proxy_connect(user->proto_opt[USEROPT_NAPSERVER][0] ? user->proto_opt[USEROPT_NAPSERVER] : NAP_SERVER, |
450 user->proto_opt[USEROPT_NAPPORT][0] ? atoi(user->proto_opt[USEROPT_NAPPORT]) : NAP_PORT, | |
451 nap_login_connect, gc); | |
2086 | 452 if (ndata->fd < 0) { |
453 hide_login_progress(gc, "Unable to connect"); | |
454 signoff(gc); | |
455 } | |
456 } | |
457 | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
458 static GList *nap_chat_info(struct gaim_connection *gc) |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
459 { |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
460 GList *m = NULL; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
461 struct proto_chat_entry *pce; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
462 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
463 pce = g_new0(struct proto_chat_entry, 1); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
464 pce->label = _("Join what group:"); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
465 m = g_list_append(m, pce); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
466 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
467 return m; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
468 } |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
469 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
470 static void nap_join_chat(struct gaim_connection *gc, GList *data) |
2086 | 471 { |
472 gchar buf[NAP_BUF_LEN]; | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
473 char *name; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
474 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
475 if (!data) |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
476 return; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
477 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
478 name = data->data; |
2086 | 479 |
480 /* Make sure the name has a # preceeding it */ | |
481 if (name[0] != '#') | |
482 g_snprintf(buf, NAP_BUF_LEN, "#%s", name); | |
483 else | |
484 g_snprintf(buf, NAP_BUF_LEN, "%s", name); | |
485 | |
486 nap_write_packet(gc, 0x190, buf); | |
487 } | |
488 | |
489 static void nap_chat_leave(struct gaim_connection *gc, int id) | |
490 { | |
491 struct nap_data *ndata = (struct nap_data *)gc->proto_data; | |
492 struct nap_channel *channel = NULL; | |
493 | |
494 channel = find_channel_by_id(gc, id); | |
495 | |
496 if (!channel) /* Again, I'm not sure how this would happen */ | |
497 return; | |
498 | |
499 nap_write_packet(gc, 0x191, channel->name); | |
500 | |
501 ndata->channels = g_slist_remove(ndata->channels, channel); | |
502 g_free(channel->name); | |
503 g_free(channel); | |
504 | |
505 } | |
506 | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
507 static int nap_chat_send(struct gaim_connection *gc, int id, char *message) |
2086 | 508 { |
509 struct nap_channel *channel = NULL; | |
510 gchar buf[NAP_BUF_LEN]; | |
511 | |
512 channel = find_channel_by_id(gc, id); | |
513 | |
514 if (!channel) { | |
515 /* This shouldn't happen */ | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
516 return -EINVAL; |
2086 | 517 } |
518 | |
519 g_snprintf(buf, NAP_BUF_LEN, "%s %s", channel->name, message); | |
520 nap_write_packet(gc, 0x192, buf); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
521 return 0; |
2086 | 522 } |
523 | |
3466 | 524 static void nap_add_buddy(struct gaim_connection *gc, const char *name) |
2086 | 525 { |
526 nap_write_packet(gc, 0xCF, name); | |
527 } | |
528 | |
2681
37d80035e77f
[gaim-migrate @ 2694]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2382
diff
changeset
|
529 static void nap_remove_buddy(struct gaim_connection *gc, char *name, char *group) |
2086 | 530 { |
531 nap_write_packet(gc, 0x12F, name); | |
532 } | |
533 | |
534 static void nap_close(struct gaim_connection *gc) | |
535 { | |
536 struct nap_data *ndata = (struct nap_data *)gc->proto_data; | |
537 struct nap_channel *channel; | |
538 | |
539 if (gc->inpa) | |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
540 gaim_input_remove(gc->inpa); |
2086 | 541 |
542 while (ndata->channels) { | |
543 channel = (struct nap_channel *)ndata->channels->data; | |
544 g_free(channel->name); | |
545 ndata->channels = g_slist_remove(ndata->channels, channel); | |
546 g_free(channel); | |
547 } | |
548 | |
2220
8b7ba25a7ece
[gaim-migrate @ 2230]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
549 g_free(gc->proto_data); |
2086 | 550 } |
551 | |
552 static void nap_add_buddies(struct gaim_connection *gc, GList *buddies) | |
553 { | |
554 while (buddies) { | |
555 nap_write_packet(gc, 0xd0, (char *)buddies->data); | |
556 buddies = buddies -> next; | |
557 } | |
558 } | |
559 | |
560 static char** nap_list_icon(int uc) | |
561 { | |
562 return napster_xpm; | |
563 } | |
564 | |
565 static struct prpl *my_protocol = NULL; | |
566 | |
3630 | 567 G_MODULE_EXPORT void napster_init(struct prpl *ret) |
2086 | 568 { |
3572 | 569 struct proto_user_opt *puo; |
570 ret->add_buddies = nap_add_buddies; | |
571 ret->remove_buddy = nap_remove_buddy; | |
572 ret->add_permit = NULL; | |
573 ret->rem_permit = NULL; | |
574 ret->add_deny = NULL; | |
575 ret->rem_deny = NULL; | |
576 ret->warn = NULL; | |
577 ret->chat_info = nap_chat_info; | |
578 ret->join_chat = nap_join_chat; | |
579 ret->chat_invite = NULL; | |
580 ret->chat_leave = nap_chat_leave; | |
581 ret->chat_whisper = NULL; | |
582 ret->chat_send = nap_chat_send; | |
583 ret->keepalive = NULL; | |
2086 | 584 ret->protocol = PROTO_NAPSTER; |
3572 | 585 ret->name = g_strdup("Napster"); |
2086 | 586 ret->list_icon = nap_list_icon; |
587 ret->login = nap_login; | |
588 ret->close = nap_close; | |
589 ret->send_im = nap_send_im; | |
590 ret->set_info = NULL; | |
591 ret->get_info = NULL; | |
592 ret->set_away = NULL; | |
593 ret->set_dir = NULL; | |
594 ret->get_dir = NULL; | |
595 ret->dir_search = NULL; | |
596 ret->set_idle = NULL; | |
597 ret->change_passwd = NULL; | |
598 ret->add_buddy = nap_add_buddy; | |
599 ret->add_buddies = nap_add_buddies; | |
600 ret->remove_buddy = nap_remove_buddy; | |
601 ret->add_permit = NULL; | |
602 ret->rem_permit = NULL; | |
603 ret->add_deny = NULL; | |
604 ret->rem_deny = NULL; | |
605 ret->warn = NULL; | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
606 ret->chat_info = nap_chat_info; |
2086 | 607 ret->join_chat = nap_join_chat; |
608 ret->chat_invite = NULL; | |
609 ret->chat_leave = nap_chat_leave; | |
610 ret->chat_whisper = NULL; | |
611 ret->chat_send = nap_chat_send; | |
612 ret->keepalive = NULL; | |
613 | |
3572 | 614 puo = g_new0(struct proto_user_opt, 1); |
615 puo->label = g_strdup("Server:"); | |
616 puo->def = g_strdup(NAP_SERVER); | |
617 puo->pos = USEROPT_NAPSERVER; | |
618 ret->user_opts = g_list_append(ret->user_opts, puo); | |
619 | |
620 puo = g_new0(struct proto_user_opt, 1); | |
621 puo->label = g_strdup("Port:"); | |
622 puo->def = g_strdup("8888"); | |
623 puo->pos = USEROPT_NAPPORT; | |
624 ret->user_opts = g_list_append(ret->user_opts, puo); | |
625 | |
2086 | 626 my_protocol = ret; |
627 } | |
628 | |
629 #ifndef STATIC | |
630 | |
3630 | 631 G_MODULE_EXPORT void gaim_prpl_init(struct prpl *prpl) |
2086 | 632 { |
3572 | 633 napster_init(prpl); |
634 prpl->plug->desc.api_version = PLUGIN_API_VERSION; | |
2086 | 635 } |
636 #endif |