[core] Simplify FileBasedTileSource

This commit is contained in:
John Firebaugh
2016-06-06 18:47:23 -07:00
committed by Konstantin Käfer
parent 4596157fe0
commit a1d1bb0c6d
5 changed files with 27 additions and 59 deletions

View File

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

View File

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

View File

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

View File

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

View File

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