/* * Copyright 2018 Google * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #import #import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORLifecycle.h" #import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageEventSelector.h" #import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORStorageProtocol.h" @class GDTCOREvent; @class GDTCORUploadCoordinator; NS_ASSUME_NONNULL_BEGIN /** The event components eventID dictionary key. */ FOUNDATION_EXPORT NSString *const kGDTCOREventComponentsEventIDKey; /** The event components qosTier dictionary key. */ FOUNDATION_EXPORT NSString *const kGDTCOREventComponentsQoSTierKey; /** The event components mappingID dictionary key. */ FOUNDATION_EXPORT NSString *const kGDTCOREventComponentsMappingIDKey; /** The event components expirationDate dictionary key. */ FOUNDATION_EXPORT NSString *const kGDTCOREventComponentsExpirationKey; /** The batch components target dictionary key. */ FOUNDATION_EXPORT NSString *const kGDTCORBatchComponentsTargetKey; /** The batch components batchID dictionary key. */ FOUNDATION_EXPORT NSString *const kGDTCORBatchComponentsBatchIDKey; /** The batch components expiration dictionary key. */ FOUNDATION_EXPORT NSString *const kGDTCORBatchComponentsExpirationKey; /** The maximum allowed disk space taken by the stored data. */ FOUNDATION_EXPORT const uint64_t kGDTCORFlatFileStorageSizeLimit; FOUNDATION_EXPORT NSString *const GDTCORFlatFileStorageErrorDomain; typedef NS_ENUM(NSInteger, GDTCORFlatFileStorageError) { GDTCORFlatFileStorageErrorSizeLimitReached = 0 }; /** Manages the storage of events. This class is thread-safe. * * Event files will be stored as follows: * /google-sdk-events//gdt_event_data//.. * * Library data will be stored as follows: * /google-sdk-events//gdt_library_data/ * * Batch data will be stored as follows: * /google-sdk-events//gdt_batch_data/./.. */ @interface GDTCORFlatFileStorage : NSObject /** The queue on which all storage work will occur. */ @property(nonatomic) dispatch_queue_t storageQueue; /** The upload coordinator instance used by this storage instance. */ @property(nonatomic) GDTCORUploadCoordinator *uploadCoordinator; /** Creates and/or returns the storage singleton. * * @return The storage singleton. */ + (instancetype)sharedInstance; /** Returns the base directory under which all events will be stored. * * @return The base directory under which all events will be stored. */ + (NSString *)eventDataStoragePath; /** Returns the base directory under which all library data will be stored. * * @return The base directory under which all library data will be stored. */ + (NSString *)libraryDataStoragePath; /** Returns the base directory under which all batch data will be stored. * * @return The base directory under which all batch data will be stored. */ + (NSString *)batchDataStoragePath; /** */ + (NSString *)batchPathForTarget:(GDTCORTarget)target batchID:(NSNumber *)batchID expirationDate:(NSDate *)expirationDate; /** Returns a constructed storage path based on the given values. This path may not exist. * * @param target The target, which is necessary to be given a path. * @param eventID The eventID. * @param qosTier The qosTier. * @param expirationDate The expirationDate as a 1970-relative time interval. * @param mappingID The mappingID. * @return The path representing the combination of the given parameters. */ + (NSString *)pathForTarget:(GDTCORTarget)target eventID:(NSString *)eventID qosTier:(NSNumber *)qosTier expirationDate:(NSDate *)expirationDate mappingID:(NSString *)mappingID; /** Returns extant paths that match all of the given parameters. * * @param eventIDs The list of eventIDs to look for, or nil for any. * @param qosTiers The list of qosTiers to look for, or nil for any. * @param mappingIDs The list of mappingIDs to look for, or nil for any. * @param onComplete The completion to call once the paths have been discovered. */ - (void)pathsForTarget:(GDTCORTarget)target eventIDs:(nullable NSSet *)eventIDs qosTiers:(nullable NSSet *)qosTiers mappingIDs:(nullable NSSet *)mappingIDs onComplete:(void (^)(NSSet *paths))onComplete; /** Fetches the current batchID counter value from library storage, increments it, and sets the new * value. Returns nil if a batchID was not able to be created for some reason. * * @param onComplete A block to execute when creating the next batchID is complete. */ - (void)nextBatchID:(void (^)(NSNumber *_Nullable batchID))onComplete; /** Constructs a dictionary of event filename components. * * @param fileName The event filename to split. * @return The dictionary of event component keys to their values. */ - (nullable NSDictionary *)eventComponentsFromFilename:(NSString *)fileName; /** Constructs a dictionary of batch filename components. * * @param fileName The batch folder name to split. * @return The dictionary of batch component keys to their values. */ - (nullable NSDictionary *)batchComponentsFromFilename:(NSString *)fileName; @end NS_ASSUME_NONNULL_END