diff options
Diffstat (limited to 'configuredivecomputer.cpp')
-rw-r--r-- | configuredivecomputer.cpp | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/configuredivecomputer.cpp b/configuredivecomputer.cpp new file mode 100644 index 000000000..01df1c744 --- /dev/null +++ b/configuredivecomputer.cpp @@ -0,0 +1,209 @@ +#include "configuredivecomputer.h" +#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), + readThread(0), + writeThread(0) +{ + setState(INITIAL); +} + +void ConfigureDiveComputer::readSettings(device_data_t *data) +{ + setState(READING); + + if (readThread) + readThread->deleteLater(); + + readThread = new ReadSettingsThread(this, data); + connect (readThread, SIGNAL(finished()), + this, SLOT(readThreadFinished()), Qt::QueuedConnection); + connect (readThread, SIGNAL(error(QString)), this, SLOT(setError(QString))); + connect (readThread, SIGNAL(devicedetails(DeviceDetails*)), this, + SIGNAL(deviceDetailsChanged(DeviceDetails*))); + + readThread->start(); +} + +void ConfigureDiveComputer::saveDeviceDetails(DeviceDetails *details, device_data_t *data) +{ + setState(WRITING); + + if (writeThread) + writeThread->deleteLater(); + + writeThread = new WriteSettingsThread(this, data); + connect (writeThread, SIGNAL(finished()), + this, SLOT(writeThreadFinished()), Qt::QueuedConnection); + connect (writeThread, SIGNAL(error(QString)), this, SLOT(setError(QString))); + + writeThread->setDeviceDetails(details); + writeThread->start(); +} + +bool ConfigureDiveComputer::saveXMLBackup(QString fileName, DeviceDetails *details, device_data_t *data, QString errorText) +{ + QString xml = ""; + QString vendor = data->vendor; + QString product = data->product; + 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("DiveMode", details->diveMode()); + xml += addSettingToXML("Saturation", details->saturation()); + xml += addSettingToXML("Desaturation", details->desaturation()); + xml += addSettingToXML("LastDeco", details->lastDeco()); + xml += addSettingToXML("Brightness", details->brightness()); + xml += addSettingToXML("Units", details->units()); + xml += addSettingToXML("SamplingRate", details->samplingRate()); + xml += addSettingToXML("Salinity", details->salinity()); + xml += addSettingToXML("DiveModeColor", details->diveModeColor()); + xml += addSettingToXML("Language", details->language()); + xml += addSettingToXML("DateFormat", details->dateFormat()); + xml += addSettingToXML("CompassGain", details->compassGain()); + 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") + .arg(fileName, file.errorString()); + return false; + } + //file open successful. write data and save. + QTextStream out(&file); + out << xml; + + file.close(); + 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 == "Saturation") + details->setSaturation(keyString.toInt()); + + if (settingName == "Desaturation") + details->setDesaturation(keyString.toInt()); + + if (settingName == "DiveMode") + details->setDiveMode(keyString.toInt()); + + if (settingName == "LastDeco") + details->setLastDeco(keyString.toInt()); + + if (settingName == "Brightness") + details->setBrightness(keyString.toInt()); + + if (settingName == "Units") + details->setUnits(keyString.toInt()); + + if (settingName == "SamplingRate") + details->setSamplingRate(keyString.toInt()); + + if (settingName == "Salinity") + details->setSalinity(keyString.toInt()); + + if (settingName == "DiveModeColour") + details->setDiveModeColor(keyString.toInt()); + + if (settingName == "Language") + details->setLanguage(keyString.toInt()); + + if (settingName == "DateFormat") + details->setDateFormat(keyString.toInt()); + + if (settingName == "CompassGain") + details->setCompassGain(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; + emit error(err); +} + +void ConfigureDiveComputer::readThreadFinished() +{ + setState(DONE); + emit readFinished(); +} + +void ConfigureDiveComputer::writeThreadFinished() +{ + setState(DONE); + if (writeThread->lastError.isEmpty()) { + //No error + emit message(tr("Setting successfully written to device")); + } +} |