Correctly handle stream restart.

This commit is contained in:
Jonathan Schleifer 2011-04-24 00:41:18 +02:00
parent f36f92f515
commit 82982768bc
2 changed files with 41 additions and 25 deletions

View file

@ -75,8 +75,8 @@
#endif #endif
{ {
OFTCPSocket *sock; OFTCPSocket *sock;
OFXMLParser *parser; OFXMLParser *parser, *oldParser;
OFXMLElementBuilder *elementBuilder; OFXMLElementBuilder *elementBuilder, *oldElementBuilder;
OFString *username, *password, *server, *resource; OFString *username, *password, *server, *resource;
XMPPJID *JID; XMPPJID *JID;
uint16_t port; uint16_t port;

View file

@ -54,15 +54,7 @@
@try { @try {
sock = [[OFTCPSocket alloc] init]; sock = [[OFTCPSocket alloc] init];
parser = [[OFXMLParser alloc] init];
elementBuilder = [[OFXMLElementBuilder alloc] init];
port = 5222; port = 5222;
[parser setDelegate: self];
[elementBuilder setDelegate: self];
roster = [[XMPPRoster alloc] initWithConnection: self];
} @catch (id e) { } @catch (id e) {
[self release]; [self release];
@throw e; @throw e;
@ -238,6 +230,16 @@
[parser parseBuffer: buffer [parser parseBuffer: buffer
withLength: length]; withLength: length];
if (oldParser != nil) {
[oldParser release];
oldParser = nil;
}
if (oldElementBuilder != nil) {
[oldElementBuilder release];
oldElementBuilder = nil;
}
} }
- (OFTCPSocket*)socket - (OFTCPSocket*)socket
@ -260,11 +262,10 @@
didStartElement: (OFString*)name didStartElement: (OFString*)name
withPrefix: (OFString*)prefix withPrefix: (OFString*)prefix
namespace: (OFString*)ns namespace: (OFString*)ns
attributes: (OFArray*)attrs attributes: (OFArray*)attributes
{ {
OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init];
OFEnumerator *enumerator; OFEnumerator *enumerator;
OFXMLAttribute *attr; OFXMLAttribute *attribute;
if (![name isEqual: @"stream"] || ![prefix isEqual: @"stream"] || if (![name isEqual: @"stream"] || ![prefix isEqual: @"stream"] ||
![ns isEqual: XMPP_NS_STREAM]) { ![ns isEqual: XMPP_NS_STREAM]) {
@ -272,18 +273,16 @@
assert(0); assert(0);
} }
enumerator = [attrs objectEnumerator]; enumerator = [attributes objectEnumerator];
while ((attr = [enumerator nextObject]) != nil) { while ((attribute = [enumerator nextObject]) != nil) {
if ([[attr name] isEqual: @"from"] && if ([[attribute name] isEqual: @"from"] &&
![[attr stringValue] isEqual: server]) { ![[attribute stringValue] isEqual: server]) {
of_log(@"Got invalid from in stream start!"); of_log(@"Got invalid from in stream start!");
assert(0); assert(0);
} }
} }
[parser setDelegate: elementBuilder]; [parser setDelegate: elementBuilder];
[pool release];
} }
- (void)parser: (OFXMLParser*)p - (void)parser: (OFXMLParser*)p
@ -302,8 +301,6 @@
- (void)elementBuilder: (OFXMLElementBuilder*)builder - (void)elementBuilder: (OFXMLElementBuilder*)builder
didBuildElement: (OFXMLElement*)element didBuildElement: (OFXMLElement*)element
{ {
OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init];
[element setDefaultNamespace: XMPP_NS_CLIENT]; [element setDefaultNamespace: XMPP_NS_CLIENT];
[element setPrefix: @"stream" [element setPrefix: @"stream"
forNamespace: XMPP_NS_STREAM]; forNamespace: XMPP_NS_STREAM];
@ -321,12 +318,31 @@
if ([[element namespace] isEqual: XMPP_NS_SASL]) if ([[element namespace] isEqual: XMPP_NS_SASL])
[self XMPP_handleSASL: element]; [self XMPP_handleSASL: element];
[pool release];
} }
- (void)XMPP_startStream - (void)XMPP_startStream
{ {
/* Make sure we don't get any old events */
[parser setDelegate: nil];
[elementBuilder setDelegate: nil];
/*
* We can't release them now, as we are currently inside them. Release
* them the next time the parser returns.
*/
oldParser = parser;
oldElementBuilder = elementBuilder;
[roster release];
parser = [[OFXMLParser alloc] init];
[parser setDelegate: self];
elementBuilder = [[OFXMLElementBuilder alloc] init];
[elementBuilder setDelegate: self];
roster = [[XMPPRoster alloc] initWithConnection: self];
[sock writeFormat: @"<?xml version='1.0'?>\n" [sock writeFormat: @"<?xml version='1.0'?>\n"
@"<stream:stream to='%@' " @"<stream:stream to='%@' "
@"xmlns='" XMPP_NS_CLIENT @"' " @"xmlns='" XMPP_NS_CLIENT @"' "
@ -481,8 +497,8 @@
[delegate connectionDidUpgradeToTLS: self]; [delegate connectionDidUpgradeToTLS: self];
/* Stream restart */ /* Stream restart */
[parser setDelegate: self];
[self XMPP_startStream]; [self XMPP_startStream];
return; return;
} }
@ -520,8 +536,8 @@
[delegate connectionWasAuthenticated: self]; [delegate connectionWasAuthenticated: self];
/* Stream restart */ /* Stream restart */
[parser setDelegate: self];
[self XMPP_startStream]; [self XMPP_startStream];
return; return;
} }