summaryrefslogtreecommitdiffstats
path: root/tderadio3/src/stationlistxmlhandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tderadio3/src/stationlistxmlhandler.cpp')
-rw-r--r--tderadio3/src/stationlistxmlhandler.cpp230
1 files changed, 230 insertions, 0 deletions
diff --git a/tderadio3/src/stationlistxmlhandler.cpp b/tderadio3/src/stationlistxmlhandler.cpp
new file mode 100644
index 0000000..04e9d6f
--- /dev/null
+++ b/tderadio3/src/stationlistxmlhandler.cpp
@@ -0,0 +1,230 @@
+/***************************************************************************
+ StationListXmlHandler.cpp - description
+ -------------------
+ begin : Son Jan 12 2003
+ copyright : (C) 2003 by Martin Witte
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "include/stationlistxmlhandler.h"
+#include <klocale.h>
+
+const char *TDERadioConfigElement = "kradiorc";
+
+const char *StationListElement = "stationlist";
+const char *compatStationElement = "station";
+
+const char *StationListInfo = "info";
+const char *StationListInfoMaintainer = "maintainer";
+const char *StationListInfoCountry = "country";
+const char *StationListInfoCity = "city";
+const char *StationListInfoMedia = "media";
+const char *StationListInfoComments = "comments";
+const char *StationListInfoChanged = "changed";
+const char *StationListInfoCreator = "creator";
+
+const char *StationListFormat = "format";
+
+
+StationListXmlHandler::StationListXmlHandler (const IErrorLogClient &logger)
+ : m_logger(logger),
+ m_compatMode (false)
+{
+ m_newStation = NULL;
+}
+
+
+StationListXmlHandler::~StationListXmlHandler ()
+{
+}
+
+
+bool StationListXmlHandler::startDocument ()
+{
+ m_status.clear();
+
+ m_stations.clear();
+ clearNewStation();
+
+ return true;
+}
+
+
+
+#define START_ELEMENT_ERROR m_logger.logError("StationListXmlHandler::startElement: " + \
+ i18n("misplaced element %1") \
+ .arg(qname));\
+ return false;
+
+bool StationListXmlHandler::startElement (const TQString &/*ns*/, const TQString &/*localname*/,
+ const TQString& _qname, const TQXmlAttributes &)
+{
+ TQString qname = _qname;
+ if (qname == TDERadioConfigElement) {
+ if (m_status.size()) { START_ELEMENT_ERROR }
+
+ // station list
+ } else if (qname == StationListElement) {
+ if (!m_status.size() || m_status.back() != TDERadioConfigElement) { START_ELEMENT_ERROR }
+ m_stations.clear();
+ clearNewStation();
+
+ } else if (qname == StationListFormat) {
+ if (!m_status.size() || m_status.back() != StationListElement) { START_ELEMENT_ERROR }
+
+ } else if (qname == StationListInfo) {
+ if (!m_status.size() || m_status.back() != StationListElement) { START_ELEMENT_ERROR }
+
+ } else if (qname == StationListInfoMaintainer ||
+ qname == StationListInfoCountry ||
+ qname == StationListInfoCity ||
+ qname == StationListInfoMedia ||
+ qname == StationListInfoComments ||
+ qname == StationListInfoChanged ||
+ qname == StationListInfoCreator
+ )
+ {
+ if (!m_status.size() || m_status.back() != StationListInfo) { START_ELEMENT_ERROR }
+
+ } else if (!m_newStation && m_status.size() && m_status.back() == StationListElement) {
+
+ if (qname == compatStationElement) {
+ qname = "FrequencyRadioStation";
+ m_compatMode = true;
+ }
+
+ const RadioStation *x = RadioStation::getStationClass(qname);
+ m_newStation = x ? x->copy() : NULL;
+
+ if (!m_newStation) { START_ELEMENT_ERROR }
+
+ } else if (m_newStation && m_status.size() && m_status.back() == m_newStation->getClassName()) {
+
+ // check done later when characters arrive
+
+ } else { // unknown
+ m_logger.logWarning("StationListXmlHandler::startElement: " +
+ i18n("unknown or unexpected element %1").arg(qname));
+ }
+
+ m_status.push_back(qname);
+ return true;
+}
+
+
+bool StationListXmlHandler::endElement (const TQString &/*ns*/, const TQString &/*localname*/,
+ const TQString &_qname)
+{
+ TQString qname = _qname;
+ if (qname == compatStationElement) {
+ qname = "FrequencyRadioStation";
+ m_compatMode = true;
+ }
+
+ if (m_status.size() && m_status.back() == qname) {
+
+ if (m_newStation && qname == m_newStation->getClassName()) {
+ m_stations.append(m_newStation);
+ clearNewStation();
+ }
+
+ m_status.pop_back();
+
+ } else {
+ if (m_status.size()) {
+ m_logger.logError("StationListXmlHandler::endElement: " +
+ i18n("expected element %1, but found %2")
+ .arg(m_status.back()).arg(qname));
+ } else {
+ m_logger.logError("StationListXmlHandler::endElement: " +
+ i18n("unexpected element %1").arg(qname));
+ }
+ }
+ return true;
+}
+
+
+#define CHARACTERS_ERROR m_logger.logError("StationListXmlHandler::characters: " + \
+ i18n("invalid data for element %1") \
+ .arg(stat)); \
+ return false;
+
+bool StationListXmlHandler::characters (const TQString &ch)
+{
+ TQString stat = m_status.back();
+ TQString str = ch.stripWhiteSpace();
+
+ // Station parsing
+
+ // information on list
+ if (stat == StationListFormat) {
+
+ if (str != STATION_LIST_FORMAT) {
+ m_logger.logError(i18n("found a station list with unknown format %1").arg(str));
+ return false;
+ }
+
+ } else if (stat == StationListInfo) {
+
+ } else if (stat == StationListInfoMaintainer) {
+
+ m_metaData.maintainer = str;
+
+ } else if (stat == StationListInfoCountry) {
+
+ m_metaData.country = str;
+
+ } else if (stat == StationListInfoCity) {
+
+ m_metaData.city = str;
+
+ } else if (stat == StationListInfoMedia) {
+
+ m_metaData.media = str;
+
+ } else if (stat == StationListInfoComments) {
+
+ m_metaData.comment = str;
+
+ } else if (stat == StationListInfoChanged) {
+
+ m_metaData.lastChange = TQDateTime::fromString(str, Qt::ISODate);
+
+ } else if (stat == StationListInfoCreator) {
+
+ // do nothing
+
+ // stations
+
+ } else if (m_newStation && m_newStation->getClassName() != stat) {
+
+ if (!m_newStation->setProperty(stat, str)) {
+ m_logger.logWarning("StationListXmlHandler::characters: " +
+ i18n("unknown property %1 for class %2")
+ .arg(stat)
+ .arg(m_newStation->getClassName()));
+ }
+
+ } else if (str.length()) {
+ m_logger.logError("StationListXmlHandler::characters: " +
+ i18n("characters ignored for element %1").arg(stat));
+ }
+ return true;
+}
+
+
+void StationListXmlHandler::clearNewStation()
+{
+ if (m_newStation)
+ delete m_newStation;
+ m_newStation = NULL;
+}