Index: src/XMPPConnection.m ================================================================== --- src/XMPPConnection.m +++ src/XMPPConnection.m @@ -22,10 +22,11 @@ */ #include #include +#include #import "XMPPConnection.h" #import "XMPPStanza.h" #import "XMPPJID.h" #import "XMPPIQ.h" @@ -114,18 +115,19 @@ - (void)setServer: (OFString*)server_ { OFString *old = server; char *srv; - Stringprep_rc rc; - - if ((rc = stringprep_profile([server_ cString], &srv, - "Nameprep", 0)) != STRINGPREP_OK) - @throw [XMPPStringPrepFailedException newWithClass: isa - connection: self - profile: @"Nameprep" - string: server_]; + Idna_rc rc; + + if ((rc = idna_to_ascii_8z([server_ cString], + &srv, IDNA_USE_STD3_ASCII_RULES)) != IDNA_SUCCESS) + @throw [XMPPIDNATranslationFailedException + newWithClass: isa + connection: self + operation: @"ToASCII" + string: server_]; @try { server = [[OFString alloc] initWithCString: srv]; } @finally { free(srv); Index: src/XMPPExceptions.h ================================================================== --- src/XMPPExceptions.h +++ src/XMPPExceptions.h @@ -52,5 +52,23 @@ - initWithClass: (Class)class_ connection: (XMPPConnection*)conn profile: (OFString*)profile string: (OFString*)string; @end + +@interface XMPPIDNATranslationFailedException: XMPPException +{ + OFString *operation; + OFString *string; +} + +@property (readonly, nonatomic) OFString *operation, *string; + ++ newWithClass: (Class)class_ + connection: (XMPPConnection*)conn + operation: (OFString*)operation + string: (OFString*)string; +- initWithClass: (Class)class_ + connection: (XMPPConnection*)conn + operation: (OFString*)operation + string: (OFString*)string; +@end Index: src/XMPPExceptions.m ================================================================== --- src/XMPPExceptions.m +++ src/XMPPExceptions.m @@ -138,9 +138,76 @@ pool = [[OFAutoreleasePool alloc] init]; description = [[OFString alloc] initWithFormat: @"Stringprep with profile %@ failed on string '%@'!", profile, string]; [pool release]; + + return description; +} +@end + +@implementation XMPPIDNATranslationFailedException +@synthesize operation, string; + ++ newWithClass: (Class)class_ + connection: (XMPPConnection*)conn + operation: (OFString*)operation + string: (OFString*)string +{ + return [[self alloc] initWithClass: class_ + connection: conn + operation: operation + string: string]; +} + +- initWithClass: (Class)class_ + connection: (XMPPConnection*)conn +{ + Class c = isa; + [self release]; + @throw [OFNotImplementedException newWithClass: c + selector: _cmd]; +} + +- initWithClass: (Class)class_ + connection: (XMPPConnection*)conn + operation: (OFString*)operation_ + string: (OFString*)string_ +{ + self = [super initWithClass: class_ + connection: conn]; + + @try { + operation = [operation_ copy]; + string = [string_ copy]; + } @catch (id e) { + [self release]; + @throw e; + } + + return self; +} + +- (void)dealloc +{ + [operation release]; + [string release]; + + [super dealloc]; +} + +- (OFString*)description +{ + OFAutoreleasePool *pool; + + if (description != nil) + return description; + + pool = [[OFAutoreleasePool alloc] init]; + description = [[OFString alloc] initWithFormat: + @"IDNA operation %@ failed on string '%@'!", + operation, string]; + [pool release]; return description; } @end