summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicoleYarroch <nicole@livio.io>2019-02-19 09:14:27 -0500
committerNicoleYarroch <nicole@livio.io>2019-02-19 09:14:27 -0500
commit55a4cd991c31c2f7f0beee74f9e9dc883e79be42 (patch)
tree22263392f965db5e8ba5bd4349008ddeb07de008
parenta7571a80a47a7ecee12b491c26f0d2c84abbf56c (diff)
downloadsdl_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.h12
-rw-r--r--SmartDeviceLink/SDLAsynchronousRPCRequestOperation.m38
-rw-r--r--SmartDeviceLink/SDLLifecycleManager.h5
-rw-r--r--SmartDeviceLink/SDLLifecycleManager.m34
-rw-r--r--SmartDeviceLink/SDLManager.h2
-rw-r--r--SmartDeviceLink/SDLManager.m8
-rw-r--r--SmartDeviceLink/SDLNotificationDispatcher.m2
-rw-r--r--SmartDeviceLink/SDLProxyListener.h2
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