From 4ca7c5364ee396a0dd1674f9b07286ec66d6cc5e Mon Sep 17 00:00:00 2001 From: Jari Jarvi Date: Fri, 18 Jun 2010 15:24:22 +0300 Subject: [PATCH] RemoteDBMgr implementation --- src/remotedb.h | 2 + src/remotedbmgr.cpp | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/remotedbmgr.h | 12 ++++-- 3 files changed, 111 insertions(+), 4 deletions(-) create mode 100644 src/remotedbmgr.cpp diff --git a/src/remotedb.h b/src/remotedb.h index 26fc559..c03189e 100644 --- a/src/remotedb.h +++ b/src/remotedb.h @@ -8,7 +8,9 @@ #include "remote.h" typedef QList RemoteList; + // Mfgname typedef QMap MfgMap; + // Initial letter typedef QMap RemoteDB; #endif diff --git a/src/remotedbmgr.cpp b/src/remotedbmgr.cpp new file mode 100644 index 0000000..6a4865d --- /dev/null +++ b/src/remotedbmgr.cpp @@ -0,0 +1,101 @@ +#include "remotedbmgr.h" + +#include +#include +#include +#include +#include +#include +#include + +RemoteDBMgr::RemoteDBMgr() +{ + connect(netAM, SIGNAL(finished(QNetworkReply *)), + this, SLOT(dbDownloadFinished(QNetworkReply *))); +} + +RemoteDBMgr::~RemoteDBMgr() +{ +} + +void RemoteDBMgr::getDBAsync() +{ + if (db.isEmpty()) { + QSettings settings(this); + netAM.get(QNetworkRequest(QUrl(settings.value("dbUrl", + "http://mercury.wipsl.com/irwi/db/db.xml").toString()))); + } else { + emit dbReady(&db); + } + +} + +void RemoteDBMgr::dbDownloadFinished(QNetworkReply *reply) +{ + if (reply->error() == QNetworkReply::NoError) { + QByteArray ba = reply->readAll(); + QBuffer buf(&ba); + buf.open(QIODevice::ReadOnly); + buf.seek(0); + QDomDocument doc; + doc.setContent(&buf); + parse(doc); + + if (!db.isEmpty()) { + emit dbReady(&db); + } + } +} + +void RemoteDBMgr::parse(QDomDocument &doc) +{ + QDomNodeList chars = doc.elementsByTagName("char"); + + for (int i = 0; i < chars.size(); ++i) { + QDomElement charEl = chars.at(i).toElement(); + if (!charEl.isNull()) { + if (charEl.hasAttribute("id")) + db.insert(charEl.attribute("id"), parseMfgMap(charEl)); + } + } +} + +MfgMap RemoteDBMgr::parseMfgMap(QDomElement &charEl) +{ + MfgMap mfgMap; + QDomNodeList mfgs = charEl.elementsByTagName("mfg"); + + for (int i = 0; i < mfgs.size(); ++i) { + QDomElement mfgEl = mfgs.at(i).toElement(); + if (!mfgEl.isNull()) { + if (mfgEl.hasAttribute("id")) { + mfgMap.insert(mfgEl.attribute("id"), parseRemotes(mfgEl)); + } + } + } + return mfgMap; +} + +RemoteList RemoteDBMgr::parseRemotes(QDomElement &mfgEl) +{ + RemoteList remotes; + QDomNodeList models = mfgEl.elementsByTagName("model"); + + for (int i = 0; i < models.size(); ++i) { + QDomElement modelEl = models.at(i).toElement(); + if (!modelEl.isNull()) { + if (modelEl.hasAttribute("id") + && modelEl.hasAttribute("name") + && modelEl.hasAttribute("rating") + && modelEl.hasAttribute("vote_count")) { + remotes << Remote(modelEl.attribute("name"), + modelEl.attribute("id"), + modelEl.attribute("rating").toInt(), + modelEl.attribute("vote_count").toInt()); + } + } + } + return remotes; +} + + diff --git a/src/remotedbmgr.h b/src/remotedbmgr.h index 26b36bf..7d5a99e 100644 --- a/src/remotedbmgr.h +++ b/src/remotedbmgr.h @@ -2,20 +2,24 @@ #define REMOTEDBMGR_H #include - +#include #include "remotedb.h" -class RemoteDBMgr : QObject +class RemoteDBMgr : public QObject { Q_OBJECT public: RemoteDBMgr(); ~RemoteDBMgr(); - void getDbAsync(); + void getDBAsync(); signals: - void dbReady(RemoteDB*); + void dbReady(RemoteDB *); + +private: + RemoteDB db; + QNetworkAccessManager netAM; }; #endif -- 1.7.9.5