in FBDeviceControl/Management/FBAMDeviceManager.m [35:86]
static BOOL FB_AMDeviceConnected(AMDeviceRef device, FBAMDeviceManager *manager)
{
NSError *error = nil;
id<FBControlCoreLogger> logger = manager.logger;
AMDCalls calls = manager.calls;
// Start with a basic connection. This should always succeed, even if the device is not paired.
if (![FBAMDeviceManager startConnectionToDevice:device calls:calls logger:logger error:&error]) {
[logger.error logFormat:@"Cannot connect to device, ignoring device %@", error];
return NO;
}
NSString *uniqueChipID = [CFBridgingRelease(calls.CopyValue(device, NULL, (__bridge CFStringRef)(FBDeviceKeyUniqueChipID))) stringValue];
if (!uniqueChipID) {
[FBAMDeviceManager stopConnectionToDevice:device calls:calls logger:logger error:nil];
[logger.error logFormat:@"Ignoring device as cannot obtain ECID for it"];
return NO;
}
if (manager.ecidFilter && ![uniqueChipID isEqualToString:manager.ecidFilter]) {
[FBAMDeviceManager stopConnectionToDevice:device calls:calls logger:logger error:nil];
[logger.error logFormat:@"Ignoring device as ECID %@ does not match filter %@", uniqueChipID, manager.ecidFilter];
return NO;
}
NSError *pairingError = nil;
BOOL pairedWithSession = [FBAMDeviceManager startSessionByPairingWithDevice:device calls:calls logger:logger error:&pairingError];
if (!pairedWithSession) {
[logger logFormat:@"Device is not paired, degraded device information will be provied %@", pairingError];
}
// Now extract all of the values.
NSDictionary<NSString *, id> * info = [FBAMDeviceManager obtainDeviceValues:device calls:calls];
// Stop the session if one was created.
if (pairedWithSession) {
[FBAMDeviceManager stopSessionWithDevice:device calls:calls logger:logger error:nil];
}
// Always disconnect, regardless of whether there was a session or not.
[FBAMDeviceManager stopConnectionToDevice:device calls:calls logger:logger error:nil];
if (!info) {
[logger.error log:@"Ignoring device as no values were returned for it"];
return NO;
}
NSString *udid = info[FBDeviceKeyUniqueDeviceID];
if (!udid) {
[logger.error logFormat:@"Ignoring device as %@ is not present in %@", FBDeviceKeyUniqueDeviceID, info];
return NO;
}
[logger.debug logFormat:@"Obtained Device Values %@", info];
[manager deviceConnected:device identifier:uniqueChipID info:info];
return YES;
}