From eae981fe277e602eebf11259670f3c164d825418 Mon Sep 17 00:00:00 2001 From: Toni Jussila Date: Mon, 1 Mar 2010 14:07:51 +0200 Subject: [PATCH] XML handler. --- Client/xmlreader.cpp | 137 ++++++++++++++++++++++++++++++++++++++++++++++++++ Client/xmlreader.h | 25 +++++++++ Client/xmlwriter.cpp | 133 ++++++++++++++++++++++++++++++++++++++++++++++++ Client/xmlwriter.h | 27 ++++++++++ 4 files changed, 322 insertions(+) create mode 100644 Client/xmlreader.cpp create mode 100644 Client/xmlreader.h create mode 100644 Client/xmlwriter.cpp create mode 100644 Client/xmlwriter.h diff --git a/Client/xmlreader.cpp b/Client/xmlreader.cpp new file mode 100644 index 0000000..cf86ef1 --- /dev/null +++ b/Client/xmlreader.cpp @@ -0,0 +1,137 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#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 index 0000000..4b19bfa --- /dev/null +++ b/Client/xmlreader.h @@ -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 index 0000000..f7b02cd --- /dev/null +++ b/Client/xmlwriter.cpp @@ -0,0 +1,133 @@ +#include +#include +//#include +#include +#include +#include +#include +#include +#include +#include +#include +#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(""); + 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 index 0000000..8f7ccda --- /dev/null +++ b/Client/xmlwriter.h @@ -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 resultmap; + Ui_MainWindow* ui; + +public slots: + bool writeXmlFile(QIODevice* device); + void writeItems(); + void initResultmap(); + void fillResultmap(); + void xmlWrite(); + +}; + +#endif // XMLWRITER_H -- 1.7.9.5