diff options
Diffstat (limited to 'platform/default/mbgl')
-rw-r--r-- | platform/default/mbgl/storage/offline.cpp | 20 | ||||
-rw-r--r-- | platform/default/mbgl/storage/offline_database.cpp | 66 | ||||
-rw-r--r-- | platform/default/mbgl/storage/offline_database.hpp | 7 | ||||
-rw-r--r-- | platform/default/mbgl/storage/offline_download.cpp | 120 | ||||
-rw-r--r-- | platform/default/mbgl/storage/offline_download.hpp | 2 |
5 files changed, 147 insertions, 68 deletions
diff --git a/platform/default/mbgl/storage/offline.cpp b/platform/default/mbgl/storage/offline.cpp index d8e0357ae2..fd2d47819b 100644 --- a/platform/default/mbgl/storage/offline.cpp +++ b/platform/default/mbgl/storage/offline.cpp @@ -11,9 +11,9 @@ namespace mbgl { OfflineTilePyramidRegionDefinition::OfflineTilePyramidRegionDefinition( - const std::string& styleURL_, const LatLngBounds& bounds_, double minZoom_, double maxZoom_, float pixelRatio_) - : styleURL(styleURL_), - bounds(bounds_), + std::string styleURL_, LatLngBounds bounds_, double minZoom_, double maxZoom_, float pixelRatio_) + : styleURL(std::move(styleURL_)), + bounds(std::move(bounds_)), minZoom(minZoom_), maxZoom(maxZoom_), pixelRatio(pixelRatio_) { @@ -23,9 +23,9 @@ OfflineTilePyramidRegionDefinition::OfflineTilePyramidRegionDefinition( } } -std::vector<CanonicalTileID> OfflineTilePyramidRegionDefinition::tileCover(SourceType type, uint16_t tileSize, const Tileset& tileset) const { - double minZ = std::max<double>(util::coveringZoomLevel(minZoom, type, tileSize), tileset.minZoom); - double maxZ = std::min<double>(util::coveringZoomLevel(maxZoom, type, tileSize), tileset.maxZoom); +std::vector<CanonicalTileID> OfflineTilePyramidRegionDefinition::tileCover(SourceType type, uint16_t tileSize, const Range<uint8_t>& zoomRange) const { + double minZ = std::max<double>(util::coveringZoomLevel(minZoom, type, tileSize), zoomRange.min); + double maxZ = std::min<double>(util::coveringZoomLevel(maxZoom, type, tileSize), zoomRange.max); assert(minZ >= 0); assert(maxZ >= 0); @@ -97,11 +97,11 @@ std::string encodeOfflineRegionDefinition(const OfflineRegionDefinition& region) } OfflineRegion::OfflineRegion(int64_t id_, - const OfflineRegionDefinition& definition_, - const OfflineRegionMetadata& metadata_) + OfflineRegionDefinition definition_, + OfflineRegionMetadata metadata_) : id(id_), - definition(definition_), - metadata(metadata_) { + definition(std::move(definition_)), + metadata(std::move(metadata_)) { } OfflineRegion::OfflineRegion(OfflineRegion&&) = default; diff --git a/platform/default/mbgl/storage/offline_database.cpp b/platform/default/mbgl/storage/offline_database.cpp index 3193909294..46a2c2bc25 100644 --- a/platform/default/mbgl/storage/offline_database.cpp +++ b/platform/default/mbgl/storage/offline_database.cpp @@ -11,15 +11,13 @@ namespace mbgl { -using namespace mapbox::sqlite; - OfflineDatabase::Statement::~Statement() { stmt.reset(); stmt.clearBindings(); } -OfflineDatabase::OfflineDatabase(const std::string& path_, uint64_t maximumCacheSize_) - : path(path_), +OfflineDatabase::OfflineDatabase(std::string path_, uint64_t maximumCacheSize_) + : path(std::move(path_)), maximumCacheSize(maximumCacheSize_) { ensureSchema(); } @@ -36,7 +34,7 @@ OfflineDatabase::~OfflineDatabase() { } void OfflineDatabase::connect(int flags) { - db = std::make_unique<Database>(path.c_str(), flags); + db = std::make_unique<mapbox::sqlite::Database>(path.c_str(), flags); db->setBusyTimeout(Milliseconds::max()); db->exec("PRAGMA foreign_keys = ON"); } @@ -44,7 +42,7 @@ void OfflineDatabase::connect(int flags) { void OfflineDatabase::ensureSchema() { if (path != ":memory:") { try { - connect(ReadWrite); + connect(mapbox::sqlite::ReadWrite); switch (userVersion()) { case 0: break; // cache-only database; ok to delete @@ -55,7 +53,7 @@ void OfflineDatabase::ensureSchema() { } removeExisting(); - connect(ReadWrite | Create); + connect(mapbox::sqlite::ReadWrite | mapbox::sqlite::Create); } catch (mapbox::sqlite::Exception& ex) { if (ex.code != SQLITE_CANTOPEN && ex.code != SQLITE_NOTADB) { Log::Error(Event::Database, "Unexpected error connecting to database: %s", ex.what()); @@ -66,7 +64,7 @@ void OfflineDatabase::ensureSchema() { if (ex.code == SQLITE_NOTADB) { removeExisting(); } - connect(ReadWrite | Create); + connect(mapbox::sqlite::ReadWrite | mapbox::sqlite::Create); } catch (...) { Log::Error(Event::Database, "Unexpected error creating database: %s", util::toString(std::current_exception()).c_str()); throw; @@ -77,7 +75,7 @@ void OfflineDatabase::ensureSchema() { try { #include "offline_schema.cpp.include" - connect(ReadWrite | Create); + connect(mapbox::sqlite::ReadWrite | mapbox::sqlite::Create); // If you change the schema you must write a migration from the previous version. db->exec("PRAGMA auto_vacuum = INCREMENTAL"); @@ -178,18 +176,22 @@ std::pair<bool, uint64_t> OfflineDatabase::putInternal(const Resource& resource, } optional<std::pair<Response, uint64_t>> OfflineDatabase::getResource(const Resource& resource) { + // clang-format off Statement accessedStmt = getStatement( "UPDATE resources SET accessed = ?1 WHERE url = ?2"); + // clang-format on accessedStmt->bind(1, util::now()); accessedStmt->bind(2, resource.url); accessedStmt->run(); + // clang-format off Statement stmt = getStatement( // 0 1 2 3 4 "SELECT etag, expires, modified, data, compressed " "FROM resources " "WHERE url = ?"); + // clang-format on stmt->bind(1, resource.url); @@ -223,11 +225,13 @@ bool OfflineDatabase::putResource(const Resource& resource, const std::string& data, bool compressed) { if (response.notModified) { + // clang-format off Statement update = getStatement( "UPDATE resources " "SET accessed = ?1, " " expires = ?2 " "WHERE url = ?3 "); + // clang-format on update->bind(1, util::now()); update->bind(2, response.expires); @@ -240,8 +244,9 @@ bool OfflineDatabase::putResource(const Resource& resource, // Begin an immediate-mode transaction to ensure that two writers do not attempt // to INSERT a resource at the same moment. - Transaction transaction(*db, Transaction::Immediate); + mapbox::sqlite::Transaction transaction(*db, mapbox::sqlite::Transaction::Immediate); + // clang-format off Statement update = getStatement( "UPDATE resources " "SET kind = ?1, " @@ -252,6 +257,7 @@ bool OfflineDatabase::putResource(const Resource& resource, " data = ?6, " " compressed = ?7 " "WHERE url = ?8 "); + // clang-format on update->bind(1, int(resource.kind)); update->bind(2, response.etag); @@ -274,9 +280,11 @@ bool OfflineDatabase::putResource(const Resource& resource, return false; } + // clang-format off Statement insert = getStatement( "INSERT INTO resources (url, kind, etag, expires, modified, accessed, data, compressed) " "VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8) "); + // clang-format on insert->bind(1, resource.url); insert->bind(2, int(resource.kind)); @@ -300,6 +308,7 @@ bool OfflineDatabase::putResource(const Resource& resource, } optional<std::pair<Response, uint64_t>> OfflineDatabase::getTile(const Resource::TileData& tile) { + // clang-format off Statement accessedStmt = getStatement( "UPDATE tiles " "SET accessed = ?1 " @@ -308,6 +317,7 @@ optional<std::pair<Response, uint64_t>> OfflineDatabase::getTile(const Resource: " AND x = ?4 " " AND y = ?5 " " AND z = ?6 "); + // clang-format on accessedStmt->bind(1, util::now()); accessedStmt->bind(2, tile.urlTemplate); @@ -317,6 +327,7 @@ optional<std::pair<Response, uint64_t>> OfflineDatabase::getTile(const Resource: accessedStmt->bind(6, tile.z); accessedStmt->run(); + // clang-format off Statement stmt = getStatement( // 0 1 2 3 4 "SELECT etag, expires, modified, data, compressed " @@ -326,6 +337,7 @@ optional<std::pair<Response, uint64_t>> OfflineDatabase::getTile(const Resource: " AND x = ?3 " " AND y = ?4 " " AND z = ?5 "); + // clang-format on stmt->bind(1, tile.urlTemplate); stmt->bind(2, tile.pixelRatio); @@ -363,6 +375,7 @@ bool OfflineDatabase::putTile(const Resource::TileData& tile, const std::string& data, bool compressed) { if (response.notModified) { + // clang-format off Statement update = getStatement( "UPDATE tiles " "SET accessed = ?1, " @@ -372,6 +385,7 @@ bool OfflineDatabase::putTile(const Resource::TileData& tile, " AND x = ?5 " " AND y = ?6 " " AND z = ?7 "); + // clang-format on update->bind(1, util::now()); update->bind(2, response.expires); @@ -388,8 +402,9 @@ bool OfflineDatabase::putTile(const Resource::TileData& tile, // Begin an immediate-mode transaction to ensure that two writers do not attempt // to INSERT a resource at the same moment. - Transaction transaction(*db, Transaction::Immediate); + mapbox::sqlite::Transaction transaction(*db, mapbox::sqlite::Transaction::Immediate); + // clang-format off Statement update = getStatement( "UPDATE tiles " "SET modified = ?1, " @@ -403,6 +418,7 @@ bool OfflineDatabase::putTile(const Resource::TileData& tile, " AND x = ?9 " " AND y = ?10 " " AND z = ?11 "); + // clang-format on update->bind(1, response.modified); update->bind(2, response.etag); @@ -428,9 +444,11 @@ bool OfflineDatabase::putTile(const Resource::TileData& tile, return false; } + // clang-format off Statement insert = getStatement( "INSERT INTO tiles (url_template, pixel_ratio, x, y, z, modified, etag, expires, accessed, data, compressed) " "VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11) "); + // clang-format on insert->bind(1, tile.urlTemplate); insert->bind(2, tile.pixelRatio); @@ -457,8 +475,10 @@ bool OfflineDatabase::putTile(const Resource::TileData& tile, } std::vector<OfflineRegion> OfflineDatabase::listRegions() { + // clang-format off Statement stmt = getStatement( "SELECT id, definition, description FROM regions"); + // clang-format on std::vector<OfflineRegion> result; @@ -474,9 +494,11 @@ std::vector<OfflineRegion> OfflineDatabase::listRegions() { OfflineRegion OfflineDatabase::createRegion(const OfflineRegionDefinition& definition, const OfflineRegionMetadata& metadata) { + // clang-format off Statement stmt = getStatement( "INSERT INTO regions (definition, description) " "VALUES (?1, ?2) "); + // clang-format on stmt->bind(1, encodeOfflineRegionDefinition(definition)); stmt->bindBlob(2, metadata); @@ -486,8 +508,10 @@ OfflineRegion OfflineDatabase::createRegion(const OfflineRegionDefinition& defin } void OfflineDatabase::deleteRegion(OfflineRegion&& region) { + // clang-format off Statement stmt = getStatement( "DELETE FROM regions WHERE id = ?"); + // clang-format on stmt->bind(1, region.getID()); stmt->run(); @@ -525,6 +549,7 @@ uint64_t OfflineDatabase::putRegionResource(int64_t regionID, const Resource& re bool OfflineDatabase::markUsed(int64_t regionID, const Resource& resource) { if (resource.kind == Resource::Kind::Tile) { + // clang-format off Statement insert = getStatement( "INSERT OR IGNORE INTO region_tiles (region_id, tile_id) " "SELECT ?1, tiles.id " @@ -534,6 +559,7 @@ bool OfflineDatabase::markUsed(int64_t regionID, const Resource& resource) { " AND x = ?4 " " AND y = ?5 " " AND z = ?6 "); + // clang-format on const Resource::TileData& tile = *resource.tileData; insert->bind(1, regionID); @@ -548,6 +574,7 @@ bool OfflineDatabase::markUsed(int64_t regionID, const Resource& resource) { return false; } + // clang-format off Statement select = getStatement( "SELECT region_id " "FROM region_tiles, tiles " @@ -558,6 +585,7 @@ bool OfflineDatabase::markUsed(int64_t regionID, const Resource& resource) { " AND y = ?5 " " AND z = ?6 " "LIMIT 1 "); + // clang-format on select->bind(1, regionID); select->bind(2, tile.urlTemplate); @@ -567,11 +595,13 @@ bool OfflineDatabase::markUsed(int64_t regionID, const Resource& resource) { select->bind(6, tile.z); return !select->run(); } else { + // clang-format off Statement insert = getStatement( "INSERT OR IGNORE INTO region_resources (region_id, resource_id) " "SELECT ?1, resources.id " "FROM resources " "WHERE resources.url = ?2 "); + // clang-format on insert->bind(1, regionID); insert->bind(2, resource.url); @@ -581,12 +611,14 @@ bool OfflineDatabase::markUsed(int64_t regionID, const Resource& resource) { return false; } + // clang-format off Statement select = getStatement( "SELECT region_id " "FROM region_resources, resources " "WHERE region_id != ?1 " " AND resources.url = ?2 " "LIMIT 1 "); + // clang-format on select->bind(1, regionID); select->bind(2, resource.url); @@ -595,8 +627,10 @@ bool OfflineDatabase::markUsed(int64_t regionID, const Resource& resource) { } OfflineRegionDefinition OfflineDatabase::getRegionDefinition(int64_t regionID) { + // clang-format off Statement stmt = getStatement( "SELECT definition FROM regions WHERE id = ?1"); + // clang-format on stmt->bind(1, regionID); stmt->run(); @@ -619,22 +653,26 @@ OfflineRegionStatus OfflineDatabase::getRegionCompletedStatus(int64_t regionID) } std::pair<int64_t, int64_t> OfflineDatabase::getCompletedResourceCountAndSize(int64_t regionID) { + // clang-format off Statement stmt = getStatement( "SELECT COUNT(*), SUM(LENGTH(data)) " "FROM region_resources, resources " "WHERE region_id = ?1 " "AND resource_id = resources.id "); + // clang-format on stmt->bind(1, regionID); stmt->run(); return { stmt->get<int64_t>(0), stmt->get<int64_t>(1) }; } std::pair<int64_t, int64_t> OfflineDatabase::getCompletedTileCountAndSize(int64_t regionID) { + // clang-format off Statement stmt = getStatement( "SELECT COUNT(*), SUM(LENGTH(data)) " "FROM region_tiles, tiles " "WHERE region_id = ?1 " "AND tile_id = tiles.id "); + // clang-format on stmt->bind(1, regionID); stmt->run(); return { stmt->get<int64_t>(0), stmt->get<int64_t>(1) }; @@ -668,6 +706,7 @@ bool OfflineDatabase::evict(uint64_t neededFreeSize) { // The addition of pageSize is a fudge factor to account for non `data` column // size, and because pages can get fragmented on the database. while (usedSize() + neededFreeSize + pageSize > maximumCacheSize) { + // clang-format off Statement stmt1 = getStatement( "DELETE FROM resources " "WHERE id IN ( " @@ -677,10 +716,12 @@ bool OfflineDatabase::evict(uint64_t neededFreeSize) { " WHERE resource_id IS NULL " " ORDER BY accessed ASC LIMIT ?1 " ") "); + // clang-format on stmt1->bind(1, 50); stmt1->run(); uint64_t changes1 = db->changes(); + // clang-format off Statement stmt2 = getStatement( "DELETE FROM tiles " "WHERE id IN ( " @@ -690,6 +731,7 @@ bool OfflineDatabase::evict(uint64_t neededFreeSize) { " WHERE tile_id IS NULL " " ORDER BY accessed ASC LIMIT ?1 " ") "); + // clang-format on stmt2->bind(1, 50); stmt2->run(); uint64_t changes2 = db->changes(); @@ -727,11 +769,13 @@ uint64_t OfflineDatabase::getOfflineMapboxTileCount() { return *offlineMapboxTileCount; } + // clang-format off Statement stmt = getStatement( "SELECT COUNT(DISTINCT id) " "FROM region_tiles, tiles " "WHERE tile_id = tiles.id " "AND url_template LIKE 'mapbox://%' "); + // clang-format on stmt->run(); diff --git a/platform/default/mbgl/storage/offline_database.hpp b/platform/default/mbgl/storage/offline_database.hpp index 1706c6ba5a..55cb7ad2fa 100644 --- a/platform/default/mbgl/storage/offline_database.hpp +++ b/platform/default/mbgl/storage/offline_database.hpp @@ -15,8 +15,8 @@ namespace mapbox { namespace sqlite { class Database; class Statement; -} -} +} // namespace sqlite +} // namespace mapbox namespace mbgl { @@ -27,8 +27,7 @@ class OfflineDatabase : private util::noncopyable { public: // Limits affect ambient caching (put) only; resources required by offline // regions are exempt. - OfflineDatabase(const std::string& path, - uint64_t maximumCacheSize = util::DEFAULT_MAX_CACHE_SIZE); + OfflineDatabase(std::string path, uint64_t maximumCacheSize = util::DEFAULT_MAX_CACHE_SIZE); ~OfflineDatabase(); optional<Response> get(const Resource&); diff --git a/platform/default/mbgl/storage/offline_download.cpp b/platform/default/mbgl/storage/offline_download.cpp index 11ca862925..dd66abf982 100644 --- a/platform/default/mbgl/storage/offline_download.cpp +++ b/platform/default/mbgl/storage/offline_download.cpp @@ -1,13 +1,16 @@ -#include <mbgl/storage/offline_download.hpp> -#include <mbgl/storage/offline_database.hpp> #include <mbgl/storage/file_source.hpp> +#include <mbgl/storage/offline_database.hpp> +#include <mbgl/storage/offline_download.hpp> #include <mbgl/storage/resource.hpp> #include <mbgl/storage/response.hpp> #include <mbgl/style/parser.hpp> +#include <mbgl/style/sources/geojson_source_impl.hpp> +#include <mbgl/style/tile_source_impl.hpp> #include <mbgl/text/glyph.hpp> -#include <mbgl/util/tile_cover.hpp> #include <mbgl/util/mapbox.hpp> #include <mbgl/util/run_loop.hpp> +#include <mbgl/util/tile_cover.hpp> +#include <mbgl/util/tileset.hpp> #include <set> @@ -63,7 +66,8 @@ std::vector<Resource> OfflineDownload::glyphResources(const style::Parser& parse if (!parser.glyphURL.empty()) { for (const auto& fontStack : parser.fontStacks()) { for (uint32_t i = 0; i < 256; i++) { - result.push_back(Resource::glyphs(parser.glyphURL, fontStack, getGlyphRange(i * 256))); + result.push_back( + Resource::glyphs(parser.glyphURL, fontStack, getGlyphRange(i * 256))); } } } @@ -71,11 +75,13 @@ std::vector<Resource> OfflineDownload::glyphResources(const style::Parser& parse return result; } -std::vector<Resource> OfflineDownload::tileResources(SourceType type, uint16_t tileSize, const Tileset& tileset) const { +std::vector<Resource> +OfflineDownload::tileResources(SourceType type, uint16_t tileSize, const Tileset& tileset) const { std::vector<Resource> result; - for (const auto& tile : definition.tileCover(type, tileSize, tileset)) { - result.push_back(Resource::tile(tileset.tiles[0], definition.pixelRatio, tile.x, tile.y, tile.z)); + for (const auto& tile : definition.tileCover(type, tileSize, tileset.zoomRange)) { + result.push_back( + Resource::tile(tileset.tiles[0], definition.pixelRatio, tile.x, tile.y, tile.z)); } return result; @@ -100,28 +106,45 @@ OfflineRegionStatus OfflineDownload::getStatus() const { result.requiredResourceCountIsPrecise = true; for (const auto& source : parser.sources) { - switch (source->type) { + switch (source->baseImpl->type) { case SourceType::Vector: - case SourceType::Raster: - if (source->getTileset()) { - result.requiredResourceCount += tileResources(source->type, source->tileSize, *source->getTileset()).size(); + case SourceType::Raster: { + style::TileSourceImpl* tileSource = + static_cast<style::TileSourceImpl*>(source->baseImpl.get()); + const variant<std::string, Tileset>& urlOrTileset = tileSource->getURLOrTileset(); + + if (urlOrTileset.is<Tileset>()) { + result.requiredResourceCount += + tileResources(source->baseImpl->type, tileSource->getTileSize(), + urlOrTileset.get<Tileset>()) + .size(); } else { result.requiredResourceCount += 1; - optional<Response> sourceResponse = offlineDatabase.get(Resource::source(source->url)); + const std::string& url = urlOrTileset.get<std::string>(); + optional<Response> sourceResponse = offlineDatabase.get(Resource::source(url)); if (sourceResponse) { - result.requiredResourceCount += tileResources(source->type, source->tileSize, - *style::parseTileJSON(*sourceResponse->data, source->url, source->type, source->tileSize)).size(); + result.requiredResourceCount += + tileResources(source->baseImpl->type, tileSource->getTileSize(), + style::TileSourceImpl::parseTileJSON( + *sourceResponse->data, url, source->baseImpl->type, + tileSource->getTileSize())) + .size(); } else { result.requiredResourceCountIsPrecise = false; } } break; + } + + case SourceType::GeoJSON: { + style::GeoJSONSource::Impl* geojsonSource = + static_cast<style::GeoJSONSource::Impl*>(source->baseImpl.get()); - case SourceType::GeoJSON: - if (!source->url.empty()) { + if (!geojsonSource->loaded) { result.requiredResourceCount += 1; } break; + } case SourceType::Video: case SourceType::Annotations: @@ -141,28 +164,33 @@ void OfflineDownload::activateDownload() { requiredSourceURLs.clear(); - ensureResource(Resource::style(definition.styleURL), [&] (Response styleResponse) { + ensureResource(Resource::style(definition.styleURL), [&](Response styleResponse) { status.requiredResourceCountIsPrecise = true; style::Parser parser; parser.parse(*styleResponse.data); for (const auto& source : parser.sources) { - SourceType type = source->type; - uint16_t tileSize = source->tileSize; - std::string url = source->url; + SourceType type = source->baseImpl->type; switch (type) { case SourceType::Vector: - case SourceType::Raster: - if (source->getTileset()) { - ensureTiles(type, tileSize, *source->getTileset()); + case SourceType::Raster: { + const style::TileSourceImpl* tileSource = + static_cast<style::TileSourceImpl*>(source->baseImpl.get()); + const variant<std::string, Tileset>& urlOrTileset = tileSource->getURLOrTileset(); + const uint16_t tileSize = tileSource->getTileSize(); + + if (urlOrTileset.is<Tileset>()) { + ensureTiles(type, tileSize, urlOrTileset.get<Tileset>()); } else { + const std::string& url = urlOrTileset.get<std::string>(); status.requiredResourceCountIsPrecise = false; requiredSourceURLs.insert(url); - ensureResource(Resource::source(url), [=] (Response sourceResponse) { - ensureTiles(type, tileSize, *style::parseTileJSON(*sourceResponse.data, url, type, tileSize)); + ensureResource(Resource::source(url), [=](Response sourceResponse) { + ensureTiles(type, tileSize, style::TileSourceImpl::parseTileJSON( + *sourceResponse.data, url, type, tileSize)); requiredSourceURLs.erase(url); if (requiredSourceURLs.empty()) { @@ -171,19 +199,24 @@ void OfflineDownload::activateDownload() { }); } break; + } - case SourceType::GeoJSON: - if (!source->url.empty()) { - ensureResource(Resource::source(source->url)); + case SourceType::GeoJSON: { + style::GeoJSONSource::Impl* geojsonSource = + static_cast<style::GeoJSONSource::Impl*>(source->baseImpl.get()); + + if (!geojsonSource->loaded) { + ensureResource(Resource::source(geojsonSource->getURL())); } break; + } case SourceType::Video: case SourceType::Annotations: break; } } - + for (const auto& resource : spriteResources(parser)) { ensureResource(resource); } @@ -204,14 +237,16 @@ void OfflineDownload::ensureTiles(SourceType type, uint16_t tileSize, const Tile } } -void OfflineDownload::ensureResource(const Resource& resource, std::function<void (Response)> callback) { +void OfflineDownload::ensureResource(const Resource& resource, + std::function<void(Response)> callback) { status.requiredResourceCount++; auto workRequestsIt = requests.insert(requests.begin(), nullptr); - *workRequestsIt = util::RunLoop::Get()->invokeCancellable([=] () { + *workRequestsIt = util::RunLoop::Get()->invokeCancellable([=]() { requests.erase(workRequestsIt); - optional<std::pair<Response, uint64_t>> offlineResponse = offlineDatabase.getRegionResource(id, resource); + optional<std::pair<Response, uint64_t>> offlineResponse = + offlineDatabase.getRegionResource(id, resource); if (offlineResponse) { if (callback) { callback(offlineResponse->first); @@ -220,24 +255,25 @@ void OfflineDownload::ensureResource(const Resource& resource, std::function<voi status.completedResourceCount++; status.completedResourceSize += offlineResponse->second; if (resource.kind == Resource::Kind::Tile) { + status.completedTileCount += 1; status.completedTileSize += offlineResponse->second; } - + observer->statusChanged(status); - + if (status.complete()) { setState(OfflineRegionDownloadState::Inactive); } return; } - + if (checkTileCountLimit(resource)) { return; } auto fileRequestsIt = requests.insert(requests.begin(), nullptr); - *fileRequestsIt = onlineFileSource.request(resource, [=] (Response onlineResponse) { + *fileRequestsIt = onlineFileSource.request(resource, [=](Response onlineResponse) { if (onlineResponse.error) { observer->responseError(*onlineResponse.error); return; @@ -253,15 +289,16 @@ void OfflineDownload::ensureResource(const Resource& resource, std::function<voi uint64_t resourceSize = offlineDatabase.putRegionResource(id, resource, onlineResponse); status.completedResourceSize += resourceSize; if (resource.kind == Resource::Kind::Tile) { + status.completedTileCount += 1; status.completedTileSize += resourceSize; } observer->statusChanged(status); - + if (checkTileCountLimit(resource)) { return; } - + if (status.complete()) { setState(OfflineRegionDownloadState::Inactive); } @@ -270,14 +307,13 @@ void OfflineDownload::ensureResource(const Resource& resource, std::function<voi } bool OfflineDownload::checkTileCountLimit(const Resource& resource) { - if (resource.kind == Resource::Kind::Tile - && util::mapbox::isMapboxURL(resource.url) - && offlineDatabase.offlineMapboxTileCountLimitExceeded()) { + if (resource.kind == Resource::Kind::Tile && util::mapbox::isMapboxURL(resource.url) && + offlineDatabase.offlineMapboxTileCountLimitExceeded()) { observer->mapboxTileCountLimitExceeded(offlineDatabase.getOfflineMapboxTileCountLimit()); setState(OfflineRegionDownloadState::Inactive); return true; } - + return false; } diff --git a/platform/default/mbgl/storage/offline_download.hpp b/platform/default/mbgl/storage/offline_download.hpp index 1a0d7536d8..27c5f0b139 100644 --- a/platform/default/mbgl/storage/offline_download.hpp +++ b/platform/default/mbgl/storage/offline_download.hpp @@ -17,7 +17,7 @@ class Tileset; namespace style { class Parser; -} +} // namespace style /** * Coordinates the request and storage of all resources for an offline region. |