Mercurial > pidgin
annotate libpurple/protocols/jabber/usertune.c @ 17857:3e437e86bd6e
Implemented user tune, currently untested.
author | Andreas Monitzer <pidgin@monitzer.com> |
---|---|
date | Sun, 17 Jun 2007 20:31:01 +0000 |
parents | |
children | 84638e3af1bc |
rev | line source |
---|---|
17857
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
1 /* |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
2 * purple - Jabber Protocol Plugin |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
3 * |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
4 * Copyright (C) 2007, Andreas Monitzer <andy@monitzer.com> |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
5 * |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
6 * This program is free software; you can redistribute it and/or modify |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
7 * it under the terms of the GNU General Public License as published by |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
8 * the Free Software Foundation; either version 2 of the License, or |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
9 * (at your option) any later version. |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
10 * |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
11 * This program is distributed in the hope that it will be useful, |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
14 * GNU General Public License for more details. |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
15 * |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
16 * You should have received a copy of the GNU General Public License |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
17 * along with this program; if not, write to the Free Software |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
19 * |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
20 */ |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
21 |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
22 #include "usertune.h" |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
23 #include "pep.h" |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
24 #include <assert.h> |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
25 #include <string.h> |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
26 #include "internal.h" |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
27 #include "request.h" |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
28 |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
29 static void jabber_tune_cb(JabberStream *js, const char *from, xmlnode *items) { |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
30 /* it doesn't make sense to have more than one item here, so let's just pick the first one */ |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
31 xmlnode *item = xmlnode_get_child(items, "item"); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
32 JabberBuddy *buddy = jabber_buddy_find(js, from, FALSE); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
33 xmlnode *tuneinfo, *tune; |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
34 PurpleTuneInfo tuneinfodata; |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
35 |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
36 /* ignore the tune of people not on our buddy list */ |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
37 if (!buddy || !item) |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
38 return; |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
39 |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
40 tuneinfodata.artist = ""; |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
41 tuneinfodata.title = ""; |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
42 tuneinfodata.album = ""; |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
43 tuneinfodata.genre = ""; |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
44 tuneinfodata.comment = ""; |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
45 tuneinfodata.track = ""; |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
46 tuneinfodata.time = -1; |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
47 tuneinfodata.year = -1; |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
48 tuneinfodata.url = ""; |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
49 |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
50 tune = xmlnode_get_child_with_namespace(item, "tune", "http://jabber.org/protocol/tune"); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
51 if (!tune) |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
52 return; |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
53 for (tuneinfo = tune->child; tuneinfo; tuneinfo = tuneinfo->next) { |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
54 if (tuneinfo->type == XMLNODE_TYPE_TAG) { |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
55 if (!strcmp(tuneinfo->name, "artist")) { |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
56 if (tuneinfodata.artist[0] != '\0') /* only pick the first one */ |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
57 tuneinfodata.artist = xmlnode_get_data(tuneinfo); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
58 } else if (!strcmp(tuneinfo->name, "length")) { |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
59 if (tuneinfodata.time == -1) { |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
60 char *length = xmlnode_get_data(tuneinfo); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
61 if (length) |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
62 tuneinfodata.time = strtol(length, NULL, 10); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
63 } |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
64 } else if (!strcmp(tuneinfo->name, "source")) { |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
65 if (tuneinfodata.album[0] != '\0') /* only pick the first one */ |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
66 tuneinfodata.album = xmlnode_get_data(tuneinfo); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
67 } else if (!strcmp(tuneinfo->name, "title")) { |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
68 if (tuneinfodata.title[0] != '\0') /* only pick the first one */ |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
69 tuneinfodata.title = xmlnode_get_data(tuneinfo); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
70 } else if (!strcmp(tuneinfo->name, "track")) { |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
71 if (tuneinfodata.track[0] != '\0') /* only pick the first one */ |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
72 tuneinfodata.track = xmlnode_get_data(tuneinfo); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
73 } else if (!strcmp(tuneinfo->name, "uri")) { |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
74 if (tuneinfodata.url[0] != '\0') /* only pick the first one */ |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
75 tuneinfodata.url = xmlnode_get_data(tuneinfo); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
76 } |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
77 } |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
78 } |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
79 JabberBuddyResource *resource = jabber_buddy_find_resource(buddy, NULL); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
80 const char *status_id = jabber_buddy_state_get_status_id(resource->state); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
81 |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
82 purple_prpl_got_user_status(js->gc->account, from, status_id, "tune_artist", tuneinfodata.artist, "tune_title", tuneinfodata.title, "tune_album", tuneinfodata.album, "tune_genre", tuneinfodata.genre, "tune_comment", tuneinfodata.comment, "tune_track", tuneinfodata.track, "tune_time", tuneinfodata.time, "tune_year", tuneinfodata.year, "tune_url", tuneinfodata.url, NULL); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
83 } |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
84 |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
85 void jabber_tune_init(void) { |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
86 jabber_add_feature("tune", "http://jabber.org/protocol/tune", jabber_pep_namespace_only_when_pep_enabled_cb); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
87 jabber_pep_register_handler("tunen", "http://jabber.org/protocol/tune", jabber_tune_cb); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
88 } |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
89 |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
90 void jabber_tune_set(PurpleConnection *gc, const PurpleTuneInfo *tuneinfo) { |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
91 xmlnode *publish, *tunenode; |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
92 JabberStream *js = gc->proto_data; |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
93 |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
94 publish = xmlnode_new("publish"); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
95 xmlnode_set_attrib(publish,"node","http://jabber.org/protocol/tune"); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
96 tunenode = xmlnode_new_child(xmlnode_new_child(publish, "item"), "tune"); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
97 xmlnode_set_namespace(tunenode, "http://jabber.org/protocol/tune"); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
98 |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
99 if(tuneinfo) { |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
100 if(tuneinfo->artist) |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
101 xmlnode_insert_data(xmlnode_new_child(tunenode, "artist"),tuneinfo->artist,-1); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
102 if(tuneinfo->title) |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
103 xmlnode_insert_data(xmlnode_new_child(tunenode, "title"),tuneinfo->title,-1); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
104 if(tuneinfo->album) |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
105 xmlnode_insert_data(xmlnode_new_child(tunenode, "source"),tuneinfo->album,-1); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
106 if(tuneinfo->url) |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
107 xmlnode_insert_data(xmlnode_new_child(tunenode, "uri"),tuneinfo->url,-1); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
108 if(tuneinfo->time >= 0) { |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
109 char *length = g_strdup_printf("%d", tuneinfo->time); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
110 xmlnode_insert_data(xmlnode_new_child(tunenode, "length"),tuneinfo->artist,-1); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
111 g_free(length); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
112 } |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
113 if(tuneinfo->track >= 0) { |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
114 char *track = g_strdup_printf("%d", tuneinfo->year); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
115 xmlnode_insert_data(xmlnode_new_child(tunenode, "track"),tuneinfo->track,-1); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
116 g_free(track); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
117 } |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
118 } |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
119 |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
120 jabber_pep_publish(js, publish); |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
121 /* publish is freed by jabber_pep_publish -> jabber_iq_send -> jabber_iq_free |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
122 (yay for well-defined memory management rules) */ |
3e437e86bd6e
Implemented user tune, currently untested.
Andreas Monitzer <pidgin@monitzer.com>
parents:
diff
changeset
|
123 } |