FBDeviceControl/Management/FBAMRestorableDevice.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 "FBAMRestorableDevice.h"
#import "FBDeviceControlError.h"
static NSString *const UnknownValue = @"unknown";
@implementation FBAMRestorableDevice
@synthesize calls = _calls;
@synthesize logger = _logger;
@synthesize restorableDevice = _restorableDevice;
- (instancetype)initWithCalls:(AMDCalls)calls restorableDevice:(AMRestorableDeviceRef)restorableDevice allValues:(NSDictionary<NSString *, id> *)allValues workQueue:(dispatch_queue_t)workQueue asyncQueue:(dispatch_queue_t)asyncQueue logger:(id<FBControlCoreLogger>)logger
{
self = [super init];
if (!self) {
return nil;
}
_calls = calls;
_restorableDevice = restorableDevice;
_allValues = allValues;
_workQueue = workQueue;
_asyncQueue = asyncQueue;
_logger = logger;
return self;
}
#pragma mark FBiOSTargetInfo
- (NSString *)uniqueIdentifier
{
return [self.allValues[FBDeviceKeyUniqueChipID] stringValue];
}
- (NSString *)udid
{
return UnknownValue;
}
- (NSString *)name
{
return self.allValues[FBDeviceKeyDeviceName];
}
- (FBiOSTargetState)state
{
AMRestorableDeviceState deviceState = self.calls.RestorableDeviceGetState(self.restorableDevice);
switch (deviceState) {
case AMRestorableDeviceStateDFU:
return FBiOSTargetStateDFU;
case AMRestorableDeviceStateRecovery:
return FBiOSTargetStateRecovery;
case AMRestorableDeviceStateRestoreOS:
return FBiOSTargetStateRestoreOS;
case AMRestorableDeviceStateBootedOS:
return FBiOSTargetStateBooted;
default:
return FBiOSTargetStateUnknown;
}
}
- (FBDeviceType *)deviceType
{
NSString *productString = self.allValues[FBDeviceKeyProductType];
return [FBDeviceType genericWithName:productString];
}
- (FBArchitecture)architecture
{
return UnknownValue;
}
- (FBiOSTargetType)targetType
{
return FBiOSTargetTypeDevice;
}
- (FBOSVersion *)osVersion
{
return [FBOSVersion genericWithName:UnknownValue];
}
- (NSDictionary<NSString *, id> *)extendedInformation
{
return @{
@"device": self.allValues,
};
}
#pragma mark FBDevice
- (NSString *)buildVersion
{
return UnknownValue;
}
- (NSString *)productVersion
{
return UnknownValue;
}
- (AMDeviceRef)amDeviceRef
{
return NULL;
}
- (AMRecoveryModeDeviceRef)recoveryModeDeviceRef
{
return self.calls.RestorableDeviceGetRecoveryModeDevice(self.restorableDevice);
}
- (FBDeviceActivationState)activationState
{
return FBDeviceActivationStateUnknown;
}
#pragma mark Public
// AMRestorableGetStringForState, is a private function so we can't get to it.
// Instead it's a very simple implementation so we just re-implement it.
+ (FBiOSTargetState)targetStateForDeviceState:(AMRestorableDeviceState)state
{
switch (state) {
case AMRestorableDeviceStateDFU:
return FBiOSTargetStateDFU;
case AMRestorableDeviceStateRecovery:
return FBiOSTargetStateRecovery;
case AMRestorableDeviceStateRestoreOS:
return FBiOSTargetStateRestoreOS;
case AMRestorableDeviceStateBootedOS:
return FBiOSTargetStateBooted;
default:
return FBiOSTargetStateUnknown;
}
}
- (void)setRestorableDevice:(AMRestorableDeviceRef)restorableDevice
{
AMDeviceRef oldRestorableDevice = _restorableDevice;
if (restorableDevice) {
CFRetain(restorableDevice);
}
if (oldRestorableDevice) {
CFRelease(oldRestorableDevice);
}
_restorableDevice = restorableDevice;
}
- (AMRestorableDeviceRef)restorableDevice
{
return _restorableDevice;
}
@end