FBSimulatorControl/Commands/FBSimulatorFileCommands.m (129 lines of code) (raw):

/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #import "FBSimulatorFileCommands.h" #import "FBSimulator.h" #import "FBSimulatorApplicationCommands.h" #import "FBSimulatorError.h" @interface FBSimulatorFileCommands () @property (nonatomic, strong, readonly) FBSimulator *simulator; @end @implementation FBSimulatorFileCommands #pragma mark Initializers + (instancetype)commandsWithTarget:(FBSimulator *)target { return [[self alloc] initWithSimulator:target]; } - (instancetype)initWithSimulator:(FBSimulator *)simulator { self = [super init]; if (!self) { return nil; } _simulator = simulator; return self; } #pragma mark FBFileCommands Implementation - (FBFutureContext<id<FBFileContainer>> *)fileCommandsForContainerApplication:(NSString *)bundleID { return [[[self dataContainerForBundleID:bundleID] onQueue:self.simulator.asyncQueue map:^(NSString *containerPath) { return [FBFileContainer fileContainerForBasePath:containerPath]; }] onQueue:self.simulator.asyncQueue contextualTeardown:^(id _, FBFutureState __) { // Do nothing. return FBFuture.empty; }]; } - (FBFutureContext<id<FBFileContainer>> *)fileCommandsForAuxillary { return [FBFutureContext futureContextWithResult:[FBFileContainer fileContainerForBasePath:self.simulator.auxillaryDirectory]]; } - (FBFutureContext<id<FBFileContainer>> *)fileCommandsForApplicationContainers { return [[[FBSimulatorApplicationCommands applicationContainerToPathMappingForSimulator:self.simulator] onQueue:self.simulator.asyncQueue map:^(NSDictionary<NSString *, NSURL *> *pathMappingURLs) { NSMutableDictionary<NSString *, NSString *> *pathMapping = NSMutableDictionary.dictionary; for (NSString *identifier in pathMappingURLs.allKeys) { pathMapping[identifier] = pathMappingURLs[identifier].path; } return [FBFileContainer fileContainerForPathMapping:pathMapping]; }] onQueue:self.simulator.asyncQueue contextualTeardown:^(id _, FBFutureState __) { // Do nothing. return FBFuture.empty; }]; } - (FBFutureContext<id<FBFileContainer>> *)fileCommandsForGroupContainers { return [[[FBSimulatorApplicationCommands groupContainerToPathMappingForSimulator:self.simulator] onQueue:self.simulator.asyncQueue map:^(NSDictionary<NSString *, NSURL *> *pathMappingURLs) { NSMutableDictionary<NSString *, NSString *> *pathMapping = NSMutableDictionary.dictionary; for (NSString *identifier in pathMappingURLs.allKeys) { pathMapping[identifier] = pathMappingURLs[identifier].path; } return [FBFileContainer fileContainerForPathMapping:pathMapping]; }] onQueue:self.simulator.asyncQueue contextualTeardown:^(id _, FBFutureState __) { // Do nothing. return FBFuture.empty; }]; } - (FBFutureContext<id<FBFileContainer>> *)fileCommandsForRootFilesystem { return [FBFutureContext futureContextWithResult:[FBFileContainer fileContainerForBasePath:self.simulator.dataDirectory]]; } - (FBFutureContext<id<FBFileContainer>> *)fileCommandsForMediaDirectory { NSString *mediaDirectory = [self.simulator.dataDirectory stringByAppendingPathComponent:@"Media"]; return [FBFutureContext futureContextWithResult:[FBFileContainer fileContainerForBasePath:mediaDirectory]]; } - (FBFutureContext<id<FBFileContainer>> *)fileCommandsForMDMProfiles { return [[FBControlCoreError describeFormat:@"%@ not supported on simulators", NSStringFromSelector(_cmd)] failFutureContext]; } - (FBFutureContext<id<FBFileContainer>> *)fileCommandsForProvisioningProfiles { return [[FBControlCoreError describeFormat:@"%@ not supported on simulators", NSStringFromSelector(_cmd)] failFutureContext]; } - (FBFutureContext<id<FBFileContainer>> *)fileCommandsForSpringboardIconLayout { return [[FBControlCoreError describeFormat:@"%@ not supported on simulators", NSStringFromSelector(_cmd)] failFutureContext]; } - (FBFutureContext<id<FBFileContainer>> *)fileCommandsForWallpaper { return [[FBControlCoreError describeFormat:@"%@ not supported on simulators", NSStringFromSelector(_cmd)] failFutureContext]; } - (FBFutureContext<id<FBFileContainer>> *)fileCommandsForDiskImages { return [[FBControlCoreError describeFormat:@"%@ not supported on simulators", NSStringFromSelector(_cmd)] failFutureContext]; } - (FBFutureContext<id<FBFileContainer>> *)fileCommandsForSymbols { return [[FBControlCoreError describeFormat:@"%@ not supported on simulators", NSStringFromSelector(_cmd)] failFutureContext]; } #pragma mark Private - (FBFuture<NSString *> *)dataContainerForBundleID:(NSString *)bundleID { return [[self.simulator installedApplicationWithBundleID:bundleID] onQueue:self.simulator.asyncQueue fmap:^ FBFuture<NSString *> * (FBInstalledApplication *installedApplication) { NSString *container = installedApplication.dataContainer; if (!container) { return [[FBSimulatorError describeFormat:@"No data container present for application %@", installedApplication] failFuture]; } return [FBFuture futureWithResult:container]; }]; } @end