[core] Simplify FileBasedTileSource
This commit is contained in:
committed by
Konstantin Käfer
parent
4596157fe0
commit
a1d1bb0c6d
@@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <mbgl/tile/tile_source.hpp>
|
||||
#include <mbgl/storage/resource.hpp>
|
||||
|
||||
namespace mbgl {
|
||||
@@ -8,10 +9,10 @@ class FileSource;
|
||||
class AsyncRequest;
|
||||
class Response;
|
||||
|
||||
template <typename T, typename I>
|
||||
class FileBasedTileSource : public T {
|
||||
template <typename T>
|
||||
class FileBasedTileSource : public TileSource {
|
||||
public:
|
||||
FileBasedTileSource(typename T::data_type&, const Resource&, FileSource&);
|
||||
FileBasedTileSource(T&, const Resource&, FileSource&);
|
||||
virtual ~FileBasedTileSource() = default;
|
||||
|
||||
protected:
|
||||
@@ -24,6 +25,7 @@ private:
|
||||
void loadRequired();
|
||||
|
||||
private:
|
||||
T& tileData;
|
||||
Resource resource;
|
||||
FileSource& fileSource;
|
||||
std::unique_ptr<AsyncRequest> request;
|
||||
|
||||
@@ -7,11 +7,11 @@
|
||||
|
||||
namespace mbgl {
|
||||
|
||||
template <typename T, typename I>
|
||||
FileBasedTileSource<T, I>::FileBasedTileSource(typename T::data_type& tileData_,
|
||||
const Resource& resource_,
|
||||
FileSource& fileSource_)
|
||||
: T(tileData_), resource(resource_), fileSource(fileSource_) {
|
||||
template <typename T>
|
||||
FileBasedTileSource<T>::FileBasedTileSource(T& tileData_,
|
||||
const Resource& resource_,
|
||||
FileSource& fileSource_)
|
||||
: tileData(tileData_), resource(resource_), fileSource(fileSource_) {
|
||||
assert(!request);
|
||||
if (fileSource.supportsOptionalRequests()) {
|
||||
// When supported, the first request is always optional, even if the TileSource
|
||||
@@ -23,7 +23,7 @@ FileBasedTileSource<T, I>::FileBasedTileSource(typename T::data_type& tileData_,
|
||||
} else {
|
||||
// When the FileSource doesn't support optional requests, we do nothing until the
|
||||
// data is definitely required.
|
||||
if (T::isRequired()) {
|
||||
if (isRequired()) {
|
||||
loadRequired();
|
||||
} else {
|
||||
// We're using this field to check whether the pending request is optional or required.
|
||||
@@ -32,15 +32,15 @@ FileBasedTileSource<T, I>::FileBasedTileSource(typename T::data_type& tileData_,
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T, typename I>
|
||||
void FileBasedTileSource<T, I>::loadOptional() {
|
||||
template <typename T>
|
||||
void FileBasedTileSource<T>::loadOptional() {
|
||||
assert(!request);
|
||||
|
||||
resource.necessity = Resource::Optional;
|
||||
request = fileSource.request(resource, [this](Response res) {
|
||||
request.reset();
|
||||
|
||||
T::tileData.setTriedOptional();
|
||||
tileData.setTriedOptional();
|
||||
|
||||
if (res.error && res.error->reason == Response::Error::Reason::NotFound) {
|
||||
// When the optional request could not be satisfied, don't treat it as an error.
|
||||
@@ -51,31 +51,31 @@ void FileBasedTileSource<T, I>::loadOptional() {
|
||||
loadedData(res);
|
||||
}
|
||||
|
||||
if (T::isRequired()) {
|
||||
if (isRequired()) {
|
||||
loadRequired();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
template <typename T, typename I>
|
||||
void FileBasedTileSource<T, I>::makeRequired() {
|
||||
template <typename T>
|
||||
void FileBasedTileSource<T>::makeRequired() {
|
||||
if (!request) {
|
||||
loadRequired();
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T, typename I>
|
||||
void FileBasedTileSource<T, I>::makeOptional() {
|
||||
template <typename T>
|
||||
void FileBasedTileSource<T>::makeOptional() {
|
||||
if (resource.necessity == Resource::Required && request) {
|
||||
// Abort a potential HTTP request.
|
||||
request.reset();
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T, typename I>
|
||||
void FileBasedTileSource<T, I>::loadedData(const Response& res) {
|
||||
template <typename T>
|
||||
void FileBasedTileSource<T>::loadedData(const Response& res) {
|
||||
if (res.error && res.error->reason != Response::Error::Reason::NotFound) {
|
||||
T::tileData.setError(std::make_exception_ptr(std::runtime_error(res.error->message)));
|
||||
tileData.setError(std::make_exception_ptr(std::runtime_error(res.error->message)));
|
||||
} else if (res.notModified) {
|
||||
resource.priorExpires = res.expires;
|
||||
// Do not notify the TileData object; when we get this message, it already has the current
|
||||
@@ -84,13 +84,13 @@ void FileBasedTileSource<T, I>::loadedData(const Response& res) {
|
||||
resource.priorModified = res.modified;
|
||||
resource.priorExpires = res.expires;
|
||||
resource.priorEtag = res.etag;
|
||||
T::tileData.setData(res.noContent ? nullptr : I::parseData(res.data), res.modified,
|
||||
tileData.setData(res.noContent ? nullptr : T::parseData(res.data), res.modified,
|
||||
res.expires);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T, typename I>
|
||||
void FileBasedTileSource<T, I>::loadRequired() {
|
||||
template <typename T>
|
||||
void FileBasedTileSource<T>::loadRequired() {
|
||||
assert(!request);
|
||||
|
||||
resource.necessity = Resource::Required;
|
||||
|
||||
@@ -23,7 +23,7 @@ RasterTileData::RasterTileData(const OverscaledTileID& id_,
|
||||
const auto resource = Resource::tile(
|
||||
tileset.tiles.at(0), parameters.pixelRatio, id_.canonical.x,
|
||||
id_.canonical.y, id_.canonical.z);
|
||||
tileSource = std::make_unique<FileBasedTileSource<RasterTileSource, RasterTileData>>(
|
||||
tileSource = std::make_unique<FileBasedTileSource<RasterTileData>>(
|
||||
*this, resource, parameters.fileSource);
|
||||
}
|
||||
|
||||
|
||||
@@ -57,38 +57,4 @@ protected:
|
||||
Necessity necessity;
|
||||
};
|
||||
|
||||
class GeometryTileData;
|
||||
class RasterTileData;
|
||||
|
||||
class GeometryTileSource : public TileSource {
|
||||
public:
|
||||
using data_type = GeometryTileData;
|
||||
|
||||
protected:
|
||||
GeometryTileSource(data_type& tileData_)
|
||||
: tileData(tileData_) {
|
||||
}
|
||||
|
||||
public:
|
||||
virtual ~GeometryTileSource() = default;
|
||||
|
||||
protected:
|
||||
data_type& tileData;
|
||||
};
|
||||
|
||||
class RasterTileSource : public TileSource {
|
||||
public:
|
||||
using data_type = RasterTileData;
|
||||
|
||||
protected:
|
||||
RasterTileSource(data_type& tileData_)
|
||||
: tileData(tileData_){};
|
||||
|
||||
public:
|
||||
virtual ~RasterTileSource() = default;
|
||||
|
||||
protected:
|
||||
data_type& tileData;
|
||||
};
|
||||
|
||||
} // namespace mbgl
|
||||
|
||||
@@ -18,7 +18,7 @@ VectorTileData::VectorTileData(const OverscaledTileID& overscaledTileID,
|
||||
const auto resource = Resource::tile(
|
||||
tileset.tiles.at(0), parameters.pixelRatio, overscaledTileID.canonical.x,
|
||||
overscaledTileID.canonical.y, overscaledTileID.canonical.z);
|
||||
tileSource = std::make_unique<FileBasedTileSource<GeometryTileSource, VectorTileData>>(
|
||||
tileSource = std::make_unique<FileBasedTileSource<VectorTileData>>(
|
||||
*this, resource, parameters.fileSource);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user