From 3c6ccfbb5d7a80e266eda4fa41ae35cf8f625f0d Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Fri, 17 Apr 2020 17:47:28 +0300 Subject: [core] Introduce Tile::setMinimumUpdateInterval() --- src/mbgl/tile/raster_dem_tile.cpp | 4 ++++ src/mbgl/tile/raster_dem_tile.hpp | 3 ++- src/mbgl/tile/raster_tile.cpp | 4 ++++ src/mbgl/tile/raster_tile.hpp | 3 ++- src/mbgl/tile/tile.hpp | 1 + src/mbgl/tile/tile_loader.hpp | 17 +++++++---------- src/mbgl/tile/tile_loader_impl.hpp | 27 ++++++++++++++++++++++++++- src/mbgl/tile/vector_tile.cpp | 4 ++++ src/mbgl/tile/vector_tile.hpp | 1 + 9 files changed, 51 insertions(+), 13 deletions(-) diff --git a/src/mbgl/tile/raster_dem_tile.cpp b/src/mbgl/tile/raster_dem_tile.cpp index b70e581ea1..83b41ddd83 100644 --- a/src/mbgl/tile/raster_dem_tile.cpp +++ b/src/mbgl/tile/raster_dem_tile.cpp @@ -122,4 +122,8 @@ void RasterDEMTile::setNecessity(TileNecessity necessity) { loader.setNecessity(necessity); } +void RasterDEMTile::setMinimumUpdateInterval(Duration interval) { + loader.setMinimumUpdateInterval(interval); +} + } // namespace mbgl diff --git a/src/mbgl/tile/raster_dem_tile.hpp b/src/mbgl/tile/raster_dem_tile.hpp index 68526fdb34..d29c5337be 100644 --- a/src/mbgl/tile/raster_dem_tile.hpp +++ b/src/mbgl/tile/raster_dem_tile.hpp @@ -67,7 +67,8 @@ public: ~RasterDEMTile() override; std::unique_ptr createRenderData() override; - void setNecessity(TileNecessity) final; + void setNecessity(TileNecessity) override; + void setMinimumUpdateInterval(Duration) override; void setError(std::exception_ptr); void setMetadata(optional modified, optional expires); diff --git a/src/mbgl/tile/raster_tile.cpp b/src/mbgl/tile/raster_tile.cpp index 66e32b7ca0..1045097a05 100644 --- a/src/mbgl/tile/raster_tile.cpp +++ b/src/mbgl/tile/raster_tile.cpp @@ -78,4 +78,8 @@ void RasterTile::setNecessity(TileNecessity necessity) { loader.setNecessity(necessity); } +void RasterTile::setMinimumUpdateInterval(Duration interval) { + loader.setMinimumUpdateInterval(interval); +} + } // namespace mbgl diff --git a/src/mbgl/tile/raster_tile.hpp b/src/mbgl/tile/raster_tile.hpp index 3ff05d2f9d..78dbd95c0a 100644 --- a/src/mbgl/tile/raster_tile.hpp +++ b/src/mbgl/tile/raster_tile.hpp @@ -23,7 +23,8 @@ public: ~RasterTile() override; std::unique_ptr createRenderData() override; - void setNecessity(TileNecessity) final; + void setNecessity(TileNecessity) override; + void setMinimumUpdateInterval(Duration) override; void setError(std::exception_ptr); void setMetadata(optional modified, optional expires); diff --git a/src/mbgl/tile/tile.hpp b/src/mbgl/tile/tile.hpp index b73383f989..bf84f8bd98 100644 --- a/src/mbgl/tile/tile.hpp +++ b/src/mbgl/tile/tile.hpp @@ -52,6 +52,7 @@ public: void setObserver(TileObserver* observer); virtual void setNecessity(TileNecessity) {} + virtual void setMinimumUpdateInterval(Duration) {} // Mark this tile as no longer needed and cancel any pending work. virtual void cancel(); diff --git a/src/mbgl/tile/tile_loader.hpp b/src/mbgl/tile/tile_loader.hpp index 65f4ceb118..c6d0d61fef 100644 --- a/src/mbgl/tile/tile_loader.hpp +++ b/src/mbgl/tile/tile_loader.hpp @@ -22,16 +22,8 @@ public: const Tileset&); ~TileLoader(); - void setNecessity(TileNecessity newNecessity) { - if (newNecessity != necessity) { - necessity = newNecessity; - if (necessity == TileNecessity::Required) { - makeRequired(); - } else { - makeOptional(); - } - } - } + void setNecessity(TileNecessity newNecessity); + void setMinimumUpdateInterval(Duration); private: // called when the tile is one of the ideal tiles that we want to show definitely. the tile source @@ -48,11 +40,16 @@ private: void loadedData(const Response&); void loadFromNetwork(); + bool hasPendingNetworkRequest() const { + return resource.loadingMethod == Resource::LoadingMethod::NetworkOnly && request; + } + T& tile; TileNecessity necessity; Resource resource; std::shared_ptr fileSource; std::unique_ptr request; + Duration minimumUpdateInterval{Duration::zero()}; }; } // namespace mbgl diff --git a/src/mbgl/tile/tile_loader_impl.hpp b/src/mbgl/tile/tile_loader_impl.hpp index b518ac6782..78b9fe6df3 100644 --- a/src/mbgl/tile/tile_loader_impl.hpp +++ b/src/mbgl/tile/tile_loader_impl.hpp @@ -56,6 +56,30 @@ TileLoader::TileLoader(T& tile_, template TileLoader::~TileLoader() = default; +template +void TileLoader::setNecessity(TileNecessity newNecessity) { + if (newNecessity != necessity) { + necessity = newNecessity; + if (necessity == TileNecessity::Required) { + makeRequired(); + } else { + makeOptional(); + } + } +} + +template +void TileLoader::setMinimumUpdateInterval(Duration interval) { + if (minimumUpdateInterval != interval) { + minimumUpdateInterval = interval; + if (hasPendingNetworkRequest()) { + // Update the pending request. + request.reset(); + loadFromNetwork(); + } + } +} + template void TileLoader::loadFromCache() { assert(!request); @@ -99,7 +123,7 @@ void TileLoader::makeRequired() { template void TileLoader::makeOptional() { - if (resource.loadingMethod == Resource::LoadingMethod::NetworkOnly && request) { + if (hasPendingNetworkRequest()) { // Abort the current request, but only when we know that we're specifically querying for a // network resource only. request.reset(); @@ -135,6 +159,7 @@ void TileLoader::loadFromNetwork() { // Instead of using Resource::LoadingMethod::All, we're first doing a CacheOnly, and then a // NetworkOnly request. resource.loadingMethod = Resource::LoadingMethod::NetworkOnly; + resource.minimumUpdateInterval = minimumUpdateInterval; request = fileSource->request(resource, [this](const Response& res) { loadedData(res); }); } diff --git a/src/mbgl/tile/vector_tile.cpp b/src/mbgl/tile/vector_tile.cpp index e3e7a2dff8..2e2dabc66e 100644 --- a/src/mbgl/tile/vector_tile.cpp +++ b/src/mbgl/tile/vector_tile.cpp @@ -16,6 +16,10 @@ void VectorTile::setNecessity(TileNecessity necessity) { loader.setNecessity(necessity); } +void VectorTile::setMinimumUpdateInterval(Duration interval) { + loader.setMinimumUpdateInterval(interval); +} + void VectorTile::setMetadata(optional modified_, optional expires_) { modified = std::move(modified_); expires = std::move(expires_); diff --git a/src/mbgl/tile/vector_tile.hpp b/src/mbgl/tile/vector_tile.hpp index 205fd642f0..fdefb14e20 100644 --- a/src/mbgl/tile/vector_tile.hpp +++ b/src/mbgl/tile/vector_tile.hpp @@ -16,6 +16,7 @@ public: const Tileset&); void setNecessity(TileNecessity) final; + void setMinimumUpdateInterval(Duration interval) final; void setMetadata(optional modified, optional expires); void setData(const std::shared_ptr& data); -- cgit v1.2.1