summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2020-04-17 17:47:28 +0300
committerMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2020-04-20 21:54:31 +0300
commit3c6ccfbb5d7a80e266eda4fa41ae35cf8f625f0d (patch)
tree1c5bc541361483df01a0d397dda9873319cf183d
parentce11fc6cfeb157673befd6a00290e19d6522b01a (diff)
downloadqtlocation-mapboxgl-3c6ccfbb5d7a80e266eda4fa41ae35cf8f625f0d.tar.gz
[core] Introduce Tile::setMinimumUpdateInterval()
-rw-r--r--src/mbgl/tile/raster_dem_tile.cpp4
-rw-r--r--src/mbgl/tile/raster_dem_tile.hpp3
-rw-r--r--src/mbgl/tile/raster_tile.cpp4
-rw-r--r--src/mbgl/tile/raster_tile.hpp3
-rw-r--r--src/mbgl/tile/tile.hpp1
-rw-r--r--src/mbgl/tile/tile_loader.hpp17
-rw-r--r--src/mbgl/tile/tile_loader_impl.hpp27
-rw-r--r--src/mbgl/tile/vector_tile.cpp4
-rw-r--r--src/mbgl/tile/vector_tile.hpp1
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<TileRenderData> createRenderData() override;
- void setNecessity(TileNecessity) final;
+ void setNecessity(TileNecessity) override;
+ void setMinimumUpdateInterval(Duration) override;
void setError(std::exception_ptr);
void setMetadata(optional<Timestamp> modified, optional<Timestamp> 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<TileRenderData> createRenderData() override;
- void setNecessity(TileNecessity) final;
+ void setNecessity(TileNecessity) override;
+ void setMinimumUpdateInterval(Duration) override;
void setError(std::exception_ptr);
void setMetadata(optional<Timestamp> modified, optional<Timestamp> 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> fileSource;
std::unique_ptr<AsyncRequest> 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
@@ -57,6 +57,30 @@ template <typename T>
TileLoader<T>::~TileLoader() = default;
template <typename T>
+void TileLoader<T>::setNecessity(TileNecessity newNecessity) {
+ if (newNecessity != necessity) {
+ necessity = newNecessity;
+ if (necessity == TileNecessity::Required) {
+ makeRequired();
+ } else {
+ makeOptional();
+ }
+ }
+}
+
+template <typename T>
+void TileLoader<T>::setMinimumUpdateInterval(Duration interval) {
+ if (minimumUpdateInterval != interval) {
+ minimumUpdateInterval = interval;
+ if (hasPendingNetworkRequest()) {
+ // Update the pending request.
+ request.reset();
+ loadFromNetwork();
+ }
+ }
+}
+
+template <typename T>
void TileLoader<T>::loadFromCache() {
assert(!request);
if (!fileSource) {
@@ -99,7 +123,7 @@ void TileLoader<T>::makeRequired() {
template <typename T>
void TileLoader<T>::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<T>::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<Timestamp> modified_, optional<Timestamp> 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<Timestamp> modified, optional<Timestamp> expires);
void setData(const std::shared_ptr<const std::string>& data);