From 0249e125898134d3f6d4a2a8972f3eeb30c02803 Mon Sep 17 00:00:00 2001 From: Berthold Stoeger Date: Sun, 23 Dec 2018 22:08:00 +0100 Subject: Import: split process_imported_dives() function Split the process_imported_dives() function in two: 1) process_imported_dives() processes the dives and generates a list of dives and trips to be added and removed. 2) add_imported_dives() calls process_imported_dives() and does the actual removal / addition of dives and trips. The goal is to split preparation and actual work, to make dive import undo-able. The code adds extra checks to never merge into the same dive twice, as this would lead to a double-free() bug. This should in principle never happen, as dives that compare equal according to is_same_dive() are merged in the imported-dives list, but perhaps in some pathologival corner-cases is_same_dive() turns out to be non-transitive. Signed-off-by: Berthold Stoeger --- desktop-widgets/divelogimportdialog.cpp | 2 +- desktop-widgets/downloadfromdivecomputer.cpp | 4 ++-- desktop-widgets/mainwindow.cpp | 2 +- desktop-widgets/subsurfacewebservices.cpp | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) (limited to 'desktop-widgets') diff --git a/desktop-widgets/divelogimportdialog.cpp b/desktop-widgets/divelogimportdialog.cpp index a280a73ee..f8e44067d 100644 --- a/desktop-widgets/divelogimportdialog.cpp +++ b/desktop-widgets/divelogimportdialog.cpp @@ -1011,7 +1011,7 @@ void DiveLogImportDialog::on_buttonBox_accepted() } } - process_imported_dives(&table, &trips, false, false, true); + add_imported_dives(&table, &trips, false, false, true); Command::clear(); MainWindow::instance()->refreshDisplay(); } diff --git a/desktop-widgets/downloadfromdivecomputer.cpp b/desktop-widgets/downloadfromdivecomputer.cpp index 50cbe223c..547c740c8 100644 --- a/desktop-widgets/downloadfromdivecomputer.cpp +++ b/desktop-widgets/downloadfromdivecomputer.cpp @@ -525,9 +525,9 @@ 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 = table->dives[table->nr - 1]->id; - process_imported_dives(table, trips, preferDownloaded(), true, false); + add_imported_dives(table, trips, preferDownloaded(), true, false); Command::clear(); - // after process_imported_dives does any merging or resorting needed, we need + // after add_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(); int idx = get_idx_by_uniq_id(uniqId); diff --git a/desktop-widgets/mainwindow.cpp b/desktop-widgets/mainwindow.cpp index f18c8af7a..474ce0f55 100644 --- a/desktop-widgets/mainwindow.cpp +++ b/desktop-widgets/mainwindow.cpp @@ -1714,7 +1714,7 @@ void MainWindow::importFiles(const QStringList fileNames) fileNamePtr = QFile::encodeName(fileNames.at(i)); parse_file(fileNamePtr.data(), &table, &trips); } - process_imported_dives(&table, &trips, false, false, true); + add_imported_dives(&table, &trips, false, false, true); Command::clear(); refreshDisplay(); } diff --git a/desktop-widgets/subsurfacewebservices.cpp b/desktop-widgets/subsurfacewebservices.cpp index 3a0dfb1e3..58806a75b 100644 --- a/desktop-widgets/subsurfacewebservices.cpp +++ b/desktop-widgets/subsurfacewebservices.cpp @@ -771,7 +771,7 @@ void DivelogsDeWebServices::buttonClicked(QAbstractButton *button) struct dive_table table = { 0 }; struct trip_table trips = { 0 }; parse_file(QFile::encodeName(zipFile.fileName()), &table, &trips); - process_imported_dives(&table, &trips, false, false, true); + add_imported_dives(&table, &trips, false, false, true); MainWindow::instance()->refreshDisplay(); /* store last entered user/pass in config */ -- cgit v1.2.3-70-g09d2