summaryrefslogtreecommitdiff
path: root/platform/darwin/src/MGLOfflinePack.mm
diff options
context:
space:
mode:
Diffstat (limited to 'platform/darwin/src/MGLOfflinePack.mm')
-rw-r--r--platform/darwin/src/MGLOfflinePack.mm282
1 files changed, 0 insertions, 282 deletions
diff --git a/platform/darwin/src/MGLOfflinePack.mm b/platform/darwin/src/MGLOfflinePack.mm
deleted file mode 100644
index edee549744..0000000000
--- a/platform/darwin/src/MGLOfflinePack.mm
+++ /dev/null
@@ -1,282 +0,0 @@
-#import "MGLOfflinePack_Private.h"
-
-#import "MGLOfflineStorage_Private.h"
-#import "MGLOfflineRegion_Private.h"
-#import "MGLTilePyramidOfflineRegion.h"
-#import "MGLTilePyramidOfflineRegion_Private.h"
-#import "MGLShapeOfflineRegion.h"
-#import "MGLShapeOfflineRegion_Private.h"
-#import "MGLLoggingConfiguration_Private.h"
-
-#import "NSValue+MGLAdditions.h"
-
-#include <mbgl/map/map_options.hpp>
-#include <mbgl/storage/database_file_source.hpp>
-
-const MGLExceptionName MGLInvalidOfflinePackException = @"MGLInvalidOfflinePackException";
-
-/**
- Assert that the current offline pack is valid.
-
- This macro should be used at the beginning of any public-facing instance method
- of `MGLOfflinePack`. For private methods, an assertion is more appropriate.
- */
-#define MGLAssertOfflinePackIsValid() \
- do { \
- if (_state == MGLOfflinePackStateInvalid) { \
- [NSException raise:MGLInvalidOfflinePackException \
- format: \
- @"-[MGLOfflineStorage removePack:withCompletionHandler:] has been called " \
- @"on this instance of MGLOfflinePack, rendering it invalid. It is an " \
- @"error to send any message to this pack."]; \
- } \
- } while (NO);
-
-@interface MGLTilePyramidOfflineRegion () <MGLOfflineRegion_Private, MGLTilePyramidOfflineRegion_Private>
-@end
-
-@interface MGLShapeOfflineRegion () <MGLOfflineRegion_Private, MGLShapeOfflineRegion_Private>
-@end
-
-class MBGLOfflineRegionObserver : public mbgl::OfflineRegionObserver {
-public:
- MBGLOfflineRegionObserver(MGLOfflinePack *pack_) : pack(pack_) {}
-
- void statusChanged(mbgl::OfflineRegionStatus status) override;
- void responseError(mbgl::Response::Error error) override;
- void mapboxTileCountLimitExceeded(uint64_t limit) override;
-
-private:
- __weak MGLOfflinePack *pack = nullptr;
-};
-
-@interface MGLOfflinePack ()
-
-@property (nonatomic, nullable, readwrite) mbgl::OfflineRegion *mbglOfflineRegion;
-@property (nonatomic, readwrite) MGLOfflinePackProgress progress;
-
-@end
-
-@implementation MGLOfflinePack {
- BOOL _isSuspending;
- std::shared_ptr<mbgl::DatabaseFileSource> _mbglDatabaseFileSource;
-}
-
-- (instancetype)init {
- MGLLogInfo(@"Calling this initializer is not allowed.");
- if (self = [super init]) {
- _state = MGLOfflinePackStateInvalid;
- NSLog(@"%s called; did you mean to call +[MGLOfflineStorage addPackForRegion:withContext:completionHandler:] instead?", __PRETTY_FUNCTION__);
- }
- return self;
-}
-
-- (instancetype)initWithMBGLRegion:(mbgl::OfflineRegion *)region {
- if (self = [super init]) {
- _mbglOfflineRegion = region;
- _state = MGLOfflinePackStateUnknown;
-
- _mbglDatabaseFileSource = [[MGLOfflineStorage sharedOfflineStorage] mbglDatabaseFileSource];
- _mbglDatabaseFileSource->setOfflineRegionObserver(*_mbglOfflineRegion, std::make_unique<MBGLOfflineRegionObserver>(self));
- }
- return self;
-}
-
-- (void)dealloc {
- MGLAssert(_state == MGLOfflinePackStateInvalid, @"MGLOfflinePack was not invalided prior to deallocation.");
-}
-
-- (id <MGLOfflineRegion>)region {
- MGLAssertOfflinePackIsValid();
-
- const mbgl::OfflineRegionDefinition &regionDefinition = _mbglOfflineRegion->getDefinition();
- MGLAssert([MGLTilePyramidOfflineRegion conformsToProtocol:@protocol(MGLOfflineRegion_Private)], @"MGLTilePyramidOfflineRegion should conform to MGLOfflineRegion_Private.");
- MGLAssert([MGLShapeOfflineRegion conformsToProtocol:@protocol(MGLOfflineRegion_Private)], @"MGLShapeOfflineRegion should conform to MGLOfflineRegion_Private.");
-
-
-
- return regionDefinition.match(
- [&] (const mbgl::OfflineTilePyramidRegionDefinition def){
- return (id <MGLOfflineRegion>)[[MGLTilePyramidOfflineRegion alloc] initWithOfflineRegionDefinition:def];
- },
- [&] (const mbgl::OfflineGeometryRegionDefinition& def){
- return (id <MGLOfflineRegion>)[[MGLShapeOfflineRegion alloc] initWithOfflineRegionDefinition:def];
- });
-}
-
-- (NSData *)context {
- MGLAssertOfflinePackIsValid();
-
- const mbgl::OfflineRegionMetadata &metadata = _mbglOfflineRegion->getMetadata();
- return [NSData dataWithBytes:&metadata[0] length:metadata.size()];
-}
-
-- (void)resume {
- MGLLogInfo(@"Resuming pack download.");
- MGLAssertOfflinePackIsValid();
-
- self.state = MGLOfflinePackStateActive;
-
- _mbglDatabaseFileSource->setOfflineRegionDownloadState(*_mbglOfflineRegion, mbgl::OfflineRegionDownloadState::Active);
-}
-
-- (void)suspend {
- MGLLogInfo(@"Suspending pack download.");
- MGLAssertOfflinePackIsValid();
-
- if (self.state == MGLOfflinePackStateActive) {
- self.state = MGLOfflinePackStateInactive;
- _isSuspending = YES;
- }
-
- _mbglDatabaseFileSource->setOfflineRegionDownloadState(*_mbglOfflineRegion, mbgl::OfflineRegionDownloadState::Inactive);
-}
-
-- (void)invalidate {
- MGLLogInfo(@"Invalidating pack.");
- MGLAssert(_state != MGLOfflinePackStateInvalid, @"Cannot invalidate an already invalid offline pack.");
- MGLAssert(self.mbglOfflineRegion, @"Should have a valid region");
-
- @synchronized (self) {
- self.state = MGLOfflinePackStateInvalid;
- if (self.mbglOfflineRegion) {
- _mbglDatabaseFileSource->setOfflineRegionObserver(*self.mbglOfflineRegion, nullptr);
- }
- self.mbglOfflineRegion = nil;
- }
-}
-
-- (void)setState:(MGLOfflinePackState)state {
- MGLLogDebug(@"Setting state: %ld", (long)state);
- if (!self.mbglOfflineRegion) {
- // A progress update has arrived after the call to
- // -[MGLOfflineStorage removePack:withCompletionHandler:] but before the
- // removal is complete and the completion handler is called.
- MGLAssert(_state == MGLOfflinePackStateInvalid, @"A valid MGLOfflinePack has no mbgl::OfflineRegion.");
- return;
- }
-
- MGLAssert(_state != MGLOfflinePackStateInvalid, @"Cannot change the state of an invalid offline pack.");
-
- if (!_isSuspending || state != MGLOfflinePackStateActive) {
- _isSuspending = NO;
- _state = state;
- }
-}
-
-- (void)requestProgress {
- MGLLogInfo(@"Requesting pack progress.");
- MGLAssertOfflinePackIsValid();
-
- __weak MGLOfflinePack *weakSelf = self;
- _mbglDatabaseFileSource->getOfflineRegionStatus(*_mbglOfflineRegion, [&, weakSelf](mbgl::expected<mbgl::OfflineRegionStatus, std::exception_ptr> status) {
- if (status) {
- mbgl::OfflineRegionStatus checkedStatus = *status;
- dispatch_async(dispatch_get_main_queue(), ^{
- MGLOfflinePack *strongSelf = weakSelf;
- [strongSelf offlineRegionStatusDidChange:checkedStatus];
- });
- }
- });
-}
-
-- (void)offlineRegionStatusDidChange:(mbgl::OfflineRegionStatus)status {
- MGLAssert(_state != MGLOfflinePackStateInvalid, @"Cannot change update progress of an invalid offline pack.");
-
- switch (status.downloadState) {
- case mbgl::OfflineRegionDownloadState::Inactive:
- self.state = status.complete() ? MGLOfflinePackStateComplete : MGLOfflinePackStateInactive;
- break;
-
- case mbgl::OfflineRegionDownloadState::Active:
- self.state = MGLOfflinePackStateActive;
- break;
- }
-
- if (_isSuspending) {
- return;
- }
-
- MGLOfflinePackProgress progress;
- progress.countOfResourcesCompleted = status.completedResourceCount;
- progress.countOfBytesCompleted = status.completedResourceSize;
- progress.countOfTilesCompleted = status.completedTileCount;
- progress.countOfTileBytesCompleted = status.completedTileSize;
- progress.countOfResourcesExpected = status.requiredResourceCount;
- progress.maximumResourcesExpected = status.requiredResourceCountIsPrecise ? status.requiredResourceCount : UINT64_MAX;
- self.progress = progress;
-
- NSDictionary *userInfo = @{MGLOfflinePackUserInfoKeyState: @(self.state),
- MGLOfflinePackUserInfoKeyProgress: [NSValue valueWithMGLOfflinePackProgress:progress]};
-
- NSNotificationCenter *noteCenter = [NSNotificationCenter defaultCenter];
- [noteCenter postNotificationName:MGLOfflinePackProgressChangedNotification
- object:self
- userInfo:userInfo];
-}
-
-- (void)didReceiveError:(NSError *)error {
- MGLLogError(@"Error: %@", error.localizedDescription);
- MGLLogInfo(@"Notifying about pack error.");
-
- NSDictionary *userInfo = @{ MGLOfflinePackUserInfoKeyError: error };
- NSNotificationCenter *noteCenter = [NSNotificationCenter defaultCenter];
- [noteCenter postNotificationName:MGLOfflinePackErrorNotification
- object:self
- userInfo:userInfo];
-}
-
-- (void)didReceiveMaximumAllowedMapboxTiles:(uint64_t)limit {
- MGLLogInfo(@"Notifying reached maximum allowed Mapbox tiles: %lu", (unsigned long)limit);
- NSDictionary *userInfo = @{ MGLOfflinePackUserInfoKeyMaximumCount: @(limit) };
- NSNotificationCenter *noteCenter = [NSNotificationCenter defaultCenter];
- [noteCenter postNotificationName:MGLOfflinePackMaximumMapboxTilesReachedNotification
- object:self
- userInfo:userInfo];
-}
-
-NSError *MGLErrorFromResponseError(mbgl::Response::Error error) {
- NSInteger errorCode = MGLErrorCodeUnknown;
- switch (error.reason) {
- case mbgl::Response::Error::Reason::NotFound:
- errorCode = MGLErrorCodeNotFound;
- break;
-
- case mbgl::Response::Error::Reason::Server:
- errorCode = MGLErrorCodeBadServerResponse;
- break;
-
- case mbgl::Response::Error::Reason::Connection:
- errorCode = MGLErrorCodeConnectionFailed;
- break;
-
- default:
- break;
- }
- return [NSError errorWithDomain:MGLErrorDomain code:errorCode userInfo:@{
- NSLocalizedFailureReasonErrorKey: @(error.message.c_str())
- }];
-}
-
-@end
-
-void MBGLOfflineRegionObserver::statusChanged(mbgl::OfflineRegionStatus status) {
- __weak MGLOfflinePack *weakPack = pack;
- dispatch_async(dispatch_get_main_queue(), ^{
- [weakPack offlineRegionStatusDidChange:status];
- });
-}
-
-void MBGLOfflineRegionObserver::responseError(mbgl::Response::Error error) {
- __weak MGLOfflinePack *weakPack = pack;
- dispatch_async(dispatch_get_main_queue(), ^{
- [weakPack didReceiveError:MGLErrorFromResponseError(error)];
- });
-}
-
-void MBGLOfflineRegionObserver::mapboxTileCountLimitExceeded(uint64_t limit) {
- __weak MGLOfflinePack *weakPack = pack;
- dispatch_async(dispatch_get_main_queue(), ^{
- [weakPack didReceiveMaximumAllowedMapboxTiles:limit];
- });
-}