From 5a45976b7c72e9a9e1a43d57e5482b1dd9c1e98e Mon Sep 17 00:00:00 2001 From: Chris Loer Date: Tue, 16 Oct 2018 14:43:09 -0700 Subject: [darwin] Add MGLOfflineStorage putResourceForURL Useful for pre-warming the ambient cache --- platform/darwin/src/MGLOfflineStorage.h | 20 ++++++++++++++++++++ platform/darwin/src/MGLOfflineStorage.mm | 24 ++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/platform/darwin/src/MGLOfflineStorage.h b/platform/darwin/src/MGLOfflineStorage.h index d512c60845..5065e397d0 100644 --- a/platform/darwin/src/MGLOfflineStorage.h +++ b/platform/darwin/src/MGLOfflineStorage.h @@ -339,6 +339,26 @@ MGL_EXPORT */ @property (nonatomic, readonly) unsigned long long countOfBytesCompleted; +/* + * Insert the provided resource into the ambient cache + * This method mimics the caching that would take place if the equivalent + * resource were requested in the process of map rendering. + * Use this method to pre-warm the cache with resources you know + * will be requested. + * + * This call is asynchronous: the data may not be immediately available + * for in-progress requests, although subsequent requests should have + * access to the cached data. + * + * @param url The URL of the resource to insert + * @param data Response data to store for this resource. Data is expected to be uncompressed; internally, the cache will compress data as necessary. + * @param modified Optional "modified" response header + * @param expires Optional "expires" response header + * @param etag Optional "entity tag" response header + */ +-(void)putResourceWithUrl:(NSURL *)url data:(NSData *)data modified:(NSDate * _Nullable)modified expires:(NSDate * _Nullable)expires etag:(NSString * _Nullable)etag; + + @end /** diff --git a/platform/darwin/src/MGLOfflineStorage.mm b/platform/darwin/src/MGLOfflineStorage.mm index fd6dd2f998..78bcb53e7c 100644 --- a/platform/darwin/src/MGLOfflineStorage.mm +++ b/platform/darwin/src/MGLOfflineStorage.mm @@ -9,10 +9,13 @@ #import "MGLTilePyramidOfflineRegion.h" #import "NSBundle+MGLAdditions.h" #import "NSValue+MGLAdditions.h" +#import "NSDate+MGLAdditions.h" +#import "NSData+MGLAdditions.h" #include #include #include +#include #include #include @@ -470,4 +473,25 @@ const MGLExceptionName MGLUnsupportedRegionTypeException = @"MGLUnsupportedRegio return attributes.fileSize; } +-(void)putResourceWithUrl:(NSURL *)url data:(NSData *)data modified:(NSDate * _Nullable)modified expires:(NSDate * _Nullable)expires etag:(NSString * _Nullable)etag { + mbgl::Resource resource(mbgl::Resource::Kind::Unknown, [[url absoluteString] UTF8String]); + mbgl::Response response; + response.data = std::make_shared(static_cast(data.bytes), data.length); + + if (etag) { + response.etag = std::string([etag UTF8String]); + } + + if (modified) { + response.modified = mbgl::util::now() + std::chrono::duration_cast(MGLDurationFromTimeInterval(modified.timeIntervalSinceNow)); + } + + if (expires) { + response.expires = mbgl::util::now() + std::chrono::duration_cast(MGLDurationFromTimeInterval(expires.timeIntervalSinceNow)); + } + + _mbglFileSource->put(resource, response); +} + + @end -- cgit v1.2.1