0bdfbe47a676734f1bc60ef353a06f4e19f6cfd3
[evehomescreen] / src / skilltree.cpp
1 #include "skilltree.h"
2 #include <QFile>
3 #include <QDataStream>
4 #include <QNetworkAccessManager>
5 #include <QNetworkReply>
6 #include <QNetworkRequest>
7 #include <QtDebug>
8 #include <QXmlStreamReader>
9 #include <assert.h>
10
11 SkillTree::SkillTree(QObject *parent) :
12     QObject(parent),
13     mgr(0),
14     reply(0)
15 {
16     QFile cacheFile("/var/tmp/skillCache");
17     if (cacheFile.exists()) {
18         QDataStream input(&cacheFile);
19         input >> skillNames;
20     } else {
21         // load from network
22
23     }
24
25 }
26
27 void SkillTree::loadSkills()
28 {
29     QFile cacheFile("/var/tmp/skillCache");
30     if (cacheFile.exists()) {
31         cacheFile.open(QIODevice::ReadOnly);
32         qDebug() << "Load from file";
33         QDataStream input(&cacheFile);
34         input >> skillNames;
35         emit skillsLoaded();
36     } else {
37         // load from network
38         qDebug() << "load skills from network";
39         mgr = new QNetworkAccessManager(this);
40         QNetworkRequest req(QUrl("http://api.eveonline.com//eve/SkillTree.xml.aspx"));
41         reply = mgr->get(req);
42         connect(reply,SIGNAL(finished()),this,SLOT(replyReady()));
43     }
44 }
45
46 void SkillTree::replyReady()
47 {
48     qDebug() << "Reply ready";
49     if (!reply->error()) {
50         QByteArray replyContent = reply->readAll();
51         qDebug() << replyContent;
52         fromXml(replyContent);
53         emit skillsLoaded();
54     } else {
55         qDebug() << "fetch error:" << reply->errorString();
56     }
57 }
58
59 void SkillTree::fromXml(QByteArray &content)
60 {
61     QXmlStreamReader xml(content);
62     xml.readNextStartElement(); //eveapi
63     //assert(xml.name() == "eveapi");
64     xml.readNextStartElement(); //currentTime
65     xml.skipCurrentElement();
66     //assert(xml.name() == "currentTime");
67     xml.readNextStartElement(); //result
68     xml.readNextStartElement(); // rowset for skill groups
69     bool groupsLeft = xml.readNextStartElement(); // row for skill group
70     while (groupsLeft) {
71         xml.readNextStartElement(); // rowset for skills
72         bool skillsLeft = xml.readNextStartElement(); // row for skill
73         while (skillsLeft) {
74             assert(xml.name() == "row");
75             QString name = xml.attributes().value("","typeName").toString();
76             int typeId = xml.attributes().value("","typeID").toString().toInt();
77             qDebug() << "Found skill " << name << ":" << typeId;
78             skillNames[typeId] = name;
79
80             xml.skipCurrentElement(); // description
81             skillsLeft = xml.readNextStartElement(); // next skill row
82         }
83         xml.readNextStartElement(); // rowset ends
84         groupsLeft = xml.readNextStartElement(); // next skill group row
85     }
86     int len = 0;
87     QString name;
88     QString longestName;
89     foreach (name,skillNames) {
90         if (name.length() > len) {
91             longestName = name;
92             len = name.length();
93         }
94     }
95
96     qDebug() << skillNames;
97     qDebug() << longestName;
98 }
99
100 void SkillTree::save()
101 {
102     QFile cache("/var/tmp/skillCache");
103     cache.open(QIODevice::WriteOnly);
104     QDataStream output(&cache);
105     output << skillNames;
106     cache.flush();
107     cache.close();
108 }
109