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