summaryrefslogtreecommitdiffstats
path: root/mobile-widgets
diff options
context:
space:
mode:
Diffstat (limited to 'mobile-widgets')
-rw-r--r--mobile-widgets/qmlmanager.cpp66
-rw-r--r--mobile-widgets/qmlmanager.h1
2 files changed, 34 insertions, 33 deletions
diff --git a/mobile-widgets/qmlmanager.cpp b/mobile-widgets/qmlmanager.cpp
index 55b606cad..7902ae569 100644
--- a/mobile-widgets/qmlmanager.cpp
+++ b/mobile-widgets/qmlmanager.cpp
@@ -305,27 +305,37 @@ void QMLManager::applicationStateChanged(Qt::ApplicationState state)
stateText.append((unsaved_changes() ? QLatin1String("") : QLatin1String("no ")) + QLatin1String("unsaved changes"));
appendTextToLog(stateText);
- if (!alreadySaving && state == Qt::ApplicationInactive && unsaved_changes()) {
- // FIXME
- // make sure the user sees that we are saving data if they come back
- // while this is running
+ if (state == Qt::ApplicationInactive && unsaved_changes()) {
+ // saveChangesCloud ensures that we don't have two conflicting saves going on
+ appendTextToLog("trying to save data as user switched away from app");
saveChangesCloud(false);
- appendTextToLog("done saving to git local / remote");
+ appendTextToLog("done trying to save to git local / remote");
}
}
+int QMLManager::openAndMaybeSync(const char *filename)
+{
+ // parse_file will potentially sync with the git server - so make sure we don't start
+ // a save in the middle of that (for example if the user switches away from the app)
+ alreadySaving = true;
+ int error = parse_file(filename, &dive_table, &trip_table, &dive_site_table);
+ alreadySaving = false;
+ return error;
+}
+
void QMLManager::openLocalThenRemote(QString url)
{
// clear out the models and the fulltext index
MobileModels::instance()->clear();
setNotificationText(tr("Open local dive data file"));
appendTextToLog(QString("Open dive data file %1 - git_local only is %2").arg(url).arg(git_local_only));
- QByteArray fileNamePrt = QFile::encodeName(url);
+ QByteArray encodedFilename = QFile::encodeName(url);
/* if this is a cloud storage repo and we have no local cache (i.e., it's the first time
- * we try to open this), parse_file will ALWAYS connect to the remote and populate the cache.
+ * we try to open this), parse_file (which is called by openAndMaybeSync) will ALWAYS connect
+ * to the remote and populate the cache.
* Otherwise parse_file will respect the git_local_only flag and only update if that isn't set */
- int error = parse_file(fileNamePrt.data(), &dive_table, &trip_table, &dive_site_table);
+ int error = openAndMaybeSync(encodedFilename.constData());
if (error) {
/* there can be 2 reasons for this:
* 1) we have cloud credentials, but there is no local repo (yet).
@@ -373,12 +383,10 @@ void QMLManager::openLocalThenRemote(QString url)
git_local_only = false;
appendTextToLog(QStringLiteral("taking things online to be able to switch to cloud account"));
}
- set_filename(fileNamePrt.data());
- if (git_local_only) {
- if (qPrefCloudStorage::cloud_verification_status() != qPrefCloudStorage::CS_NOCLOUD)
- appendTextToLog(QStringLiteral("have cloud credentials, but user asked not to connect to network"));
- alreadySaving = false;
- }
+ set_filename(encodedFilename.constData());
+ if (git_local_only && qPrefCloudStorage::cloud_verification_status() != qPrefCloudStorage::CS_NOCLOUD)
+ appendTextToLog(QStringLiteral("have cloud credentials, but user asked not to connect to network"));
+
updateAllGlobalLists();
}
@@ -487,9 +495,6 @@ void QMLManager::finishSetup()
if (!qPrefCloudStorage::cloud_storage_email().isEmpty() &&
!qPrefCloudStorage::cloud_storage_password().isEmpty() &&
getCloudURL(url) == 0) {
- // we know that we are the first ones to access git storage, so we don't need to test,
- // but we need to make sure we stay the only ones accessing git storage
- alreadySaving = true;
openLocalThenRemote(url);
} else if (!empty_string(existing_filename) &&
qPrefCloudStorage::cloud_verification_status() != qPrefCloudStorage::CS_UNKNOWN) {
@@ -498,7 +503,7 @@ void QMLManager::finishSetup()
qPrefCloudStorage::set_cloud_verification_status(qPrefCloudStorage::CS_NOCLOUD);
saveCloudCredentials(qPrefCloudStorage::cloud_storage_email(), qPrefCloudStorage::cloud_storage_password(), qPrefCloudStorage::cloud_storage_pin());
appendTextToLog(tr("working in no-cloud mode"));
- int error = parse_file(existing_filename, &dive_table, &trip_table, &dive_site_table);
+ int error = openAndMaybeSync(existing_filename);
if (error) {
// we got an error loading the local file
setNotificationText(tr("Error parsing local storage, giving up"));
@@ -595,9 +600,6 @@ void QMLManager::saveCloudCredentials(const QString &newEmail, const QString &ne
MobileModels::instance()->clear();
GpsListModel::instance()->clear();
setStartPageText(tr("Attempting to open cloud storage with new credentials"));
- // we therefore know that no one else is already accessing THIS git repo;
- // let's make sure we stay the only ones doing so
- alreadySaving = true;
// since we changed credentials, we need to try to connect to the cloud, regardless
// of whether we're in offline mode or not, to make sure the repository is synced
currentGitLocalOnly = git_local_only;
@@ -674,6 +676,8 @@ void QMLManager::loadDivesWithValidCredentials()
} else {
appendTextToLog("Switching from no cloud mode; keep in memory dive data");
}
+ // this might sync with the remote server and therefore change our git repo
+ alreadySaving = true;
if (git != dummy_git_repository) {
appendTextToLog(QString("have repository and branch %1").arg(branch));
error = git_load_dives(git, branch, &dive_table, &trip_table, &dive_site_table);
@@ -681,6 +685,7 @@ void QMLManager::loadDivesWithValidCredentials()
appendTextToLog(QString("didn't receive valid git repo, try again"));
error = parse_file(fileNamePrt.data(), &dive_table, &trip_table, &dive_site_table);
}
+ alreadySaving = false;
if (!error) {
report_error("filename is now %s", fileNamePrt.data());
set_filename(fileNamePrt.data());
@@ -694,7 +699,6 @@ void QMLManager::loadDivesWithValidCredentials()
consumeFinishedLoad();
successful_exit:
- alreadySaving = false;
setLoadFromCloud(true);
// if we came from local storage mode, let's merge the local data into the local cache
// for the remote data - which then later gets merged with the remote data if necessary
@@ -747,7 +751,6 @@ void QMLManager::revertToNoCloudIfNeeded()
set_filename(qPrintable(nocloud_localstorage()));
setStartPageText(RED_FONT + tr("Failed to connect to cloud server, reverting to no cloud status") + END_FONT);
}
- alreadySaving = false;
}
void QMLManager::consumeFinishedLoad()
@@ -768,7 +771,6 @@ void QMLManager::consumeFinishedLoad()
appendTextToLog(QStringLiteral("%1 dives loaded").arg(dive_table.nr));
if (dive_table.nr == 0)
setStartPageText(tr("Cloud storage open successfully. No dives in dive list."));
- alreadySaving = false;
}
void QMLManager::refreshDiveList()
@@ -1288,13 +1290,14 @@ void QMLManager::openNoCloudRepo()
if (git == dummy_git_repository) {
// repo doesn't exist, create it and write the empty dive list to it
git_create_local_repo(qPrintable(filename));
+ alreadySaving = true;
save_dives(qPrintable(filename));
+ alreadySaving = false;
set_filename(qPrintable(filename));
auto s = qPrefLog::instance();
s->set_default_filename(qPrintable(filename));
s->set_default_file_behavior(LOCAL_DEFAULT_FILE);
}
-
openLocalThenRemote(filename);
}
@@ -1320,19 +1323,18 @@ void QMLManager::saveChangesLocal()
appendTextToLog("save operation already in progress, can't save locally");
return;
}
- alreadySaving = true;
bool glo = git_local_only;
git_local_only = true;
- if (save_dives(existing_filename)) {
+ alreadySaving = true;
+ int error = save_dives(existing_filename);
+ alreadySaving = false;
+ git_local_only = glo;
+ if (error) {
setNotificationText(consumeError());
set_filename(NULL);
- git_local_only = glo;
- alreadySaving = false;
return;
}
- git_local_only = glo;
mark_divelist_changed(false);
- alreadySaving = false;
} else {
appendTextToLog("local save requested with no unsaved changes");
}
@@ -1364,9 +1366,7 @@ void QMLManager::saveChangesCloud(bool forceRemoteSync)
bool glo = git_local_only;
git_local_only = false;
- alreadySaving = true;
loadDivesWithValidCredentials();
- alreadySaving = false;
git_local_only = glo;
}
diff --git a/mobile-widgets/qmlmanager.h b/mobile-widgets/qmlmanager.h
index cadbe4973..f3440cf75 100644
--- a/mobile-widgets/qmlmanager.h
+++ b/mobile-widgets/qmlmanager.h
@@ -260,6 +260,7 @@ private:
bool checkLocation(DiveSiteChange &change, const DiveObjectHelper &myDive, struct dive *d, QString location, QString gps);
bool checkDuration(const DiveObjectHelper &myDive, struct dive *d, QString duration);
bool checkDepth(const DiveObjectHelper &myDive, struct dive *d, QString depth);
+ int openAndMaybeSync(const char *filename);
bool currentGitLocalOnly;
Q_INVOKABLE DCDeviceData *m_device_data;
QString m_progressMessage;