2 * Copyright (c) 2016 Apple Inc. All Rights Reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
21 * @APPLE_LICENSE_HEADER_END@
24 #import <Foundation/Foundation.h>
27 @
class CKKSKeychainView
;
28 #import "keychain/ckks/CKKSGroupOperation.h"
29 #import "keychain/ckks/CloudKitDependencies.h"
31 NS_ASSUME_NONNULL_BEGIN
34 @protocol CKKSFetchBecauseProtocol
<NSObject
>
36 typedef NSString
<CKKSFetchBecauseProtocol
> CKKSFetchBecause
;
37 extern CKKSFetchBecause
* const CKKSFetchBecauseAPNS
;
38 extern CKKSFetchBecause
* const CKKSFetchBecauseAPIFetchRequest
;
39 extern CKKSFetchBecause
* const CKKSFetchBecauseCurrentItemFetchRequest
;
40 extern CKKSFetchBecause
* const CKKSFetchBecauseInitialStart
;
41 extern CKKSFetchBecause
* const CKKSFetchBecauseSecuritydRestart
;
42 extern CKKSFetchBecause
* const CKKSFetchBecausePreviousFetchFailed
;
43 extern CKKSFetchBecause
* const CKKSFetchBecauseKeyHierarchy
;
44 extern CKKSFetchBecause
* const CKKSFetchBecauseTesting
;
45 extern CKKSFetchBecause
* const CKKSFetchBecauseResync
;
47 /* Clients that register to use fetches */
48 @interface CKKSCloudKitFetchRequest
: NSObject
49 @property
bool participateInFetch
;
50 @
property (nullable
) CKServerChangeToken
* changeToken
;
53 @
class CKKSCloudKitDeletion
;
54 @protocol CKKSChangeFetcherClient
<NSObject
>
55 - (CKRecordZoneID
*)zoneID
;
56 - (CKKSCloudKitFetchRequest
*)participateInFetch
;
57 - (bool)notifyFetchError
:(NSError
*)error
;
58 - (void)changesFetched
:(NSArray
<CKRecord
*>*)changedRecords
59 deletedRecordIDs
:(NSArray
<CKKSCloudKitDeletion
*>*)deleted
60 oldChangeToken
:(CKServerChangeToken
* _Nullable
)oldChangeToken
61 newChangeToken
:(CKServerChangeToken
*)changeToken
;
64 // I don't understand why recordType isn't part of record ID, but deletions come in as both things
65 @interface CKKSCloudKitDeletion
: NSObject
66 @property CKRecordID
* recordID
;
67 @property NSString
* recordType
;
68 - (instancetype
)initWithRecordID
:(CKRecordID
*)recordID recordType
:(NSString
*)recordType
;
72 @interface CKKSFetchAllRecordZoneChangesOperation
: CKKSGroupOperation
73 @
property (readonly
) Class
<CKKSFetchRecordZoneChangesOperation
> fetchRecordZoneChangesOperationClass
;
74 @
property (readonly
) CKContainer
* container
;
76 // Set this to true before starting this operation if you'd like resync behavior:
77 // Fetching everything currently in CloudKit and comparing to local copy
78 @property
bool resync
;
80 @property NSDictionary
<CKRecordZoneID
*, id
<CKKSChangeFetcherClient
>>* clientMap
;
81 @
property (nullable
) NSMutableArray
<CKRecordZoneID
*>* fetchedZoneIDs
;
83 @property NSSet
<CKKSFetchBecause
*>* fetchReasons
;
84 @property NSSet
<CKRecordZoneNotification
*>* apnsPushes
;
86 @property NSMutableDictionary
<CKRecordID
*, CKRecord
*>* modifications
;
87 @property NSMutableDictionary
<CKRecordID
*, CKKSCloudKitDeletion
*>* deletions
;
88 @property NSMutableDictionary
<CKRecordID
*, CKServerChangeToken
*>* changeTokens
;
90 - (instancetype
)init NS_UNAVAILABLE
;
91 - (instancetype
)initWithContainer
:(CKContainer
*)container
92 fetchClass
:(Class
<CKKSFetchRecordZoneChangesOperation
>)fetchRecordZoneChangesOperationClass
93 clients
:(NSArray
<id
<CKKSChangeFetcherClient
>>*)clients
94 fetchReasons
:(NSSet
<CKKSFetchBecause
*>*)fetchReasons
95 apnsPushes
:(NSSet
<CKRecordZoneNotification
*>* _Nullable
)apnsPushes
96 forceResync
:(bool)forceResync
97 ckoperationGroup
:(CKOperationGroup
*)ckoperationGroup
;
101 NS_ASSUME_NONNULL_END