diff options
Diffstat (limited to 'platform/default/default_file_source.cpp')
-rw-r--r-- | platform/default/default_file_source.cpp | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/platform/default/default_file_source.cpp b/platform/default/default_file_source.cpp index f070121497..051e1b125c 100644 --- a/platform/default/default_file_source.cpp +++ b/platform/default/default_file_source.cpp @@ -74,9 +74,9 @@ public: } void getRegionStatus(int64_t regionID, std::function<void (std::exception_ptr, optional<OfflineRegionStatus>)> callback) { - try { - callback({}, getDownload(regionID).getStatus()); - } catch (...) { + if (auto download = getDownload(regionID)) { + callback({}, download->getStatus()); + } else { callback(std::current_exception(), {}); } } @@ -92,11 +92,15 @@ public: } void setRegionObserver(int64_t regionID, std::unique_ptr<OfflineRegionObserver> observer) { - getDownload(regionID).setObserver(std::move(observer)); + if (auto download = getDownload(regionID)) { + download->setObserver(std::move(observer)); + } } void setRegionDownloadState(int64_t regionID, OfflineRegionDownloadState state) { - getDownload(regionID).setState(state); + if (auto download = getDownload(regionID)) { + download->setState(state); + } } void request(AsyncRequest* req, Resource resource, ActorRef<FileSourceRequest> ref) { @@ -181,13 +185,19 @@ public: } private: - OfflineDownload& getDownload(int64_t regionID) { + OfflineDownload* getDownload(int64_t regionID) { auto it = downloads.find(regionID); if (it != downloads.end()) { - return *it->second; + return it->second.get(); + } + auto definition = offlineDatabase->getRegionDefinition(regionID); + if (!definition) { + return nullptr; } - return *downloads.emplace(regionID, - std::make_unique<OfflineDownload>(regionID, offlineDatabase->getRegionDefinition(regionID), *offlineDatabase, onlineFileSource)).first->second; + + auto download = std::make_unique<OfflineDownload>(regionID, std::move(*definition), + *offlineDatabase, onlineFileSource); + return downloads.emplace(regionID, std::move(download)).first->second.get(); } // shared so that destruction is done on the creating thread |