1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
//
// TestConnectionManager.m
// SmartDeviceLink-iOS
//
// Created by Joel Fischer on 11/6/15.
// Copyright © 2015 smartdevicelink. All rights reserved.
//
#import "TestConnectionManager.h"
#import "SDLRPCRequest.h"
#import "SDLRPCResponse.h"
NS_ASSUME_NONNULL_BEGIN
@implementation TestConnectionManager
- (instancetype)init {
self = [super init];
if (!self) {
return nil;
}
_receivedRequestObjects = [NSMutableArray<TestConnectionRequestObject *> array];
_multipleCompletionBlocks = [NSMutableArray array];
_systemInfo = [[SDLSystemInfo alloc] initWithMake:@"Livio" model:@"Is" trim:@"Awesome" modelYear:@"2021" softwareVersion:@"1.1.1.1" hardwareVersion:@"2.2.2.2"];
return self;
}
- (NSArray<__kindof SDLRPCMessage *> *)receivedRequests {
NSMutableArray<__kindof SDLRPCMessage *> *requests = [NSMutableArray array];
[_receivedRequestObjects enumerateObjectsUsingBlock:^(__kindof TestConnectionRequestObject * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
[requests addObject:obj.message];
}];
return [requests copy];
}
- (void)sendConnectionRPC:(__kindof SDLRPCMessage *)rpc {
[self.receivedRequestObjects addObject:[[TestConnectionRequestObject alloc] initWithMessage:rpc responseHandler:nil]];
}
- (void)sendConnectionRequest:(__kindof SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)handler {
request.correlationID = [self test_nextCorrelationID];
[self.receivedRequestObjects addObject:[[TestConnectionRequestObject alloc] initWithMessage:request responseHandler:handler]];
}
- (void)sendConnectionManagerRequest:(__kindof SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)handler {
[self sendConnectionRequest:request withResponseHandler:handler];
}
- (void)sendConnectionManagerRPC:(__kindof SDLRPCMessage *)rpc {
[self sendConnectionRPC:rpc];
}
- (void)sendRequests:(nonnull NSArray<SDLRPCRequest *> *)requests progressHandler:(nullable SDLMultipleAsyncRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler {
if (requests.count == 0) {
return completionHandler(YES);
}
[requests enumerateObjectsUsingBlock:^(SDLRPCRequest * _Nonnull request, NSUInteger idx, BOOL * _Nonnull stop) {
[self sendConnectionRequest:request withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
if (progressHandler != nil) {
progressHandler(request, response, error, (double)idx / (double)requests.count);
}
}];
}];
[_multipleCompletionBlocks addObject:completionHandler];
}
- (void)sendSequentialRequests:(nonnull NSArray<SDLRPCRequest *> *)requests progressHandler:(nullable SDLMultipleSequentialRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler {
if (requests.count == 0) {
return completionHandler(YES);
}
[requests enumerateObjectsUsingBlock:^(SDLRPCRequest * _Nonnull request, NSUInteger idx, BOOL * _Nonnull stop) {
[self sendConnectionRequest:request withResponseHandler:nil];
progressHandler(request, nil, nil, (double)idx / (double)requests.count);
}];
[_multipleCompletionBlocks addObject:completionHandler];
}
- (void)respondToLastRequestWithResponse:(__kindof SDLRPCResponse *)response {
[self respondToLastRequestWithResponse:response error:nil];
}
- (void)respondToLastRequestWithResponse:(__kindof SDLRPCResponse *)response error:(nullable NSError *)error {
NSError *thisError = nil;
if (!response.success.boolValue && error == nil) {
thisError = self.defaultError;
} else if (error != nil) {
thisError = error;
}
TestConnectionRequestObject *lastObject = self.receivedRequestObjects.lastObject;
if (lastObject.responseHandler != nil) {
lastObject.responseHandler((SDLRPCRequest *)lastObject.message, response, thisError);
} else {
@throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"Attempted to respond to last request, but there was no last request block" userInfo:nil];
}
}
- (void)respondToRequestWithResponse:(__kindof SDLRPCResponse *)response requestNumber:(NSInteger)requestNumber error:(nullable NSError *)error {
NSError *thisError = nil;
if (!response.success.boolValue && error == nil) {
thisError = self.defaultError;
} else if (error != nil) {
thisError = error;
}
TestConnectionRequestObject *requestObj = self.receivedRequestObjects[requestNumber];
if (requestObj.responseHandler != nil) {
requestObj.responseHandler((SDLRPCRequest *)requestObj.message, response, thisError);
} else {
@throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"Attempted to respond to last request, but there was no last request block" userInfo:nil];
}
}
- (void)respondToLastMultipleRequestsWithSuccess:(BOOL)success {
if (self.multipleCompletionBlocks.lastObject != nil) {
SDLMultipleRequestCompletionHandler block = [self.multipleCompletionBlocks.lastObject copy];
[self.multipleCompletionBlocks removeLastObject];
block(success);
}
}
- (void)reset {
_receivedRequestObjects = [NSMutableArray<__kindof TestConnectionRequestObject *> array];
_multipleCompletionBlocks = [NSMutableArray array];
}
#pragma mark - Getters
- (NSError *)defaultError {
return [NSError errorWithDomain:@"com.sdl.testConnectionManager" code:-1 userInfo:nil];
}
#pragma mark Private helpers
- (NSNumber *)test_nextCorrelationID {
static NSUInteger correlationID = 0;
return @(correlationID++);
}
@end
NS_ASSUME_NONNULL_END
|