diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2016-01-13 17:10:13 -0800 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2016-02-10 15:40:20 -0800 |
commit | dbb8e58aea00a84716aafa6887b50c0186169f9e (patch) | |
tree | e981b82badcf800d6d33acac94d44a78f7b57776 /platform/default/default_file_source.cpp | |
parent | f3d4107d19eef20cc2cf30cd347301128b4f9a86 (diff) | |
download | qtlocation-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.cpp | 40 |
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()); } } |