summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorGravatar Tomaz Canabrava <tcanabrava@kde.org>2017-04-18 19:14:03 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2017-05-27 07:53:14 -0700
commitdec47e11cd3aa1f4c6333a69c72df4c4d5e0628f (patch)
treec92b83e5818918c92cf0e39e248869e82d666c65 /core
parent3c3f91dcb2964180f5ced838a06db35021dde0f1 (diff)
downloadsubsurface-dec47e11cd3aa1f4c6333a69c72df4c4d5e0628f.tar.gz
Separate the download thread from the widget logic
This is important to not duplicate code for the Qml view. Now the DownloadFromDiveComputer widget is mostly free from important code (that has been upgraded to the core folder), and I can start coding the QML interface. There are still a few functions on the desktop widget that will die so I can call them via the QML code later. I also touched the location of a few globals (please, let's stop using those) - because it was declared on the desktop code and being used in the core. Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'core')
-rw-r--r--core/CMakeLists.txt2
-rw-r--r--core/dive.h2
-rw-r--r--core/divelist.c3
-rw-r--r--core/downloadfromdcthread.cpp36
-rw-r--r--core/downloadfromdcthread.h21
-rw-r--r--core/uemis-downloader.c2
6 files changed, 66 insertions, 0 deletions
diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt
index fc6d20ba8..b2effd519 100644
--- a/core/CMakeLists.txt
+++ b/core/CMakeLists.txt
@@ -84,11 +84,13 @@ set(SUBSURFACE_CORE_LIB_SRCS
isocialnetworkintegration.cpp
gpslocation.cpp
cloudstorage.cpp
+ downloadfromdcthread.cpp
#Subsurface Qt have the Subsurface structs QObjectified for easy access via QML.
subsurface-qt/DiveObjectHelper.cpp
subsurface-qt/CylinderObjectHelper.cpp
subsurface-qt/SettingsObjectWrapper.cpp
+
${SERIAL_FTDI}
${PLATFORM_SRC}
${BT_CORE_SRC_FILES}
diff --git a/core/dive.h b/core/dive.h
index c2ae1e36d..c65d3ffc5 100644
--- a/core/dive.h
+++ b/core/dive.h
@@ -971,6 +971,8 @@ extern volume_t string_to_volume(const char *str, pressure_t workp);
extern fraction_t string_to_fraction(const char *str);
extern void average_max_depth(struct diveplan *dive, int *avg_depth, int *max_depth);
+extern struct dive_table downloadTable;
+
#include "pref.h"
#endif // DIVE_H
diff --git a/core/divelist.c b/core/divelist.c
index fd7fc6790..4f253039b 100644
--- a/core/divelist.c
+++ b/core/divelist.c
@@ -55,6 +55,9 @@ dive_trip_t *dive_trip_list;
unsigned int amount_selected;
+// We need to stop using globals, really.
+struct dive_table downloadTable;
+
#if DEBUG_SELECTION_TRACKING
void dump_selection(void)
{
diff --git a/core/downloadfromdcthread.cpp b/core/downloadfromdcthread.cpp
new file mode 100644
index 000000000..dc13a23d7
--- /dev/null
+++ b/core/downloadfromdcthread.cpp
@@ -0,0 +1,36 @@
+#include "downloadfromdcthread.h"
+#include "core/libdivecomputer.h"
+
+static QString str_error(const char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ const QString str = QString().vsprintf(fmt, args);
+ va_end(args);
+
+ return str;
+}
+
+DownloadThread::DownloadThread(QObject *parent, device_data_t *data) : QThread(parent),
+ data(data)
+{
+ data->download_table = nullptr;
+}
+
+void DownloadThread::setDiveTable(struct dive_table* table)
+{
+ data->download_table = table;
+}
+
+void DownloadThread::run()
+{
+ Q_ASSERT(data->download_table != nullptr);
+ const char *errorText;
+ import_thread_cancelled = false;
+ if (!strcmp(data->vendor, "Uemis"))
+ errorText = do_uemis_import(data);
+ else
+ errorText = do_libdivecomputer_import(data);
+ if (errorText)
+ error = str_error(errorText, data->devname, data->vendor, data->product);
+}
diff --git a/core/downloadfromdcthread.h b/core/downloadfromdcthread.h
new file mode 100644
index 000000000..ab21db0aa
--- /dev/null
+++ b/core/downloadfromdcthread.h
@@ -0,0 +1,21 @@
+#ifndef DOWNLOADFROMDCTHREAD_H
+#define DOWNLOADFROMDCTHREAD_H
+
+#include <QThread>
+#include "dive.h"
+#include "libdivecomputer.h"
+
+class DownloadThread : public QThread {
+ Q_OBJECT
+public:
+ DownloadThread(QObject *parent, device_data_t *data);
+ void setDiveTable(struct dive_table *table);
+ void run() override;
+
+ QString error;
+
+private:
+ device_data_t *data;
+};
+
+#endif
diff --git a/core/uemis-downloader.c b/core/uemis-downloader.c
index 79c88d28b..e65c1fd46 100644
--- a/core/uemis-downloader.c
+++ b/core/uemis-downloader.c
@@ -76,6 +76,8 @@ static int dive_to_read = 0;
static int max_deleted_seen = -1;
+extern struct dive_table downloadTable;
+
/* helper function to parse the Uemis data structures */
static void uemis_ts(char *buffer, void *_when)
{