Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

Commit

Permalink
[core] Introduce usage tag for resources
Browse files Browse the repository at this point in the history
Make the distinction if a resource is being requested for offline
usage or if it will be used immediately.

Fixes #14746
  • Loading branch information
tmpsantos committed May 27, 2019
1 parent 5e00a2a commit 6948c13
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 9 deletions.
7 changes: 7 additions & 0 deletions include/mbgl/storage/resource.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,11 @@ class Resource {
Low
};

enum class Usage : bool {
Online,
Offline
};

struct TileData {
std::string urlTemplate;
uint8_t pixelRatio;
Expand Down Expand Up @@ -60,6 +65,7 @@ class Resource {
}

void setPriority(Priority p) { priority = p; }
void setUsage(Usage u) { usage = u; }

bool hasLoadingMethod(LoadingMethod method);

Expand All @@ -83,6 +89,7 @@ class Resource {

Kind kind;
LoadingMethod loadingMethod;
Usage usage{ Usage::Online };
Priority priority;
std::string url;

Expand Down
2 changes: 1 addition & 1 deletion platform/default/include/mbgl/storage/offline_download.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ class OfflineDownload {
std::deque<Resource> resourcesRemaining;
std::list<std::tuple<Resource, Response>> buffer;

void queueResource(Resource);
void queueResource(Resource&&);
void queueTiles(style::SourceType, uint16_t tileSize, const Tileset&);
};

Expand Down
30 changes: 23 additions & 7 deletions platform/default/src/mbgl/storage/offline_download.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -223,8 +223,12 @@ void OfflineDownload::activateDownload() {
status = OfflineRegionStatus();
status.downloadState = OfflineRegionDownloadState::Active;
status.requiredResourceCount++;
ensureResource(Resource::style(definition.match([](auto& reg){ return reg.styleURL; }), Resource::Priority::Low),
[&](Response styleResponse) {

auto styleResource = Resource::style(definition.match([](auto& reg){ return reg.styleURL; }));
styleResource.setPriority(Resource::Priority::Low);
styleResource.setUsage(Resource::Usage::Offline);

ensureResource(styleResource, [&](Response styleResponse) {
status.requiredResourceCountIsPrecise = true;

style::Parser parser;
Expand All @@ -242,7 +246,11 @@ void OfflineDownload::activateDownload() {
status.requiredResourceCount++;
requiredSourceURLs.insert(url);

ensureResource(Resource::source(url, Resource::Priority::Low), [=](Response sourceResponse) {
auto sourceResource = Resource::source(url);
sourceResource.setPriority(Resource::Priority::Low);
sourceResource.setUsage(Resource::Usage::Offline);

ensureResource(sourceResource, [=](Response sourceResponse) {
style::conversion::Error error;
optional<Tileset> tileset = style::conversion::convertJSON<Tileset>(*sourceResponse.data, error);
if (tileset) {
Expand Down Expand Up @@ -361,24 +369,32 @@ void OfflineDownload::deactivateDownload() {
requests.clear();
}

void OfflineDownload::queueResource(Resource resource) {
void OfflineDownload::queueResource(Resource&& resource) {
resource.setPriority(Resource::Priority::Low);
resource.setUsage(Resource::Usage::Offline);
status.requiredResourceCount++;
resourcesRemaining.push_front(std::move(resource));
}

void OfflineDownload::queueTiles(SourceType type, uint16_t tileSize, const Tileset& tileset) {
tileCover(definition, type, tileSize, tileset.zoomRange, [&](const auto& tile) {
status.requiredResourceCount++;
resourcesRemaining.push_back(Resource::tile(
tileset.tiles[0], definition.match([](auto& def) { return def.pixelRatio; }), tile.x,
tile.y, tile.z, tileset.scheme, Resource::Priority::Low));

auto tileResource = Resource::tile(
tileset.tiles[0], definition.match([](auto& def) { return def.pixelRatio; }),
tile.x, tile.y, tile.z, tileset.scheme);

tileResource.setPriority(Resource::Priority::Low);
tileResource.setUsage(Resource::Usage::Offline);

resourcesRemaining.push_back(std::move(tileResource));
});
}

void OfflineDownload::ensureResource(const Resource& resource,
std::function<void(Response)> callback) {
assert(resource.priority == Resource::Priority::Low);
assert(resource.usage == Resource::Usage::Offline);

auto workRequestsIt = requests.insert(requests.begin(), nullptr);
*workRequestsIt = util::RunLoop::Get()->invokeCancellable([=]() {
Expand Down
9 changes: 8 additions & 1 deletion test/storage/offline_download.test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -740,7 +740,7 @@ TEST(OfflineDownload, Deactivate) {
}


TEST(OfflineDownload, AllOfflineRequestsHaveLowPriority) {
TEST(OfflineDownload, AllOfflineRequestsHaveLowPriorityAndOfflineUsage) {
OfflineTest test;
auto region = test.createRegion();
ASSERT_TRUE(region);
Expand All @@ -751,36 +751,43 @@ TEST(OfflineDownload, AllOfflineRequestsHaveLowPriority) {

test.fileSource.styleResponse = [&] (const Resource& resource) {
EXPECT_TRUE(resource.priority == Resource::Priority::Low);
EXPECT_TRUE(resource.usage == Resource::Usage::Offline);
return test.response("style.json");
};

test.fileSource.spriteImageResponse = [&] (const Resource& resource) {
EXPECT_TRUE(resource.priority == Resource::Priority::Low);
EXPECT_TRUE(resource.usage == Resource::Usage::Offline);
return test.response("sprite.png");
};

test.fileSource.imageResponse = [&] (const Resource& resource) {
EXPECT_TRUE(resource.priority == Resource::Priority::Low);
EXPECT_TRUE(resource.usage == Resource::Usage::Offline);
return test.response("radar.gif");
};

test.fileSource.spriteJSONResponse = [&] (const Resource& resource) {
EXPECT_TRUE(resource.priority == Resource::Priority::Low);
EXPECT_TRUE(resource.usage == Resource::Usage::Offline);
return test.response("sprite.json");
};

test.fileSource.glyphsResponse = [&] (const Resource& resource) {
EXPECT_TRUE(resource.priority == Resource::Priority::Low);
EXPECT_TRUE(resource.usage == Resource::Usage::Offline);
return test.response("glyph.pbf");
};

test.fileSource.sourceResponse = [&] (const Resource& resource) {
EXPECT_TRUE(resource.priority == Resource::Priority::Low);
EXPECT_TRUE(resource.usage == Resource::Usage::Offline);
return test.response("streets.json");
};

test.fileSource.tileResponse = [&] (const Resource& resource) {
EXPECT_TRUE(resource.priority == Resource::Priority::Low);
EXPECT_TRUE(resource.usage == Resource::Usage::Offline);
return test.response("0-0-0.vector.pbf");
};

Expand Down

0 comments on commit 6948c13

Please sign in to comment.