summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--platform/darwin/http_request_nsurl.mm23
-rw-r--r--platform/default/asset_request_fs.cpp48
-rw-r--r--platform/default/asset_request_zip.cpp28
-rw-r--r--platform/default/http_request_curl.cpp28
-rw-r--r--src/mbgl/storage/asset_request.hpp12
-rw-r--r--src/mbgl/storage/default_file_source.cpp6
-rw-r--r--src/mbgl/storage/http_request.hpp12
-rw-r--r--src/mbgl/storage/request_base.hpp11
8 files changed, 67 insertions, 101 deletions
diff --git a/platform/darwin/http_request_nsurl.mm b/platform/darwin/http_request_nsurl.mm
index 07ac16e058..f5e7888f57 100644
--- a/platform/darwin/http_request_nsurl.mm
+++ b/platform/darwin/http_request_nsurl.mm
@@ -200,7 +200,7 @@ void HTTPRequestImpl::handleResponse() {
}
context->removeRequest(request);
- request->ptr = nullptr;
+ request->impl = nullptr;
delete request;
request = nullptr;
}
@@ -243,7 +243,7 @@ HTTPRequestImpl::~HTTPRequestImpl() {
if (request) {
context->removeRequest(request);
- request->ptr = nullptr;
+ request->impl = nullptr;
}
}
@@ -398,24 +398,21 @@ void HTTPRequestImpl::restart(uv_timer_t *timer, int) {
// -------------------------------------------------------------------------------------------------
-HTTPRequest::HTTPRequest(const Resource& resource, Callback callback)
- : RequestBase(resource, callback) {
+HTTPRequest::HTTPRequest(const Resource& resource, Callback callback,
+ uv_loop_t* loop, std::shared_ptr<const Response> response)
+ : RequestBase(resource, callback)
+ , impl(new HTTPRequestImpl(this, loop, response)) {
}
HTTPRequest::~HTTPRequest() {
- if (ptr) {
- reinterpret_cast<HTTPRequestImpl *>(ptr)->cancel();
+ if (impl) {
+ impl->cancel();
}
}
-void HTTPRequest::start(uv_loop_t *loop, std::shared_ptr<const Response> response) {
- assert(!ptr);
- ptr = new HTTPRequestImpl(this, loop, response);
-}
-
void HTTPRequest::retryImmediately() {
- if (ptr) {
- reinterpret_cast<HTTPRequestImpl *>(ptr)->retryImmediately();
+ if (impl) {
+ impl->retryImmediately();
}
}
diff --git a/platform/default/asset_request_fs.cpp b/platform/default/asset_request_fs.cpp
index 9580c2f5bc..87e4320622 100644
--- a/platform/default/asset_request_fs.cpp
+++ b/platform/default/asset_request_fs.cpp
@@ -26,7 +26,7 @@ class AssetRequestImpl {
MBGL_STORE_THREAD(tid)
public:
- AssetRequestImpl(AssetRequest *request, uv_loop_t *loop);
+ AssetRequestImpl(AssetRequest*, uv_loop_t*, const std::string& assetRoot);
~AssetRequestImpl();
static void fileOpened(uv_fs_t *req);
@@ -36,8 +36,8 @@ public:
static void notifyError(uv_fs_t *req);
static void cleanup(uv_fs_t *req);
-
AssetRequest *request = nullptr;
+ std::string assetRoot;
bool canceled = false;
uv_fs_t req;
uv_file fd = -1;
@@ -49,11 +49,13 @@ AssetRequestImpl::~AssetRequestImpl() {
MBGL_VERIFY_THREAD(tid);
if (request) {
- request->ptr = nullptr;
+ request->impl = nullptr;
}
}
-AssetRequestImpl::AssetRequestImpl(AssetRequest *request_, uv_loop_t *loop) : request(request_) {
+AssetRequestImpl::AssetRequestImpl(AssetRequest* request_, uv_loop_t* loop, const std::string& assetRoot_)
+ : request(request_)
+ , assetRoot(assetRoot_) {
req.data = this;
const auto &url = request->resource.url;
@@ -63,7 +65,7 @@ AssetRequestImpl::AssetRequestImpl(AssetRequest *request_, uv_loop_t *loop) : re
path = url.substr(8);
} else {
// This is a relative path. Prefix with the application root.
- path = request->assetRoot + "/" + url.substr(8);
+ path = assetRoot + "/" + url.substr(8);
}
uv_fs_open(loop, &req, path.c_str(), O_RDONLY, S_IRUSR, fileOpened);
@@ -208,40 +210,26 @@ void AssetRequestImpl::cleanup(uv_fs_t *req) {
// -------------------------------------------------------------------------------------------------
-AssetRequest::AssetRequest(const Resource& resource_, Callback callback_, const std::string& assetRoot_)
+AssetRequest::AssetRequest(const Resource& resource_, Callback callback_,
+ uv_loop_t* loop, const std::string& assetRoot)
: RequestBase(resource_, callback_)
- , assetRoot(assetRoot_) {
+ , impl(new AssetRequestImpl(this, loop, assetRoot)) {
assert(algo::starts_with(resource.url, "asset://"));
+ // Note: the AssetRequestImpl deletes itself.
}
AssetRequest::~AssetRequest() {
- if (ptr) {
- reinterpret_cast<AssetRequestImpl *>(ptr)->request = nullptr;
+ if (impl) {
+ impl->request = nullptr;
}
}
-void AssetRequest::start(uv_loop_t *loop, std::shared_ptr<const Response> response) {
- // We're ignoring the existing response if any.
- (void(response));
-
- assert(!ptr);
- ptr = new AssetRequestImpl(this, loop);
- // Note: the AssetRequestImpl deletes itself.
-}
-
void AssetRequest::cancel() {
- if (ptr) {
- reinterpret_cast<AssetRequestImpl *>(ptr)->canceled = true;
-
- // uv_cancel fails frequently when the request has already been started.
- // In that case, we have to let it complete and check the canceled bool
- // instead. The cancelation callback will delete the AssetRequest object.
- uv_cancel((uv_req_t *)&reinterpret_cast<AssetRequestImpl *>(ptr)->req);
- } else {
- // This request is canceled before we called start. We're safe to delete
- // ourselves now.
- delete this;
- }
+ impl->canceled = true;
+ // uv_cancel fails frequently when the request has already been started.
+ // In that case, we have to let it complete and check the canceled bool
+ // instead. The cancelation callback will delete the AssetRequest object.
+ uv_cancel((uv_req_t *)&impl->req);
}
}
diff --git a/platform/default/asset_request_zip.cpp b/platform/default/asset_request_zip.cpp
index 69de1c742c..9f7ed6d9b7 100644
--- a/platform/default/asset_request_zip.cpp
+++ b/platform/default/asset_request_zip.cpp
@@ -77,7 +77,7 @@ class AssetRequestImpl {
MBGL_STORE_THREAD(tid)
public:
- AssetRequestImpl(AssetRequest *request, uv_loop_t *loop);
+ AssetRequestImpl(AssetRequest*, uv_loop_t*, const std::string& assetRoot);
~AssetRequestImpl();
void cancel();
@@ -112,10 +112,10 @@ AssetRequestImpl::~AssetRequestImpl() {
}
}
-AssetRequestImpl::AssetRequestImpl(AssetRequest *request_, uv_loop_t *loop)
+AssetRequestImpl::AssetRequestImpl(AssetRequest* request_, uv_loop_t* loop, const std::string& assetRoot_)
: context(*AssetZipContext::Get(loop)),
request(request_),
- root(request->assetRoot),
+ root(assetRoot_),
path(std::string { "assets/" } + request->resource.url.substr(8)) {
auto zip = context.getHandle(root);
if (zip) {
@@ -275,30 +275,22 @@ void AssetRequestImpl::cancel() {
// -------------------------------------------------------------------------------------------------
-AssetRequest::AssetRequest(const Resource& resource_, Callback callback_, const std::string& assetRoot_)
+AssetRequest::AssetRequest(const Resource& resource_, Callback callback_,
+ uv_loop_t* loop, const std::string& assetRoot)
: RequestBase(resource_, callback_)
- , assetRoot(assetRoot_) {
+ , impl(new AssetRequestImpl(this, loop, assetRoot)) {
assert(algo::starts_with(resource.url, "asset://"));
}
AssetRequest::~AssetRequest() {
- if (ptr) {
- reinterpret_cast<AssetRequestImpl *>(ptr)->cancel();
+ if (impl) {
+ impl->cancel();
}
}
-void AssetRequest::start(uv_loop_t *loop, std::shared_ptr<const Response> response) {
- // We're ignoring the existing response if any.
- (void(response));
-
- assert(!ptr);
- ptr = new AssetRequestImpl(this, loop);
- // Note: the AssetRequestImpl deletes itself.
-}
-
void AssetRequest::cancel() {
- if (ptr) {
- reinterpret_cast<AssetRequestImpl *>(ptr)->cancel();
+ if (impl) {
+ impl->cancel();
}
delete this;
diff --git a/platform/default/http_request_curl.cpp b/platform/default/http_request_curl.cpp
index ffe3b525ab..95cc882114 100644
--- a/platform/default/http_request_curl.cpp
+++ b/platform/default/http_request_curl.cpp
@@ -495,7 +495,7 @@ HTTPRequestImpl::~HTTPRequestImpl() {
if (request) {
context->removeRequest(request);
- request->ptr = nullptr;
+ request->impl = nullptr;
}
handleError(curl_multi_remove_handle(context->multi, handle));
@@ -723,33 +723,27 @@ void HTTPRequestImpl::handleResult(CURLcode code) {
// -------------------------------------------------------------------------------------------------
-HTTPRequest::HTTPRequest(const Resource& resource_, Callback callback_)
- : RequestBase(resource_, callback_) {
+HTTPRequest::HTTPRequest(const Resource& resource_, Callback callback_,
+ uv_loop_t* loop, std::shared_ptr<const Response> response)
+ : RequestBase(resource_, callback_)
+ , impl(new HTTPRequestImpl(this, loop, response)) {
}
HTTPRequest::~HTTPRequest() {
- if (ptr) {
- reinterpret_cast<HTTPRequestImpl *>(ptr)->abandon();
+ if (impl) {
+ impl->abandon();
}
}
-void HTTPRequest::start(uv_loop_t *loop, std::shared_ptr<const Response> response) {
- assert(!ptr);
- ptr = new HTTPRequestImpl(this, loop, response);
-}
-
void HTTPRequest::retryImmediately() {
- if (ptr) {
- reinterpret_cast<HTTPRequestImpl *>(ptr)->retryImmediately();
+ if (impl) {
+ impl->retryImmediately();
}
}
void HTTPRequest::cancel() {
- if (ptr) {
- delete reinterpret_cast<HTTPRequestImpl *>(ptr);
- ptr = nullptr;
- }
-
+ delete impl;
+ impl = nullptr;
delete this;
}
diff --git a/src/mbgl/storage/asset_request.hpp b/src/mbgl/storage/asset_request.hpp
index e20e1d818a..3f9b018b54 100644
--- a/src/mbgl/storage/asset_request.hpp
+++ b/src/mbgl/storage/asset_request.hpp
@@ -3,20 +3,22 @@
#include "request_base.hpp"
+typedef struct uv_loop_s uv_loop_t;
+
namespace mbgl {
+class AssetRequestImpl;
+
class AssetRequest : public RequestBase {
public:
- AssetRequest(const Resource&, Callback, const std::string& assetRoot);
+ AssetRequest(const Resource&, Callback, uv_loop_t*, const std::string& assetRoot);
- void start(uv_loop_t *loop, std::shared_ptr<const Response> response = nullptr);
- void cancel();
+ void cancel() override;
private:
~AssetRequest();
- void *ptr = nullptr;
- const std::string& assetRoot;
+ AssetRequestImpl* impl;
friend class AssetRequestImpl;
};
diff --git a/src/mbgl/storage/default_file_source.cpp b/src/mbgl/storage/default_file_source.cpp
index c510b5c7f1..3e02c05fae 100644
--- a/src/mbgl/storage/default_file_source.cpp
+++ b/src/mbgl/storage/default_file_source.cpp
@@ -134,12 +134,10 @@ void DefaultFileSource::Impl::startRealRequest(const Resource& resource, std::sh
};
if (algo::starts_with(resource.url, "asset://")) {
- request->request = new AssetRequest(resource, callback, assetRoot);
+ request->request = new AssetRequest(resource, callback, request->loop, assetRoot);
} else {
- request->request = new HTTPRequest(resource, callback);
+ request->request = new HTTPRequest(resource, callback, request->loop, response);
}
-
- request->request->start(request->loop, response);
}
void DefaultFileSource::Impl::cancel(Request* req) {
diff --git a/src/mbgl/storage/http_request.hpp b/src/mbgl/storage/http_request.hpp
index faf6ee2f1c..bbe1265c6d 100644
--- a/src/mbgl/storage/http_request.hpp
+++ b/src/mbgl/storage/http_request.hpp
@@ -3,23 +3,23 @@
#include "request_base.hpp"
+typedef struct uv_loop_s uv_loop_t;
+
namespace mbgl {
-struct Resource;
+class HTTPRequestImpl;
class HTTPRequest : public RequestBase {
public:
- HTTPRequest(const Resource&, Callback);
-
- void start(uv_loop_t *loop, std::shared_ptr<const Response> response = nullptr);
- void cancel();
+ HTTPRequest(const Resource&, Callback, uv_loop_t*, std::shared_ptr<const Response> = nullptr);
+ void cancel() override;
void retryImmediately();
private:
~HTTPRequest();
- void *ptr = nullptr;
+ HTTPRequestImpl* impl;
friend class HTTPRequestImpl;
};
diff --git a/src/mbgl/storage/request_base.hpp b/src/mbgl/storage/request_base.hpp
index 281e76a02c..e4ea7117c1 100644
--- a/src/mbgl/storage/request_base.hpp
+++ b/src/mbgl/storage/request_base.hpp
@@ -7,8 +7,6 @@
#include <memory>
#include <functional>
-typedef struct uv_loop_s uv_loop_t;
-
namespace mbgl {
struct Resource;
@@ -19,19 +17,16 @@ public:
using Callback = std::function<void (std::shared_ptr<const Response> response, FileCache::Hint hint)>;
RequestBase(const Resource& resource_, Callback notify_)
- : notify(notify_)
- , resource(resource_) {
+ : resource(resource_)
+ , notify(notify_) {
}
virtual ~RequestBase() = default;
-
- virtual void start(uv_loop_t *loop, std::shared_ptr<const Response> response = nullptr) = 0;
virtual void cancel() = 0;
- Callback notify;
-
protected:
const Resource& resource;
+ Callback notify;
};
}