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