summaryrefslogtreecommitdiff
path: root/platform/default/default_file_source.cpp
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2016-01-13 17:10:13 -0800
committerJohn Firebaugh <john.firebaugh@gmail.com>2016-02-10 15:40:20 -0800
commitdbb8e58aea00a84716aafa6887b50c0186169f9e (patch)
treee981b82badcf800d6d33acac94d44a78f7b57776 /platform/default/default_file_source.cpp
parentf3d4107d19eef20cc2cf30cd347301128b4f9a86 (diff)
downloadqtlocation-mapboxgl-dbb8e58aea00a84716aafa6887b50c0186169f9e.tar.gz
[core] Moving caching logic to DefaultFileSource
This results in OnlineFileSource containing precisely the logic we want for reuse by OfflineFileSource, and no more.
Diffstat (limited to 'platform/default/default_file_source.cpp')
-rw-r--r--platform/default/default_file_source.cpp40
1 files changed, 37 insertions, 3 deletions
diff --git a/platform/default/default_file_source.cpp b/platform/default/default_file_source.cpp
index a1f8bc2c48..56b47539b1 100644
--- a/platform/default/default_file_source.cpp
+++ b/platform/default/default_file_source.cpp
@@ -5,6 +5,9 @@
#include <mbgl/platform/platform.hpp>
#include <mbgl/util/url.hpp>
+#include <mbgl/util/work_request.hpp>
+
+#include <cassert>
namespace {
@@ -22,8 +25,7 @@ class DefaultFileSource::Impl {
public:
Impl(const std::string& cachePath, const std::string& assetRoot)
: assetFileSource(assetRoot),
- cache(SQLiteCache::getShared(cachePath)),
- onlineFileSource(cache.get()) {
+ cache(SQLiteCache::getShared(cachePath)) {
}
AssetFileSource assetFileSource;
@@ -53,11 +55,43 @@ void DefaultFileSource::setMaximumCacheEntrySize(uint64_t size) {
impl->cache->setMaximumCacheEntrySize(size);
}
+SQLiteCache& DefaultFileSource::getCache() {
+ return *impl->cache;
+}
+
+class DefaultFileRequest : public FileRequest {
+public:
+ DefaultFileRequest(Resource resource, FileSource::Callback callback, DefaultFileSource::Impl* impl) {
+ cacheRequest = impl->cache->get(resource, [=](std::shared_ptr<Response> cacheResponse) mutable {
+ cacheRequest.reset();
+
+ if (cacheResponse) {
+ resource.priorModified = cacheResponse->modified;
+ resource.priorExpires = cacheResponse->expires;
+ resource.priorEtag = cacheResponse->etag;
+ }
+
+ onlineRequest = impl->onlineFileSource.request(resource, [=] (Response onlineResponse) {
+ impl->cache->put(resource, onlineResponse);
+ callback(onlineResponse);
+ });
+
+ // Do this last because it may result in deleting this DefaultFileRequest.
+ if (cacheResponse) {
+ callback(*cacheResponse);
+ }
+ });
+ }
+
+ std::unique_ptr<WorkRequest> cacheRequest;
+ std::unique_ptr<FileRequest> onlineRequest;
+};
+
std::unique_ptr<FileRequest> DefaultFileSource::request(const Resource& resource, Callback callback) {
if (isAssetURL(resource.url)) {
return impl->assetFileSource.request(resource, callback);
} else {
- return impl->onlineFileSource.request(resource, callback);
+ return std::make_unique<DefaultFileRequest>(resource, callback, impl.get());
}
}