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