summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLeith Bade <leith@mapbox.com>2014-12-02 19:40:07 +1100
committerLeith Bade <leith@mapbox.com>2014-12-02 19:41:50 +1100
commit2b865224127c2b5126e089e6384795282c3601cd (patch)
tree2d17d5834b1f48c5d49d0f17a5b914fe875c078d /src
parent9a8c018a32c351954f96cfe587c3f108ce4a986b (diff)
downloadqtlocation-mapboxgl-2b865224127c2b5126e089e6384795282c3601cd.tar.gz
Share asset_request between platforms
Diffstat (limited to 'src')
-rw-r--r--src/storage/asset_request.cpp37
-rw-r--r--src/storage/asset_request_baton.cpp54
-rw-r--r--src/storage/file_source.cpp7
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);
}