diff --git a/src/XMPPConnection.h b/src/XMPPConnection.h index c9a9e33..59ccba7 100644 --- a/src/XMPPConnection.h +++ b/src/XMPPConnection.h @@ -79,6 +79,7 @@ id delegate; OFMutableDictionary *callbacks; XMPPAuthenticator *authModule; + BOOL streamOpen; BOOL needsSession; BOOL encryptionRequired, encrypted; unsigned int lastID; @@ -94,6 +95,7 @@ @property (readonly, retain, getter=socket) OFTCPSocket *sock; @property (assign) BOOL encryptionRequired; @property (readonly) BOOL encrypted; +@property (readonly) BOOL streamOpen; #endif /** @@ -106,6 +108,11 @@ */ - (void)connect; +/** + * Closes the stream to the XMPP service + */ +- (void)close; + /** * Checks the certificate presented by the server. * Throws SSLInvalidCertificateException on failure. diff --git a/src/XMPPConnection.m b/src/XMPPConnection.m index 81ceb75..c56130c 100644 --- a/src/XMPPConnection.m +++ b/src/XMPPConnection.m @@ -65,6 +65,7 @@ sock = [[OFTCPSocket alloc] init]; port = 5222; encrypted = NO; + streamOpen = NO; callbacks = [[OFMutableDictionary alloc] init]; } @catch (id e) { [self release]; @@ -316,6 +317,11 @@ return encrypted; } +- (BOOL)streamOpen +{ + return streamOpen; +} + - (void)checkCertificate { X509Certificate *cert; @@ -461,10 +467,12 @@ withCallbackBlock: (xmpp_callback_block)callback; namespace: (OFString *)ns { if (![name isEqual: @"stream"] || ![prefix isEqual: @"stream"] || - ![ns isEqual: XMPP_NS_STREAM]) { + ![ns isEqual: XMPP_NS_STREAM]) @throw [OFMalformedXMLException exceptionWithClass: [builder class] parser: nil]; + else { + [self close]; } } @@ -496,6 +504,15 @@ withCallbackBlock: (xmpp_callback_block)callback; @"xmlns='" XMPP_NS_CLIENT @"' " @"xmlns:stream='" XMPP_NS_STREAM @"' " @"version='1.0'>", domain]; + streamOpen = YES; +} + +- (void)close +{ + if (streamOpen) { + [sock writeString: @""]; + streamOpen = NO; + } } - (void)XMPP_handleStanza: (OFXMLElement*)element @@ -530,9 +547,8 @@ withCallbackBlock: (xmpp_callback_block)callback; if ([[element name] isEqual: @"error"]) { OFString *condition, *reason; - [parser setDelegate: self]; - [sock writeString: @""]; - [sock close]; + [self close]; + [sock close]; // Remote has already closed his stream if ([element elementForName: @"bad-format" namespace: XMPP_NS_XMPP_STREAM])