File indexing completed on 2024-04-21 15:38:14

0001 /**
0002  * Copyright (C) 2006 by Koos Vriezen <koos.vriezen@gmail.com>
0003  *
0004  * This library is free software; you can redistribute it and/or
0005  * modify it under the terms of the GNU Library General Public
0006  * License version 2 as published by the Free Software Foundation.
0007  *
0008  * This library is distributed in the hope that it will be useful,
0009  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0010  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0011  * Library General Public License for more details.
0012  *
0013  * You should have received a copy of the GNU Library General Public License
0014  * along with this library; see the file COPYING.LIB.  If not, write to
0015  * the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
0016  * Boston, MA 02110-1301, USA.
0017  **/
0018 
0019 #include "config-kmplayer.h"
0020 #include <kdebug.h>
0021 
0022 #include "kmplayer_xspf.h"
0023 
0024 using namespace KMPlayer;
0025 
0026 
0027 KDE_NO_EXPORT Node *XSPF::Playlist::childFromTag (const QString & tag) {
0028     QByteArray ba = tag.toLatin1();
0029     const char * name = ba.constData ();
0030     if (!strcasecmp (name, "tracklist"))
0031         return new Tracklist (m_doc);
0032     else if (!strcasecmp (name, "creator"))
0033         return new DarkNode (m_doc, name, id_node_creator);
0034     else if (!strcasecmp (name, "title"))
0035         return new DarkNode (m_doc, name, id_node_title);
0036     else if (!strcasecmp (name, "annotation"))
0037         return new DarkNode (m_doc, name, id_node_annotation);
0038     else if (!strcasecmp (name, "info"))
0039         return new DarkNode (m_doc, name, id_node_info);
0040     else if (!strcasecmp (name, "location"))
0041         return new DarkNode (m_doc, name, id_node_location);
0042     else if (!strcasecmp (name, "identifier"))
0043         return new DarkNode (m_doc, name, id_node_identifier);
0044     else if (!strcasecmp (name, "image"))
0045         return new DarkNode (m_doc, name, id_node_image);
0046     else if (!strcasecmp (name, "date"))
0047         return new DarkNode (m_doc, name, id_node_date);
0048     else if (!strcasecmp (name, "license"))
0049         return new DarkNode (m_doc, name, id_node_license);
0050     else if (!strcasecmp (name, "attribution"))
0051         return new DarkNode (m_doc, name, id_node_attribution);
0052     else if (!strcasecmp (name, "link"))
0053         return new DarkNode (m_doc, name, id_node_link);
0054     else if (!strcasecmp (name, "meta"))
0055         return new DarkNode (m_doc, name, id_node_meta);
0056     else if (!strcasecmp (name, "extension"))
0057         return new DarkNode (m_doc, name, id_node_extension);
0058     return 0L;
0059 }
0060 
0061 KDE_NO_EXPORT void XSPF::Playlist::closed () {
0062     for (Node *e = firstChild (); e; e = e->nextSibling ()) {
0063         if (e->id == id_node_title)
0064             title = e->innerText ().simplified ();
0065         else if (e->id == id_node_location)
0066             src = e->innerText ().trimmed ();
0067     }
0068     Mrl::closed ();
0069 }
0070 
0071 void *XSPF::Playlist::role (RoleType msg, void *content)
0072 {
0073     if (RolePlaylist == msg)
0074         return !title.isEmpty () ? (PlaylistRole *) this : NULL;
0075     return Mrl::role (msg, content);
0076 }
0077 
0078 //-----------------------------------------------------------------------------
0079 
0080 KDE_NO_EXPORT Node *XSPF::Tracklist::childFromTag (const QString & tag) {
0081     QByteArray ba = tag.toLatin1 ();
0082     const char *name = ba.constData ();
0083     if (!strcasecmp (name, "track"))
0084         return new XSPF::Track (m_doc);
0085     return 0L;
0086 }
0087 
0088 //-----------------------------------------------------------------------------
0089 
0090 KDE_NO_EXPORT Node *XSPF::Track::childFromTag (const QString & tag) {
0091     QByteArray ba = tag.toLatin1 ();
0092     const char *name = ba.constData ();
0093     if (!strcasecmp (name, "location"))
0094         return new Location (m_doc);
0095     else if (!strcasecmp (name, "creator"))
0096         return new DarkNode (m_doc, name, id_node_creator);
0097     else if (!strcasecmp (name, "title"))
0098         return new DarkNode (m_doc, name, id_node_title);
0099     else if (!strcasecmp (name, "annotation"))
0100         return new DarkNode (m_doc, name, id_node_annotation);
0101     else if (!strcasecmp (name, "info"))
0102         return new DarkNode (m_doc, name, id_node_info);
0103     else if (!strcasecmp (name, "identifier"))
0104         return new DarkNode (m_doc, name, id_node_identifier);
0105     else if (!strcasecmp (name, "album"))
0106         return new DarkNode (m_doc, name, id_node_album);
0107     else if (!strcasecmp (name, "image"))
0108         return new DarkNode (m_doc, name, id_node_image);
0109     else if (!strcasecmp (name, "trackNum"))
0110         return new DarkNode (m_doc, name, id_node_tracknum);
0111     else if (!strcasecmp (name, "duration"))
0112         return new DarkNode (m_doc, name, id_node_duration);
0113     else if (!strcasecmp (name, "link"))
0114         return new DarkNode (m_doc, name, id_node_link);
0115     else if (!strcasecmp (name, "meta"))
0116         return new DarkNode (m_doc, name, id_node_meta);
0117     else if (!strcasecmp (name, "extension"))
0118         return new DarkNode (m_doc, name, id_node_extension);
0119     return 0L;
0120 }
0121 
0122 KDE_NO_EXPORT void XSPF::Track::closed () {
0123     Location *location = NULL;
0124     QString title;
0125     for (Node *e = firstChild (); e; e = e->nextSibling ()) {
0126         switch (e->id) {
0127             case id_node_title:
0128                 title = e->innerText ();
0129                 break;
0130             case id_node_location:
0131                 location = static_cast <Location *> (e);
0132                 break;
0133         }
0134     }
0135     if (location && !title.isEmpty ())
0136         location->setCaption (title);
0137     Element::closed ();
0138 }
0139 
0140 KDE_NO_EXPORT void XSPF::Track::activate () {
0141     for (Node *e = firstChild (); e; e = e->nextSibling ())
0142         if (e->id == id_node_annotation) {
0143             QString inf = e->innerText ().trimmed ();
0144             document ()->message (MsgInfoString, &inf);
0145             break;
0146         }
0147     Element::activate ();
0148 }
0149 
0150 void XSPF::Location::closed () {
0151     src = innerText ().trimmed ();
0152     Mrl::closed ();
0153 }