XML handler.
authorToni Jussila <toni.jussila@gmail.com>
Mon, 1 Mar 2010 12:07:51 +0000 (14:07 +0200)
committerToni Jussila <toni.jussila@gmail.com>
Mon, 1 Mar 2010 12:07:51 +0000 (14:07 +0200)
Client/xmlreader.cpp [new file with mode: 0644]
Client/xmlreader.h [new file with mode: 0644]
Client/xmlwriter.cpp [new file with mode: 0644]
Client/xmlwriter.h [new file with mode: 0644]

diff --git a/Client/xmlreader.cpp b/Client/xmlreader.cpp
new file mode 100644 (file)
index 0000000..cf86ef1
--- /dev/null
@@ -0,0 +1,137 @@
+#include <QtGui>
+#include <QNetworkRequest>
+#include <QNetworkReply>
+#include <QIODevice>
+#include <QFile>
+#include <QMessageBox>
+#include <QDebug>
+#include <QDateTime>
+#include <QDate>
+#include <QTime>
+#include <QApplication>
+#include "xmlreader.h"
+
+
+/*! @brief Constructor, connects object to GUI
+ */
+XmlReader::XmlReader(Ui_MainWindow* myMainWindow)
+{
+    ui = myMainWindow;
+}
+
+/*! @brief Destructor
+  */
+XmlReader::~XmlReader()
+{
+
+}
+
+QString XmlReader::errorString() const
+{
+    return QObject::tr("%1\nLine %2, column %3")
+            .arg(xmlreader.errorString())
+            .arg(xmlreader.lineNumber())
+            .arg(xmlreader.columnNumber());
+}
+
+
+/*! @brief parsing xml file that is sent by server over network.
+  * Shows received information on screen and parsed information on command line.
+  * @note Partly commented for git.
+  * @todo (Development: Seems to omit element tags and some values when reading from QFile. Why? This used
+  * earlier with QNetworkReply printed all xml contents.)
+  * @todo Remove command line output and use final GUI widget names.
+  * @todo Replace using of QFile to QNetworkReply.
+  */
+void XmlReader::xmlRead(QIODevice *device)
+//void XmlReader::xmlRead(QNetworkReply *device)
+{
+    qDebug() << "_xmlRead";
+
+    xmlreader.addData(device->readAll());
+    //Or: View webpage contents on textEdit by adding all data to xml stream reader,
+    //since readAll() empties the buffer
+    /*QByteArray readAllArr = device->readAll();
+    ui->textEditXml->append(readAllArr);
+    xmlreader.addData(readAllArr);*/
+
+    //Go trough the xml document
+    while(!xmlreader.atEnd())
+    {
+        //Read next node
+        xmlreader.readNext();
+        //Check if this element is starting element
+        if(xmlreader.isStartElement())
+        {
+            if(xmlreader.name() == "place")
+            {
+                qDebug() << xmlreader.name();
+            }
+            if(xmlreader.name() == "date")
+            {
+                 qDebug() << xmlreader.name();
+            }
+            if(xmlreader.name() == "time")
+            {
+                 qDebug() << xmlreader.name();
+            }
+            if(xmlreader.name() == "result")
+            {
+                //Two consequent start elements
+                if(xmlreader.readNextStartElement())
+                {
+                    if(xmlreader.name() == "speed")
+                    {
+                    QString speed;
+                    QXmlStreamAttributes attr = xmlreader.attributes();
+                    speed = (attr.value("value").toString() + " " + attr.value("unit").toString());
+                    //ui->lineEditSpeed->setText(speed);
+                    qDebug() << xmlreader.name() << speed;
+                    }
+                }
+            }
+            if(xmlreader.name() == "distance")
+            {
+                QString distance;
+                QXmlStreamAttributes attr = xmlreader.attributes();
+                distance = (attr.value("value").toString() + " " + attr.value("unit").toString());
+                //ui->lineEditDist->setText(distance);
+                qDebug() << xmlreader.name() << distance;
+            }
+            if(xmlreader.name() == "acceleration")
+            {
+                QString acceleration;
+                QXmlStreamAttributes attr = xmlreader.attributes();
+                acceleration = (attr.value("value").toString()+ " " + attr.value("unit").toString());
+                //ui->lineEditAccel->setText(acceleration);
+                qDebug() << xmlreader.name() << acceleration;
+            }
+        }
+    }
+}
+
+/*! @brief A function used tmp in development.
+  * @note Partly harcoded and commented for git.
+  */
+void XmlReader::xmlShow()
+{
+    //QString filename = ui->lineEditFile->text();
+    QString filename = "xmlfile.xml";
+    QFile file(filename);
+
+    if (!file.open(QFile::ReadOnly))
+    {
+        /*QMessageBox::warning(this->ui->centralWidget,
+                                tr("QXmlStream Bookmarks"),
+                                tr("Cannot write file %1:\n%2.")
+                                .arg(file.fileName())
+                                .arg(file.errorString()));*/
+        qDebug() << "_xmlShow fail";
+        return;
+    }
+
+    xmlRead(&file);
+
+    file.close();
+}
+
diff --git a/Client/xmlreader.h b/Client/xmlreader.h
new file mode 100644 (file)
index 0000000..4b19bfa
--- /dev/null
@@ -0,0 +1,25 @@
+#ifndef XMLREADER_H
+#define XMLREADER_H
+
+#include "ui_mainwindow.h"
+
+
+class XmlReader : public QObject
+{
+public:
+    XmlReader(Ui_MainWindow* myMainWindow);
+    ~XmlReader();
+    QString errorString() const;
+
+private:
+    QXmlStreamReader xmlreader;
+    Ui_MainWindow* ui;
+
+public slots:
+    //void xmlRead(QNetworkReply *device);
+    void xmlRead(QIODevice* device);
+    void xmlShow();
+
+};
+
+#endif // XMLREADER_H
diff --git a/Client/xmlwriter.cpp b/Client/xmlwriter.cpp
new file mode 100644 (file)
index 0000000..f7b02cd
--- /dev/null
@@ -0,0 +1,133 @@
+#include <QtGui>
+#include <QNetworkRequest>
+//#include <QNetworkReply>
+#include <QIODevice>
+#include <QFile>
+#include <QMessageBox>
+#include <QDebug>
+#include <QDateTime>
+#include <QDate>
+#include <QTime>
+#include <QApplication>
+#include "xmlwriter.h"
+
+
+/*! @brief Constructor, connects object to GUI
+ */
+XmlWriter::XmlWriter(Ui_MainWindow* myMainWindow)
+{
+    ui = myMainWindow;
+}
+
+
+/*! @brief Destructor
+  */
+XmlWriter::~XmlWriter()
+{
+
+}
+
+/*! @brief Opens and closes a file, when xml information is written into a file,
+  * and passes file to writeXmlFile()
+  * @note Partly harcoded and commented for git.
+  * @todo Replace hardcoced filename and GUI elements to finally used widgets.
+  */
+void XmlWriter::xmlWrite()
+{
+    //QString filename = ui->lineEditFile->text();
+    QString filename = "xmlfile.xml";
+    QFile file(filename);
+    if (!file.open(QFile::WriteOnly | QFile::Text)) {
+        /*QMessageBox::warning(this->ui->centralWidget, tr("QXmlStream Bookmarks"),
+                             tr("Cannot write file %1:\n%2.")
+                             .arg(filename)
+                             .arg(file.errorString()));
+                             */
+        qDebug() << "_xmlWrite fail";
+        return;
+    }
+
+    writeXmlFile(&file);
+    file.close();
+}
+
+/*! @brief Writes general xml information.
+  * @todo Check API connection to QBuffer, when Speed Freek network client has been written.
+  */
+bool XmlWriter::writeXmlFile(QIODevice *device)
+//bool XmlWriter::writeXmlFile(QBuffer *device)
+{
+    xmlwriter.setDevice(device);
+    xmlwriter.writeStartDocument();
+    xmlwriter.writeDTD("<!DOCTYPE xml>");
+    xmlwriter.writeStartElement("xml");
+    xmlwriter.writeAttribute("version", "1.0");
+    writeItems();
+    xmlwriter.writeEndDocument();
+
+    return true;
+}
+
+/*! @brief Writes Speed Freek application specific items as tags and contents.
+  * @brief Results of speed/ direction/ acceleration into QMap are calculated elsewhere
+  * @todo Consider looping of writing QMap values.
+  * @todo Replace hardcoced names to finally used GUI elements.
+  */
+void XmlWriter::writeItems()
+{
+    //xmlwriter.writeCharacters(ui->lineEditPlace->text());
+    //Temporarily:
+    xmlwriter.writeStartElement("place");
+    xmlwriter.writeCharacters("rallirata");
+    xmlwriter.writeEndElement();
+
+    xmlwriter.writeStartElement("date");
+    xmlwriter.writeCharacters(QDate::currentDate().toString());
+    xmlwriter.writeEndElement();
+
+    xmlwriter.writeStartElement("time");
+    xmlwriter.writeCharacters(QTime::currentTime().toString());
+    xmlwriter.writeEndElement();
+
+    /* Or combined:
+    xmlwriter.writeStartElement("datetime");
+    xmlwriter.writeCharacters(QDateTime::currentDateTime().toString());
+    xmlwriter.writeEndElement(); */
+
+    xmlwriter.writeStartElement("result");
+    xmlwriter.writeStartElement("speed");
+    xmlwriter.writeAttribute("value", QString::number(resultmap.value("speed")));
+    xmlwriter.writeAttribute("unit", "m/s");
+    xmlwriter.writeEndElement();
+    xmlwriter.writeStartElement("distance");
+    xmlwriter.writeAttribute("value", QString::number(resultmap.value("distance")));
+    xmlwriter.writeAttribute("unit", "m");
+    xmlwriter.writeEndElement();
+    xmlwriter.writeStartElement("acceleration");
+    xmlwriter.writeAttribute("value", QString::number(resultmap.value("acceleration")));
+    xmlwriter.writeAttribute("unit", "m/s2");
+    xmlwriter.writeEndElement();
+    xmlwriter.writeEndElement();    //result
+    //or:
+    //xmlwriter.writeTextElement("speed", QString::number(resultmap.value("speed")) + " m/s");
+    //xmlwriter.writeTextElement("distance", QString::number(resultmap.value("distance")) + " m");
+    //xmlwriter.writeTextElement("acceleration", QString::number(resultmap.value("acceleration")) + " m/s2");
+}
+
+/*! @brief Initializes QMap by zeroing values for a new measurement.
+  */
+void XmlWriter::initResultmap()
+{
+    resultmap["acceleration"] = 0;
+    resultmap["speed"] = 0;
+    resultmap["distance"] = 0;
+}
+
+/*! @brief A temp function during development, used until real QMap available.
+  */
+void XmlWriter::fillResultmap()
+{
+    resultmap["acceleration"] = 9;
+    resultmap["speed"] = 48;
+    resultmap["distance"] = 600;
+}
diff --git a/Client/xmlwriter.h b/Client/xmlwriter.h
new file mode 100644 (file)
index 0000000..8f7ccda
--- /dev/null
@@ -0,0 +1,27 @@
+#ifndef XMLWRITER_H
+#define XMLWRITER_H
+
+#include "ui_mainwindow.h"
+
+
+class XmlWriter : public QObject
+{
+public:
+    XmlWriter(Ui_MainWindow* myMainWindow);
+    ~XmlWriter();
+
+private:
+    QXmlStreamWriter xmlwriter;
+    QMap<QString, int> resultmap;
+    Ui_MainWindow* ui;
+
+public slots:
+    bool writeXmlFile(QIODevice* device);
+    void writeItems();
+    void initResultmap();
+    void fillResultmap();
+    void xmlWrite();
+
+};
+
+#endif // XMLWRITER_H