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