From aa6647e910073edffbd1f3c087ed110927c38aeb Mon Sep 17 00:00:00 2001 From: Asheem Mamoowala Date: Thu, 18 May 2017 13:56:09 -0700 Subject: [PATCH] [core] Offline support for Image Sources --- include/mbgl/storage/resource.hpp | 6 ++-- .../default/mbgl/storage/offline_download.cpp | 29 +++++++++++++----- platform/default/online_file_source.cpp | 1 + src/mbgl/storage/resource.cpp | 7 +++++ src/mbgl/style/sources/image_source.cpp | 2 +- test/fixtures/offline_download/radar.gif | Bin 0 -> 10958 bytes test/fixtures/offline_download/style.json | 10 ++++++ test/src/mbgl/test/stub_file_source.cpp | 3 ++ test/src/mbgl/test/stub_file_source.hpp | 1 + test/storage/offline_download.test.cpp | 11 +++++-- test/storage/resource.test.cpp | 7 +++++ 11 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 test/fixtures/offline_download/radar.gif diff --git a/include/mbgl/storage/resource.hpp b/include/mbgl/storage/resource.hpp index c05f40b65..7e9ced804 100644 --- a/include/mbgl/storage/resource.hpp +++ b/include/mbgl/storage/resource.hpp @@ -18,7 +18,8 @@ public: Tile, Glyphs, SpriteImage, - SpriteJSON + SpriteJSON, + Image }; struct TileData { @@ -55,7 +56,8 @@ public: const std::pair& glyphRange); static Resource spriteImage(const std::string& base, float pixelRatio); static Resource spriteJSON(const std::string& base, float pixelRatio); - + static Resource image(const std::string& url); + Kind kind; Necessity necessity; std::string url; diff --git a/platform/default/mbgl/storage/offline_download.cpp b/platform/default/mbgl/storage/offline_download.cpp index 99b444771..980561e43 100644 --- a/platform/default/mbgl/storage/offline_download.cpp +++ b/platform/default/mbgl/storage/offline_download.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -111,8 +112,16 @@ OfflineRegionStatus OfflineDownload::getStatus() const { } case SourceType::GeoJSON: { - auto* geojsonSource = source->as(); - if (geojsonSource->getURL()) { + const auto& geojsonSource = *source->as(); + if (geojsonSource.getURL()) { + result.requiredResourceCount += 1; + } + break; + } + + case SourceType::Image: { + const auto& imageSource = *source->as(); + if (!imageSource.getURL().empty()) { result.requiredResourceCount += 1; } break; @@ -120,7 +129,6 @@ OfflineRegionStatus OfflineDownload::getStatus() const { case SourceType::Video: case SourceType::Annotations: - case SourceType::Image: break; } } @@ -188,17 +196,24 @@ void OfflineDownload::activateDownload() { } case SourceType::GeoJSON: { - const auto* geojsonSource = static_cast(source.get()); + const auto& geojsonSource = *source->as(); + if (geojsonSource.getURL()) { + queueResource(Resource::source(*geojsonSource.getURL())); + } + break; + } - if (geojsonSource->getURL()) { - queueResource(Resource::source(*geojsonSource->getURL())); + case SourceType::Image: { + const auto& imageSource = *source->as(); + std::string imageUrl = imageSource.getURL(); + if (!imageUrl.empty()) { + queueResource(Resource::image(imageUrl)); } break; } case SourceType::Video: case SourceType::Annotations: - case SourceType::Image: break; } } diff --git a/platform/default/online_file_source.cpp b/platform/default/online_file_source.cpp index a72b6f4ef..d7649a348 100644 --- a/platform/default/online_file_source.cpp +++ b/platform/default/online_file_source.cpp @@ -189,6 +189,7 @@ std::unique_ptr OnlineFileSource::request(const Resource& resource switch (resource.kind) { case Resource::Kind::Unknown: + case Resource::Kind::Image: break; case Resource::Kind::Style: diff --git a/src/mbgl/storage/resource.cpp b/src/mbgl/storage/resource.cpp index 20dde1db5..94bba7f8b 100644 --- a/src/mbgl/storage/resource.cpp +++ b/src/mbgl/storage/resource.cpp @@ -53,6 +53,13 @@ Resource Resource::source(const std::string& url) { }; } +Resource Resource::image(const std::string& url) { + return Resource { + Resource::Kind::Image, + url + }; +} + Resource Resource::spriteImage(const std::string& base, float pixelRatio) { return Resource { Resource::Kind::SpriteImage, diff --git a/src/mbgl/style/sources/image_source.cpp b/src/mbgl/style/sources/image_source.cpp index 4f86befd0..3c33a7807 100644 --- a/src/mbgl/style/sources/image_source.cpp +++ b/src/mbgl/style/sources/image_source.cpp @@ -59,7 +59,7 @@ void ImageSource::loadDescription(FileSource& fileSource) { if (req || loaded) { return; } - const Resource imageResource { Resource::Unknown, *url, {}, Resource::Necessity::Required }; + const Resource imageResource { Resource::Image, *url, {}, Resource::Necessity::Required }; req = fileSource.request(imageResource, [this](Response res) { if (res.error) { diff --git a/test/fixtures/offline_download/radar.gif b/test/fixtures/offline_download/radar.gif new file mode 100644 index 0000000000000000000000000000000000000000..7398a060c09834a3545cb4502139441ab9664fea GIT binary patch literal 10958 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 StubFileSource::defaultResponse(const Resource& resource) { case Resource::Kind::SpriteImage: if (!spriteImageResponse) throw std::runtime_error("unexpected sprite image request"); return spriteImageResponse(resource); + case Resource::Kind::Image: + if (!imageResponse) throw std::runtime_error("unexpected image request"); + return imageResponse(resource); case Resource::Kind::Unknown: throw std::runtime_error("unknown resource type"); } diff --git a/test/src/mbgl/test/stub_file_source.hpp b/test/src/mbgl/test/stub_file_source.hpp index ee4175cc3..85118e1a7 100644 --- a/test/src/mbgl/test/stub_file_source.hpp +++ b/test/src/mbgl/test/stub_file_source.hpp @@ -29,6 +29,7 @@ public: ResponseFunction glyphsResponse; ResponseFunction spriteJSONResponse; ResponseFunction spriteImageResponse; + ResponseFunction imageResponse; private: // The default behavior is to throw if no per-kind callback has been set. diff --git a/test/storage/offline_download.test.cpp b/test/storage/offline_download.test.cpp index 27e57771c..57780eba4 100644 --- a/test/storage/offline_download.test.cpp +++ b/test/storage/offline_download.test.cpp @@ -191,6 +191,11 @@ TEST(OfflineDownload, Activate) { return test.response("sprite.png"); }; + test.fileSource.imageResponse = [&] (const Resource& resource) { + EXPECT_EQ("http://127.0.0.1:3000/radar.gif", resource.url); + return test.response("radar.gif"); + }; + test.fileSource.spriteJSONResponse = [&] (const Resource& resource) { EXPECT_EQ("http://127.0.0.1:3000/sprite.json", resource.url); return test.response("sprite.json"); @@ -219,7 +224,7 @@ TEST(OfflineDownload, Activate) { observer->statusChangedFn = [&] (OfflineRegionStatus status) { if (status.complete()) { - EXPECT_EQ(261u, status.completedResourceCount); // 256 glyphs, 1 tile, 1 style, source, sprite image, and sprite json + EXPECT_EQ(262u, status.completedResourceCount); // 256 glyphs, 1 tile, 1 style, source, image, sprite image, and sprite json EXPECT_EQ(test.size, status.completedResourceSize); download.setState(OfflineRegionDownloadState::Inactive); @@ -299,7 +304,7 @@ TEST(OfflineDownload, GetStatusStyleComplete) { EXPECT_EQ(OfflineRegionDownloadState::Inactive, status.downloadState); EXPECT_EQ(1u, status.completedResourceCount); EXPECT_EQ(test.size, status.completedResourceSize); - EXPECT_EQ(260u, status.requiredResourceCount); + EXPECT_EQ(261u, status.requiredResourceCount); EXPECT_FALSE(status.requiredResourceCountIsPrecise); EXPECT_FALSE(status.complete()); } @@ -325,7 +330,7 @@ TEST(OfflineDownload, GetStatusStyleAndSourceComplete) { EXPECT_EQ(OfflineRegionDownloadState::Inactive, status.downloadState); EXPECT_EQ(2u, status.completedResourceCount); EXPECT_EQ(test.size, status.completedResourceSize); - EXPECT_EQ(261u, status.requiredResourceCount); + EXPECT_EQ(262u, status.requiredResourceCount); EXPECT_TRUE(status.requiredResourceCountIsPrecise); EXPECT_FALSE(status.complete()); } diff --git a/test/storage/resource.test.cpp b/test/storage/resource.test.cpp index 1c15fe650..5a27aa98a 100644 --- a/test/storage/resource.test.cpp +++ b/test/storage/resource.test.cpp @@ -117,6 +117,13 @@ TEST(Resource, SpriteImage) { EXPECT_EQ("http://example.com/sprite@2x.png", resource.url); } +TEST(Resource, Image) { + using namespace mbgl; + Resource resource = Resource::image("http://example.com/sprite.jpg"); + EXPECT_EQ(Resource::Kind::Image, resource.kind); + EXPECT_EQ("http://example.com/sprite.jpg", resource.url); +} + TEST(Resource, SpriteJSON) { using namespace mbgl; Resource resource = Resource::spriteJSON("http://example.com/sprite", 2.0);