diff options
Diffstat (limited to 'SmartDeviceLink/SDLProtocol.m')
-rw-r--r-- | SmartDeviceLink/SDLProtocol.m | 281 |
1 files changed, 138 insertions, 143 deletions
diff --git a/SmartDeviceLink/SDLProtocol.m b/SmartDeviceLink/SDLProtocol.m index 29c7ca38f..d9d3c03d7 100644 --- a/SmartDeviceLink/SDLProtocol.m +++ b/SmartDeviceLink/SDLProtocol.m @@ -47,7 +47,6 @@ NS_ASSUME_NONNULL_BEGIN @property (nullable, strong, nonatomic) SDLProtocolReceivedMessageRouter *messageRouter; @property (strong, nonatomic) NSMutableDictionary<SDLServiceTypeBox *, SDLProtocolHeader *> *serviceHeaders; @property (assign, nonatomic) int32_t hashId; -@property (nonatomic, strong) SDLEncryptionLifecycleManager *encryptionLifecycleManager; // Readonly public properties @property (strong, nonatomic, readwrite, nullable) NSString *authToken; @@ -61,35 +60,40 @@ NS_ASSUME_NONNULL_BEGIN #pragma mark - Lifecycle -- (instancetype)init { - if (self = [super init]) { - _messageID = 0; - _hashId = SDLControlFrameInt32NotFound; - _prioritizedCollection = [[SDLPrioritizedObjectCollection alloc] init]; - _protocolDelegateTable = [NSHashTable weakObjectsHashTable]; - _serviceHeaders = [[NSMutableDictionary alloc] init]; - _messageRouter = [[SDLProtocolReceivedMessageRouter alloc] init]; - _messageRouter.delegate = self; - } +- (instancetype)initWithTransport:(id<SDLTransportType>)transport encryptionManager:(nullable SDLEncryptionLifecycleManager *)encryptionManager { + self = [super init]; + if (!self) { return nil; } - return self; -} + SDLLogV(@"Initializing protocol with transport: %@, encryption manager: %@", transport, encryptionManager); + _messageID = 0; + _hashId = SDLControlFrameInt32NotFound; + _prioritizedCollection = [[SDLPrioritizedObjectCollection alloc] init]; + _protocolDelegateTable = [NSHashTable weakObjectsHashTable]; + _serviceHeaders = [[NSMutableDictionary alloc] init]; + _messageRouter = [[SDLProtocolReceivedMessageRouter alloc] init]; + _messageRouter.delegate = self; -- (instancetype)initWithEncryptionLifecycleManager:(SDLEncryptionLifecycleManager *)encryptionLifecycleManager { - if (self = [super init]) { - _messageID = 0; - _hashId = SDLControlFrameInt32NotFound; - _prioritizedCollection = [[SDLPrioritizedObjectCollection alloc] init]; - _protocolDelegateTable = [NSHashTable weakObjectsHashTable]; - _serviceHeaders = [[NSMutableDictionary alloc] init]; - _messageRouter = [[SDLProtocolReceivedMessageRouter alloc] init]; - _messageRouter.delegate = self; - _encryptionLifecycleManager = encryptionLifecycleManager; - } + _transport = transport; + _transport.delegate = self; + + _encryptionLifecycleManager = encryptionManager; return self; } +- (void)start { + SDLLogD(@"Starting protocol: %@", self); + [self.transport connect]; +} + +- (void)stopWithCompletionHandler:(void (^)(void))disconnectCompletionHandler { + SDLLogD(@"Stopping protocol: %@, disconnecting transport and stopping security manager", self); + [self.securityManager stop]; + [self.transport disconnectWithCompletionHandler:^{ + disconnectCompletionHandler(); + }]; +} + #pragma mark - Service metadata - (BOOL)storeHeader:(SDLProtocolHeader *)header forServiceType:(SDLServiceType)serviceType { if (header == nil) { @@ -104,7 +108,12 @@ NS_ASSUME_NONNULL_BEGIN - (UInt8)sdl_retrieveSessionIDforServiceType:(SDLServiceType)serviceType { SDLProtocolHeader *header = self.serviceHeaders[@(serviceType)]; if (header == nil) { - SDLLogW(@"Warning: Tried to retrieve sessionID for serviceType %i, but no header is saved for that service type", serviceType); + // The first time the RPC service type is created, there's no header, so we don't need to warn. + if (serviceType != SDLServiceTypeRPC) { + SDLLogW(@"Warning: Tried to retrieve sessionID for serviceType %i, but no header is saved for that service type.", serviceType); + } + + return 0; } return header.sessionID; @@ -113,37 +122,40 @@ NS_ASSUME_NONNULL_BEGIN #pragma mark - SDLTransportDelegate - (void)onTransportConnected { - NSArray<id<SDLProtocolListener>> *listeners; + SDLLogV(@"Transport connected, opening protocol"); + NSArray<id<SDLProtocolDelegate>> *listeners; @synchronized(self.protocolDelegateTable) { listeners = self.protocolDelegateTable.allObjects; } - for (id<SDLProtocolListener> listener in listeners) { - if ([listener respondsToSelector:@selector(onProtocolOpened)]) { - [listener onProtocolOpened]; + for (id<SDLProtocolDelegate> listener in listeners) { + if ([listener respondsToSelector:@selector(protocolDidOpen:)]) { + [listener protocolDidOpen:self]; } } } - (void)onTransportDisconnected { - NSArray<id<SDLProtocolListener>> *listeners; + SDLLogV(@"Transport disconnected, closing protocol"); + NSArray<id<SDLProtocolDelegate>> *listeners; @synchronized(self.protocolDelegateTable) { listeners = self.protocolDelegateTable.allObjects; } - for (id<SDLProtocolListener> listener in listeners) { - if ([listener respondsToSelector:@selector(onProtocolClosed)]) { - [listener onProtocolClosed]; + for (id<SDLProtocolDelegate> listener in listeners) { + if ([listener respondsToSelector:@selector(protocolDidClose:)]) { + [listener protocolDidClose:self]; } } } - (void)onDataReceived:(NSData *)receivedData { - [self handleBytesFromTransport:receivedData]; + [self sdl_handleBytesFromTransport:receivedData]; } - (void)onError:(NSError *)error { - for (id<SDLProtocolListener> listener in self.protocolDelegateTable.allObjects) { - if ([listener respondsToSelector:@selector(onTransportError:)]) { - [listener onTransportError:error]; + SDLLogV(@"Transport received an error: %@", error); + for (id<SDLProtocolDelegate> listener in self.protocolDelegateTable.allObjects) { + if ([listener respondsToSelector:@selector(protocol:transportDidError:)]) { + [listener protocol:self transportDidError:error]; } } } @@ -153,10 +165,12 @@ NS_ASSUME_NONNULL_BEGIN - (void)startServiceWithType:(SDLServiceType)serviceType payload:(nullable NSData *)payload { // No encryption, just build and send the message synchronously SDLProtocolMessage *message = [self sdl_createStartServiceMessageWithType:serviceType encrypted:NO payload:payload]; + SDLLogD(@"Sending start service: %@", message); [self sdl_sendDataToTransport:message.data onService:serviceType]; } - (void)startSecureServiceWithType:(SDLServiceType)serviceType payload:(nullable NSData *)payload tlsInitializationHandler:(void (^)(BOOL success, NSError *error))tlsInitializationHandler { + SDLLogD(@"Attempting to start TLS for service type: %hhu", serviceType); [self sdl_initializeTLSEncryptionWithCompletionHandler:^(BOOL success, NSError *error) { if (!success) { // We can't start the service because we don't have encryption, return the error @@ -166,6 +180,7 @@ NS_ASSUME_NONNULL_BEGIN // TLS initialization succeeded. Build and send the message. SDLProtocolMessage *message = [self sdl_createStartServiceMessageWithType:serviceType encrypted:YES payload:nil]; + SDLLogD(@"TLS initialized, sending start service for message: %@", message); [self sdl_sendDataToTransport:message.data onService:serviceType]; }]; } @@ -174,22 +189,7 @@ NS_ASSUME_NONNULL_BEGIN SDLProtocolHeader *header = [SDLProtocolHeader headerForVersion:(UInt8)[SDLGlobals sharedGlobals].protocolVersion.major]; NSData *servicePayload = payload; - switch (serviceType) { - case SDLServiceTypeRPC: { - // Need a different header for starting the RPC service, we get the session Id from the HU, or its the same as the RPC service's - if ([self sdl_retrieveSessionIDforServiceType:SDLServiceTypeRPC]) { - header.sessionID = [self sdl_retrieveSessionIDforServiceType:SDLServiceTypeRPC]; - } else { - header.sessionID = 0; - } - - SDLControlFramePayloadRPCStartService *startServicePayload = [[SDLControlFramePayloadRPCStartService alloc] initWithVersion:SDLMaxProxyProtocolVersion]; - servicePayload = startServicePayload.data; - } break; - default: { - header.sessionID = [self sdl_retrieveSessionIDforServiceType:SDLServiceTypeRPC]; - } break; - } + header.sessionID = [self sdl_retrieveSessionIDforServiceType:SDLServiceTypeRPC]; header.frameType = SDLFrameTypeControl; header.serviceType = serviceType; header.frameData = SDLFrameInfoStartService; @@ -211,6 +211,7 @@ NS_ASSUME_NONNULL_BEGIN return; } + SDLLogD(@"Telling security manager to initialize"); [self.securityManager initializeWithAppId:self.appId completionHandler:^(NSError *_Nullable error) { if (error) { SDLLogE(@"Security Manager failed to initialize with error: %@", error); @@ -248,6 +249,7 @@ NS_ASSUME_NONNULL_BEGIN } SDLProtocolMessage *message = [SDLProtocolMessage messageWithHeader:header andPayload:payload]; + SDLLogD(@"Sending end service: %@", message); [self sdl_sendDataToTransport:message.data onService:serviceType]; } @@ -255,6 +257,8 @@ NS_ASSUME_NONNULL_BEGIN #pragma mark - Register Secondary Transport - (void)registerSecondaryTransport { + SDLLogV(@"Attempting to register the secondary transport"); + SDLProtocolHeader *header = [SDLProtocolHeader headerForVersion:(UInt8)[SDLGlobals sharedGlobals].protocolVersion.major]; header.frameType = SDLFrameTypeControl; header.serviceType = SDLServiceTypeControl; @@ -265,6 +269,7 @@ NS_ASSUME_NONNULL_BEGIN } SDLProtocolMessage *message = [SDLProtocolMessage messageWithHeader:header andPayload:nil]; + SDLLogD(@"Sending register secondary transport: %@", message); [self sdl_sendDataToTransport:message.data onService:SDLServiceTypeControl]; } @@ -293,7 +298,7 @@ NS_ASSUME_NONNULL_BEGIN } NSData *messagePayload = nil; - SDLLogV(@"Send RPC %@", message); + SDLLogV(@"Sending RPC: %@", message); // Build the message payload. Include the binary header if necessary // VERSION DEPENDENT CODE @@ -418,7 +423,7 @@ NS_ASSUME_NONNULL_BEGIN SDLProtocolMessage *message = [SDLProtocolMessage messageWithHeader:header andPayload:data]; - if (message.size < [[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeRPC]) { + if (message.size < [[SDLGlobals sharedGlobals] mtuSizeForServiceType:service]) { SDLLogV(@"Sending protocol message: %@", message); [self sdl_sendDataToTransport:message.data onService:header.serviceType]; } else { @@ -434,7 +439,7 @@ NS_ASSUME_NONNULL_BEGIN #pragma mark - Receive and Process Data // Turn received bytes into message objects. -- (void)handleBytesFromTransport:(NSData *)receivedData { +- (void)sdl_handleBytesFromTransport:(NSData *)receivedData { // Initialize the receive buffer which will contain bytes while messages are constructed. if (self.receiveBuffer == nil) { self.receiveBuffer = [NSMutableData dataWithCapacity:(4 * [[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeRPC])]; @@ -443,10 +448,10 @@ NS_ASSUME_NONNULL_BEGIN // Save the data [self.receiveBuffer appendData:receivedData]; - [self processMessages]; + [self sdl_processMessages]; } -- (void)processMessages { +- (void)sdl_processMessages { UInt8 incomingVersion = [SDLProtocolHeader determineVersion:self.receiveBuffer]; // If we have enough bytes, create the header. @@ -479,10 +484,9 @@ NS_ASSUME_NONNULL_BEGIN } message = [SDLProtocolMessage messageWithHeader:header andPayload:payload]; - SDLLogV(@"Protocol message received: %@", message); } else { // Need to wait for more bytes. - SDLLogV(@" protocol header complete, message incomplete, waiting for %ld more bytes. Header: %@", (long)(messageSize - self.receiveBuffer.length), header); + SDLLogV(@"Protocol header complete, message incomplete, waiting for %ld more bytes. Header: %@", (long)(messageSize - self.receiveBuffer.length), header); return; } @@ -490,16 +494,21 @@ NS_ASSUME_NONNULL_BEGIN self.receiveBuffer = [[self.receiveBuffer subdataWithRange:NSMakeRange(messageSize, self.receiveBuffer.length - messageSize)] mutableCopy]; // Pass on the message to the message router. - [self.messageRouter handleReceivedMessage:message]; + [self.messageRouter handleReceivedMessage:message protocol:self]; // Call recursively until the buffer is empty or incomplete message is encountered if (self.receiveBuffer.length > 0) { - [self processMessages]; + [self sdl_processMessages]; } } -- (void)handleProtocolStartServiceACKMessage:(SDLProtocolMessage *)startServiceACK { - // V5 Packet + +#pragma mark - SDLProtocolDelegate from SDLReceivedProtocolMessageRouter + +- (void)protocol:(SDLProtocol *)protocol didReceiveStartServiceACK:(SDLProtocolMessage *)startServiceACK { + SDLLogD(@"Received start service ACK: %@", startServiceACK); + + // V5+ Packet if (startServiceACK.header.version >= 5) { switch (startServiceACK.header.serviceType) { case SDLServiceTypeRPC: { @@ -521,8 +530,7 @@ NS_ASSUME_NONNULL_BEGIN default: break; } - } else { - // V4 and below packet + } else { // V4 and below packet switch (startServiceACK.header.serviceType) { case SDLServiceTypeRPC: { [SDLGlobals sharedGlobals].maxHeadUnitProtocolVersion = [SDLVersion versionWithMajor:startServiceACK.header.version minor:0 patch:0]; @@ -536,69 +544,74 @@ NS_ASSUME_NONNULL_BEGIN self.serviceHeaders[@(startServiceACK.header.serviceType)] = [startServiceACK.header copy]; // Pass along to all the listeners - NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners]; - for (id<SDLProtocolListener> listener in listeners) { - if ([listener respondsToSelector:@selector(handleProtocolStartServiceACKMessage:)]) { - [listener handleProtocolStartServiceACKMessage:startServiceACK]; + NSArray<id<SDLProtocolDelegate>> *listeners = [self sdl_getProtocolListeners]; + for (id<SDLProtocolDelegate> listener in listeners) { + if ([listener respondsToSelector:@selector(protocol:didReceiveStartServiceACK:)]) { + [listener protocol:protocol didReceiveStartServiceACK:startServiceACK]; } } } -- (void)handleProtocolStartServiceNAKMessage:(SDLProtocolMessage *)startServiceNAK { +- (void)protocol:(SDLProtocol *)protocol didReceiveStartServiceNAK:(SDLProtocolMessage *)startServiceNAK { [self sdl_logControlNAKPayload:startServiceNAK]; - NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners]; - for (id<SDLProtocolListener> listener in listeners) { - if ([listener respondsToSelector:@selector(handleProtocolStartServiceNAKMessage:)]) { - [listener handleProtocolStartServiceNAKMessage:startServiceNAK]; + NSArray<id<SDLProtocolDelegate>> *listeners = [self sdl_getProtocolListeners]; + for (id<SDLProtocolDelegate> listener in listeners) { + if ([listener respondsToSelector:@selector(protocol:didReceiveStartServiceNAK:)]) { + [listener protocol:protocol didReceiveStartServiceNAK:startServiceNAK]; } } } -- (void)handleProtocolEndServiceACKMessage:(SDLProtocolMessage *)endServiceACK { +- (void)protocol:(SDLProtocol *)protocol didReceiveEndServiceACK:(SDLProtocolMessage *)endServiceACK { + SDLLogD(@"End service ACK: %@", endServiceACK); // Remove the session id [self.serviceHeaders removeObjectForKey:@(endServiceACK.header.serviceType)]; - NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners]; - for (id<SDLProtocolListener> listener in listeners) { - if ([listener respondsToSelector:@selector(handleProtocolEndServiceACKMessage:)]) { - [listener handleProtocolEndServiceACKMessage:endServiceACK]; + NSArray<id<SDLProtocolDelegate>> *listeners = [self sdl_getProtocolListeners]; + for (id<SDLProtocolDelegate> listener in listeners) { + if ([listener respondsToSelector:@selector(protocol:didReceiveEndServiceACK:)]) { + [listener protocol:protocol didReceiveEndServiceACK:endServiceACK]; } } } -- (void)handleProtocolEndServiceNAKMessage:(SDLProtocolMessage *)endServiceNAK { +- (void)protocol:(SDLProtocol *)protocol didReceiveEndServiceNAK:(SDLProtocolMessage *)endServiceNAK { [self sdl_logControlNAKPayload:endServiceNAK]; - NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners]; - for (id<SDLProtocolListener> listener in listeners) { - if ([listener respondsToSelector:@selector(handleProtocolEndServiceNAKMessage:)]) { - [listener handleProtocolEndServiceNAKMessage:endServiceNAK]; + NSArray<id<SDLProtocolDelegate>> *listeners = [self sdl_getProtocolListeners]; + for (id<SDLProtocolDelegate> listener in listeners) { + if ([listener respondsToSelector:@selector(protocol:didReceiveEndServiceNAK:)]) { + [listener protocol:protocol didReceiveEndServiceNAK:endServiceNAK]; } } } -- (void)handleProtocolRegisterSecondaryTransportACKMessage:(SDLProtocolMessage *)registerSecondaryTransportACK { - NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners]; - for (id<SDLProtocolListener> listener in listeners) { - if ([listener respondsToSelector:@selector(handleProtocolRegisterSecondaryTransportACKMessage:)]) { - [listener handleProtocolRegisterSecondaryTransportACKMessage:registerSecondaryTransportACK]; +- (void)protocol:(SDLProtocol *)protocol didReceiveRegisterSecondaryTransportACK:(SDLProtocolMessage *)registerSecondaryTransportACK { + SDLLogD(@"Register Secondary Transport ACK: %@", registerSecondaryTransportACK); + + NSArray<id<SDLProtocolDelegate>> *listeners = [self sdl_getProtocolListeners]; + for (id<SDLProtocolDelegate> listener in listeners) { + if ([listener respondsToSelector:@selector(protocol:didReceiveRegisterSecondaryTransportACK:)]) { + [listener protocol:protocol didReceiveRegisterSecondaryTransportACK:registerSecondaryTransportACK]; } } } -- (void)handleProtocolRegisterSecondaryTransportNAKMessage:(SDLProtocolMessage *)registerSecondaryTransportNAK { +- (void)protocol:(SDLProtocol *)protocol didReceiveRegisterSecondaryTransportNAK:(SDLProtocolMessage *)registerSecondaryTransportNAK { [self sdl_logControlNAKPayload:registerSecondaryTransportNAK]; - NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners]; - for (id<SDLProtocolListener> listener in listeners) { - if ([listener respondsToSelector:@selector(handleProtocolRegisterSecondaryTransportNAKMessage:)]) { - [listener handleProtocolRegisterSecondaryTransportNAKMessage:registerSecondaryTransportNAK]; + NSArray<id<SDLProtocolDelegate>> *listeners = [self sdl_getProtocolListeners]; + for (id<SDLProtocolDelegate> listener in listeners) { + if ([listener respondsToSelector:@selector(protocol:didReceiveRegisterSecondaryTransportNAK:)]) { + [listener protocol:protocol didReceiveRegisterSecondaryTransportNAK:registerSecondaryTransportNAK]; } } } - (void)handleHeartbeatForSession:(Byte)session { + SDLLogV(@"Received a heartbeat"); + // Respond with a heartbeat ACK SDLProtocolHeader *header = [SDLProtocolHeader headerForVersion:(UInt8)[SDLGlobals sharedGlobals].protocolVersion.major]; header.frameType = SDLFrameTypeControl; @@ -608,8 +621,8 @@ NS_ASSUME_NONNULL_BEGIN SDLProtocolMessage *message = [SDLProtocolMessage messageWithHeader:header andPayload:nil]; [self sdl_sendDataToTransport:message.data onService:header.serviceType]; - NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners]; - for (id<SDLProtocolListener> listener in listeners) { + NSArray<id<SDLProtocolDelegate>> *listeners = [self sdl_getProtocolListeners]; + for (id<SDLProtocolDelegate> listener in listeners) { if ([listener respondsToSelector:@selector(handleHeartbeatForSession:)]) { [listener handleHeartbeatForSession:session]; } @@ -617,61 +630,40 @@ NS_ASSUME_NONNULL_BEGIN } - (void)handleHeartbeatACK { - NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners]; - for (id<SDLProtocolListener> listener in listeners) { + SDLLogV(@"Received a heartbeat ACK"); + + NSArray<id<SDLProtocolDelegate>> *listeners = [self sdl_getProtocolListeners]; + for (id<SDLProtocolDelegate> listener in listeners) { if ([listener respondsToSelector:@selector(handleHeartbeatACK)]) { [listener handleHeartbeatACK]; } } } -- (void)handleTransportEventUpdateMessage:(SDLProtocolMessage *)transportEventUpdate { - NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners]; - for (id<SDLProtocolListener> listener in listeners) { - if ([listener respondsToSelector:@selector(handleTransportEventUpdateMessage:)]) { - [listener handleTransportEventUpdateMessage:transportEventUpdate]; +- (void)protocol:(SDLProtocol *)protocol didReceiveTransportEventUpdate:(SDLProtocolMessage *)transportEventUpdate { + SDLLogD(@"Received a transport event update: %@", transportEventUpdate); + + NSArray<id<SDLProtocolDelegate>> *listeners = [self sdl_getProtocolListeners]; + for (id<SDLProtocolDelegate> listener in listeners) { + if ([listener respondsToSelector:@selector(protocol:didReceiveTransportEventUpdate:)]) { + [listener protocol:protocol didReceiveTransportEventUpdate:transportEventUpdate]; } } } -- (void)onProtocolMessageReceived:(SDLProtocolMessage *)msg { +- (void)protocol:(SDLProtocol *)protocol didReceiveMessage:(SDLProtocolMessage *)msg { // Control service (but not control frame type) messages are TLS handshake messages if (msg.header.serviceType == SDLServiceTypeControl) { [self sdl_processSecurityMessage:msg]; return; } - NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners]; - for (id<SDLProtocolListener> listener in listeners) { - if ([listener respondsToSelector:@selector(onProtocolMessageReceived:)]) { - [listener onProtocolMessageReceived:msg]; - } - } -} - -- (void)onProtocolOpened { - NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners]; - for (id<SDLProtocolListener> listener in listeners) { - if ([listener respondsToSelector:@selector(onProtocolOpened)]) { - [listener onProtocolOpened]; - } - } -} - -- (void)onProtocolClosed { - NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners]; - for (id<SDLProtocolListener> listener in listeners) { - if ([listener respondsToSelector:@selector(onProtocolClosed)]) { - [listener onProtocolClosed]; - } - } -} + SDLLogV(@"Other protocol message received: %@", msg); -- (void)onError:(NSString *)info exception:(NSException *)e { - NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners]; - for (id<SDLProtocolListener> listener in listeners) { - if ([listener respondsToSelector:@selector(onError:exception:)]) { - [listener onError:info exception:e]; + NSArray<id<SDLProtocolDelegate>> *listeners = [self sdl_getProtocolListeners]; + for (id<SDLProtocolDelegate> listener in listeners) { + if ([listener respondsToSelector:@selector(protocol:didReceiveMessage:)]) { + [listener protocol:protocol didReceiveMessage:msg]; } } } @@ -683,21 +675,20 @@ NS_ASSUME_NONNULL_BEGIN if (nakMessage.header.version >= 5) { SDLControlFramePayloadNak *endServiceNakPayload = [[SDLControlFramePayloadNak alloc] initWithData:nakMessage.payload]; NSArray<NSString *> *rejectedParams = endServiceNakPayload.rejectedParams; - if (rejectedParams.count > 0) { - SDLLogE(@"Start Service NAK'd, service type: %@, rejectedParams: %@", @(nakMessage.header.serviceType), rejectedParams); - } + SDLLogE(@"%@ service NAK'd, service type: %@, rejectedParams: %@", (nakMessage.header.frameData == SDLFrameInfoStartServiceNACK) ? @"Start" : @"End", @(nakMessage.header.serviceType), rejectedParams); + } else { + SDLLogE(@"NAK received message: %@", nakMessage); } } break; case SDLFrameInfoRegisterSecondaryTransportNACK: { SDLControlFramePayloadRegisterSecondaryTransportNak *payload = [[SDLControlFramePayloadRegisterSecondaryTransportNak alloc] initWithData:nakMessage.payload]; SDLLogE(@"Register Secondary Transport NAK'd, reason: %@", payload.reason); } break; - default: - break; + default: break; } } -- (NSArray<id<SDLProtocolListener>> *)sdl_getProtocolListeners { +- (NSArray<id<SDLProtocolDelegate>> *)sdl_getProtocolListeners { @synchronized(self.protocolDelegateTable) { return self.protocolDelegateTable.allObjects; } @@ -705,16 +696,19 @@ NS_ASSUME_NONNULL_BEGIN #pragma mark - TLS Handshake + // TODO: These should be split out to a separate class to be tested properly - (void)sdl_processSecurityMessage:(SDLProtocolMessage *)clientHandshakeMessage { + SDLLogD(@"Received a security message: %@", clientHandshakeMessage); + if (self.securityManager == nil) { - SDLLogE(@"Failed to process security message because no security manager is set. Message: %@", clientHandshakeMessage); + SDLLogE(@"Failed to process security message because no security manager is set."); return; } // Misformatted handshake message, something went wrong if (clientHandshakeMessage.payload.length <= 12) { - SDLLogE(@"Security message is malformed, less than 12 bytes. It does not have a protocol header. Message: %@", clientHandshakeMessage); + SDLLogE(@"Security message is malformed, less than 12 bytes. It does not have a protocol header."); } // Tear off the binary header of the client protocol message to get at the actual TLS handshake @@ -737,6 +731,7 @@ NS_ASSUME_NONNULL_BEGIN } // Send the response or error message. If it's an error message, the module will ACK the Start Service without encryption. If it's a TLS handshake message, the module will ACK with encryption + SDLLogD(@"Sending security message: %@", serverSecurityMessage); [self sdl_sendDataToTransport:serverSecurityMessage.data onService:SDLServiceTypeControl]; } |