FBDeviceControl/Commands/FBDeviceDiagnosticInformationCommands.m (78 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 "FBDeviceDiagnosticInformationCommands.h"
#import "FBDevice.h"
#import "FBAMDServiceConnection.h"
#import "FBManagedConfigClient.h"
#import "FBSpringboardServicesClient.h"
static NSString *const DiagnosticsRelayService = @"com.apple.mobile.diagnostics_relay";
@interface FBDeviceDiagnosticInformationCommands ()
@property (nonatomic, weak, readonly) FBDevice *device;
@end
@implementation FBDeviceDiagnosticInformationCommands
#pragma mark Initializers
+ (instancetype)commandsWithTarget:(FBDevice *)target
{
return [[self alloc] initWithDevice:target];
}
- (instancetype)initWithDevice:(FBDevice *)device
{
self = [super init];
if (!self) {
return nil;
}
_device = device;
return self;
}
#pragma mark FBDeviceDiagnosticInformationCommands Implementation
- (FBFuture<NSDictionary<NSString *, id> *> *)fetchDiagnosticInformation
{
return [[FBFuture
futureWithFutures:@[
[self fetchInformationFromDiagnosticsRelay],
[self fetchInformationFromSpringboard],
[self fetchInformationFromMobileConfiguration],
]]
onQueue:self.device.asyncQueue map:^ NSDictionary<NSString *, id> * (NSArray<id> *results) {
return [FBCollectionOperations recursiveFilteredJSONSerializableRepresentationOfDictionary:@{
DiagnosticsRelayService: results[0],
FBSpringboardServiceName: results[1],
FBManagedConfigService: results[2],
}];
}];
}
#pragma mark Private
- (FBFuture<NSDictionary<NSString *, id> *> *)fetchInformationFromDiagnosticsRelay
{
return [[self.device
startService:DiagnosticsRelayService]
onQueue:self.device.asyncQueue pop:^(FBAMDServiceConnection *connection) {
NSError *error = nil;
NSDictionary<NSString *, id> *result = [connection sendAndReceiveMessage:@{@"Request": @"All"} error:&error];
if (!result) {
return [FBFuture futureWithError:error];
}
if (![result[@"Status"] isEqualToString:@"Success"]) {
return [[FBControlCoreError
describeFormat:@"Not successful %@", result]
failFuture];
}
return [FBFuture futureWithResult:[FBCollectionOperations recursiveFilteredJSONSerializableRepresentationOfDictionary:result[@"Diagnostics"]]];
}];
}
- (FBFuture<IconLayoutType> *)fetchInformationFromSpringboard
{
return [[self.device
startService:FBSpringboardServiceName]
onQueue:self.device.asyncQueue pop:^(FBAMDServiceConnection *connection) {
FBSpringboardServicesClient *client = [FBSpringboardServicesClient springboardServicesClientWithConnection:connection logger:self.device.logger];
return [client getIconLayout];
}];
}
- (FBFuture<NSDictionary<NSString *, id> *> *)fetchInformationFromMobileConfiguration
{
return [[self.device
startService:FBManagedConfigService]
onQueue:self.device.asyncQueue pop:^(FBAMDServiceConnection *connection) {
return [[FBManagedConfigClient managedConfigClientWithConnection:connection logger:self.device.logger] getCloudConfiguration];
}];
}
@end