// // MQTTCFSocketDecoder.m // MQTTClient.framework // // Copyright © 2013-2017, Christoph Krey. All rights reserved. // #import "MQTTCFSocketDecoder.h" #import "MQTTLog.h" @interface MQTTCFSocketDecoder() @end @implementation MQTTCFSocketDecoder - (instancetype)init { self = [super init]; self.state = MQTTCFSocketDecoderStateInitializing; self.stream = nil; return self; } - (void)open { if (self.state == MQTTCFSocketDecoderStateInitializing) { (self.stream).delegate = self; [self.stream open]; } } - (void)dealloc { [self close]; } - (void)close { [self.stream close]; [self.stream setDelegate:nil]; } - (void)stream:(NSStream *)sender handleEvent:(NSStreamEvent)eventCode { if (eventCode & NSStreamEventOpenCompleted) { DDLogVerbose(@"[MQTTCFSocketDecoder] NSStreamEventOpenCompleted"); self.state = MQTTCFSocketDecoderStateReady; [self.delegate decoderDidOpen:self]; } if (eventCode & NSStreamEventHasBytesAvailable) { DDLogVerbose(@"[MQTTCFSocketDecoder] NSStreamEventHasBytesAvailable"); if (self.state == MQTTCFSocketDecoderStateInitializing) { self.state = MQTTCFSocketDecoderStateReady; } if (self.state == MQTTCFSocketDecoderStateReady) { NSInteger n; UInt8 buffer[768]; n = [self.stream read:buffer maxLength:sizeof(buffer)]; if (n == -1) { self.state = MQTTCFSocketDecoderStateError; [self.delegate decoder:self didFailWithError:nil]; } else { NSData *data = [NSData dataWithBytes:buffer length:n]; DDLogVerbose(@"[MQTTCFSocketDecoder] received (%lu)=%@...", (unsigned long)data.length, [data subdataWithRange:NSMakeRange(0, MIN(256, data.length))]); [self.delegate decoder:self didReceiveMessage:data]; } } } if (eventCode & NSStreamEventHasSpaceAvailable) { DDLogVerbose(@"[MQTTCFSocketDecoder] NSStreamEventHasSpaceAvailable"); } if (eventCode & NSStreamEventEndEncountered) { DDLogVerbose(@"[MQTTCFSocketDecoder] NSStreamEventEndEncountered"); self.state = MQTTCFSocketDecoderStateInitializing; self.error = nil; [self.delegate decoderdidClose:self]; } if (eventCode & NSStreamEventErrorOccurred) { DDLogVerbose(@"[MQTTCFSocketDecoder] NSStreamEventErrorOccurred"); self.state = MQTTCFSocketDecoderStateError; self.error = self.stream.streamError; [self.delegate decoder:self didFailWithError:self.error]; } } @end