From e3e8e886a795f44c45e8255f8b98b70db3c9c219 Mon Sep 17 00:00:00 2001 From: Jonathan Schleifer Date: Mon, 17 Dec 2018 21:04:49 +0000 Subject: [PATCH] Adjust to ObjFW changes FossilOrigin-Name: 42243ac2f70297a6b48b7cd7d0a53b8ee49cc69a430c156d730a335af3bc3ed3 --- src/IRCConnection.h | 5 +-- src/IRCConnection.m | 82 +++++++++++++++++++-------------------------- tests/tests.m | 9 ++++- 3 files changed, 46 insertions(+), 50 deletions(-) diff --git a/src/IRCConnection.h b/src/IRCConnection.h index 1d0e2c8..12d94bc 100644 --- a/src/IRCConnection.h +++ b/src/IRCConnection.h @@ -37,6 +37,8 @@ OF_ASSUME_NONNULL_BEGIN - (void)connection: (IRCConnection *)connection didSendLine: (OFString *)line; - (void)connectionWasEstablished: (IRCConnection *)connection; +- (void)connection: (IRCConnection *)connection + didFailToConnectWithException: (id)exception; - (void)connection: (IRCConnection *)connection didSeeUser: (IRCUser *)user joinChannel: (OFString *)channel; @@ -88,6 +90,7 @@ OF_ASSUME_NONNULL_BEGIN of_time_interval_t _pingInterval, _pingTimeout; OFString *_Nullable _pingData; OFTimer *_Nullable _pingTimer; + bool _fallbackEncodingUsed; } @property (readonly, nonatomic) Class socketClass; @@ -120,8 +123,6 @@ OF_ASSUME_NONNULL_BEGIN channel: (OFString *)channel reason: (nullable OFString *)reason; - (void)changeNicknameTo: (OFString *)nickname; -- (void)processLine: (OFString *)line; -- (void)handleConnection; - (nullable OFSet OF_GENERIC(OFString *) *)usersInChannel: (OFString *)channel; @end diff --git a/src/IRCConnection.m b/src/IRCConnection.m index 293519f..9cc125d 100644 --- a/src/IRCConnection.m +++ b/src/IRCConnection.m @@ -37,6 +37,9 @@ #import "IRCConnection.h" #import "IRCUser.h" +@interface IRCConnection () +@end + @implementation IRCConnection @synthesize socketClass = _socketClass; @synthesize server = _server, port = _port; @@ -91,18 +94,36 @@ @throw [OFAlreadyConnectedException exception]; _socket = [[_socketClass alloc] init]; + [_socket setDelegate: self]; + [_socket asyncConnectToHost: _server + port: _port]; + + objc_autoreleasePoolPop(pool); +} + +- (void)socket: (OF_KINDOF(OFTCPSocket *))socket + didConnectToHost: (OFString *)host + port: (uint16_t)port + exception: (id)exception +{ + if (exception != nil) { + if ([_delegate respondsToSelector: + @selector(connection:didFailToConnectWithException:)]) + [_delegate connection: self + didFailToConnectWithException: exception]; + + return; + } + if ([_delegate respondsToSelector: @selector(connection:didCreateSocket:)]) [_delegate connection: self didCreateSocket: _socket]; - [_socket connectToHost: _server - port: _port]; - [self sendLineWithFormat: @"NICK %@", _nickname]; [self sendLineWithFormat: @"USER %@ * 0 :%@", _username, _realname]; - objc_autoreleasePoolPop(pool); + [socket asyncReadLine]; } - (void)disconnect @@ -575,50 +596,25 @@ _socket = nil; } -- (void)processLine: (OFString *)line -{ - void *pool = objc_autoreleasePoolPush(); - - [self irc_processLine: line]; - - objc_autoreleasePoolPop(pool); -} - -- (bool)irc_socket: (OFTCPSocket *)socket - didReceiveWronglyEncodedLine: (OFString *)line - context: (id)context - exception: (OFException *)exception +- (bool)stream: (OF_KINDOF(OFStream *))stream + didReadLine: (OFString *)line + exception: (OFException *)exception { if (line != nil) { [self irc_processLine: line]; - [socket asyncReadLineWithTarget: self - selector: @selector(irc_socket: - didReceiveLine:context: - exception:) - context: nil]; - } - return false; -} + if (_fallbackEncodingUsed) { + _fallbackEncodingUsed = false; + [stream asyncReadLine]; + return false; + } -- (bool)irc_socket: (OFTCPSocket *)socket - didReceiveLine: (OFString *)line - context: (id)context - exception: (OFException *)exception -{ - if (line != nil) { - [self irc_processLine: line]; return true; } if ([exception isKindOfClass: [OFInvalidEncodingException class]]) { - [socket - asyncReadLineWithEncoding: _fallbackEncoding - target: self - selector: @selector(irc_socket: - didReceiveWronglyEncodedLine: - context:exception:) - context: nil]; + _fallbackEncodingUsed = true; + [stream asyncReadLineWithEncoding: _fallbackEncoding]; return false; } @@ -635,14 +631,6 @@ return false; } -- (void)handleConnection -{ - [_socket asyncReadLineWithTarget: self - selector: @selector(irc_socket:didReceiveLine: - context:exception:) - context: nil]; -} - - (OFSet OF_GENERIC(OFString *) *)usersInChannel: (OFString *)channel { return [[[_channels objectForKey: channel] copy] autorelease]; diff --git a/tests/tests.m b/tests/tests.m index 51a2ee4..4e855fa 100644 --- a/tests/tests.m +++ b/tests/tests.m @@ -44,7 +44,6 @@ OF_APPLICATION_DELEGATE(TestApp) [connection setDelegate: self]; [connection connect]; - [connection handleConnection]; } - (void)connection: (IRCConnection*)connection @@ -64,6 +63,14 @@ OF_APPLICATION_DELEGATE(TestApp) [connection joinChannel: @"#objfw"]; } +- (void)connection: (IRCConnection *)connection + didFailToConnectWithException: (id)exception +{ + [of_stderr writeFormat: @"Failed to connect: %@\n", exception]; + + [OFApplication terminateWithStatus: 1]; +} + - (void)connection: (IRCConnection*)connection didSeeUser: (IRCUser*)user joinChannel: (OFString*)channel