diff --git a/core/divelist.c b/core/divelist.c index 71556101c..916da4605 100644 --- a/core/divelist.c +++ b/core/divelist.c @@ -1339,10 +1339,13 @@ static bool try_to_merge_into(struct dive *dive_to_add, int idx, bool prefer_imp * Add imported dive to global dive table. Overlapping dives will * be merged if possible. If prefer_imported is true, data of the * new dives are prioritized in such a case. + * If downloaded is true, only the divecomputer of the first dive + * will be considered, as it is assumed that all dives come from + * the same computer. * Note: the dives in import_table are consumed! On return import_table * has size 0. */ -void process_imported_dives(struct dive_table *import_table, bool prefer_imported) +void process_imported_dives(struct dive_table *import_table, bool prefer_imported, bool downloaded) { int i, j; struct dive *old_dive, *merged; @@ -1356,7 +1359,7 @@ void process_imported_dives(struct dive_table *import_table, bool prefer_importe /* check if we need a nickname for the divecomputer for newly downloaded dives; * since we know they all came from the same divecomputer we just check for the * first one */ - if (import_table->dives[0]->downloaded) + if (downloaded) set_dc_nickname(import_table->dives[0]); else /* they aren't downloaded, so record / check all new ones */ diff --git a/core/divelist.h b/core/divelist.h index 885dbe67f..ac9435356 100644 --- a/core/divelist.h +++ b/core/divelist.h @@ -19,7 +19,7 @@ extern int init_decompression(struct deco_state *ds, struct dive *dive); /* divelist core logic functions */ extern void process_loaded_dives(); -extern void process_imported_dives(struct dive_table *import_table, bool prefer_imported); +extern void process_imported_dives(struct dive_table *import_table, bool prefer_imported, bool downloaded); extern char *get_dive_gas_string(struct dive *dive); struct dive **grow_dive_table(struct dive_table *table); diff --git a/desktop-widgets/divelogimportdialog.cpp b/desktop-widgets/divelogimportdialog.cpp index 874c33adc..c72f179e4 100644 --- a/desktop-widgets/divelogimportdialog.cpp +++ b/desktop-widgets/divelogimportdialog.cpp @@ -1007,7 +1007,7 @@ void DiveLogImportDialog::on_buttonBox_accepted() } } - process_imported_dives(&table, false); + process_imported_dives(&table, false, false); MainWindow::instance()->refreshDisplay(); } diff --git a/desktop-widgets/downloadfromdivecomputer.cpp b/desktop-widgets/downloadfromdivecomputer.cpp index 46cb0418b..1e239c378 100644 --- a/desktop-widgets/downloadfromdivecomputer.cpp +++ b/desktop-widgets/downloadfromdivecomputer.cpp @@ -506,7 +506,7 @@ void DownloadFromDCWidget::on_ok_clicked() // remember the last downloaded dive (on most dive computers this will be the chronologically // first new dive) and select it again after processing all the dives int uniqId = downloadTable.dives[downloadTable.nr - 1]->id; - process_imported_dives(&downloadTable, preferDownloaded()); + process_imported_dives(&downloadTable, preferDownloaded(), true); // after process_imported_dives does any merging or resorting needed, we need // to recreate the model for the dive list so we can select the newest dive MainWindow::instance()->recreateDiveList(); diff --git a/desktop-widgets/mainwindow.cpp b/desktop-widgets/mainwindow.cpp index 9049b741b..a7e91732b 100644 --- a/desktop-widgets/mainwindow.cpp +++ b/desktop-widgets/mainwindow.cpp @@ -1739,7 +1739,7 @@ void MainWindow::importFiles(const QStringList fileNames) fileNamePtr = QFile::encodeName(fileNames.at(i)); parse_file(fileNamePtr.data(), &table); } - process_imported_dives(&table, false); + process_imported_dives(&table, false, false); refreshDisplay(); } diff --git a/desktop-widgets/subsurfacewebservices.cpp b/desktop-widgets/subsurfacewebservices.cpp index 693463bf1..db2fece76 100644 --- a/desktop-widgets/subsurfacewebservices.cpp +++ b/desktop-widgets/subsurfacewebservices.cpp @@ -769,7 +769,7 @@ void DivelogsDeWebServices::buttonClicked(QAbstractButton *button) /* parse file and import dives */ struct dive_table table = { 0 }; parse_file(QFile::encodeName(zipFile.fileName()), &table); - process_imported_dives(&table, false); + process_imported_dives(&table, false, false); MainWindow::instance()->refreshDisplay(); /* store last entered user/pass in config */ diff --git a/mobile-widgets/qmlmanager.cpp b/mobile-widgets/qmlmanager.cpp index 4927899de..3bd806034 100644 --- a/mobile-widgets/qmlmanager.cpp +++ b/mobile-widgets/qmlmanager.cpp @@ -325,8 +325,9 @@ void QMLManager::updateAllGlobalLists() void QMLManager::mergeLocalRepo() { char *filename = NOCLOUD_LOCALSTORAGE; - parse_file(filename, &dive_table); - process_imported_dives(false); + struct dive_table table = { 0 }; + parse_file(filename, &table); + process_imported_dives(&table, false, false); } void QMLManager::copyAppLogToClipboard() diff --git a/qt-models/diveimportedmodel.cpp b/qt-models/diveimportedmodel.cpp index ebe803244..6926981d5 100644 --- a/qt-models/diveimportedmodel.cpp +++ b/qt-models/diveimportedmodel.cpp @@ -173,7 +173,7 @@ void DiveImportedModel::recordDives() delete_dive_from_table(&downloadTable, j); } - process_imported_dives(diveTable, true); + process_imported_dives(diveTable, true, true); if (autogroup) autogroup_dives(); } diff --git a/tests/testmerge.cpp b/tests/testmerge.cpp index a99fd65e7..4559ad9b9 100644 --- a/tests/testmerge.cpp +++ b/tests/testmerge.cpp @@ -23,9 +23,9 @@ void TestMerge::testMergeEmpty() */ struct dive_table table = { 0 }; QCOMPARE(parse_file(SUBSURFACE_TEST_DATA "/dives/test47.xml", &table), 0); - process_imported_dives(&table, false); + process_imported_dives(&table, false, false); QCOMPARE(parse_file(SUBSURFACE_TEST_DATA "/dives/test48.xml", &table), 0); - process_imported_dives(&table, false); + process_imported_dives(&table, false, false); QCOMPARE(save_dives("./testmerge47+48.ssrf"), 0); QFile org(SUBSURFACE_TEST_DATA "/dives/test47+48.xml"); org.open(QFile::ReadOnly); @@ -47,9 +47,9 @@ void TestMerge::testMergeBackwards() */ struct dive_table table = { 0 }; QCOMPARE(parse_file(SUBSURFACE_TEST_DATA "/dives/test48.xml", &table), 0); - process_imported_dives(&table, false); + process_imported_dives(&table, false, false); QCOMPARE(parse_file(SUBSURFACE_TEST_DATA "/dives/test47.xml", &table), 0); - process_imported_dives(&table, false); + process_imported_dives(&table, false, false); QCOMPARE(save_dives("./testmerge47+48.ssrf"), 0); QFile org(SUBSURFACE_TEST_DATA "/dives/test47+48.xml"); org.open(QFile::ReadOnly); diff --git a/tests/testrenumber.cpp b/tests/testrenumber.cpp index 9c409c512..89ce1f8d0 100644 --- a/tests/testrenumber.cpp +++ b/tests/testrenumber.cpp @@ -15,7 +15,7 @@ void TestRenumber::testMerge() { struct dive_table table = { 0 }; QCOMPARE(parse_file(SUBSURFACE_TEST_DATA "/dives/test47b.xml", &table), 0); - process_imported_dives(&table, false); + process_imported_dives(&table, false, false); QCOMPARE(dive_table.nr, 1); QCOMPARE(unsaved_changes(), 1); mark_divelist_changed(false); @@ -25,7 +25,7 @@ void TestRenumber::testMergeAndAppend() { struct dive_table table = { 0 }; QCOMPARE(parse_file(SUBSURFACE_TEST_DATA "/dives/test47c.xml", &table), 0); - process_imported_dives(&table, false); + process_imported_dives(&table, false, false); QCOMPARE(dive_table.nr, 2); QCOMPARE(unsaved_changes(), 1); struct dive *d = get_dive(1);