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