@@ -17,10 +17,11 @@ #include "config.h" #import "OFSet.h" #import "OFSet_hashtable.h" #import "OFString.h" +#import "OFXMLElement.h" #import "OFAutoreleasePool.h" #import "OFNotImplementedException.h" static struct { @@ -60,10 +61,15 @@ arguments: (va_list)arguments { return [[OFSet_hashtable alloc] initWithObject: firstObject arguments: arguments]; } + +- initWithSerialization: (OFXMLElement*)element +{ + return [[OFSet_hashtable alloc] initWithSerialization: element]; +} - retain { return self; } @@ -170,10 +176,18 @@ } - initWithObject: (id)firstObject arguments: (va_list)arguments { + Class c = isa; + [self release]; + @throw [OFNotImplementedException newWithClass: c + selector: _cmd]; +} + +- initWithSerialization: (OFXMLElement*)element +{ Class c = isa; [self release]; @throw [OFNotImplementedException newWithClass: c selector: _cmd]; } @@ -314,10 +328,44 @@ [pool release]; return NO; } + +- (OFXMLElement*)XMLElementBySerializing +{ + OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; + OFAutoreleasePool *pool2; + OFXMLElement *element; + OFEnumerator *enumerator; + id object; + + if ([self isKindOfClass: [OFMutableSet class]]) + element = [OFXMLElement elementWithName: @"OFMutableSet" + namespace: OF_SERIALIZATION_NS]; + else + element = [OFXMLElement elementWithName: @"OFSet" + namespace: OF_SERIALIZATION_NS]; + + enumerator = [self objectEnumerator]; + + pool2 = [[OFAutoreleasePool alloc] init]; + while ((object = [enumerator nextObject]) != nil) { + [element addChild: [object XMLElementBySerializing]]; + + [pool2 releaseObjects]; + } + + [element retain]; + @try { + [pool release]; + } @finally { + [element autorelease]; + } + + return element; +} #ifdef OF_HAVE_BLOCKS - (void)enumerateObjectsUsingBlock: (of_set_enumeration_block_t)block { OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init];