diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2015-06-10 07:24:34 -0700 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2015-06-10 09:29:04 -0700 |
commit | 1ee447b5a95e97f5eb409ce67b0b06464138e572 (patch) | |
tree | 75070de371927ec4caa18eee6d5aed3c825b8594 | |
parent | 2365531c686be62954c201a690d89e0eebdef456 (diff) | |
download | subsurface-1ee447b5a95e97f5eb409ce67b0b06464138e572.tar.gz |
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 <dirk@hohndel.org>
-rw-r--r-- | device.h | 2 | ||||
-rw-r--r-- | divecomputer.cpp | 28 | ||||
-rw-r--r-- | save-git.c | 2 | ||||
-rw-r--r-- | save-xml.c | 2 |
4 files changed, 28 insertions, 6 deletions
@@ -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<DiveComputerNode> 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, " <userid>%30s</userid>\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, " <autogroup state='1' />\n"); put_format(b, "</settings>\n"); |