FBDeviceControl/Commands/FBDeviceLogCommands.m (69 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 "FBDeviceLogCommands.h"
#import "FBDevice+Private.h"
#import "FBDeviceControlError.h"
#import "FBAMDServiceConnection.h"
#pragma mark Protocol Adaptor
@interface FBDeviceLogOperation : NSObject <FBLogOperation>
@property (nonatomic, strong, readonly) FBFileReader *reader;
@property (nonatomic, strong, readonly) FBFuture<NSNull *> *readCompleted;
@property (nonatomic, strong, readonly) FBMutableFuture<NSNull *> *serviceCompleted;
@end
@implementation FBDeviceLogOperation
@synthesize consumer = _consumer;
- (instancetype)initWithConsumer:(id<FBDataConsumer>)consumer readCompleted:(FBFuture<NSNull *> *)readCompleted serviceCompleted:(FBMutableFuture<NSNull *> *)serviceCompleted
{
self = [self init];
if (!self) {
return nil;
}
_consumer = consumer;
_readCompleted = readCompleted;
_serviceCompleted = serviceCompleted;
return self;
}
- (FBFuture<NSNull *> *)completed
{
return self.serviceCompleted;
}
@end
#pragma mark FBDeviceLogCommands Implementation
@interface FBDeviceLogCommands()
@property (nonatomic, weak, readonly) FBDevice *device;
@end
@implementation FBDeviceLogCommands
#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 FBLogCommands Implementation
- (FBFuture<id<FBLogOperation>> *)tailLog:(NSArray<NSString *> *)arguments consumer:(id<FBDataConsumer>)consumer
{
if (arguments.count != 0) {
NSString *unsupportedArgumentsMessage = [NSString stringWithFormat:@"[FBDeviceLogCommands][rdar://38452839] Unsupported arguments: %@", arguments];
[consumer consumeData:[unsupportedArgumentsMessage dataUsingEncoding:NSUTF8StringEncoding]];
[self.device.logger log:unsupportedArgumentsMessage];
}
dispatch_queue_t queue = self.device.asyncQueue;
dispatch_queue_t readQueue = dispatch_queue_create("com.facebook.fbdevicecontrol.device_log_consumer", DISPATCH_QUEUE_SERIAL);
return [[[self.device
startService:@"com.apple.syslog_relay"]
onQueue:queue pend:^(FBAMDServiceConnection *connection) {
id<FBFileReader> reader = [connection readFromConnectionWritingToConsumer:consumer onQueue:readQueue];
return [[reader startReading] mapReplace:reader];
}]
onQueue:queue enter:^(id<FBFileReader> reader, FBMutableFuture<NSNull *> *teardown) {
FBFuture<NSNull *> *readCompleted = [[reader finishedReading] mapReplace:NSNull.null];
return [[FBDeviceLogOperation alloc] initWithConsumer:consumer readCompleted:readCompleted serviceCompleted:teardown];
}];
}
@end