RemoteDBMgr implementation
authorJari Jarvi <t7jaja00@students.oamk.fi>
Fri, 18 Jun 2010 12:24:22 +0000 (15:24 +0300)
committerJari Jarvi <t7jaja00@students.oamk.fi>
Fri, 18 Jun 2010 12:24:22 +0000 (15:24 +0300)
src/remotedb.h
src/remotedbmgr.cpp [new file with mode: 0644]
src/remotedbmgr.h

index 26fc559..c03189e 100644 (file)
@@ -8,7 +8,9 @@
 #include "remote.h"
 
 typedef QList <Remote> RemoteList;
+        // Mfgname
 typedef QMap <QString, RemoteList> MfgMap;
+        // Initial letter
 typedef QMap <QString, MfgMap> RemoteDB;
 
 #endif
diff --git a/src/remotedbmgr.cpp b/src/remotedbmgr.cpp
new file mode 100644 (file)
index 0000000..6a4865d
--- /dev/null
@@ -0,0 +1,101 @@
+#include "remotedbmgr.h"
+
+#include <QFile> 
+#include <QDomElement> 
+#include <QDomNodeList> 
+#include <QSettings> 
+#include <QNetworkReply>
+#include <QUrl>
+#include <QNetworkRequest>
+
+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;
+}
+
+
index 26b36bf..7d5a99e 100644 (file)
@@ -2,20 +2,24 @@
 #define REMOTEDBMGR_H
 
 #include <QObject>
-
+#include <QNetworkAccessManager>
 #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