summaryrefslogtreecommitdiff
path: root/platform/default/mbgl/storage/offline_download.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'platform/default/mbgl/storage/offline_download.cpp')
-rw-r--r--platform/default/mbgl/storage/offline_download.cpp63
1 files changed, 35 insertions, 28 deletions
diff --git a/platform/default/mbgl/storage/offline_download.cpp b/platform/default/mbgl/storage/offline_download.cpp
index 178bdcbfeb..8aacc29c56 100644
--- a/platform/default/mbgl/storage/offline_download.cpp
+++ b/platform/default/mbgl/storage/offline_download.cpp
@@ -8,6 +8,7 @@
#include <mbgl/text/glyph.hpp>
#include <mbgl/util/tile_cover.hpp>
#include <mbgl/util/mapbox.hpp>
+#include <mbgl/util/run_loop.hpp>
#include <set>
@@ -195,7 +196,8 @@ void OfflineDownload::activateDownload() {
}
void OfflineDownload::deactivateDownload() {
- requests.clear();
+ workRequests.clear();
+ fileRequests.clear();
}
void OfflineDownload::ensureTiles(SourceType type, uint16_t tileSize, const SourceInfo& info) {
@@ -207,43 +209,48 @@ void OfflineDownload::ensureTiles(SourceType type, uint16_t tileSize, const Sour
void OfflineDownload::ensureResource(const Resource& resource, std::function<void (Response)> callback) {
status.requiredResourceCount++;
- optional<std::pair<Response, uint64_t>> offlineResponse = offlineDatabase.getRegionResource(id, resource);
- if (offlineResponse) {
- if (callback) {
- callback(offlineResponse->first);
- }
+ auto workRequestsIt = workRequests.insert(workRequests.begin(), nullptr);
+ *workRequestsIt = util::RunLoop::Get()->invokeCancellable([=] () {
+ workRequests.erase(workRequestsIt);
- status.completedResourceCount++;
- status.completedResourceSize += offlineResponse->second;
- observer->statusChanged(status);
+ optional<std::pair<Response, uint64_t>> offlineResponse = offlineDatabase.getRegionResource(id, resource);
+ if (offlineResponse) {
+ if (callback) {
+ callback(offlineResponse->first);
+ }
- return;
- }
+ status.completedResourceCount++;
+ status.completedResourceSize += offlineResponse->second;
+ observer->statusChanged(status);
- if (resource.kind == Resource::Kind::Tile
- && util::mapbox::isMapboxURL(resource.url)
- && offlineDatabase.offlineMapboxTileCountLimitExceeded()) {
- observer->mapboxTileCountLimitExceeded(offlineDatabase.getOfflineMapboxTileCountLimit());
- return;
- }
+ return;
+ }
- auto it = requests.insert(requests.begin(), nullptr);
- *it = onlineFileSource.request(resource, [=] (Response onlineResponse) {
- if (onlineResponse.error) {
- observer->responseError(*onlineResponse.error);
+ if (resource.kind == Resource::Kind::Tile
+ && util::mapbox::isMapboxURL(resource.url)
+ && offlineDatabase.offlineMapboxTileCountLimitExceeded()) {
+ observer->mapboxTileCountLimitExceeded(offlineDatabase.getOfflineMapboxTileCountLimit());
return;
}
- requests.erase(it);
+ auto fileRequestsIt = fileRequests.insert(fileRequests.begin(), nullptr);
+ *fileRequestsIt = onlineFileSource.request(resource, [=] (Response onlineResponse) {
+ if (onlineResponse.error) {
+ observer->responseError(*onlineResponse.error);
+ return;
+ }
+
+ fileRequests.erase(fileRequestsIt);
- if (callback) {
- callback(onlineResponse);
- }
+ if (callback) {
+ callback(onlineResponse);
+ }
- status.completedResourceCount++;
- status.completedResourceSize += offlineDatabase.putRegionResource(id, resource, onlineResponse);
+ status.completedResourceCount++;
+ status.completedResourceSize += offlineDatabase.putRegionResource(id, resource, onlineResponse);
- observer->statusChanged(status);
+ observer->statusChanged(status);
+ });
});
}