[core] FileSourceManager::getFileSource() returns PassRefPtr

This commit is contained in:
Mikhail Pozdnyakov
2020-02-25 22:25:10 +02:00
parent 1399040087
commit aad13f6a3f
15 changed files with 69 additions and 48 deletions

View File

@@ -90,7 +90,7 @@ int main(int argc, char* argv[]) {
}
mbgl::util::RunLoop loop;
auto dbfs = mbgl::FileSourceManager::get()->getFileSource(
std::shared_ptr<mbgl::FileSource> dbfs = mbgl::FileSourceManager::get()->getFileSource(
mbgl::FileSourceType::Database, mbgl::ResourceOptions().withCachePath(args::get(cacheValue)));
dbfs->forward(resource, response, [&loop] { loop.stop(); });
loop.run();

View File

@@ -163,10 +163,10 @@ int main(int argc, char *argv[]) {
util::RunLoop loop;
std::shared_ptr<DatabaseFileSource> fileSource =
std::static_pointer_cast<DatabaseFileSource>(FileSourceManager::get()->getFileSource(
std::shared_ptr<DatabaseFileSource> fileSource = std::static_pointer_cast<DatabaseFileSource>(
std::shared_ptr<FileSource>(FileSourceManager::get()->getFileSource(
FileSourceType::Database,
ResourceOptions().withAccessToken(token).withBaseURL(apiBaseURL).withCachePath(output)));
ResourceOptions().withAccessToken(token).withBaseURL(apiBaseURL).withCachePath(output))));
std::unique_ptr<OfflineRegion> region;

View File

@@ -1,6 +1,7 @@
#pragma once
#include <mbgl/storage/file_source.hpp>
#include <mbgl/util/pass_types.hpp>
namespace mbgl {
@@ -29,7 +30,7 @@ public:
// Returns shared instance of a file source for (type, options) tuple.
// Creates new instance via registered factory if needed. If new instance cannot be
// created, nullptr would be returned.
std::shared_ptr<FileSource> getFileSource(FileSourceType, const ResourceOptions&) noexcept;
PassRefPtr<FileSource> getFileSource(FileSourceType, const ResourceOptions&) noexcept;
// Registers file source factory for a provided FileSourceType type. If factory for the
// same type was already registered, will unregister previously registered factory.

View File

@@ -41,10 +41,10 @@ FileSource::FileSource(jni::JNIEnv& _env, const jni::String& accessToken, const
// TODO: Split Android FileSource API to smaller interfaces
resourceLoader =
mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::ResourceLoader, resourceOptions);
databaseSource = std::static_pointer_cast<mbgl::DatabaseFileSource>(
mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Database, resourceOptions));
onlineSource = std::static_pointer_cast<mbgl::OnlineFileSource>(
mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Network, resourceOptions));
databaseSource = std::static_pointer_cast<mbgl::DatabaseFileSource>(std::shared_ptr<mbgl::FileSource>(
mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Database, resourceOptions)));
onlineSource = std::static_pointer_cast<mbgl::OnlineFileSource>(std::shared_ptr<mbgl::FileSource>(
mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Network, resourceOptions)));
}
FileSource::~FileSource() {

View File

@@ -25,8 +25,9 @@ void handleException(std::exception_ptr exception,
// OfflineManager //
OfflineManager::OfflineManager(jni::JNIEnv& env, const jni::Object<FileSource>& jFileSource)
: fileSource(std::static_pointer_cast<mbgl::DatabaseFileSource>(mbgl::FileSourceManager::get()->getFileSource(
mbgl::FileSourceType::Database, FileSource::getSharedResourceOptions(env, jFileSource)))) {
: fileSource(std::static_pointer_cast<mbgl::DatabaseFileSource>(
std::shared_ptr<mbgl::FileSource>(mbgl::FileSourceManager::get()->getFileSource(
mbgl::FileSourceType::Database, FileSource::getSharedResourceOptions(env, jFileSource))))) {
if (!fileSource) {
ThrowNew(env, jni::FindClass(env, "java/lang/IllegalStateException"), "Offline functionality is disabled.");
}

View File

@@ -16,8 +16,9 @@ namespace android {
OfflineRegion::OfflineRegion(jni::JNIEnv& env, jni::jlong offlineRegionPtr, const jni::Object<FileSource>& jFileSource)
: region(reinterpret_cast<mbgl::OfflineRegion*>(offlineRegionPtr)),
fileSource(std::static_pointer_cast<mbgl::DatabaseFileSource>(mbgl::FileSourceManager::get()->getFileSource(
mbgl::FileSourceType::Database, FileSource::getSharedResourceOptions(env, jFileSource)))) {
fileSource(std::static_pointer_cast<mbgl::DatabaseFileSource>(
std::shared_ptr<mbgl::FileSource>(mbgl::FileSourceManager::get()->getFileSource(
mbgl::FileSourceType::Database, FileSource::getSharedResourceOptions(env, jFileSource))))) {
if (!fileSource) {
ThrowNew(env, jni::FindClass(env, "java/lang/IllegalStateException"), "Offline functionality is disabled.");
}

View File

@@ -233,8 +233,8 @@ const MGLExceptionName MGLUnsupportedRegionTypeException = @"MGLUnsupportedRegio
options.withCachePath(_mbglCachePath)
.withAssetPath([NSBundle mainBundle].resourceURL.path.UTF8String);
_mbglFileSource = mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::ResourceLoader, options);
_mbglOnlineFileSource = std::static_pointer_cast<mbgl::OnlineFileSource>(mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Network, options));
_mbglDatabaseFileSource = std::static_pointer_cast<mbgl::DatabaseFileSource>(mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Database, options));
_mbglOnlineFileSource = std::static_pointer_cast<mbgl::OnlineFileSource>(std::shared_ptr<mbgl::FileSource>(mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Network, options)));
_mbglDatabaseFileSource = std::static_pointer_cast<mbgl::DatabaseFileSource>(std::shared_ptr<mbgl::FileSource>(mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Database, options)));
// Observe for changes to the API base URL (and find out the current one).
[[MGLAccountManager sharedManager] addObserver:self

View File

@@ -107,7 +107,7 @@ int main(int argc, char *argv[]) {
mbgl::ResourceOptions resourceOptions;
resourceOptions.withCachePath(cacheDB).withAccessToken(token);
auto onlineFileSource =
std::shared_ptr<mbgl::FileSource> onlineFileSource =
mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Network, resourceOptions);
if (!settings.online) {
if (onlineFileSource) {
@@ -165,7 +165,7 @@ int main(int argc, char *argv[]) {
});
// Resource loader controls top-level request processing and can resume / pause all managed sources simultaneously.
auto resourceLoader =
std::shared_ptr<mbgl::FileSource> resourceLoader =
mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::ResourceLoader, resourceOptions);
view->setPauseResumeCallback([resourceLoader]() {
static bool isPaused = false;
@@ -180,8 +180,8 @@ int main(int argc, char *argv[]) {
});
// Database file source.
auto databaseFileSource = std::static_pointer_cast<mbgl::DatabaseFileSource>(
mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Database, resourceOptions));
auto databaseFileSource = std::static_pointer_cast<mbgl::DatabaseFileSource>(std::shared_ptr<mbgl::FileSource>(
mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Database, resourceOptions)));
view->setResetCacheCallback([databaseFileSource]() {
databaseFileSource->resetDatabase([](std::exception_ptr ex) {
if (ex) {

View File

@@ -1751,7 +1751,8 @@ QMapboxGLPrivate::QMapboxGLPrivate(QMapboxGL *q, const QMapboxGLSettings &settin
mbgl::ResourceTransform::FinishedCallback onFinished) {
actorRef.invoke(&mbgl::ResourceTransform::TransformCallback::operator(), kind, url, std::move(onFinished));
}};
auto fs = mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Network, resourceOptions);
std::shared_ptr<mbgl::FileSource> fs =
mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Network, resourceOptions);
std::static_pointer_cast<mbgl::OnlineFileSource>(fs)->setResourceTransform(std::move(transform));
}

View File

@@ -19,7 +19,7 @@ ProxyFileSource::ProxyFileSource(std::shared_ptr<FileSource> defaultResourceLoad
: defaultResourceLoader(std::move(defaultResourceLoader_)) {
assert(defaultResourceLoader);
if (offline) {
auto dbfs = FileSourceManager::get()->getFileSource(FileSourceType::Database, options);
std::shared_ptr<FileSource> dbfs = FileSourceManager::get()->getFileSource(FileSourceType::Database, options);
dbfs->setProperty(READ_ONLY_MODE_KEY, true);
}
}

View File

@@ -33,7 +33,9 @@ Map::Map(RendererFrontend& frontend,
: impl(std::make_unique<Impl>(
frontend,
observer,
FileSourceManager::get() ? FileSourceManager::get()->getFileSource(ResourceLoader, resourceOptions) : nullptr,
FileSourceManager::get()
? std::shared_ptr<FileSource>(FileSourceManager::get()->getFileSource(ResourceLoader, resourceOptions))
: nullptr,
mapOptions)) {}
Map::Map(std::unique_ptr<Impl> impl_) : impl(std::move(impl_)) {}

View File

@@ -30,8 +30,7 @@ FileSourceManager::FileSourceManager() : impl(std::make_unique<Impl>()) {}
FileSourceManager::~FileSourceManager() = default;
std::shared_ptr<FileSource> FileSourceManager::getFileSource(FileSourceType type,
const ResourceOptions& options) noexcept {
PassRefPtr<FileSource> FileSourceManager::getFileSource(FileSourceType type, const ResourceOptions& options) noexcept {
std::lock_guard<std::recursive_mutex> lock(impl->mutex);
// Remove released file sources.

View File

@@ -342,7 +342,8 @@ TEST(Map, Offline) {
NetworkStatus::Set(NetworkStatus::Status::Offline);
const std::string prefix = "http://127.0.0.1:3000/";
auto dbfs = FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
std::shared_ptr<FileSource> dbfs =
FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
dbfs->forward(Resource::style(prefix + "style.json"), expiredItem("style.json"));
dbfs->forward(Resource::source(prefix + "streets.json"), expiredItem("streets.json"));
dbfs->forward(Resource::spriteJSON(prefix + "sprite", 1.0), expiredItem("sprite.json"));
@@ -882,7 +883,8 @@ TEST(Map, NoContentTiles) {
Response response;
response.noContent = true;
response.expires = util::now() + 1h;
auto dbfs = FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
std::shared_ptr<FileSource> dbfs =
FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
dbfs->forward(
Resource::tile("http://example.com/{z}-{x}-{y}.vector.pbf", 1.0, 0, 0, 0, Tileset::Scheme::XYZ), response, [&] {
test.map.getStyle().loadJSON(R"STYLE({
@@ -1327,7 +1329,8 @@ TEST(Map, TEST_REQUIRES_SERVER(ExpiredSpriteSheet)) {
NetworkStatus::Set(NetworkStatus::Status::Offline);
const std::string prefix = "http://127.0.0.1:3000/online/";
auto dbfs = FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
std::shared_ptr<FileSource> dbfs =
FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
dbfs->forward(Resource::style(prefix + "style.json"), makeResponse("style.json"));
dbfs->forward(Resource::source(prefix + "streets.json"), makeResponse("streets.json"));
dbfs->forward(Resource::spriteJSON(prefix + "sprite", 1.0), makeResponse("sprite.json", true));

View File

@@ -12,7 +12,8 @@ using namespace mbgl;
TEST(DatabaseFileSource, PauseResume) {
util::RunLoop loop;
auto dbfs = FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
std::shared_ptr<FileSource> dbfs =
FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
dbfs->pause();
const Resource res{Resource::Unknown, "http://127.0.0.1:3000/test", {}, Resource::LoadingMethod::CacheOnly};

View File

@@ -263,7 +263,8 @@ TEST(MainResourceLoader, OptionalNonExpired) {
response.expires = util::now() + 1h;
std::unique_ptr<AsyncRequest> req;
auto dbfs = FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
std::shared_ptr<FileSource> dbfs =
FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
dbfs->forward(optionalResource, response, [&] {
req = fs.request(optionalResource, [&](Response res) {
req.reset();
@@ -294,7 +295,8 @@ TEST(MainResourceLoader, OptionalExpired) {
Response response;
response.data = std::make_shared<std::string>("Cached value");
response.expires = util::now() - 1h;
auto dbfs = FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
std::shared_ptr<FileSource> dbfs =
FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
std::unique_ptr<AsyncRequest> req;
dbfs->forward(optionalResource, response, [&] {
req = fs.request(optionalResource, [&](Response res) {
@@ -356,7 +358,8 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(NoCacheRefreshEtagNotModified)) {
response.data = std::make_shared<std::string>("Cached value");
response.expires = util::now() + 1h;
std::unique_ptr<AsyncRequest> req;
auto dbfs = FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
std::shared_ptr<FileSource> dbfs =
FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
dbfs->forward(resource, response, [&] {
req = fs.request(resource, [&](Response res) {
req.reset();
@@ -392,7 +395,8 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(NoCacheRefreshEtagModified)) {
response.data = std::make_shared<std::string>("Cached value");
response.expires = util::now() + 1h;
std::unique_ptr<AsyncRequest> req;
auto dbfs = FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
std::shared_ptr<FileSource> dbfs =
FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
dbfs->forward(resource, response, [&] {
req = fs.request(resource, [&](Response res) {
req.reset();
@@ -427,7 +431,8 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(NoCacheFull)) {
response.data = std::make_shared<std::string>("Cached value");
response.expires = util::now() + 1h;
std::unique_ptr<AsyncRequest> req;
auto dbfs = FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
std::shared_ptr<FileSource> dbfs =
FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
dbfs->forward(resource, response, [&] {
req = fs.request(resource, [&](Response res) {
req.reset();
@@ -464,7 +469,8 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(NoCacheRefreshModifiedNotModified)
response.data = std::make_shared<std::string>("Cached value");
response.expires = util::now() + 1h;
std::unique_ptr<AsyncRequest> req;
auto dbfs = FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
std::shared_ptr<FileSource> dbfs =
FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
dbfs->forward(resource, response, [&] {
req = fs.request(resource, [&](Response res) {
req.reset();
@@ -501,7 +507,8 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(NoCacheRefreshModifiedModified)) {
response.data = std::make_shared<std::string>("Cached value");
response.expires = util::now() + 1h;
std::unique_ptr<AsyncRequest> req;
auto dbfs = FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
std::shared_ptr<FileSource> dbfs =
FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
dbfs->forward(resource, response, [&] {
req = fs.request(resource, [&](Response res) {
req.reset();
@@ -522,10 +529,10 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(NoCacheRefreshModifiedModified)) {
TEST(MainResourceLoader, TEST_REQUIRES_SERVER(SetResourceTransform)) {
util::RunLoop loop;
MainResourceLoader fs(ResourceOptions{});
auto onlinefs = std::static_pointer_cast<OnlineFileSource>(
FileSourceManager::get()->getFileSource(FileSourceType::Network, ResourceOptions{}));
MainResourceLoader resourceLoader(ResourceOptions{});
std::shared_ptr<FileSource> fs =
FileSourceManager::get()->getFileSource(FileSourceType::Network, ResourceOptions{});
auto onlinefs = std::static_pointer_cast<OnlineFileSource>(fs);
// Translates the URL "localhost://test to http://127.0.0.1:3000/test
Actor<ResourceTransform::TransformCallback> transform(
@@ -545,7 +552,7 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(SetResourceTransform)) {
const Resource resource1{Resource::Unknown, "localhost://test"};
std::unique_ptr<AsyncRequest> req;
req = fs.request(resource1, [&](Response res) {
req = resourceLoader.request(resource1, [&](Response res) {
req.reset();
EXPECT_EQ(nullptr, res.error);
ASSERT_TRUE(res.data.get());
@@ -562,7 +569,7 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(SetResourceTransform)) {
onlinefs->setResourceTransform({});
const Resource resource2{Resource::Unknown, "http://127.0.0.1:3000/test"};
req = fs.request(resource2, [&](Response res) {
req = resourceLoader.request(resource2, [&](Response res) {
req.reset();
EXPECT_EQ(nullptr, res.error);
ASSERT_TRUE(res.data.get());
@@ -579,9 +586,10 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(SetResourceTransform)) {
TEST(MainResourceLoader, SetResourceCachePath) {
util::RunLoop loop;
MainResourceLoader fs(ResourceOptions{});
auto dbfs = std::static_pointer_cast<DatabaseFileSource>(
FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{}));
MainResourceLoader resourceLoader(ResourceOptions{});
std::shared_ptr<FileSource> fs =
FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
auto dbfs = std::static_pointer_cast<DatabaseFileSource>(fs);
dbfs->setDatabasePath("./new_offline.db", [&loop] { loop.stop(); });
loop.run();
}
@@ -604,7 +612,8 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(RespondToStaleMustRevalidate)) {
response.mustRevalidate = true;
response.etag.emplace("snowfall");
std::unique_ptr<AsyncRequest> req;
auto dbfs = FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
std::shared_ptr<FileSource> dbfs =
FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
dbfs->forward(resource, response, [&] {
req = fs.request(resource, [&](Response res) {
req.reset();
@@ -676,8 +685,10 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(CachedResourceLowPriority)) {
using namespace std::chrono_literals;
response.expires = util::now() - 1h;
auto dbfs = FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
auto onlineFs = FileSourceManager::get()->getFileSource(FileSourceType::Network, ResourceOptions{});
std::shared_ptr<FileSource> dbfs =
FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
std::shared_ptr<FileSource> onlineFs =
FileSourceManager::get()->getFileSource(FileSourceType::Network, ResourceOptions{});
// Put existing values into the cache.
Resource resource1{Resource::Unknown, "http://127.0.0.1:3000/load/3", {}, Resource::LoadingMethod::All};
@@ -762,7 +773,8 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(NoDoubleDispatch)) {
std::unique_ptr<AsyncRequest> req;
unsigned responseCount = 0u;
auto dbfs = FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
std::shared_ptr<FileSource> dbfs =
FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{});
dbfs->forward(resource, response, [&] {
req = fs.request(resource, [&](Response res) {
EXPECT_EQ(nullptr, res.error);