summaryrefslogtreecommitdiff
path: root/SmartDeviceLink/SDLProtocol.m
diff options
context:
space:
mode:
Diffstat (limited to 'SmartDeviceLink/SDLProtocol.m')
-rw-r--r--SmartDeviceLink/SDLProtocol.m281
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];
}