diff options
-rw-r--r-- | qt-ui/configuredivecomputer.cpp | 93 | ||||
-rw-r--r-- | qt-ui/configuredivecomputer.h | 5 | ||||
-rw-r--r-- | qt-ui/configuredivecomputerdialog.cpp | 28 | ||||
-rw-r--r-- | qt-ui/configuredivecomputerdialog.h | 2 |
4 files changed, 115 insertions, 13 deletions
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 <QDebug> #include <QFile> +#include <libxml/parser.h> +#include <libxml/parserInternals.h> +#include <libxml/tree.h> +#include <libxslt/transform.h> +#include <QStringList> 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 += "<backup>"; - xml += "\n<divecomputer vendor='" + vendor - + "' model = '" + product + "'" - + " />"; - xml += "\n<settings>"; - xml += "\n<setting name='CustomText' value = '" + details->customText() + "' />"; - xml += "\n<setting name='Brightness' value = '" + QString::number(details->brightness()) + "' />"; - xml += "\n<setting name='Language' value = '" + QString::number(details->language()) + "' />"; - xml += "\n<setting name='DateFormat' value = '" + QString::number(details->dateFormat()) + "' />"; - xml += "\n</settings>"; - xml += "\n</backup>"; + xml += "<DiveComputerSettingsBackup>"; + xml += "\n<DiveComputer>"; + xml += addSettingToXML("Vendor", vendor); + xml += addSettingToXML("Product", product); + xml += "\n</DiveComputer>"; + xml += "\n<Settings>"; + xml += addSettingToXML("CustomText", details->customText()); + xml += addSettingToXML("Brightness", details->brightness()); + xml += addSettingToXML("Language", details->language()); + xml += addSettingToXML("DateFormat", details->dateFormat()); + xml += "\n</Settings>"; + xml += "\n</DiveComputerSettingsBackup>"; 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() + "</" + settingName + ">"; +} + 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 <QDateTime> +#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; |