summaryrefslogtreecommitdiff
path: root/platform/default/mbgl
diff options
context:
space:
mode:
Diffstat (limited to 'platform/default/mbgl')
-rw-r--r--platform/default/mbgl/storage/offline.cpp20
-rw-r--r--platform/default/mbgl/storage/offline_database.cpp66
-rw-r--r--platform/default/mbgl/storage/offline_database.hpp7
-rw-r--r--platform/default/mbgl/storage/offline_download.cpp120
-rw-r--r--platform/default/mbgl/storage/offline_download.hpp2
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.