summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvo van Dongen <info@ivovandongen.nl>2016-10-20 12:02:04 +0300
committerIvo van Dongen <ivovandongen@users.noreply.github.com>2016-10-20 16:18:08 +0300
commitab63a9494f109245f9bd81839e2576b60a34cd2c (patch)
tree62acef7b18d88a8386abdca75b8ff73cb39701fa
parent5527887c4bb1299fd2351e1a0c7550fab5f39bef (diff)
downloadqtlocation-mapboxgl-ab63a9494f109245f9bd81839e2576b60a34cd2c.tar.gz
[core] reload geojson source on url change
-rw-r--r--src/mbgl/style/source_observer.hpp3
-rw-r--r--src/mbgl/style/sources/geojson_source_impl.cpp7
-rw-r--r--src/mbgl/style/style.cpp7
-rw-r--r--src/mbgl/style/style.hpp1
-rw-r--r--test/src/mbgl/test/stub_style_observer.hpp5
-rw-r--r--test/style/source.test.cpp34
6 files changed, 57 insertions, 0 deletions
diff --git a/src/mbgl/style/source_observer.hpp b/src/mbgl/style/source_observer.hpp
index a6cdab6ba2..dcbcaeabaf 100644
--- a/src/mbgl/style/source_observer.hpp
+++ b/src/mbgl/style/source_observer.hpp
@@ -20,6 +20,9 @@ public:
virtual void onSourceAttributionChanged(Source&, const std::string&) {}
virtual void onSourceError(Source&, std::exception_ptr) {}
+ //Source description needs to be reloaded
+ virtual void onSourceDescriptionChanged(Source&) {}
+
virtual void onTileChanged(Source&, const OverscaledTileID&) {}
virtual void onTileError(Source&, const OverscaledTileID&, std::exception_ptr) {}
};
diff --git a/src/mbgl/style/sources/geojson_source_impl.cpp b/src/mbgl/style/sources/geojson_source_impl.cpp
index 5b7ba4fc77..f4d47cae35 100644
--- a/src/mbgl/style/sources/geojson_source_impl.cpp
+++ b/src/mbgl/style/sources/geojson_source_impl.cpp
@@ -38,6 +38,12 @@ GeoJSONSource::Impl::~Impl() = default;
void GeoJSONSource::Impl::setURL(std::string url_) {
url = std::move(url_);
+
+ //Signal that the source description needs a reload
+ if (loaded) {
+ loaded = false;
+ observer->onSourceDescriptionChanged(base);
+ }
}
optional<std::string> GeoJSONSource::Impl::getURL() {
@@ -132,6 +138,7 @@ void GeoJSONSource::Impl::loadDescription(FileSource& fileSource) {
loaded = true;
observer->onSourceLoaded(base);
+ req.reset();
}
});
}
diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp
index 522965b953..01ca5b6f36 100644
--- a/src/mbgl/style/style.cpp
+++ b/src/mbgl/style/style.cpp
@@ -491,6 +491,13 @@ void Style::onSourceError(Source& source, std::exception_ptr error) {
observer->onResourceError(error);
}
+void Style::onSourceDescriptionChanged(Source& source) {
+ observer->onSourceDescriptionChanged(source);
+ if (!source.baseImpl->loaded) {
+ source.baseImpl->loadDescription(fileSource);
+ }
+}
+
void Style::onTileChanged(Source& source, const OverscaledTileID& tileID) {
observer->onTileChanged(source, tileID);
observer->onUpdate(Update::Repaint);
diff --git a/src/mbgl/style/style.hpp b/src/mbgl/style/style.hpp
index 648bd48030..21b25857d6 100644
--- a/src/mbgl/style/style.hpp
+++ b/src/mbgl/style/style.hpp
@@ -134,6 +134,7 @@ private:
void onSourceLoaded(Source&) override;
void onSourceAttributionChanged(Source&, const std::string&) override;
void onSourceError(Source&, std::exception_ptr) override;
+ void onSourceDescriptionChanged(Source&) override;
void onTileChanged(Source&, const OverscaledTileID&) override;
void onTileError(Source&, const OverscaledTileID&, std::exception_ptr) override;
diff --git a/test/src/mbgl/test/stub_style_observer.hpp b/test/src/mbgl/test/stub_style_observer.hpp
index 7189fd8af4..95280565ff 100644
--- a/test/src/mbgl/test/stub_style_observer.hpp
+++ b/test/src/mbgl/test/stub_style_observer.hpp
@@ -38,6 +38,10 @@ public:
if (sourceError) sourceError(source, error);
}
+ void onSourceDescriptionChanged(Source& source) override {
+ if (sourceDescriptionChanged) sourceDescriptionChanged(source);
+ }
+
void onTileChanged(Source& source, const OverscaledTileID& tileID) override {
if (tileChanged) tileChanged(source, tileID);
};
@@ -58,6 +62,7 @@ public:
std::function<void (Source&)> sourceLoaded;
std::function<void (Source&, std::string)> sourceAttributionChanged;
std::function<void (Source&, std::exception_ptr)> sourceError;
+ std::function<void (Source&)> sourceDescriptionChanged;
std::function<void (Source&, const OverscaledTileID&)> tileChanged;
std::function<void (Source&, const OverscaledTileID&, std::exception_ptr)> tileError;
std::function<void (std::exception_ptr)> resourceError;
diff --git a/test/style/source.test.cpp b/test/style/source.test.cpp
index 859aa82893..3270894a59 100644
--- a/test/style/source.test.cpp
+++ b/test/style/source.test.cpp
@@ -381,3 +381,37 @@ TEST(Source, RasterTileAttribution) {
test.run();
}
+
+TEST(Source, GeoJSonSourceUrlUpdate) {
+ SourceTest test;
+
+ test.fileSource.sourceResponse = [&] (const Resource& resource) {
+ EXPECT_EQ("url", resource.url);
+ Response response;
+ response.data = std::make_unique<std::string>("{\"geometry\": {\"type\": \"Point\", \"coordinates\": [1.1, 1.1]}, \"type\": \"Feature\", \"properties\": {}}");
+ return response;
+ };
+
+ test.observer.sourceDescriptionChanged = [&] (Source&) {
+ //Should be called (test will hang if it doesn't)
+ test.end();
+ };
+
+ test.observer.tileError = [&] (Source&, const OverscaledTileID&, std::exception_ptr) {
+ FAIL() << "Should never be called";
+ };
+
+ GeoJSONSource source("source");
+ source.baseImpl->setObserver(&test.observer);
+
+ //Load initial, so the source state will be loaded=true
+ source.baseImpl->loadDescription(test.fileSource);
+
+ //Schedule an update
+ test.loop.invoke([&] () {
+ //Update the url
+ source.setURL(std::string("http://source-url.ext"));
+ });
+
+ test.run();
+}