diff --git a/map/cloud.cpp b/map/cloud.cpp index b8f07d4a10..1bf5ff24dc 100644 --- a/map/cloud.cpp +++ b/map/cloud.cpp @@ -126,11 +126,16 @@ bool IsSuccessfulResultCode(int resultCode) { return resultCode >= 200 && resultCode < 300; } + +std::string GetDeviceName() +{ + return GetPlatform().DeviceName() + " (" + GetPlatform().DeviceModel() + ")"; +} } // namespace Cloud::SnapshotRequestData::SnapshotRequestData(std::vector const & files) : m_deviceId(GetPlatform().UniqueClientId()) - , m_deviceName(GetPlatform().DeviceName()) + , m_deviceName(GetDeviceName()) , m_fileNames(files) {} @@ -418,8 +423,8 @@ void Cloud::ScheduleUploading() m_uploadingStarted = true; } - if (m_onSynchronizationStarted != nullptr) - m_onSynchronizationStarted(); + ThreadSafeCallback( + [this]() { return m_onSynchronizationStarted; }); // Create snapshot and begin uploading in case of success. CreateSnapshotTask(kTaskTimeoutInSeconds, 0 /* attemptIndex */, @@ -504,10 +509,6 @@ void Cloud::ScheduleUploadingTask(EntryPtr const & entry, uint32_t timeout, } else if (result.m_requestResult.m_status == RequestStatus::Forbidden) { - // Finish uploading and notify about invalid access token. - if (m_onInvalidToken != nullptr) - m_onInvalidToken(); - FinishUploading(SynchronizationResult::AuthError, result.m_requestResult.m_error); return; } @@ -587,10 +588,6 @@ void Cloud::CreateSnapshotTask(uint32_t timeout, uint32_t attemptIndex, } else if (result.m_status == RequestStatus::Forbidden) { - // Finish and notify about invalid access token. - if (m_onInvalidToken != nullptr) - m_onInvalidToken(); - FinishUploading(SynchronizationResult::AuthError, result.m_error); return; } @@ -782,6 +779,9 @@ Cloud::EntryPtr Cloud::FindOutdatedEntry() const void Cloud::FinishUploading(SynchronizationResult result, std::string const & errorStr) { + if (result == SynchronizationResult::AuthError) + ThreadSafeCallback([this]() { return m_onInvalidToken; }); + { std::lock_guard lock(m_mutex); m_index.m_isOutdated = (result != SynchronizationResult::Success); @@ -794,8 +794,8 @@ void Cloud::FinishUploading(SynchronizationResult result, std::string const & er SaveIndexImpl(); } - if (m_onSynchronizationFinished != nullptr) - m_onSynchronizationFinished(result, errorStr); + ThreadSafeCallback( + [this]() { return m_onSynchronizationFinished; }, result, errorStr); } void Cloud::SetAccessToken(std::string const & token) diff --git a/map/cloud.hpp b/map/cloud.hpp index 6e36d8d928..12b6fe78a6 100644 --- a/map/cloud.hpp +++ b/map/cloud.hpp @@ -233,6 +233,18 @@ private: std::string const & filePath); RequestResult NotifyAboutUploading(std::string const & filePath, uint64_t fileSize) const; + template + void ThreadSafeCallback(HandlerGetterType && handlerGetter, HandlerArgs... handlerArgs) + { + HandlerType handler; + { + std::lock_guard lock(m_mutex); + handler = handlerGetter(); + } + if (handler != nullptr) + handler(handlerArgs...); + } + CloudParams const m_params; InvalidTokenHandler m_onInvalidToken; SynchronizationStartedHandler m_onSynchronizationStarted;