diff options
author | Leith Bade <leith@mapbox.com> | 2014-12-02 19:40:07 +1100 |
---|---|---|
committer | Leith Bade <leith@mapbox.com> | 2014-12-02 19:41:50 +1100 |
commit | 2b865224127c2b5126e089e6384795282c3601cd (patch) | |
tree | 2d17d5834b1f48c5d49d0f17a5b914fe875c078d /src | |
parent | 9a8c018a32c351954f96cfe587c3f108ce4a986b (diff) | |
download | qtlocation-mapboxgl-2b865224127c2b5126e089e6384795282c3601cd.tar.gz |
Share asset_request between platforms
Diffstat (limited to 'src')
-rw-r--r-- | src/storage/asset_request.cpp | 37 | ||||
-rw-r--r-- | src/storage/asset_request_baton.cpp | 54 | ||||
-rw-r--r-- | src/storage/file_source.cpp | 7 |
3 files changed, 92 insertions, 6 deletions
diff --git a/src/storage/asset_request.cpp b/src/storage/asset_request.cpp new file mode 100644 index 0000000000..0d0eed2c7a --- /dev/null +++ b/src/storage/asset_request.cpp @@ -0,0 +1,37 @@ +#include <mbgl/storage/asset_request.hpp> +#include <mbgl/storage/asset_request_baton.hpp> +#include <mbgl/storage/response.hpp> + +#include <uv.h> + +#include <cassert> + +#include <unistd.h> + +namespace mbgl { + +AssetRequest::AssetRequest(const std::string &path_, uv_loop_t *loop) + : BaseRequest(path_), ptr(new AssetRequestBaton(this, path, loop)) { +} + +void AssetRequest::cancel() { + assert(thread_id == uv_thread_self()); + + if (ptr) { + ptr->cancel(); + + // When deleting a AssetRequest object with a uv_fs_* call is in progress, we are making sure + // that the callback doesn't accidentally reference this object again. + ptr->request = nullptr; + ptr = nullptr; + } + + notify(); +} + +AssetRequest::~AssetRequest() { + assert(thread_id == uv_thread_self()); + cancel(); +} + +} diff --git a/src/storage/asset_request_baton.cpp b/src/storage/asset_request_baton.cpp new file mode 100644 index 0000000000..918324108e --- /dev/null +++ b/src/storage/asset_request_baton.cpp @@ -0,0 +1,54 @@ +#include <mbgl/android/jni.hpp> +#include <mbgl/storage/asset_request_baton.hpp> +#include <mbgl/storage/asset_request.hpp> +#include <mbgl/storage/response.hpp> + +#include <limits> +#include <boost/make_unique.hpp> + +namespace mbgl { + +AssetRequestBaton::AssetRequestBaton(AssetRequest *request_, const std::string &path_, uv_loop_t *loop) + : thread_id(uv_thread_self()), + request(request_), + async_run(new uv_async_t()), + path(path_) { + + uv_async_init(loop, async_run.get(), run); + async_run->data = this; + + uv_async_send(async_run.get()); +} + +AssetRequestBaton::~AssetRequestBaton() { + uv_close((uv_handle_t *)async_run.get(), nullptr); +} + +void AssetRequestBaton::cancel() { + canceled = true; +} + +void AssetRequestBaton::notify_error(uv_async_t *async, const int code, const char *message) { + AssetRequestBaton *ptr = (AssetRequestBaton *)async->data; + assert(ptr->thread_id == uv_thread_self()); + + if (ptr->request && !ptr->canceled) { + ptr->request->response = std::unique_ptr<Response>(new Response); + ptr->request->response->code = code; + ptr->request->response->message = message; + ptr->request->notify(); + } +} + +void AssetRequestBaton::cleanup(uv_async_t *async) { + AssetRequestBaton *ptr = (AssetRequestBaton *)async->data; + assert(ptr->thread_id == uv_thread_self()); + + if (ptr->request) { + ptr->request->ptr = nullptr; + } + + delete ptr; +} + +} diff --git a/src/storage/file_source.cpp b/src/storage/file_source.cpp index a2ddb28e02..a8b249ee32 100644 --- a/src/storage/file_source.cpp +++ b/src/storage/file_source.cpp @@ -2,12 +2,9 @@ #include <mbgl/storage/file_request.hpp> #include <mbgl/storage/http_request.hpp> #include <mbgl/storage/sqlite_store.hpp> +#include <mbgl/storage/asset_request.hpp> #include <mbgl/util/uv-messenger.h> -#ifdef __ANDROID__ - #include <mbgl/platform/android/asset_request.hpp> -#endif - #include <uv.h> namespace mbgl { @@ -77,10 +74,8 @@ std::unique_ptr<Request> FileSource::request(ResourceType type, const std::strin if (!req) { if (absoluteURL.substr(0, 7) == "file://") { req = std::make_shared<FileRequest>(absoluteURL.substr(7), loop); -#ifdef __ANDROID__ } else if (absoluteURL.substr(0, 8) == "asset://") { req = std::make_shared<AssetRequest>(absoluteURL.substr(8), loop); -#endif } else { req = std::make_shared<HTTPRequest>(type, absoluteURL, loop, store); } |