diff options
author | Ivo van Dongen <info@ivovandongen.nl> | 2016-09-28 16:01:06 +0200 |
---|---|---|
committer | Ivo van Dongen <ivovandongen@users.noreply.github.com> | 2016-09-30 14:57:26 +0200 |
commit | 1bf12e20a65a3e0e8212e0c24db5a136096896e7 (patch) | |
tree | 33e8cd7ac2d4fca6185bff1349fbb50e7fda8eb0 /platform/default | |
parent | eca126d804e96b4ca9ef1ff447448420a32747ee (diff) | |
download | qtlocation-mapboxgl-1bf12e20a65a3e0e8212e0c24db5a136096896e7.tar.gz |
[core] LocalFileSource implementation and tests
Diffstat (limited to 'platform/default')
-rw-r--r-- | platform/default/default_file_source.cpp | 6 | ||||
-rw-r--r-- | platform/default/local_file_source.cpp | 66 |
2 files changed, 71 insertions, 1 deletions
diff --git a/platform/default/default_file_source.cpp b/platform/default/default_file_source.cpp index 099890a035..7b52637c15 100644 --- a/platform/default/default_file_source.cpp +++ b/platform/default/default_file_source.cpp @@ -1,5 +1,6 @@ #include <mbgl/storage/default_file_source.hpp> #include <mbgl/storage/asset_file_source.hpp> +#include <mbgl/storage/local_file_source.hpp> #include <mbgl/storage/online_file_source.hpp> #include <mbgl/storage/offline_database.hpp> #include <mbgl/storage/offline_download.hpp> @@ -164,7 +165,8 @@ DefaultFileSource::DefaultFileSource(const std::string& cachePath, uint64_t maximumCacheSize) : thread(std::make_unique<util::Thread<Impl>>(util::ThreadContext{"DefaultFileSource", util::ThreadPriority::Low}, cachePath, maximumCacheSize)), - assetFileSource(std::make_unique<AssetFileSource>(assetRoot)) { + assetFileSource(std::make_unique<AssetFileSource>(assetRoot)), + localFileSource(std::make_unique<LocalFileSource>()) { } DefaultFileSource::~DefaultFileSource() = default; @@ -203,6 +205,8 @@ std::unique_ptr<AsyncRequest> DefaultFileSource::request(const Resource& resourc if (isAssetURL(resource.url)) { return assetFileSource->request(resource, callback); + } else if (LocalFileSource::acceptsURL(resource.url)) { + return localFileSource->request(resource, callback); } else { return std::make_unique<DefaultFileRequest>(resource, callback, *thread); } diff --git a/platform/default/local_file_source.cpp b/platform/default/local_file_source.cpp new file mode 100644 index 0000000000..5686b453dc --- /dev/null +++ b/platform/default/local_file_source.cpp @@ -0,0 +1,66 @@ +#include <mbgl/storage/local_file_source.hpp> +#include <mbgl/storage/response.hpp> +#include <mbgl/util/string.hpp> +#include <mbgl/util/thread.hpp> +#include <mbgl/util/url.hpp> +#include <mbgl/util/util.hpp> +#include <mbgl/util/io.hpp> + +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> + +namespace { + +const char* protocol = "file://"; +const std::size_t protocolLength = 7; + +} // namespace + +namespace mbgl { + +class LocalFileSource::Impl { +public: + void request(const std::string& url, FileSource::Callback callback) { + //Cut off the protocol + std::string path = mbgl::util::percentDecode(url.substr(protocolLength)); + + Response response; + + struct stat buf; + int result = stat(path.c_str(), &buf); + + if (result == 0 && S_ISDIR(buf.st_mode)) { + response.error = std::make_unique<Response::Error>(Response::Error::Reason::NotFound); + } else if (result == -1 && errno == ENOENT) { + response.error = std::make_unique<Response::Error>(Response::Error::Reason::NotFound); + } else { + try { + response.data = std::make_shared<std::string>(util::read_file(path)); + } catch (...) { + response.error = std::make_unique<Response::Error>( + Response::Error::Reason::Other, + util::toString(std::current_exception())); + } + } + + callback(response); + } + +}; + +LocalFileSource::LocalFileSource() + : thread(std::make_unique<util::Thread<Impl>>(util::ThreadContext{"LocalFileSource", util::ThreadPriority::Low})) { +} + +LocalFileSource::~LocalFileSource() = default; + +std::unique_ptr<AsyncRequest> LocalFileSource::request(const Resource& resource, Callback callback) { + return thread->invokeWithCallback(&Impl::request, resource.url, callback); +} + +bool LocalFileSource::acceptsURL(const std::string& url) { + return url.compare(0, protocolLength, protocol) == 0; +} + +} // namespace mbgl |