Routing of server results on GUI.
[speedfreak] / Client / xmlwriter.cpp
1 /*
2  * Xml writer
3  *
4  * @author     Tiina Kivilinna-Korhola
5  * @copyright  (c) 2010 Speed Freak team
6  * license     http://opensource.org/licenses/gpl-license.php GNU Public License
7  */
8
9 #include "xmlwriter.h"
10
11
12
13 /**
14   *@brief Constructor, connects object to GUI
15   *@param Pointer to carmainwindow, which is temporarily used during development
16   */
17 XmlWriter::XmlWriter()
18 {
19     tmpvalue = 110;
20     trackInd = 0;
21 }
22
23 /**
24   *@brief Destructor
25   */
26 XmlWriter::~XmlWriter()
27 {
28
29 }
30
31 /**
32   *@brief Writes registration items into tags.
33   *@param netbuf a buffer where xmlstreamwriter writes to.
34   *@param usr for user name.
35   *@param psswd for password.
36   *@param email.
37   */
38 void XmlWriter::writeRegistering(QBuffer *netbuf, QString usr, QString psswd, QString email)
39 {
40     qDebug() << "_writeRegistering";
41
42     xmlwriter.setDevice(netbuf);
43
44     xmlwriter.writeStartDocument();
45     xmlwriter.writeStartElement("user");
46
47     xmlwriter.writeStartElement("login");
48     xmlwriter.writeCharacters(usr);
49     xmlwriter.writeEndElement();
50
51     xmlwriter.writeStartElement("password");
52     xmlwriter.writeCharacters(psswd);
53     xmlwriter.writeEndElement();
54
55     xmlwriter.writeStartElement("email");
56     xmlwriter.writeCharacters(email);
57     xmlwriter.writeEndElement();
58
59     xmlwriter.writeEndElement();
60     xmlwriter.writeEndDocument();
61 }
62
63
64 /**
65   *@brief Writes Speed Freek results items as tags and contents into a buffer.
66   *@todo Consider looping when writing many values.
67   *@todo Replace test value to finally used variables.
68   */
69 void XmlWriter::writeResult(QBuffer *netbuf)
70 {
71     qDebug() << "_writeResult";
72
73     xmlwriter.setDevice(netbuf);
74
75     xmlwriter.writeStartDocument();
76     xmlwriter.writeStartElement("result");
77     tmpvalue++;
78     qDebug() << tmpvalue;
79     xmlwriter.writeAttribute("value", QString::number(tmpvalue));
80     xmlwriter.writeEndElement();
81     xmlwriter.writeEndDocument();
82 }
83
84
85 /**
86   *@brief Write track to server.
87   *@param Starting index of gps results table.
88   *@param Ending index of gps results table.
89   *@todo Connect to real values.
90   *@todo Decide suitable parameters.
91   */
92 void XmlWriter::writeGpsTrack(int startInd, int stopInd)
93 {
94     qDebug() << "_writeGpsTrack";
95     analyzeGpsData();
96
97     int i = 0;
98
99     xmlwriter.writeStartElement("gpx");
100     xmlwriter.writeAttribute("someattribute", "abc");
101     xmlwriter.writeAttribute("otherattribute", "cde");
102
103     xmlwriter.writeStartElement("metadata");
104     xmlwriter.writeStartElement("link");
105     xmlwriter.writeAttribute("href", "http://api.speedfreak-app.com/api/track");
106     xmlwriter.writeCharacters("Speed Freak");
107     xmlwriter.writeEndElement();
108     xmlwriter.writeStartElement("time");
109     xmlwriter.writeCharacters(QDateTime::currentDateTime().toString());
110     xmlwriter.writeEndElement();
111     xmlwriter.writeEndElement();    //metadata
112
113     xmlwriter.writeStartElement("trk");
114     xmlwriter.writeStartElement("name");
115     xmlwriter.writeCharacters("Example Track");
116     xmlwriter.writeEndElement();
117     xmlwriter.writeStartElement("trkseg");
118     for(i = startInd; i < (stopInd - startInd); i++) {
119         xmlwriter.writeStartElement("trkpt");
120         xmlwriter.writeAttribute("lat", QString::number(trackTable[i].latitude));
121         xmlwriter.writeAttribute("lon", QString::number(trackTable[i].longitude));
122         xmlwriter.writeStartElement("ele");
123         xmlwriter.writeCharacters(QString::number(trackTable[i].altitude));
124         xmlwriter.writeEndElement();
125         xmlwriter.writeStartElement("time");
126         xmlwriter.writeCharacters(QString::number(trackTable[i].time));
127         xmlwriter.writeEndElement();
128         xmlwriter.writeStartElement("speed");
129         xmlwriter.writeCharacters(QString::number(trackTable[i].speed));
130         xmlwriter.writeEndElement();
131         xmlwriter.writeStartElement("track");
132         xmlwriter.writeCharacters(QString::number(trackTable[i].track));
133         xmlwriter.writeEndElement();
134         xmlwriter.writeEndElement();    //trkpt
135     }
136     xmlwriter.writeEndElement();    //trkseg
137     xmlwriter.writeEndElement();    //trk
138     xmlwriter.writeEndElement();    //gpx
139 }
140
141
142 /**
143   *@brief Opens and closes a file, when xml information is written into a file,
144   *and passes file to writeXmlFile()
145   *@param usr for user name.
146   *@param psswd for password.
147   *@param email.
148   *@todo Replace hardcoced filename to finally GUI entry widget.
149   */
150 //void XmlWriter::writeXml(QString usr, QString psswd, QString email)
151 void XmlWriter::writeXml()
152 {
153     QString filename = "xmlcategoryfile.xml";
154     QFile file(filename);
155     if (!file.open(QFile::WriteOnly | QFile::Text)) {
156         qDebug() << "_xmlWrite fail";
157         return;
158     }
159
160     writeXmlFile(&file);
161     //writeRegistering(&file, usr, psswd, email);
162     //writeResult(&file);
163     file.close();
164 }
165
166 /**
167   *@brief Writes general xml information.
168   *Calls other functions to insert login and result information.
169   *@param device: target of writing, here filename.
170   *@param usr for user name.
171   *@param psswd for password.
172   *@param email.
173   */
174 bool XmlWriter::writeXmlFile(QIODevice *device)
175 {
176     xmlwriter.setDevice(device);
177     xmlwriter.writeStartDocument();
178     //writeItems();
179     //serverWritesXml();
180     writeGpsTrack(0, 16);
181     xmlwriter.writeEndDocument();
182
183     return true;
184 }
185
186
187 /**
188   *@brief Writes Speed Freek results items as tags and contents to earlier defined target.
189   *@todo Consider looping when writing many values.
190   *@todo Replace testing values to finally used variabls.
191   */
192 void XmlWriter::writeItems()
193 {
194     xmlwriter.writeStartElement("result");
195     xmlwriter.writeAttribute("value", QString::number(14)); //tmp testing value
196     xmlwriter.writeAttribute("unit", "seconds");
197     xmlwriter.writeAttribute("date", QDateTime::currentDateTime().toString());
198     xmlwriter.writeEndElement();
199 }
200
201
202 /**
203   *@brief A temp function during development, used to create a "serverfile".
204   */
205 void XmlWriter::serverWritesXml()
206 {
207     /* Server sends to client */
208     /*
209     int i = 0;
210     int n = 5;
211
212     //Write top 10 Results
213     xmlwriter.writeStartElement("results");
214     xmlwriter.writeAttribute("category", "acceleration-0-40");
215     xmlwriter.writeAttribute("unit", "seconds");
216     xmlwriter.writeAttribute("description", "Acceleration from 0 to 100 km/h");
217
218     for (i = 0; i < n; i++) {
219         xmlwriter.writeStartElement("result");
220         xmlwriter.writeAttribute("position", QString::number(i));
221         xmlwriter.writeAttribute("user", "test123");
222         xmlwriter.writeAttribute("date", QDateTime::currentDateTime().toString());
223         xmlwriter.writeAttribute("value", QString::number(i+i+1));
224         xmlwriter.writeEndElement();
225     }
226     */
227     //Write categories
228     xmlwriter.writeStartElement("categories");
229
230     xmlwriter.writeStartElement("category");
231     xmlwriter.writeCharacters("acceleration-0-10");
232     xmlwriter.writeEndElement();
233
234     xmlwriter.writeStartElement("category");
235     xmlwriter.writeCharacters("acceleration-0-40");
236     xmlwriter.writeEndElement();
237
238     xmlwriter.writeStartElement("category");
239     xmlwriter.writeCharacters("acceleration-0-100");
240     xmlwriter.writeEndElement();
241
242     xmlwriter.writeEndElement();
243 }
244
245
246 /**
247   *@brief A temp function during development, used to create data for drawing route and for server.
248   */
249 void XmlWriter::analyzeGpsData()
250 {
251     qDebug() << "_analyzeGpsData";
252
253     double startTime;
254     int tableSize = 0;
255
256     qDebug() << "sizeof(analyzeTable)" << sizeof(analyzeTable);
257     tableSize = 16;
258
259     for(int i = 1; i < tableSize; i++)
260     {
261         //example of one feature whose consequent values are compared and saved if they differentiate too much
262         if(analyzeTable[i].speed < (analyzeTable[i-1].speed - 1) ||
263            analyzeTable[i].speed > (analyzeTable[i-1].speed + 1) )
264         {
265            trackTable[trackInd] = analyzeTable[i];
266            trackInd++;
267            qDebug() << "trackTable[trackInd].speed" << trackTable[trackInd].speed;
268         }
269     }
270 }
271
272 void XmlWriter::initPointTable(gpsPoint *table, int count, double add1, int add2, int add3)
273 {
274     qDebug() << "_initPointTable";
275
276     int i = 1;
277     int j = 0;
278
279     table[0].latitude = 67.00;
280     table[0].longitude = 27.50;
281     table[0].altitude = 7.00;
282     table[0].speed = 0;
283     table[0].time = 0;
284
285     for(j = 0; j < count; j++)
286     {
287         table[i].latitude = table[i-1].latitude + add1;
288         //table[i].longitude = table[i-1].longitude + add1;
289         table[i].altitude = table[i-1].altitude + add1;
290         table[i].speed = table[i-1].speed + add2;
291         table[i].track = table[i-1].track + 1;
292         table[i].time = table[i-1].time + add3;
293         i++;
294     }
295     for(j = 0; j < count; j++)
296     {
297         //table[i].latitude = table[i-1].latitude + add1;
298         table[i].longitude = table[i-1].longitude + add1;
299         table[i].altitude = table[i-1].altitude -add1;
300         table[i].speed = table[i-1].speed + add2;
301         table[i].track = table[i-1].track + 1;
302         table[i].time = table[i-1].time + add3;
303         i++;
304     }
305     for(j = 0; j < count; j++)
306     {
307         table[i].latitude = table[i-1].latitude - add1;
308         //table[i].longitude = table[i-1].longitude + add1;
309         table[i].altitude = table[i-1].altitude + add1;
310         table[i].speed = table[i-1].speed - add2;
311         table[i].track = table[i-1].track - 1;
312         table[i].time = table[i-1].time + add3;
313         i++;
314     }
315     for(j = 0; j < count; j++)
316     {
317         //table[i].latitude = table[i-1].latitude + add1;
318         table[i].longitude = table[i-1].longitude - add1;
319         table[i].altitude = table[i-1].altitude - add1;
320         table[i].speed = table[i-1].speed - add2;
321         table[i].track = table[i-1].track - 1;
322         table[i].time = table[i-1].time + add3;
323         i++;
324     }
325 }
326
327