From 1ee447b5a95e97f5eb409ce67b0b06464138e572 Mon Sep 17 00:00:00 2001 From: Dirk Hohndel Date: Wed, 10 Jun 2015 07:24:34 -0700 Subject: When saving only selected dives, only include referenced dive computers Since we should have far fewer dive computers than dives this straight forward algorithm shouldn't cause any performance issues. Signed-off-by: Dirk Hohndel --- device.h | 2 +- divecomputer.cpp | 28 +++++++++++++++++++++++++--- save-git.c | 2 +- save-xml.c | 2 +- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/device.h b/device.h index 9f6ebdcee..9ff2ce23a 100644 --- a/device.h +++ b/device.h @@ -9,7 +9,7 @@ extern "C" { extern struct divecomputer *fake_dc(struct divecomputer *dc); extern void create_device_node(const char *model, uint32_t deviceid, const char *serial, const char *firmware, const char *nickname); extern void call_for_each_dc(void *f, void (*callback)(void *, const char *, uint32_t, - const char *, const char *, const char *)); + const char *, const char *, const char *), bool select_only); #ifdef __cplusplus } diff --git a/divecomputer.cpp b/divecomputer.cpp index daea390c2..ac43bd00b 100644 --- a/divecomputer.cpp +++ b/divecomputer.cpp @@ -90,14 +90,36 @@ extern "C" bool compareDC(const DiveComputerNode &a, const DiveComputerNode &b) } extern "C" void call_for_each_dc (void *f, void (*callback)(void *, const char *, uint32_t, - const char *, const char *, const char *)) + const char *, const char *, const char *), + bool select_only) { QList values = dcList.dcMap.values(); qSort(values.begin(), values.end(), compareDC); for (int i = 0; i < values.size(); i++) { const DiveComputerNode *node = &values.at(i); - callback(f, node->model.toUtf8().data(), node->deviceId, node->nickName.toUtf8().data(), - node->serialNumber.toUtf8().data(), node->firmware.toUtf8().data()); + bool found = false; + if (select_only) { + int j; + struct dive *d; + for_each_dive (j, d) { + struct divecomputer *dc; + if (!d->selected) + continue; + for_each_dc(d, dc) { + if (dc->deviceid == node->deviceId) { + found = true; + break; + } + } + if (found) + break; + } + } else { + found = true; + } + if (found) + callback(f, node->model.toUtf8().data(), node->deviceId, node->nickName.toUtf8().data(), + node->serialNumber.toUtf8().data(), node->firmware.toUtf8().data()); } } diff --git a/save-git.c b/save-git.c index 6461366f1..16db95f6c 100644 --- a/save-git.c +++ b/save-git.c @@ -821,7 +821,7 @@ static void save_settings(git_repository *repo, struct dir *tree) put_format(&b, "version %d\n", VERSION); save_userid(&b); - call_for_each_dc(&b, save_one_device); + call_for_each_dc(&b, save_one_device, false); cond_put_format(autogroup, &b, "autogroup\n"); blob_insert(repo, tree, &b, "00-Subsurface"); diff --git a/save-xml.c b/save-xml.c index 58f274722..6fd089f7c 100644 --- a/save-xml.c +++ b/save-xml.c @@ -501,7 +501,7 @@ void save_dives_buffer(struct membuffer *b, const bool select_only) put_format(b, " %30s\n", prefs.userid); /* save the dive computer nicknames, if any */ - call_for_each_dc(b, save_one_device); + call_for_each_dc(b, save_one_device, select_only); if (autogroup) put_format(b, " \n"); put_format(b, "\n"); -- cgit v1.2.3-70-g09d2