FBControlCore/Management/FBiOSTarget.m (126 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 "FBiOSTarget.h"
#import "FBiOSTargetConfiguration.h"
NSString *FBiOSTargetStateStringFromState(FBiOSTargetState state)
{
switch (state) {
case FBiOSTargetStateCreating:
return FBiOSTargetStateStringCreating;
case FBiOSTargetStateShutdown:
return FBiOSTargetStateStringShutdown;
case FBiOSTargetStateBooting:
return FBiOSTargetStateStringBooting;
case FBiOSTargetStateBooted:
return FBiOSTargetStateStringBooted;
case FBiOSTargetStateShuttingDown:
return FBiOSTargetStateStringShuttingDown;
case FBiOSTargetStateDFU:
return FBiOSTargetStateStringDFU;
case FBiOSTargetStateRecovery:
return FBiOSTargetStateStringRecovery;
case FBiOSTargetStateRestoreOS:
return FBiOSTargetStateStringRestoreOS;
default:
return FBiOSTargetStateStringUnknown;
}
}
FBiOSTargetState FBiOSTargetStateFromStateString(NSString *stateString)
{
stateString = [stateString.lowercaseString stringByReplacingOccurrencesOfString:@"-" withString:@" "];
if ([stateString isEqualToString:FBiOSTargetStateStringCreating.lowercaseString]) {
return FBiOSTargetStateCreating;
}
if ([stateString isEqualToString:FBiOSTargetStateStringShutdown.lowercaseString]) {
return FBiOSTargetStateShutdown;
}
if ([stateString isEqualToString:FBiOSTargetStateStringBooting.lowercaseString]) {
return FBiOSTargetStateBooting;
}
if ([stateString isEqualToString:FBiOSTargetStateStringBooted.lowercaseString]) {
return FBiOSTargetStateBooted;
}
if ([stateString isEqualToString:FBiOSTargetStateStringShuttingDown.lowercaseString]) {
return FBiOSTargetStateShuttingDown;
}
if ([stateString isEqualToString:FBiOSTargetStateStringDFU.lowercaseString]) {
return FBiOSTargetStateDFU;
}
if ([stateString isEqualToString:FBiOSTargetStateStringRecovery.lowercaseString]) {
return FBiOSTargetStateRecovery;
}
if ([stateString isEqualToString:FBiOSTargetStateStringRestoreOS.lowercaseString]) {
return FBiOSTargetStateRestoreOS;
}
return FBiOSTargetStateUnknown;
}
NSString *FBiOSTargetTypeStringFromTargetType(FBiOSTargetType targetType)
{
if (targetType == FBiOSTargetTypeDevice) {
return @"Device";
}
if (targetType == FBiOSTargetTypeSimulator) {
return @"Simulator";
}
if (targetType == FBiOSTargetTypeLocalMac) {
return @"Mac";
}
return @"Unknown";
}
NSComparisonResult FBiOSTargetComparison(id<FBiOSTarget> left, id<FBiOSTarget> right)
{
NSComparisonResult comparison = [@(left.targetType) compare:@(right.targetType)];
if (comparison != NSOrderedSame) {
return comparison;
}
comparison = [left.osVersion.number compare:right.osVersion.number];
if (comparison != NSOrderedSame) {
return comparison;
}
comparison = [@(left.deviceType.family) compare:@(right.deviceType.family)];
if (comparison != NSOrderedSame) {
return comparison;
}
comparison = [left.deviceType.model compare:right.deviceType.model];
if (comparison != NSOrderedSame) {
return comparison;
}
comparison = [@(left.state) compare:@(right.state)];
if (comparison != NSOrderedSame) {
return comparison;
}
return [left.udid compare:right.udid];
}
NSString *FBiOSTargetDescribe(id<FBiOSTargetInfo> target)
{
return [NSString stringWithFormat:
@"%@ | %@ | %@ | %@ | %@ | %@",
target.udid,
target.name,
FBiOSTargetStateStringFromState(target.state),
target.deviceType.model,
target.osVersion,
target.architecture
];
}
NSPredicate *FBiOSTargetPredicateForUDID(NSString *udid)
{
return FBiOSTargetPredicateForUDIDs(@[udid]);
}
NSPredicate *FBiOSTargetPredicateForUDIDs(NSArray<NSString *> *udids)
{
NSSet<NSString *> *udidsSet = [NSSet setWithArray:udids];
return [NSPredicate predicateWithBlock:^ BOOL (id<FBiOSTarget> candidate, NSDictionary *_) {
return [udidsSet containsObject:candidate.udid];
}];
}
FBFuture<NSNull *> *FBiOSTargetResolveState(id<FBiOSTarget> target, FBiOSTargetState state)
{
return [FBFuture onQueue:target.workQueue resolveWhen:^ BOOL {
return target.state == state;
}];
}
FBFuture<NSNull *> *FBiOSTargetResolveLeavesState(id<FBiOSTarget> target, FBiOSTargetState state)
{
return [FBFuture onQueue:target.workQueue resolveWhen:^ BOOL {
return target.state != state;
}];
}