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