summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2016-02-08 16:16:37 -0800
committerJohn Firebaugh <john.firebaugh@gmail.com>2016-02-10 15:40:20 -0800
commit5d42321b73dcafbfd76d38331558e5e60f7d9f1e (patch)
treee4f81086e2838485655d672209fbc1ce109fe0f6
parent96e0e5252e27e231021df9058cf1e5bc29181345 (diff)
downloadqtlocation-mapboxgl-5d42321b73dcafbfd76d38331558e5e60f7d9f1e.tar.gz
[core] Make {Default,Online}FileSource::Impl more similar
-rw-r--r--include/mbgl/storage/online_file_source.hpp3
-rw-r--r--platform/default/default_file_source.cpp32
-rw-r--r--platform/default/online_file_source.cpp95
3 files changed, 50 insertions, 80 deletions
diff --git a/include/mbgl/storage/online_file_source.hpp b/include/mbgl/storage/online_file_source.hpp
index 1f346b5e76..aceb141fb4 100644
--- a/include/mbgl/storage/online_file_source.hpp
+++ b/include/mbgl/storage/online_file_source.hpp
@@ -20,11 +20,8 @@ public:
std::unique_ptr<FileRequest> request(const Resource&, Callback) override;
private:
- friend class OnlineFileRequest;
friend class OnlineFileRequestImpl;
- void cancel(FileRequest*);
-
class Impl;
const std::unique_ptr<util::Thread<Impl>> thread;
std::string accessToken;
diff --git a/platform/default/default_file_source.cpp b/platform/default/default_file_source.cpp
index 5bb171f7c2..cdf5e1e442 100644
--- a/platform/default/default_file_source.cpp
+++ b/platform/default/default_file_source.cpp
@@ -114,7 +114,7 @@ public:
getDownload(regionID).setState(state);
}
- void add(FileRequest* req, Resource resource, Callback callback) {
+ void request(FileRequest* req, Resource resource, Callback callback) {
tasks[req] = std::make_unique<Task>(resource, callback, this);
}
@@ -147,21 +147,6 @@ private:
bool offline = false;
};
-class DefaultFileRequest : public FileRequest {
-public:
- DefaultFileRequest(Resource resource, FileSource::Callback callback, util::Thread<DefaultFileSource::Impl>& thread_)
- : thread(thread_),
- workRequest(thread.invokeWithCallback(&DefaultFileSource::Impl::add, callback, this, resource)) {
- }
-
- ~DefaultFileRequest() {
- thread.invoke(&DefaultFileSource::Impl::cancel, this);
- }
-
- util::Thread<DefaultFileSource::Impl>& thread;
- std::unique_ptr<WorkRequest> workRequest;
-};
-
DefaultFileSource::DefaultFileSource(const std::string& cachePath, const std::string& assetRoot)
: thread(std::make_unique<util::Thread<DefaultFileSource::Impl>>(util::ThreadContext{"DefaultFileSource", util::ThreadType::Unknown, util::ThreadPriority::Low}, cachePath)),
assetFileSource(std::make_unique<AssetFileSource>(assetRoot)) {
@@ -186,6 +171,21 @@ void DefaultFileSource::setMaximumCacheEntrySize(uint64_t) {
}
std::unique_ptr<FileRequest> DefaultFileSource::request(const Resource& resource, Callback callback) {
+ class DefaultFileRequest : public FileRequest {
+ public:
+ DefaultFileRequest(Resource resource_, FileSource::Callback callback_, util::Thread<DefaultFileSource::Impl>& thread_)
+ : thread(thread_),
+ workRequest(thread.invokeWithCallback(&DefaultFileSource::Impl::request, callback_, this, resource_)) {
+ }
+
+ ~DefaultFileRequest() {
+ thread.invoke(&DefaultFileSource::Impl::cancel, this);
+ }
+
+ util::Thread<DefaultFileSource::Impl>& thread;
+ std::unique_ptr<WorkRequest> workRequest;
+ };
+
if (isAssetURL(resource.url)) {
return assetFileSource->request(resource, callback);
} else {
diff --git a/platform/default/online_file_source.cpp b/platform/default/online_file_source.cpp
index 01dc23bae0..3614501eed 100644
--- a/platform/default/online_file_source.cpp
+++ b/platform/default/online_file_source.cpp
@@ -20,20 +20,6 @@
namespace mbgl {
-class OnlineFileRequest : public FileRequest {
-public:
- OnlineFileRequest(OnlineFileSource& fileSource_)
- : fileSource(fileSource_) {
- }
-
- ~OnlineFileRequest() {
- fileSource.cancel(this);
- }
-
- OnlineFileSource& fileSource;
- std::unique_ptr<WorkRequest> workRequest;
-};
-
class OnlineFileRequestImpl : public util::noncopyable {
public:
using Callback = std::function<void (Response)>;
@@ -59,22 +45,35 @@ private:
class OnlineFileSource::Impl {
public:
- using Callback = std::function<void (Response)>;
+ // Dummy parameter is a workaround for a gcc 4.9 bug.
+ Impl(int) {
+ NetworkStatus::Subscribe(&reachability);
+ }
- Impl(int);
- ~Impl();
+ ~Impl() {
+ NetworkStatus::Unsubscribe(&reachability);
+ }
- void networkIsReachableAgain();
+ void request(FileRequest* req, Resource resource, Callback callback) {
+ pending[req] = std::make_unique<OnlineFileRequestImpl>(resource, callback, *this);
+ }
- void add(Resource, FileRequest*, Callback);
- void cancel(FileRequest*);
+ void cancel(FileRequest* req) {
+ pending.erase(req);
+ }
private:
friend OnlineFileRequestImpl;
+ void networkIsReachableAgain() {
+ for (auto& req : pending) {
+ req.second->networkIsReachableAgain(*this);
+ }
+ }
+
std::unordered_map<FileRequest*, std::unique_ptr<OnlineFileRequestImpl>> pending;
- const std::unique_ptr<HTTPContextBase> httpContext;
- util::AsyncTask reachability;
+ const std::unique_ptr<HTTPContextBase> httpContext { HTTPContextBase::createContext() };
+ util::AsyncTask reachability { std::bind(&Impl::networkIsReachableAgain, this) };
};
OnlineFileSource::OnlineFileSource()
@@ -85,10 +84,6 @@ OnlineFileSource::OnlineFileSource()
OnlineFileSource::~OnlineFileSource() = default;
std::unique_ptr<FileRequest> OnlineFileSource::request(const Resource& resource, Callback callback) {
- if (!callback) {
- throw util::MisuseException("FileSource callback can't be empty");
- }
-
Resource res = resource;
switch (resource.kind) {
@@ -117,44 +112,24 @@ std::unique_ptr<FileRequest> OnlineFileSource::request(const Resource& resource,
break;
}
- auto req = std::make_unique<OnlineFileRequest>(*this);
- req->workRequest = thread->invokeWithCallback(&Impl::add, callback, res, req.get());
- return std::move(req);
-}
-
-void OnlineFileSource::cancel(FileRequest* req) {
- thread->invoke(&Impl::cancel, req);
-}
-
-// ----- Impl -----
-
-// Dummy parameter is a workaround for a gcc 4.9 bug.
-OnlineFileSource::Impl::Impl(int)
- : httpContext(HTTPContextBase::createContext()),
- reachability(std::bind(&Impl::networkIsReachableAgain, this)) {
- NetworkStatus::Subscribe(&reachability);
-}
+ class OnlineFileRequest : public FileRequest {
+ public:
+ OnlineFileRequest(Resource resource_, FileSource::Callback callback_, util::Thread<OnlineFileSource::Impl>& thread_)
+ : thread(thread_),
+ workRequest(thread.invokeWithCallback(&OnlineFileSource::Impl::request, callback_, this, resource_)) {
+ }
-OnlineFileSource::Impl::~Impl() {
- NetworkStatus::Unsubscribe(&reachability);
-}
+ ~OnlineFileRequest() {
+ thread.invoke(&OnlineFileSource::Impl::cancel, this);
+ }
-void OnlineFileSource::Impl::networkIsReachableAgain() {
- for (auto& req : pending) {
- req.second->networkIsReachableAgain(*this);
- }
-}
+ util::Thread<OnlineFileSource::Impl>& thread;
+ std::unique_ptr<WorkRequest> workRequest;
+ };
-void OnlineFileSource::Impl::add(Resource resource, FileRequest* req, Callback callback) {
- pending[req] = std::make_unique<OnlineFileRequestImpl>(resource, callback, *this);
+ return std::make_unique<OnlineFileRequest>(res, callback, *thread);
}
-void OnlineFileSource::Impl::cancel(FileRequest* req) {
- pending.erase(req);
-}
-
-// ----- OnlineFileRequest -----
-
OnlineFileRequestImpl::OnlineFileRequestImpl(const Resource& resource_, Callback callback_, OnlineFileSource::Impl& impl)
: resource(resource_),
callback(callback_) {
@@ -165,9 +140,7 @@ OnlineFileRequestImpl::OnlineFileRequestImpl(const Resource& resource_, Callback
OnlineFileRequestImpl::~OnlineFileRequestImpl() {
if (request) {
request->cancel();
- request = nullptr;
}
- // timer is automatically canceled upon destruction.
}
static Duration errorRetryTimeout(Response::Error::Reason failedRequestReason, uint32_t failedRequests) {