#include #include #include #include #include #include #include #include #include #include namespace { bool acceptsURL(const std::string& url) { return 0 == url.rfind(mbgl::util::FILE_PROTOCOL, 0); } } // namespace namespace mbgl { class LocalFileSource::Impl { public: Impl(ActorRef) {} void request(const std::string& url, ActorRef req) { if (!acceptsURL(url)) { Response response; response.error = std::make_unique(Response::Error::Reason::Other, "Invalid file URL"); req.invoke(&FileSourceRequest::setResponse, response); return; } // Cut off the protocol and prefix with path. const auto path = mbgl::util::percentDecode(url.substr(std::char_traits::length(util::FILE_PROTOCOL))); requestLocalFile(path, std::move(req)); } }; LocalFileSource::LocalFileSource() : impl(std::make_unique>( util::makeThreadPrioritySetter(platform::EXPERIMENTAL_THREAD_PRIORITY_FILE), "LocalFileSource")) {} LocalFileSource::~LocalFileSource() = default; std::unique_ptr LocalFileSource::request(const Resource& resource, Callback callback) { auto req = std::make_unique(std::move(callback)); impl->actor().invoke(&Impl::request, resource.url, req->actor()); return std::move(req); } bool LocalFileSource::canRequest(const Resource& resource) const { return acceptsURL(resource.url); } void LocalFileSource::pause() { impl->pause(); } void LocalFileSource::resume() { impl->resume(); } } // namespace mbgl