From aa6647e910073edffbd1f3c087ed110927c38aeb Mon Sep 17 00:00:00 2001 From: Asheem Mamoowala Date: Thu, 18 May 2017 13:56:09 -0700 Subject: [core] Offline support for Image Sources --- include/mbgl/storage/resource.hpp | 6 +++-- platform/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 c05f40b65c..7e9ced8049 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 99b4447711..980561e43a 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 a72b6f4efc..d7649a348c 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 20dde1db56..94bba7f8bf 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 4f86befd0b..3c33a7807f 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 0000000000..7398a060c0 Binary files /dev/null and b/test/fixtures/offline_download/radar.gif differ diff --git a/test/fixtures/offline_download/style.json b/test/fixtures/offline_download/style.json index 978df3aae3..618afd45f0 100644 --- a/test/fixtures/offline_download/style.json +++ b/test/fixtures/offline_download/style.json @@ -5,6 +5,16 @@ "mapbox": { "type": "vector", "url": "http://127.0.0.1:3000/streets.json" + }, + "radar": { + "type": "image", + "url":"http://127.0.0.1:3000/radar.gif", + "coordinates": [ + [-180, -85.0511], + [180, -85.0511], + [180, 85.0511], + [-180, 85.0511] + ] } }, "glyphs": "http://127.0.0.1:3000/{fontstack}/{range}.pbf", diff --git a/test/src/mbgl/test/stub_file_source.cpp b/test/src/mbgl/test/stub_file_source.cpp index ec0545e88c..7891d5d907 100644 --- a/test/src/mbgl/test/stub_file_source.cpp +++ b/test/src/mbgl/test/stub_file_source.cpp @@ -77,6 +77,9 @@ optional 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 ee4175cc3f..85118e1a77 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 27e57771c8..57780eba40 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 1c15fe6503..5a27aa98a5 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); -- cgit v1.2.1