From d0b240cda9c6789d93de28cf4fdf1d86dc406382 Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Fri, 17 Aug 2018 10:47:18 -0400 Subject: Update for v6.0.2 --- SmartDeviceLink/SDLProxy.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'SmartDeviceLink/SDLProxy.m') diff --git a/SmartDeviceLink/SDLProxy.m b/SmartDeviceLink/SDLProxy.m index 69ee0618f..ddaff8fe0 100644 --- a/SmartDeviceLink/SDLProxy.m +++ b/SmartDeviceLink/SDLProxy.m @@ -42,7 +42,7 @@ typedef NSString SDLVehicleMake; typedef void (^URLSessionTaskCompletionHandler)(NSData *data, NSURLResponse *response, NSError *error); typedef void (^URLSessionDownloadTaskCompletionHandler)(NSURL *location, NSURLResponse *response, NSError *error); -NSString *const SDLProxyVersion = @"6.0.1"; +NSString *const SDLProxyVersion = @"6.0.2"; const float StartSessionTime = 10.0; const float NotifyProxyClosedDelay = (float)0.1; const int PoliciesCorrelationId = 65535; -- cgit v1.2.1 From 025d4f267462da43d84ed67296039e2926c050a8 Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Wed, 12 Sep 2018 11:58:55 -0400 Subject: Handle Play/Pause addition * Add global for negotiated RPC version * Add Play/Pause and Okay enums * Handle play/pause and related RPCs --- SmartDeviceLink/SDLProxy.m | 268 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 259 insertions(+), 9 deletions(-) (limited to 'SmartDeviceLink/SDLProxy.m') diff --git a/SmartDeviceLink/SDLProxy.m b/SmartDeviceLink/SDLProxy.m index fa084205d..fab519b11 100644 --- a/SmartDeviceLink/SDLProxy.m +++ b/SmartDeviceLink/SDLProxy.m @@ -6,7 +6,6 @@ #import #import -#import "SDLTransportType.h" #import "SDLAudioStreamingState.h" #import "SDLLogMacros.h" #import "SDLEncodedSyncPData.h" @@ -18,6 +17,8 @@ #import "SDLLanguage.h" #import "SDLLayoutMode.h" #import "SDLLockScreenStatusManager.h" +#import "SDLOnButtonEvent.h" +#import "SDLOnButtonPress.h" #import "SDLOnHMIStatus.h" #import "SDLOnSystemRequest.h" #import "SDLPolicyDataParser.h" @@ -29,10 +30,13 @@ #import "SDLRegisterAppInterfaceResponse.h" #import "SDLRequestType.h" #import "SDLStreamingMediaManager.h" +#import "SDLSubscribeButton.h" #import "SDLSystemContext.h" #import "SDLSystemRequest.h" #import "SDLTCPTransport.h" #import "SDLTimer.h" +#import "SDLTransportType.h" +#import "SDLUnsubscribeButton.h" #import "SDLVehicleType.h" NS_ASSUME_NONNULL_BEGIN @@ -266,8 +270,16 @@ static float DefaultConnectionTimeout = 45.0; } -#pragma mark - Message sending and recieving +#pragma mark - Message sending - (void)sendRPC:(SDLRPCMessage *)message { + if ([message.getFunctionName isEqualToString:@"SubscribeButton"]) { + BOOL handledRPC = [self sdl_adaptButtonSubscribeMessage:(SDLSubscribeButton *)message]; + if (handledRPC) { return; } + } else if ([message.getFunctionName isEqualToString:@"UnsubscribeButton"]) { + BOOL handledRPC = [self sdl_adaptButtonUnsubscribeMessage:(SDLUnsubscribeButton *)message]; + if (handledRPC) { return; } + } + @try { [self.protocol sendRPC:message]; } @catch (NSException *exception) { @@ -275,6 +287,129 @@ static float DefaultConnectionTimeout = 45.0; } } +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +- (BOOL)sdl_adaptButtonSubscribeMessage:(SDLSubscribeButton *)message { + if ([SDLGlobals sharedGlobals].rpcVersion.majorVersion.intValue >= 5) { + if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) { + SDLSubscribeButton *playPauseMessage = [message copy]; + playPauseMessage.buttonName = SDLButtonNamePlayPause; + + @try { + [self.protocol sendRPC:message]; + [self.protocol sendRPC:playPauseMessage]; + } @catch (NSException *exception) { + SDLLogE(@"Proxy: Failed to send RPC message: %@", message.name); + } + + return YES; + } else if ([message.buttonName isEqualToEnum:SDLButtonNameOkay]) { + SDLSubscribeButton *okMessage = [message copy]; + okMessage.buttonName = SDLButtonNameOk; + + @try { + [self.protocol sendRPC:okMessage]; + } @catch (NSException *exception) { + SDLLogE(@"Proxy: Failed to send RPC message: %@", message.name); + } + + return YES; + } else if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) { + return NO; + } + } else { + if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) { + return NO; + } else if ([message.buttonName isEqualToEnum:SDLButtonNameOkay]) { + SDLSubscribeButton *okMessage = [message copy]; + okMessage.buttonName = SDLButtonNameOk; + + @try { + [self.protocol sendRPC:okMessage]; + } @catch (NSException *exception) { + SDLLogE(@"Proxy: Failed to send RPC message: %@", message.name); + } + + return YES; + } else if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) { + SDLSubscribeButton *okMessage = [message copy]; + okMessage.buttonName = SDLButtonNameOk; + + @try { + [self.protocol sendRPC:okMessage]; + } @catch (NSException *exception) { + SDLLogE(@"Proxy: Failed to send RPC message: %@", message.name); + } + + return YES; + } + } + + return NO; +} + +- (BOOL)sdl_adaptButtonUnsubscribeMessage:(SDLUnsubscribeButton *)message { + if ([SDLGlobals sharedGlobals].rpcVersion.majorVersion.intValue >= 5) { + if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) { + SDLUnsubscribeButton *playPauseMessage = [message copy]; + playPauseMessage.buttonName = SDLButtonNamePlayPause; + + @try { + [self.protocol sendRPC:message]; + [self.protocol sendRPC:playPauseMessage]; + } @catch (NSException *exception) { + SDLLogE(@"Proxy: Failed to send RPC message: %@", message.name); + } + + return YES; + } else if ([message.buttonName isEqualToEnum:SDLButtonNameOkay]) { + SDLUnsubscribeButton *okMessage = [message copy]; + okMessage.buttonName = SDLButtonNameOk; + + @try { + [self.protocol sendRPC:okMessage]; + } @catch (NSException *exception) { + SDLLogE(@"Proxy: Failed to send RPC message: %@", message.name); + } + + return YES; + } else if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) { + return NO; + } + } else { + if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) { + return NO; + } else if ([message.buttonName isEqualToEnum:SDLButtonNameOkay]) { + SDLUnsubscribeButton *okMessage = [message copy]; + okMessage.buttonName = SDLButtonNameOk; + + @try { + [self.protocol sendRPC:okMessage]; + } @catch (NSException *exception) { + SDLLogE(@"Proxy: Failed to send RPC message: %@", message.name); + } + + return YES; + } else if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) { + SDLUnsubscribeButton *okMessage = [message copy]; + okMessage.buttonName = SDLButtonNameOk; + + @try { + [self.protocol sendRPC:okMessage]; + } @catch (NSException *exception) { + SDLLogE(@"Proxy: Failed to send RPC message: %@", message.name); + } + + return YES; + } + } + + return NO; +} +#pragma clang diagnostic pop + +#pragma mark - Message Receiving + - (void)handleProtocolMessage:(SDLProtocolMessage *)incomingMessage { // Convert protocol message to dictionary NSDictionary *rpcMessageAsDictionary = [incomingMessage rpcDictionary]; @@ -298,9 +433,6 @@ static float DefaultConnectionTimeout = 45.0; NSString *functionClassName = [NSString stringWithFormat:@"SDL%@", functionName]; SDLRPCMessage *newMessage = [[NSClassFromString(functionClassName) alloc] initWithDictionary:[dict mutableCopy]]; - // Log the RPC message - SDLLogV(@"Message received: %@", newMessage); - // Intercept and handle several messages ourselves if ([functionName isEqualToString:SDLNameOnAppInterfaceUnregistered] || [functionName isEqualToString:SDLNameUnregisterAppInterface]) { [self handleRPCUnregistered:dict]; @@ -322,10 +454,30 @@ static float DefaultConnectionTimeout = 45.0; [self handleSystemRequestResponse:newMessage]; } - // Formulate the name of the method to call and invoke the method on the delegate(s) - NSString *handlerName = [NSString stringWithFormat:@"on%@:", functionName]; - SEL handlerSelector = NSSelectorFromString(handlerName); - [self invokeMethodOnDelegates:handlerSelector withObject:newMessage]; + + if ([functionName isEqualToString:@"OnButtonPress"]) { + SDLOnButtonPress *message = (SDLOnButtonPress *)newMessage; + if ([SDLGlobals sharedGlobals].rpcVersion.majorVersion.intValue >= 5) { + BOOL handledRPC = [self sdl_handleOnButtonPressPostV5:message]; + if (handledRPC) { return; } + } else { // RPC version of 4 or less (connected to an old head unit) + BOOL handledRPC = [self sdl_handleOnButtonPressPreV5:message]; + if (handledRPC) { return; } + } + } + + if ([functionName isEqualToString:@"OnButtonEvent"]) { + SDLOnButtonEvent *message = (SDLOnButtonEvent *)newMessage; + if ([SDLGlobals sharedGlobals].rpcVersion.majorVersion.intValue >= 5) { + BOOL handledRPC = [self sdl_handleOnButtonEventPostV5:message]; + if (handledRPC) { return; } + } else { + BOOL handledRPC = [self sdl_handleOnButtonEventPreV5:message]; + if (handledRPC) { return; } + } + } + + [self sdl_invokeDelegateMethodsWithFunction:functionName message:newMessage]; // When an OnHMIStatus notification comes in, after passing it on (above), generate an "OnLockScreenNotification" if ([functionName isEqualToString:@"OnHMIStatus"]) { @@ -338,6 +490,13 @@ static float DefaultConnectionTimeout = 45.0; } } +- (void)sdl_invokeDelegateMethodsWithFunction:(NSString *)functionName message:(SDLRPCMessage *)message { + // Formulate the name of the method to call and invoke the method on the delegate(s) + NSString *handlerName = [NSString stringWithFormat:@"on%@:", functionName]; + SEL handlerSelector = NSSelectorFromString(handlerName); + [self invokeMethodOnDelegates:handlerSelector withObject:message]; +} + #pragma mark - RPC Handlers @@ -397,6 +556,97 @@ static float DefaultConnectionTimeout = 45.0; SDLLogV(@"SystemRequestResponse to be discarded"); } +#pragma mark BackCompatability ButtonName Helpers + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +- (BOOL)sdl_handleOnButtonPressPreV5:(SDLOnButtonPress *)message { + // Drop PlayPause, this shouldn't come in + if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) { + return YES; + } else if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) { + // Send Ok, Okay, and Play/Pause notifications + SDLOnButtonPress *okayPress = [message copy]; + okayPress.buttonName = SDLButtonNameOkay; + + SDLOnButtonPress *playPausePress = [message copy]; + playPausePress.buttonName = SDLButtonNamePlayPause; + + [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:okayPress]; + [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:playPausePress]; + [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:message]; + return YES; + } + + return NO; +} + +- (BOOL)sdl_handleOnButtonPressPostV5:(SDLOnButtonPress *)message { + if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) { + // Send PlayPause & OK notifications + SDLOnButtonPress *okPress = [message copy]; + okPress.buttonName = SDLButtonNameOk; + + [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:okPress]; + [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:message]; + return YES; + } else if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) { + // Send Okay and OK notifications + SDLOnButtonPress *okayPress = [message copy]; + okayPress.buttonName = SDLButtonNameOkay; + + [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:okayPress]; + [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:message]; + return YES; + } + + return NO; +} + +- (BOOL)sdl_handleOnButtonEventPreV5:(SDLOnButtonEvent *)message { + // Drop PlayPause, this shouldn't come in + if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) { + return YES; + } else if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) { + // Send Ok, Okay, and Play/Pause notifications + SDLOnButtonEvent *okayEvent = [message copy]; + okayEvent.buttonName = SDLButtonNameOkay; + + SDLOnButtonEvent *playPauseEvent = [message copy]; + playPauseEvent.buttonName = SDLButtonNamePlayPause; + + [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:okayEvent]; + [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:playPauseEvent]; + [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:message]; + return YES; + } + + return NO; +} + +- (BOOL)sdl_handleOnButtonEventPostV5:(SDLOnButtonEvent *)message { + if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) { + // Send PlayPause & OK notifications + SDLOnButtonEvent *okEvent = [message copy]; + okEvent.buttonName = SDLButtonNameOk; + + [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:okEvent]; + [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:message]; + return YES; + } else if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) { + // Send Okay and OK notifications + SDLOnButtonEvent *okayEvent = [message copy]; + okayEvent.buttonName = SDLButtonNameOkay; + + [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:okayEvent]; + [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:message]; + return YES; + } + + return NO; +} +#pragma clang diagnostic pop + #pragma mark Handle Post-Invoke of Delegate Methods - (void)handleAfterHMIStatus:(SDLRPCMessage *)message { -- cgit v1.2.1 From d7abd4e7d28373ac5b06a9dd515709d963a1517a Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Mon, 17 Sep 2018 13:13:24 -0400 Subject: Remove Okay, only use OK and PlayPause --- SmartDeviceLink/SDLProxy.m | 76 ++++++++-------------------------------------- 1 file changed, 12 insertions(+), 64 deletions(-) (limited to 'SmartDeviceLink/SDLProxy.m') diff --git a/SmartDeviceLink/SDLProxy.m b/SmartDeviceLink/SDLProxy.m index fab519b11..da9e891bc 100644 --- a/SmartDeviceLink/SDLProxy.m +++ b/SmartDeviceLink/SDLProxy.m @@ -302,35 +302,13 @@ static float DefaultConnectionTimeout = 45.0; SDLLogE(@"Proxy: Failed to send RPC message: %@", message.name); } - return YES; - } else if ([message.buttonName isEqualToEnum:SDLButtonNameOkay]) { - SDLSubscribeButton *okMessage = [message copy]; - okMessage.buttonName = SDLButtonNameOk; - - @try { - [self.protocol sendRPC:okMessage]; - } @catch (NSException *exception) { - SDLLogE(@"Proxy: Failed to send RPC message: %@", message.name); - } - return YES; } else if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) { return NO; } - } else { + } else { // Major version < 5 if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) { return NO; - } else if ([message.buttonName isEqualToEnum:SDLButtonNameOkay]) { - SDLSubscribeButton *okMessage = [message copy]; - okMessage.buttonName = SDLButtonNameOk; - - @try { - [self.protocol sendRPC:okMessage]; - } @catch (NSException *exception) { - SDLLogE(@"Proxy: Failed to send RPC message: %@", message.name); - } - - return YES; } else if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) { SDLSubscribeButton *okMessage = [message copy]; okMessage.buttonName = SDLButtonNameOk; @@ -361,35 +339,13 @@ static float DefaultConnectionTimeout = 45.0; SDLLogE(@"Proxy: Failed to send RPC message: %@", message.name); } - return YES; - } else if ([message.buttonName isEqualToEnum:SDLButtonNameOkay]) { - SDLUnsubscribeButton *okMessage = [message copy]; - okMessage.buttonName = SDLButtonNameOk; - - @try { - [self.protocol sendRPC:okMessage]; - } @catch (NSException *exception) { - SDLLogE(@"Proxy: Failed to send RPC message: %@", message.name); - } - return YES; } else if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) { return NO; } - } else { + } else { // Major version < 5 if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) { return NO; - } else if ([message.buttonName isEqualToEnum:SDLButtonNameOkay]) { - SDLUnsubscribeButton *okMessage = [message copy]; - okMessage.buttonName = SDLButtonNameOk; - - @try { - [self.protocol sendRPC:okMessage]; - } @catch (NSException *exception) { - SDLLogE(@"Proxy: Failed to send RPC message: %@", message.name); - } - - return YES; } else if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) { SDLUnsubscribeButton *okMessage = [message copy]; okMessage.buttonName = SDLButtonNameOk; @@ -565,14 +521,10 @@ static float DefaultConnectionTimeout = 45.0; if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) { return YES; } else if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) { - // Send Ok, Okay, and Play/Pause notifications - SDLOnButtonPress *okayPress = [message copy]; - okayPress.buttonName = SDLButtonNameOkay; - + // Send Ok and Play/Pause notifications SDLOnButtonPress *playPausePress = [message copy]; playPausePress.buttonName = SDLButtonNamePlayPause; - [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:okayPress]; [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:playPausePress]; [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:message]; return YES; @@ -591,11 +543,11 @@ static float DefaultConnectionTimeout = 45.0; [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:message]; return YES; } else if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) { - // Send Okay and OK notifications - SDLOnButtonPress *okayPress = [message copy]; - okayPress.buttonName = SDLButtonNameOkay; + // Send PlayPause and OK notifications + SDLOnButtonPress *playPausePress = [message copy]; + playPausePress.buttonName = SDLButtonNamePlayPause; - [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:okayPress]; + [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:playPausePress]; [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:message]; return YES; } @@ -608,14 +560,10 @@ static float DefaultConnectionTimeout = 45.0; if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) { return YES; } else if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) { - // Send Ok, Okay, and Play/Pause notifications - SDLOnButtonEvent *okayEvent = [message copy]; - okayEvent.buttonName = SDLButtonNameOkay; - + // Send Ok and Play/Pause notifications SDLOnButtonEvent *playPauseEvent = [message copy]; playPauseEvent.buttonName = SDLButtonNamePlayPause; - [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:okayEvent]; [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:playPauseEvent]; [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:message]; return YES; @@ -634,11 +582,11 @@ static float DefaultConnectionTimeout = 45.0; [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:message]; return YES; } else if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) { - // Send Okay and OK notifications - SDLOnButtonEvent *okayEvent = [message copy]; - okayEvent.buttonName = SDLButtonNameOkay; + // Send PlayPause and OK notifications + SDLOnButtonEvent *playPauseEvent = [message copy]; + playPauseEvent.buttonName = SDLButtonNamePlayPause; - [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:okayEvent]; + [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:playPauseEvent]; [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:message]; return YES; } -- cgit v1.2.1