2017-04-18 19:14:03 +02:00
|
|
|
#include "downloadfromdcthread.h"
|
|
|
|
#include "core/libdivecomputer.h"
|
|
|
|
|
2017-04-27 20:24:14 +02:00
|
|
|
QStringList vendorList;
|
|
|
|
QHash<QString, QStringList> productList;
|
|
|
|
QMap<QString, dc_descriptor_t *> descriptorLookup;
|
|
|
|
|
2017-04-18 19:14:03 +02:00
|
|
|
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);
|
|
|
|
}
|
2017-04-27 20:24:14 +02:00
|
|
|
|
|
|
|
void fill_computer_list()
|
|
|
|
{
|
|
|
|
dc_iterator_t *iterator = NULL;
|
|
|
|
dc_descriptor_t *descriptor = NULL;
|
|
|
|
struct mydescriptor *mydescriptor;
|
|
|
|
|
|
|
|
QStringList computer;
|
|
|
|
dc_descriptor_iterator(&iterator);
|
|
|
|
while (dc_iterator_next(iterator, &descriptor) == DC_STATUS_SUCCESS) {
|
|
|
|
const char *vendor = dc_descriptor_get_vendor(descriptor);
|
|
|
|
const char *product = dc_descriptor_get_product(descriptor);
|
|
|
|
|
|
|
|
if (!vendorList.contains(vendor))
|
|
|
|
vendorList.append(vendor);
|
|
|
|
|
|
|
|
if (!productList[vendor].contains(product))
|
|
|
|
productList[vendor].push_back(product);
|
|
|
|
|
|
|
|
descriptorLookup[QString(vendor) + QString(product)] = descriptor;
|
|
|
|
}
|
|
|
|
dc_iterator_free(iterator);
|
|
|
|
Q_FOREACH (QString vendor, vendorList)
|
|
|
|
qSort(productList[vendor]);
|
|
|
|
|
|
|
|
/* and add the Uemis Zurich which we are handling internally
|
|
|
|
THIS IS A HACK as we magically have a data structure here that
|
|
|
|
happens to match a data structure that is internal to libdivecomputer;
|
|
|
|
this WILL BREAK if libdivecomputer changes the dc_descriptor struct...
|
|
|
|
eventually the UEMIS code needs to move into libdivecomputer, I guess */
|
|
|
|
|
|
|
|
mydescriptor = (struct mydescriptor *)malloc(sizeof(struct mydescriptor));
|
|
|
|
mydescriptor->vendor = "Uemis";
|
|
|
|
mydescriptor->product = "Zurich";
|
|
|
|
mydescriptor->type = DC_FAMILY_NULL;
|
|
|
|
mydescriptor->model = 0;
|
|
|
|
|
|
|
|
if (!vendorList.contains("Uemis"))
|
|
|
|
vendorList.append("Uemis");
|
|
|
|
|
|
|
|
if (!productList["Uemis"].contains("Zurich"))
|
|
|
|
productList["Uemis"].push_back("Zurich");
|
|
|
|
|
|
|
|
descriptorLookup["UemisZurich"] = (dc_descriptor_t *)mydescriptor;
|
|
|
|
|
|
|
|
qSort(vendorList);
|
|
|
|
}
|