diff options
author | NicoleYarroch <nicole@livio.io> | 2019-02-19 09:14:27 -0500 |
---|---|---|
committer | NicoleYarroch <nicole@livio.io> | 2019-02-19 09:14:27 -0500 |
commit | 55a4cd991c31c2f7f0beee74f9e9dc883e79be42 (patch) | |
tree | 22263392f965db5e8ba5bd4349008ddeb07de008 | |
parent | a7571a80a47a7ecee12b491c26f0d2c84abbf56c (diff) | |
download | sdl_ios-55a4cd991c31c2f7f0beee74f9e9dc883e79be42.tar.gz |
Basic fix for receiving requests and sending responses
Implemented basic fixes to managers to allow sending RPC responses and notifications and to receive RPC requests.
-rw-r--r-- | SmartDeviceLink/SDLAsynchronousRPCRequestOperation.h | 12 | ||||
-rw-r--r-- | SmartDeviceLink/SDLAsynchronousRPCRequestOperation.m | 38 | ||||
-rw-r--r-- | SmartDeviceLink/SDLLifecycleManager.h | 5 | ||||
-rw-r--r-- | SmartDeviceLink/SDLLifecycleManager.m | 34 | ||||
-rw-r--r-- | SmartDeviceLink/SDLManager.h | 2 | ||||
-rw-r--r-- | SmartDeviceLink/SDLManager.m | 8 | ||||
-rw-r--r-- | SmartDeviceLink/SDLNotificationDispatcher.m | 2 | ||||
-rw-r--r-- | SmartDeviceLink/SDLProxyListener.h | 2 |
8 files changed, 74 insertions, 29 deletions
diff --git a/SmartDeviceLink/SDLAsynchronousRPCRequestOperation.h b/SmartDeviceLink/SDLAsynchronousRPCRequestOperation.h index a24165dad..c69185a41 100644 --- a/SmartDeviceLink/SDLAsynchronousRPCRequestOperation.h +++ b/SmartDeviceLink/SDLAsynchronousRPCRequestOperation.h @@ -11,13 +11,23 @@ #import "SDLAsynchronousOperation.h" #import "SDLLifecycleManager.h" +@class SDLRPCMessage; + @protocol SDLConnectionManagerType; NS_ASSUME_NONNULL_BEGIN @interface SDLAsynchronousRPCRequestOperation : SDLAsynchronousOperation -@property (copy, nonatomic) NSArray<SDLRPCRequest *> *requests; +//@property (copy, nonatomic) NSArray<SDLRPCRequest *> *requests; +@property (copy, nonatomic) NSArray<__kindof SDLRPCMessage *> *rpcs; + +// TODO: NEW +- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager rpc:(__kindof SDLRPCMessage *)rpc responseHandler:(nullable SDLResponseHandler)responseHandler; + +- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager rpcs:(NSArray<__kindof SDLRPCMessage *> *)rpcs progressHandler:(nullable SDLMultipleAsyncRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler; + +//// - (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager requests:(NSArray<SDLRPCRequest *> *)requests progressHandler:(nullable SDLMultipleAsyncRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler; diff --git a/SmartDeviceLink/SDLAsynchronousRPCRequestOperation.m b/SmartDeviceLink/SDLAsynchronousRPCRequestOperation.m index 5c67e3e8a..e8843d8c8 100644 --- a/SmartDeviceLink/SDLAsynchronousRPCRequestOperation.m +++ b/SmartDeviceLink/SDLAsynchronousRPCRequestOperation.m @@ -11,6 +11,8 @@ #import "SDLConnectionManagerType.h" #import "SDLError.h" #import "SDLGlobals.h" +#import "SDLRPCMessage.h" +#import "SDLRPCRequest.h" NS_ASSUME_NONNULL_BEGIN @@ -49,27 +51,35 @@ NS_ASSUME_NONNULL_BEGIN return self; } -- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager requests:(NSArray<SDLRPCRequest *> *)requests progressHandler:(nullable SDLMultipleAsyncRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler { +- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager rpcs:(NSArray<__kindof SDLRPCMessage *> *)rpcs progressHandler:(nullable SDLMultipleAsyncRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler { self = [self init]; _connectionManager = connectionManager; - _requests = requests; + _rpcs = rpcs; _progressHandler = progressHandler; _completionHandler = completionHandler; return self; } -- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager request:(SDLRPCRequest *)request responseHandler:(nullable SDLResponseHandler)responseHandler { +- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager rpc:(__kindof SDLRPCMessage *)rpc responseHandler:(nullable SDLResponseHandler)responseHandler { self = [self init]; _connectionManager = connectionManager; - _requests = @[request]; + _rpcs = @[rpc]; _responseHandler = responseHandler; return self; } +- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager requests:(NSArray<SDLRPCRequest *> *)requests progressHandler:(nullable SDLMultipleAsyncRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler { + return [self initWithConnectionManager:connectionManager rpcs:requests progressHandler:progressHandler completionHandler:completionHandler]; +} + +- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager request:(SDLRPCRequest *)request responseHandler:(nullable SDLResponseHandler)responseHandler { + return [self initWithConnectionManager:connectionManager rpc:request responseHandler:responseHandler]; +} + - (void)start { [super start]; @@ -77,8 +87,9 @@ NS_ASSUME_NONNULL_BEGIN } - (void)sdl_sendRequests { - for (SDLRPCRequest *request in self.requests) { + for (id request in self.rpcs) { if (self.isCancelled) { + // FIXME: Deal with aborted responses [self sdl_abortOperationWithRequest:request]; return; } @@ -88,7 +99,7 @@ NS_ASSUME_NONNULL_BEGIN } } -- (void)sdl_sendRequest:(SDLRPCRequest *)request { +- (void)sdl_sendRequest:(__kindof SDLRPCMessage *)request { __weak typeof(self) weakSelf = self; [self.connectionManager sendConnectionRequest:request withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) { __strong typeof(self) strongSelf = weakSelf; @@ -112,7 +123,7 @@ NS_ASSUME_NONNULL_BEGIN } // If we've received responses for all requests, call the completion handler. - if (strongSelf.requestsComplete >= strongSelf.requests.count) { + if (strongSelf.requestsComplete >= strongSelf.rpcs.count) { [strongSelf finishOperation]; } }]; @@ -121,9 +132,12 @@ NS_ASSUME_NONNULL_BEGIN - (void)sdl_abortOperationWithRequest:(SDLRPCRequest *)request { self.requestFailed = YES; - for (NSUInteger i = self.requestsComplete; i < self.requests.count; i++) { + for (NSUInteger i = self.requestsComplete; i < self.rpcs.count; i++) { if (self.progressHandler != NULL) { - self.progressHandler(self.requests[i], nil, [NSError sdl_lifecycle_multipleRequestsCancelled], self.percentComplete); + id rpc = self.rpcs[i]; + SDLRPCRequest *abortedRequest = [rpc isMemberOfClass:[SDLRPCRequest class]] ? (SDLRPCRequest *)rpc : nil; + // FIXME: first param is not nullable + self.progressHandler(abortedRequest, nil, [NSError sdl_lifecycle_multipleRequestsCancelled], self.percentComplete); } if (self.responseHandler != NULL) { @@ -141,7 +155,7 @@ NS_ASSUME_NONNULL_BEGIN #pragma mark - Getters - (float)percentComplete { - return (float)self.requestsComplete / (float)self.requests.count; + return (float)self.requestsComplete / (float)self.rpcs.count; } #pragma mark - Property Overrides @@ -163,11 +177,11 @@ NS_ASSUME_NONNULL_BEGIN } - (NSString *)description { - return [NSString stringWithFormat:@"%@, request count=%lu, requests started=%lu, finished=%lu, failed=%@", self.name, (unsigned long)self.requests.count, (unsigned long)self.requestsStarted, (unsigned long)self.requestsComplete, (self.requestFailed ? @"YES": @"NO")]; + return [NSString stringWithFormat:@"%@, request count=%lu, requests started=%lu, finished=%lu, failed=%@", self.name, (unsigned long)self.rpcs.count, (unsigned long)self.requestsStarted, (unsigned long)self.requestsComplete, (self.requestFailed ? @"YES": @"NO")]; } - (NSString *)debugDescription { - return [NSString stringWithFormat:@"%@, request count=%lu, requests started=%lu, finished=%lu, failed=%@, requests=%@", self.name, (unsigned long)self.requests.count, (unsigned long)self.requestsStarted, (unsigned long)self.requestsComplete, (self.requestFailed ? @"YES": @"NO"), self.requests]; + return [NSString stringWithFormat:@"%@, request count=%lu, requests started=%lu, finished=%lu, failed=%@, requests=%@", self.name, (unsigned long)self.rpcs.count, (unsigned long)self.requestsStarted, (unsigned long)self.requestsComplete, (self.requestFailed ? @"YES": @"NO"), self.rpcs]; } @end diff --git a/SmartDeviceLink/SDLLifecycleManager.h b/SmartDeviceLink/SDLLifecycleManager.h index 594dccba3..239e1a370 100644 --- a/SmartDeviceLink/SDLLifecycleManager.h +++ b/SmartDeviceLink/SDLLifecycleManager.h @@ -26,6 +26,7 @@ @class SDLPutFile; @class SDLRegisterAppInterfaceResponse; @class SDLResponseDispatcher; +@class SDLRPCMessage; @class SDLRPCNotification; @class SDLRPCRequest; @class SDLRPCResponse; @@ -121,7 +122,7 @@ typedef void (^SDLManagerReadyBlock)(BOOL success, NSError *_Nullable error); * * @param request The RPC request to send */ -- (void)sendRequest:(SDLRPCRequest *)request; +- (void)sendRequest:(__kindof SDLRPCMessage *)request; /** * Send an RPC request and set a completion handler that will be called with the response when the response returns. @@ -129,7 +130,7 @@ typedef void (^SDLManagerReadyBlock)(BOOL success, NSError *_Nullable error); * @param request The RPC request to send * @param handler The handler that will be called when the response returns */ -- (void)sendRequest:(SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)handler; +- (void)sendRequest:(__kindof SDLRPCMessage *)request withResponseHandler:(nullable SDLResponseHandler)handler; /** Send all of the requests given as quickly as possible, but in order. Call the completionHandler after all requests have either failed or given a response. diff --git a/SmartDeviceLink/SDLLifecycleManager.m b/SmartDeviceLink/SDLLifecycleManager.m index d521244d0..1e20d8e5c 100644 --- a/SmartDeviceLink/SDLLifecycleManager.m +++ b/SmartDeviceLink/SDLLifecycleManager.m @@ -520,12 +520,13 @@ SDLLifecycleState *const SDLLifecycleStateReady = @"Ready"; #pragma mark Sending Requests -- (void)sendRequest:(SDLRPCRequest *)request { +- (void)sendRequest:(__kindof SDLRPCMessage *)request { [self sendRequest:request withResponseHandler:nil]; } -- (void)sendRequest:(__kindof SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)handler { - SDLAsynchronousRPCRequestOperation *op = [[SDLAsynchronousRPCRequestOperation alloc] initWithConnectionManager:self request:request responseHandler:handler]; +- (void)sendRequest:(__kindof SDLRPCMessage *)request withResponseHandler:(nullable SDLResponseHandler)handler { + SDLAsynchronousRPCRequestOperation *op = [[SDLAsynchronousRPCRequestOperation alloc] initWithConnectionManager:self rpc:request responseHandler:handler]; +// SDLAsynchronousRPCRequestOperation *op = [[SDLAsynchronousRPCRequestOperation alloc] initWithConnectionManager:self request:request responseHandler:handler]; [self.rpcOperationQueue addOperation:op]; } @@ -549,7 +550,7 @@ SDLLifecycleState *const SDLLifecycleStateReady = @"Ready"; [self.rpcOperationQueue addOperation:op]; } -- (void)sendConnectionRequest:(__kindof SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)handler { +- (void)sendConnectionRequest:(__kindof SDLRPCMessage *)request withResponseHandler:(nullable SDLResponseHandler)handler { if (![self.lifecycleStateMachine isCurrentState:SDLLifecycleStateReady]) { SDLLogW(@"Manager not ready, message not sent (%@)", request); if (handler) { @@ -567,13 +568,13 @@ SDLLifecycleState *const SDLLifecycleStateReady = @"Ready"; } // Managers need to avoid state checking. Part of <SDLConnectionManagerType>. -- (void)sendConnectionManagerRequest:(__kindof SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)handler { +- (void)sendConnectionManagerRequest:(__kindof SDLRPCMessage *)request withResponseHandler:(nullable SDLResponseHandler)handler { dispatch_async(_lifecycleQueue, ^{ [self sdl_sendRequest:request withResponseHandler:handler]; }); } -- (void)sdl_sendRequest:(SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)handler { +- (void)sdl_sendRequest:(__kindof SDLRPCMessage *)request withResponseHandler:(nullable SDLResponseHandler)handler { // We will allow things to be sent in a "SDLLifecycleStateConnected" state in the private method, but block it in the public method sendRequest:withCompletionHandler: so that the lifecycle manager can complete its setup without being bothered by developer error NSParameterAssert(request != nil); @@ -590,11 +591,24 @@ SDLLifecycleState *const SDLLifecycleStateReady = @"Ready"; } // Add a correlation ID to the request - NSNumber *corrID = [self sdl_getNextCorrelationId]; - request.correlationID = corrID; + SDLRPCRequest *test = [request isKindOfClass:[SDLRPCRequest class]] ? (SDLRPCRequest *)request : nil; + if (test != nil) { + NSNumber *corrID = [self sdl_getNextCorrelationId]; + test.correlationID = corrID; - [self.responseDispatcher storeRequest:request handler:handler]; - [self.proxy sendRPC:request]; + [self.responseDispatcher storeRequest:test handler:handler]; + [self.proxy sendRPC:test]; + } + + SDLRPCResponse *testResponse = [request isKindOfClass:[SDLRPCResponse class]] ? (SDLRPCResponse *)request : nil; + if (testResponse != nil) { + [self.proxy sendRPC:testResponse]; + } + + SDLRPCNotification *testNotification = [request isKindOfClass:[SDLRPCNotification class]] ? (SDLRPCNotification *)request : nil; + if (testNotification != nil) { + [self.proxy sendRPC:testNotification]; + } } diff --git a/SmartDeviceLink/SDLManager.h b/SmartDeviceLink/SDLManager.h index b984a58a5..a97ef0c91 100644 --- a/SmartDeviceLink/SDLManager.h +++ b/SmartDeviceLink/SDLManager.h @@ -15,6 +15,7 @@ @class SDLProxy; @class SDLPutFile; @class SDLRegisterAppInterfaceResponse; +@class SDLRPCMessage; @class SDLRPCNotification; @class SDLRPCRequest; @class SDLRPCResponse; @@ -132,6 +133,7 @@ typedef void (^SDLManagerReadyBlock)(BOOL success, NSError *_Nullable error); #pragma mark Manually Send RPC Requests +- (void)sendRPC:(__kindof SDLRPCMessage *)rpc; /** * Send an RPC request and don't bother with the response or error. If you need the response or error, call sendRequest:withCompletionHandler: instead. * diff --git a/SmartDeviceLink/SDLManager.m b/SmartDeviceLink/SDLManager.m index fa7c9e8e0..92ab50480 100644 --- a/SmartDeviceLink/SDLManager.m +++ b/SmartDeviceLink/SDLManager.m @@ -119,12 +119,16 @@ NS_ASSUME_NONNULL_BEGIN #pragma mark SDLConnectionManager Protocol +- (void)sendRPC:(__kindof SDLRPCMessage *)rpc { + [self.lifecycleManager sendRequest:rpc]; +} + - (void)sendRequest:(SDLRPCRequest *)request { [self sendRequest:request withResponseHandler:nil]; } -- (void)sendRequest:(__kindof SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)handler { - [self.lifecycleManager sendRequest:request withResponseHandler:handler]; +- (void)sendRequest:(SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)handler { + [self.lifecycleManager sendRequest:(__kindof SDLRPCMessage *)request withResponseHandler:handler]; } - (void)sendRequests:(NSArray<SDLRPCRequest *> *)requests progressHandler:(nullable SDLMultipleAsyncRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler { diff --git a/SmartDeviceLink/SDLNotificationDispatcher.m b/SmartDeviceLink/SDLNotificationDispatcher.m index 4b42d0da9..d786d2f14 100644 --- a/SmartDeviceLink/SDLNotificationDispatcher.m +++ b/SmartDeviceLink/SDLNotificationDispatcher.m @@ -157,7 +157,7 @@ NS_ASSUME_NONNULL_BEGIN [self postRPCResponseNotification:SDLDidReceiveGenericResponse response:response]; } -- (void)onGetAppServiceDataRequest:(SDLGetAppServiceData *)request { +- (void)onGetAppServiceData:(SDLGetAppServiceData *)request { [self postRPCRequestNotification:SDLDidReceiveGetAppServiceDataRequest request:request]; } diff --git a/SmartDeviceLink/SDLProxyListener.h b/SmartDeviceLink/SDLProxyListener.h index 9c044854a..00e31c072 100644 --- a/SmartDeviceLink/SDLProxyListener.h +++ b/SmartDeviceLink/SDLProxyListener.h @@ -236,7 +236,7 @@ NS_ASSUME_NONNULL_BEGIN * * @param request A SDLGetAppServiceData object */ -- (void)onGetAppServiceDataRequest:(SDLGetAppServiceData *)request; +- (void)onGetAppServiceData:(SDLGetAppServiceData *)request; /** * Called when a Get App Service Data Response is received from Core |