[core] reload geojson source on url change

This commit is contained in:
Ivo van Dongen
2016-10-20 12:02:04 +03:00
committed by Ivo van Dongen
parent 5527887c4b
commit ab63a9494f
6 changed files with 57 additions and 0 deletions

View File

@@ -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) {}
};

View File

@@ -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();
}
});
}

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;

View File

@@ -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();
}