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