From aad60ef6da3308960767a47cb750c2ba9aab54bd Mon Sep 17 00:00:00 2001 From: "Joseph W. Joshua" Date: Wed, 11 Jun 2014 09:37:27 +0300 Subject: Working XML Backup and Restore The ConfigureDiveComputer class now has functions for complete XML backup and restore. These dump the loaded settings on a dive computer to an XML file, and there is an option to restore them. Signed-off-by: Joseph W. Joshua Signed-off-by: Thiago Macieira --- qt-ui/configuredivecomputer.cpp | 93 ++++++++++++++++++++++++++++++----- qt-ui/configuredivecomputer.h | 5 +- qt-ui/configuredivecomputerdialog.cpp | 28 ++++++++++- qt-ui/configuredivecomputerdialog.h | 2 + 4 files changed, 115 insertions(+), 13 deletions(-) (limited to 'qt-ui') diff --git a/qt-ui/configuredivecomputer.cpp b/qt-ui/configuredivecomputer.cpp index 0d602c8e8..72f2427d4 100644 --- a/qt-ui/configuredivecomputer.cpp +++ b/qt-ui/configuredivecomputer.cpp @@ -2,6 +2,11 @@ #include "libdivecomputer/hw.h" #include #include +#include +#include +#include +#include +#include ConfigureDiveComputer::ConfigureDiveComputer(QObject *parent) : QObject(parent), @@ -49,17 +54,18 @@ bool ConfigureDiveComputer::saveXMLBackup(QString fileName, DeviceDetails *detai QString xml = ""; QString vendor = data->vendor; QString product = data->product; - xml += ""; - xml += "\n"; - xml += "\n"; - xml += "\n"; - xml += "\n"; - xml += "\n"; - xml += "\n"; - xml += "\n"; - xml += "\n"; + xml += ""; + xml += "\n"; + xml += addSettingToXML("Vendor", vendor); + xml += addSettingToXML("Product", product); + xml += "\n"; + xml += "\n"; + xml += addSettingToXML("CustomText", details->customText()); + xml += addSettingToXML("Brightness", details->brightness()); + xml += addSettingToXML("Language", details->language()); + xml += addSettingToXML("DateFormat", details->dateFormat()); + xml += "\n"; + xml += "\n"; QFile file(fileName); if (!file.open(QIODevice::WriteOnly)) { errorText = tr("Could not save the backup file %1. Error Message: %2") @@ -74,12 +80,77 @@ bool ConfigureDiveComputer::saveXMLBackup(QString fileName, DeviceDetails *detai return true; } +bool ConfigureDiveComputer::restoreXMLBackup(QString fileName, DeviceDetails *details, QString errorText) +{ + xmlDocPtr doc; + xmlNodePtr node; + xmlChar *key; + + doc = xmlParseFile(fileName.toUtf8().data()); + + if (doc == NULL) { + errorText = tr("Could not read the backup file."); + return false; + } + + node = xmlDocGetRootElement(doc); + if (node == NULL) { + errorText = tr("The specified file is invalid."); + xmlFreeDoc(doc); + return false; + } + + if (xmlStrcmp(node->name, (const xmlChar *) "DiveComputerSettingsBackup")) { + errorText = tr("The specified file does not contain a valid backup."); + xmlFreeDoc(doc); + return false; + } + + xmlNodePtr child = node->children; + + while (child != NULL) { + QString nodeName = (char *)child->name; + if (nodeName == "Settings") { + xmlNodePtr settingNode = child->children; + while (settingNode != NULL) { + QString settingName = (char *)settingNode->name; + key = xmlNodeListGetString(doc, settingNode->xmlChildrenNode, 1); + QString keyString = (char *)key; + if (settingName != "text") { + if (settingName == "CustomText") + details->setCustomText(keyString); + + if (settingName == "Brightness") + details->setBrightness(keyString.toInt()); + + if (settingName == "Language") + details->setLanguage(keyString.toInt()); + + if (settingName == "DateFormat") + details->setDateFormat(keyString.toInt()); + } + + settingNode = settingNode->next; + } + } + child = child->next; + } + + return true; +} + void ConfigureDiveComputer::setState(ConfigureDiveComputer::states newState) { currentState = newState; emit stateChanged(currentState); } + +QString ConfigureDiveComputer::addSettingToXML(QString settingName, QVariant value) +{ + return "\n<" + settingName + ">" + value.toString() + ""; +} + void ConfigureDiveComputer::setError(QString err) { lastError = err; diff --git a/qt-ui/configuredivecomputer.h b/qt-ui/configuredivecomputer.h index ca072e148..31c0cb756 100644 --- a/qt-ui/configuredivecomputer.h +++ b/qt-ui/configuredivecomputer.h @@ -8,6 +8,8 @@ #include "configuredivecomputerthreads.h" #include +#include "libxml/xmlreader.h" + class ConfigureDiveComputer : public QObject { Q_OBJECT @@ -31,6 +33,7 @@ public: void saveDeviceDetails(DeviceDetails *details, device_data_t *data); void fetchDeviceDetails(); bool saveXMLBackup(QString fileName, DeviceDetails *details, device_data_t *data, QString errorText); + bool restoreXMLBackup(QString fileName, DeviceDetails *details, QString errorText); signals: void message(QString msg); void error(QString err); @@ -43,7 +46,7 @@ private: ReadSettingsThread *readThread; WriteSettingsThread *writeThread; void setState(states newState); - + QString addSettingToXML(QString settingName, QVariant value); private slots: void readThreadFinished(); void writeThreadFinished(); diff --git a/qt-ui/configuredivecomputerdialog.cpp b/qt-ui/configuredivecomputerdialog.cpp index 71960b6f2..2f8771ed7 100644 --- a/qt-ui/configuredivecomputerdialog.cpp +++ b/qt-ui/configuredivecomputerdialog.cpp @@ -244,7 +244,7 @@ void ConfigureDiveComputerDialog::on_backupButton_clicked() QString errorText = ""; if (!config->saveXMLBackup(backupPath, deviceDetails, &device_data, errorText)) { QMessageBox::critical(this, tr("XML Backup Error"), - tr("An eror occurred while saving the backup file.\n%1") + tr("An error occurred while saving the backup file.\n%1") .arg(errorText) ); } else { @@ -255,3 +255,29 @@ void ConfigureDiveComputerDialog::on_backupButton_clicked() } } } + +void ConfigureDiveComputerDialog::on_restoreBackupButton_clicked() +{ + QString filename = existing_filename ?: prefs.default_filename; + QFileInfo fi(filename); + filename = fi.absolutePath().append(QDir::separator()).append("Backup.xml"); + QString restorePath = QFileDialog::getOpenFileName(this, tr("Restore Dive Computer Settings"), + filename, tr("Backup files (*.xml)") + ); + if (!restorePath.isEmpty()) { + QString errorText = ""; + if (!config->restoreXMLBackup(restorePath, deviceDetails, errorText)) { + QMessageBox::critical(this, tr("XML Restore Error"), + tr("An error occurred while restoring the backup file.\n%1") + .arg(errorText) + ); + } else { + reloadValues(); + //getDeviceData(); + //config->saveDeviceDetails(deviceDetails, &device_data); + QMessageBox::information(this, tr("Restore succeeded"), + tr("Your settings have been restored successfully.") + ); + } + } +} diff --git a/qt-ui/configuredivecomputerdialog.h b/qt-ui/configuredivecomputerdialog.h index 7312deec7..ee1eb4c99 100644 --- a/qt-ui/configuredivecomputerdialog.h +++ b/qt-ui/configuredivecomputerdialog.h @@ -33,6 +33,8 @@ private slots: void reloadValues(); void on_backupButton_clicked(); + void on_restoreBackupButton_clicked(); + private: Ui::ConfigureDiveComputerDialog *ui; -- cgit v1.2.3-70-g09d2