@@ -22,10 +22,18 @@ #import "OFURL.h" #import "OFString.h" #import "OFAutoreleasePool.h" #import "OFExceptions.h" +#import "macros.h" + +#define ADD_STR_HASH(str) \ + h = [str hash]; \ + OF_HASH_ADD(hash, h >> 24); \ + OF_HASH_ADD(hash, (h >> 16) & 0xFF); \ + OF_HASH_ADD(hash, (h >> 8) & 0xFF); \ + OF_HASH_ADD(hash, h & 0xFF); @implementation OFURL + URLWithString: (OFString*)str { return [[[self alloc] initWithString: str] autorelease]; @@ -189,10 +197,34 @@ if (![url->fragment isEqual: fragment]) return NO; return YES; } + +- (uint32_t)hash +{ + uint32_t hash, h; + + OF_HASH_INIT(hash); + + ADD_STR_HASH(scheme); + ADD_STR_HASH(host); + + OF_HASH_ADD(hash, (port >> 8) & 0xFF); + OF_HASH_ADD(hash, port & 0xFF); + + ADD_STR_HASH(user); + ADD_STR_HASH(password); + ADD_STR_HASH(path); + ADD_STR_HASH(parameters); + ADD_STR_HASH(query); + ADD_STR_HASH(fragment); + + OF_HASH_FINALIZE(hash); + + return hash; +} - copy { OFURL *new = [[OFURL alloc] init]; @@ -211,50 +243,115 @@ - (OFString*)scheme { return [[scheme copy] autorelease]; } + +- (void)setScheme: (OFString*)scheme_ +{ + if (![scheme_ isEqual: @"http"] && ![scheme_ isEqual: @"https"]) + @throw [OFInvalidArgumentException newWithClass: isa + selector: _cmd]; + + OFString *old = scheme; + scheme = [scheme_ copy]; + [old release]; +} - (OFString*)host { return [[host copy] autorelease]; } + +- (void)setHost: (OFString*)host_ +{ + OFString *old = host; + host = [host_ copy]; + [old release]; +} - (uint16_t)port { return port; } + +- (void)setPort: (uint16_t)port_ +{ + port = port_; +} - (OFString*)user { return [[user copy] autorelease]; } + +- (void)setUser: (OFString*)user_ +{ + OFString *old = user; + user = [user_ copy]; + [old release]; +} - (OFString*)password { return [[password copy] autorelease]; } + +- (void)setPassword: (OFString*)password_ +{ + OFString *old = password; + password = [password_ copy]; + [old release]; +} - (OFString*)path { return [[path copy] autorelease]; } + +- (void)setPath: (OFString*)path_ +{ + OFString *old = path; + path = [path_ copy]; + [old release]; +} - (OFString*)parameters { return [[parameters copy] autorelease]; } + +- (void)setParameters: (OFString*)parameters_ +{ + OFString *old = parameters; + parameters = [parameters_ copy]; + [old release]; +} - (OFString*)query { return [[query copy] autorelease]; } + +- (void)setQuery: (OFString*)query_ +{ + OFString *old = query; + query = [query_ copy]; + [old release]; +} - (OFString*)fragment { return [[fragment copy] autorelease]; } + +- (void)setFragment: (OFString*)fragment_ +{ + OFString *old = fragment; + fragment = [fragment_ copy]; + [old release]; +} - (OFString*)description { OFMutableString *desc = [OFMutableString stringWithFormat: @"%s://", [scheme cString]];