1 /**
2 * Copyright (C) 2006 by Koos Vriezen <koos.vriezen@gmail.com>
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License version 2 as published by the Free Software Foundation.
7 *
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Library General Public License for more details.
12 *
13 * You should have received a copy of the GNU Library General Public License
14 * along with this library; see the file COPYING.LIB. If not, write to
15 * the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
16 * Boston, MA 02110-1301, USA.
17 **/
18
19 #include "config-kmplayer.h"
20 #include <kdebug.h>
21
22 #include "kmplayer_xspf.h"
23
24 using namespace KMPlayer;
25
26
childFromTag(const QString & tag)27 KDE_NO_EXPORT Node *XSPF::Playlist::childFromTag (const QString & tag) {
28 QByteArray ba = tag.toLatin1();
29 const char * name = ba.constData ();
30 if (!strcasecmp (name, "tracklist"))
31 return new Tracklist (m_doc);
32 else if (!strcasecmp (name, "creator"))
33 return new DarkNode (m_doc, name, id_node_creator);
34 else if (!strcasecmp (name, "title"))
35 return new DarkNode (m_doc, name, id_node_title);
36 else if (!strcasecmp (name, "annotation"))
37 return new DarkNode (m_doc, name, id_node_annotation);
38 else if (!strcasecmp (name, "info"))
39 return new DarkNode (m_doc, name, id_node_info);
40 else if (!strcasecmp (name, "location"))
41 return new DarkNode (m_doc, name, id_node_location);
42 else if (!strcasecmp (name, "identifier"))
43 return new DarkNode (m_doc, name, id_node_identifier);
44 else if (!strcasecmp (name, "image"))
45 return new DarkNode (m_doc, name, id_node_image);
46 else if (!strcasecmp (name, "date"))
47 return new DarkNode (m_doc, name, id_node_date);
48 else if (!strcasecmp (name, "license"))
49 return new DarkNode (m_doc, name, id_node_license);
50 else if (!strcasecmp (name, "attribution"))
51 return new DarkNode (m_doc, name, id_node_attribution);
52 else if (!strcasecmp (name, "link"))
53 return new DarkNode (m_doc, name, id_node_link);
54 else if (!strcasecmp (name, "meta"))
55 return new DarkNode (m_doc, name, id_node_meta);
56 else if (!strcasecmp (name, "extension"))
57 return new DarkNode (m_doc, name, id_node_extension);
58 return 0L;
59 }
60
closed()61 KDE_NO_EXPORT void XSPF::Playlist::closed () {
62 for (Node *e = firstChild (); e; e = e->nextSibling ()) {
63 if (e->id == id_node_title)
64 title = e->innerText ().simplified ();
65 else if (e->id == id_node_location)
66 src = e->innerText ().trimmed ();
67 }
68 Mrl::closed ();
69 }
70
role(RoleType msg,void * content)71 void *XSPF::Playlist::role (RoleType msg, void *content)
72 {
73 if (RolePlaylist == msg)
74 return !title.isEmpty () ? (PlaylistRole *) this : NULL;
75 return Mrl::role (msg, content);
76 }
77
78 //-----------------------------------------------------------------------------
79
childFromTag(const QString & tag)80 KDE_NO_EXPORT Node *XSPF::Tracklist::childFromTag (const QString & tag) {
81 QByteArray ba = tag.toLatin1 ();
82 const char *name = ba.constData ();
83 if (!strcasecmp (name, "track"))
84 return new XSPF::Track (m_doc);
85 return 0L;
86 }
87
88 //-----------------------------------------------------------------------------
89
childFromTag(const QString & tag)90 KDE_NO_EXPORT Node *XSPF::Track::childFromTag (const QString & tag) {
91 QByteArray ba = tag.toLatin1 ();
92 const char *name = ba.constData ();
93 if (!strcasecmp (name, "location"))
94 return new Location (m_doc);
95 else if (!strcasecmp (name, "creator"))
96 return new DarkNode (m_doc, name, id_node_creator);
97 else if (!strcasecmp (name, "title"))
98 return new DarkNode (m_doc, name, id_node_title);
99 else if (!strcasecmp (name, "annotation"))
100 return new DarkNode (m_doc, name, id_node_annotation);
101 else if (!strcasecmp (name, "info"))
102 return new DarkNode (m_doc, name, id_node_info);
103 else if (!strcasecmp (name, "identifier"))
104 return new DarkNode (m_doc, name, id_node_identifier);
105 else if (!strcasecmp (name, "album"))
106 return new DarkNode (m_doc, name, id_node_album);
107 else if (!strcasecmp (name, "image"))
108 return new DarkNode (m_doc, name, id_node_image);
109 else if (!strcasecmp (name, "trackNum"))
110 return new DarkNode (m_doc, name, id_node_tracknum);
111 else if (!strcasecmp (name, "duration"))
112 return new DarkNode (m_doc, name, id_node_duration);
113 else if (!strcasecmp (name, "link"))
114 return new DarkNode (m_doc, name, id_node_link);
115 else if (!strcasecmp (name, "meta"))
116 return new DarkNode (m_doc, name, id_node_meta);
117 else if (!strcasecmp (name, "extension"))
118 return new DarkNode (m_doc, name, id_node_extension);
119 return 0L;
120 }
121
closed()122 KDE_NO_EXPORT void XSPF::Track::closed () {
123 Location *location = NULL;
124 QString title;
125 for (Node *e = firstChild (); e; e = e->nextSibling ()) {
126 switch (e->id) {
127 case id_node_title:
128 title = e->innerText ();
129 break;
130 case id_node_location:
131 location = static_cast <Location *> (e);
132 break;
133 }
134 }
135 if (location && !title.isEmpty ())
136 location->setCaption (title);
137 Element::closed ();
138 }
139
activate()140 KDE_NO_EXPORT void XSPF::Track::activate () {
141 for (Node *e = firstChild (); e; e = e->nextSibling ())
142 if (e->id == id_node_annotation) {
143 QString inf = e->innerText ().trimmed ();
144 document ()->message (MsgInfoString, &inf);
145 break;
146 }
147 Element::activate ();
148 }
149
closed()150 void XSPF::Location::closed () {
151 src = innerText ().trimmed ();
152 Mrl::closed ();
153 }
154