52- (instancetype)init:(NSArray*)arguments withLogCallback:(
LogCallback)logCallback withLogRedirectionStrategy:(LogRedirectionStrategy)logRedirectionStrategy {
61 _logs = [[NSMutableArray alloc] init];
62 _logsLock = [[NSRecursiveLock alloc] init];
63 _state = SessionStateCreated;
82- (NSDate*)getCreateTime {
86- (NSDate*)getStartTime {
90- (NSDate*)getEndTime {
97 if (startTime != nil && endTime != nil) {
98 return [[NSNumber numberWithDouble:([endTime timeIntervalSinceDate:startTime]*1000)] longValue];
104- (NSArray*)getArguments {
108- (NSString*)getCommand {
112- (void)waitForAsynchronousMessagesInTransmit:(
int)timeout {
113 NSDate* expireDate = [[NSDate date] dateByAddingTimeInterval:((double)timeout)/1000];
114 dispatch_semaphore_t
semaphore = dispatch_semaphore_create(0);
116 while ([
self thereAreAsynchronousMessagesInTransmit] && ([[NSDate date] timeIntervalSinceDate:expireDate] < 0)) {
117 dispatch_semaphore_wait(
semaphore, dispatch_time(DISPATCH_TIME_NOW, 100 * NSEC_PER_MSEC));
121- (NSArray*)getAllLogsWithTimeout:(
int)waitTimeout {
122 [
self waitForAsynchronousMessagesInTransmit:waitTimeout];
124 if ([
self thereAreAsynchronousMessagesInTransmit]) {
125 NSLog(
@"getAllLogsWithTimeout was called to return all logs but there are still logs being transmitted for session id %ld.",
_sessionId);
128 return [
self getLogs];
131- (NSArray*)getAllLogs {
132 return [
self getAllLogsWithTimeout:AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit];
137 NSArray* logsCopy = [_logs copy];
143- (NSString*)getAllLogsAsStringWithTimeout:(
int)waitTimeout {
144 [
self waitForAsynchronousMessagesInTransmit:waitTimeout];
146 if ([
self thereAreAsynchronousMessagesInTransmit]) {
147 NSLog(
@"getAllLogsAsStringWithTimeout was called to return all logs but there are still logs being transmitted for session id %ld.",
_sessionId);
150 return [
self getLogsAsString];
153- (NSString*)getAllLogsAsString {
154 return [
self getAllLogsAsStringWithTimeout:AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit];
157- (NSString*)getLogsAsString {
158 NSMutableString* concatenatedString = [[NSMutableString alloc] init];
161 for (
int i=0; i < [_logs count]; i++) {
162 [concatenatedString appendString:[[_logs objectAtIndex:i] getMessage]];
166 return concatenatedString;
169- (NSString*)getOutput {
170 return [
self getAllLogsAsString];
173- (SessionState)getState {
181- (NSString*)getFailStackTrace {
185- (LogRedirectionStrategy)getLogRedirectionStrategy {
189- (BOOL)thereAreAsynchronousMessagesInTransmit {
193- (void)addLog:(
Log*)log {
195 [_logs addObject:log];
199- (void)startRunning {
200 _state = SessionStateRunning;
206 _state = SessionStateCompleted;
210- (void)fail:(NSException*)exception {
211 _failStackTrace = [NSString stringWithFormat:@"%@\n%@", [exception userInfo], [exception callStackSymbols]];
212 _state = SessionStateFailed;
226- (BOOL)isMediaInformation {
232 if (
_state == SessionStateRunning) {
NSString * _failStackTrace
NSRecursiveLock * _logsLock
LogRedirectionStrategy _logRedirectionStrategy
int const AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit
static AtomicLong * sessionIdGenerator
void addSessionToSessionHistory(id< Session > session)
static LogCallback logCallback
static dispatch_semaphore_t semaphore
void(^ LogCallback)(Log *log)
NSString * argumentsToString:(NSArray *arguments)
void cancel:(long sessionId)