static BOOL FB_AMDeviceConnected()

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;
}