summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Loer <chris.loer@gmail.com>2018-10-16 14:43:09 -0700
committerChris Loer <chris.loer@mapbox.com>2018-10-17 12:53:24 -0700
commit5a45976b7c72e9a9e1a43d57e5482b1dd9c1e98e (patch)
treea10f4b17b3ae8248710f93de2f7754e6f246f5a0
parentf510b577aadad43c2ade55c0be3f8289209d559f (diff)
downloadqtlocation-mapboxgl-5a45976b7c72e9a9e1a43d57e5482b1dd9c1e98e.tar.gz
[darwin] Add MGLOfflineStorage putResourceForURL
Useful for pre-warming the ambient cache
-rw-r--r--platform/darwin/src/MGLOfflineStorage.h20
-rw-r--r--platform/darwin/src/MGLOfflineStorage.mm24
2 files changed, 44 insertions, 0 deletions
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 <mbgl/actor/actor.hpp>
#include <mbgl/actor/scheduler.hpp>
#include <mbgl/storage/resource_transform.hpp>
+#include <mbgl/util/chrono.hpp>
#include <mbgl/util/run_loop.hpp>
#include <mbgl/util/string.hpp>
@@ -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<std::string>(static_cast<const char*>(data.bytes), data.length);
+
+ if (etag) {
+ response.etag = std::string([etag UTF8String]);
+ }
+
+ if (modified) {
+ response.modified = mbgl::util::now() + std::chrono::duration_cast<mbgl::Seconds>(MGLDurationFromTimeInterval(modified.timeIntervalSinceNow));
+ }
+
+ if (expires) {
+ response.expires = mbgl::util::now() + std::chrono::duration_cast<mbgl::Seconds>(MGLDurationFromTimeInterval(expires.timeIntervalSinceNow));
+ }
+
+ _mbglFileSource->put(resource, response);
+}
+
+
@end