Revert "Removed onlinepollerthread"
[irwi] / src / remotedbmgr.cpp
1 #include "remotedbmgr.h"
2
3 #include <QFile> 
4 #include <QDomElement> 
5 #include <QDomNodeList> 
6 #include <QSettings> 
7 #include <QNetworkReply>
8 #include <QUrl>
9 #include <QNetworkRequest>
10 #include <QBuffer>
11 #include <QByteArray>
12
13 RemoteDBMgr::RemoteDBMgr()
14 {
15     connect(&netAM, SIGNAL(finished(QNetworkReply *)), 
16             this, SLOT(dbDownloadFinished(QNetworkReply *)));
17 }
18
19 RemoteDBMgr::~RemoteDBMgr()
20 {
21     foreach(MfgMap mfgMap, db.values()) {
22         foreach(RemoteList list, mfgMap.values()) {
23             qDeleteAll(list);
24         }
25     }
26 }
27
28 void RemoteDBMgr::getDBAsync()
29 {
30     if (db.isEmpty() && !processing) {
31         QSettings settings(this);
32         netAM.get(QNetworkRequest(QUrl(settings.value("baseUrl",
33             "http://mercury.wipsl.com/irwi/").toString() + "db/db.xml")));
34     } else {
35         emit dbReady(&db);
36     }
37
38 }
39
40 void RemoteDBMgr::dbDownloadFinished(QNetworkReply *reply)
41 {
42     if (processing = (reply->error() == QNetworkReply::NoError)) {
43         QByteArray ba = reply->readAll();
44         QBuffer buf(&ba);
45         buf.open(QIODevice::ReadOnly);
46         buf.seek(0);
47         QDomDocument doc;
48         doc.setContent(&buf);
49         parse(doc);
50
51         if (!db.isEmpty()) {
52             emit dbReady(&db);
53         }
54     }
55     processing = false;
56 }
57
58 void RemoteDBMgr::parse(QDomDocument &doc)
59 {
60     QDomNodeList chars = doc.elementsByTagName("char");
61
62     for (int i = 0; i < chars.size(); ++i) {
63         QDomElement charEl = chars.at(i).toElement();
64         if (!charEl.isNull()) {
65             if (charEl.hasAttribute("id"))
66                 db.insert(charEl.attribute("id"), parseMfgMap(charEl));
67         }
68     }
69 }
70
71 MfgMap RemoteDBMgr::parseMfgMap(QDomElement &charEl)
72 {
73     MfgMap mfgMap;
74     QDomNodeList mfgs = charEl.elementsByTagName("mfg");
75
76     for (int i = 0; i < mfgs.size(); ++i) {
77         QDomElement mfgEl = mfgs.at(i).toElement();
78         if (!mfgEl.isNull()) {
79             if (mfgEl.hasAttribute("id")) {
80                 mfgMap.insert(mfgEl.attribute("id"), parseRemotes(mfgEl));
81             }
82         }
83     }
84     return mfgMap;
85 }
86
87 RemoteList RemoteDBMgr::parseRemotes(QDomElement &mfgEl)
88 {
89     RemoteList remotes;
90     QDomNodeList models = mfgEl.elementsByTagName("model");
91
92     for (int i = 0; i < models.size(); ++i) {
93         QDomElement modelEl = models.at(i).toElement();
94         if (!modelEl.isNull()) {
95             if (modelEl.hasAttribute("name")
96                 && modelEl.hasAttribute("rating")
97                 && modelEl.hasAttribute("vote_count")) {
98                 remotes << new Remote(modelEl.attribute("name"),
99                                       mfgEl.attribute("id"),
100                                       modelEl.attribute("rating").toInt(),
101                                       modelEl.attribute("vote_count").toInt());
102             }
103         }
104     }
105     return remotes;
106 }
107
108