You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.9 KiB
95 lines
2.9 KiB
// |
|
// 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; |
|
self.runLoop = [NSRunLoop currentRunLoop]; |
|
self.runLoopMode = NSRunLoopCommonModes; |
|
return self; |
|
} |
|
|
|
- (void)open { |
|
if (self.state == MQTTCFSocketDecoderStateInitializing) { |
|
[self.stream setDelegate:self]; |
|
[self.stream scheduleInRunLoop:self.runLoop forMode:self.runLoopMode]; |
|
[self.stream open]; |
|
} |
|
} |
|
|
|
- (void)dealloc { |
|
[self close]; |
|
} |
|
|
|
- (void)close { |
|
[self.stream close]; |
|
[self.stream removeFromRunLoop:self.runLoop forMode:self.runLoopMode]; |
|
[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
|
|
|