summaryrefslogtreecommitdiff
path: root/platform/default/default_file_source.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'platform/default/default_file_source.cpp')
-rw-r--r--platform/default/default_file_source.cpp28
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