mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-28 05:00:20 +00:00
8733828380
The memory managements for DeviceDetails was very sketchy. First of all, sharing a pointer to a structure between threads seems like a recipe for disaster. Secondly, the structure was a QObject and when first generated included in the (silly) Qt object tree, but when generated in the threads it was not. Clearly, this leaks. Instead, use value semantics and use local copies of the structure. I didn't go full length and use std::move to move the data, because this doesn't work through signals (which are the wrong abstraction here, but OK) and secondly I didn't have time to analyze whether the caller still needs the data after passing it down to the worker thread. To be able to pass an object through signals, the class has to be registered in the Qt MetaType system. Super ugly, but fine for now. Ultimately, this whole thing should probably be replaced by futures, co-routines, or whatever. Moreover, this removes the prefix from number of "m_*" function parameters. By convention, "m_" marks member variables, which function parameters are not. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at> make DeviceDetails a metatype So that we can pass it as value through the signal/slot system. (squash with original commit) Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
70 lines
1.7 KiB
C++
70 lines
1.7 KiB
C++
// SPDX-License-Identifier: GPL-2.0
|
|
#ifndef CONFIGUREDIVECOMPUTER_H
|
|
#define CONFIGUREDIVECOMPUTER_H
|
|
|
|
#include <QObject>
|
|
#include <QThread>
|
|
#include <QVariant>
|
|
#include "libdivecomputer.h"
|
|
#include "configuredivecomputerthreads.h"
|
|
#include <QDateTime>
|
|
|
|
#include "libxml/xmlreader.h"
|
|
|
|
class ConfigureDiveComputer : public QObject {
|
|
Q_OBJECT
|
|
public:
|
|
explicit ConfigureDiveComputer();
|
|
void readSettings(device_data_t *data);
|
|
|
|
enum states {
|
|
OPEN,
|
|
INITIAL,
|
|
READING,
|
|
WRITING,
|
|
RESETTING,
|
|
FWUPDATE,
|
|
CANCELLING,
|
|
CANCELLED,
|
|
ERRORED,
|
|
DONE,
|
|
};
|
|
|
|
QString lastError;
|
|
states currentState;
|
|
void saveDeviceDetails(const DeviceDetails &details, device_data_t *data);
|
|
void fetchDeviceDetails();
|
|
bool saveXMLBackup(const QString &fileName, const DeviceDetails &details, device_data_t *data);
|
|
bool restoreXMLBackup(const QString &fileName, DeviceDetails &details);
|
|
void startFirmwareUpdate(const QString &fileName, device_data_t *data, bool forceUpdate);
|
|
void resetSettings(device_data_t *data);
|
|
|
|
QString dc_open(device_data_t *data);
|
|
public
|
|
slots:
|
|
void dc_close(device_data_t *data);
|
|
signals:
|
|
void progress(int percent);
|
|
void message(QString msg);
|
|
void error(QString err);
|
|
void stateChanged(states newState);
|
|
void deviceDetailsChanged(DeviceDetails newDetails);
|
|
|
|
private:
|
|
ReadSettingsThread *readThread;
|
|
WriteSettingsThread *writeThread;
|
|
ResetSettingsThread *resetThread;
|
|
FirmwareUpdateThread *firmwareThread;
|
|
void connectThreadSignals(DeviceThread *thread);
|
|
void setState(states newState);
|
|
private
|
|
slots:
|
|
void progressEvent(int percent);
|
|
void readThreadFinished();
|
|
void writeThreadFinished();
|
|
void resetThreadFinished();
|
|
void firmwareThreadFinished();
|
|
void setError(QString err);
|
|
};
|
|
|
|
#endif // CONFIGUREDIVECOMPUTER_H
|