@@ -25,10 +25,11 @@ #import "OFXMLElement.h" #import "OFAutoreleasePool.h" #import "OFEnumerationMutationException.h" #import "OFInvalidArgumentException.h" +#import "OFInvalidFormatException.h" #import "OFOutOfRangeException.h" #import "macros.h" struct of_dictionary_bucket of_dictionary_deleted_bucket = {}; @@ -476,57 +477,51 @@ } - initWithSerialization: (OFXMLElement*)element { @try { - OFAutoreleasePool *pool, *pool2; + OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; + OFAutoreleasePool *pool2; OFMutableDictionary *dictionary; - OFArray *pairs; - OFEnumerator *enumerator; - OFXMLElement *pair; - - pool = [[OFAutoreleasePool alloc] init]; - - if (![[element name] isEqual: @"object"] || - ![[element namespace] isEqual: OF_SERIALIZATION_NS] || - ![[[element attributeForName: @"class"] stringValue] - isEqual: [self className]]) + OFArray *keys, *objects; + OFEnumerator *keyEnumerator, *objectEnumerator; + OFXMLElement *keyElement, *objectElement; + + if (![[element name] isEqual: [self className]] || + ![[element namespace] isEqual: OF_SERIALIZATION_NS]) @throw [OFInvalidArgumentException newWithClass: isa selector: _cmd]; dictionary = [OFMutableDictionary dictionary]; - pairs = [element elementsForName: @"pair" - namespace: OF_SERIALIZATION_NS]; - enumerator = [pairs objectEnumerator]; + keys = [element elementsForName: @"key" + namespace: OF_SERIALIZATION_NS]; + objects = [element elementsForName: @"object" + namespace: OF_SERIALIZATION_NS]; + + if ([keys count] != [objects count]) + @throw [OFInvalidFormatException newWithClass: isa]; + + keyEnumerator = [keys objectEnumerator]; + objectEnumerator = [objects objectEnumerator]; pool2 = [[OFAutoreleasePool alloc] init]; - while ((pair = [enumerator nextObject]) != nil) { - OFXMLElement *keyElement, *valueElement; - id key; - id object; - - keyElement = [pair elementForName: @"key" - namespace: OF_SERIALIZATION_NS]; - valueElement = [pair - elementForName: @"value" - namespace: OF_SERIALIZATION_NS]; - - if (keyElement == nil || valueElement == nil) - @throw [OFInvalidArgumentException - newWithClass: isa - selector: _cmd]; - - key = [[keyElement elementForName: @"object" - namespace: OF_SERIALIZATION_NS] - objectByDeserializing]; - object = [[valueElement - elementForName: @"object" - namespace: OF_SERIALIZATION_NS] - objectByDeserializing]; - - [dictionary setObject: object - forKey: key]; + + while ((keyElement = [keyEnumerator nextObject]) != nil && + (objectElement = [objectEnumerator nextObject]) != nil) { + OFXMLElement *key, *object; + + key = [[keyElement elementsForNamespace: + OF_SERIALIZATION_NS] firstObject]; + object = [[objectElement elementsForNamespace: + OF_SERIALIZATION_NS] firstObject]; + + if (key == nil || object == nil) + @throw [OFInvalidFormatException + newWithClass: isa]; + + [dictionary setObject: [object objectByDeserializing] + forKey: [key objectByDeserializing]]; [pool2 releaseObjects]; } self = [self initWithDictionary: dictionary]; @@ -824,51 +819,49 @@ return ret; } - (OFXMLElement*)XMLElementBySerializing { - OFAutoreleasePool *pool, *pool2; + OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; + OFAutoreleasePool *pool2; OFXMLElement *element; OFEnumerator *keyEnumerator, *objectEnumerator; id key, object; - element = [OFXMLElement elementWithName: @"object" + element = [OFXMLElement elementWithName: [self className] namespace: OF_SERIALIZATION_NS]; - pool = [[OFAutoreleasePool alloc] init]; - [element addAttributeWithName: @"class" - stringValue: [self className]]; - keyEnumerator = [self keyEnumerator]; objectEnumerator = [self objectEnumerator]; - pool2 = [[OFAutoreleasePool alloc] init]; + while ((key = [keyEnumerator nextObject]) != nil && (object = [objectEnumerator nextObject]) != nil) { - OFXMLElement *pair, *keyElement, *valueElement; - - pair = [OFXMLElement elementWithName: @"pair" - namespace: OF_SERIALIZATION_NS]; + OFXMLElement *keyElement, *objectElement; keyElement = [OFXMLElement elementWithName: @"key" namespace: OF_SERIALIZATION_NS]; [keyElement addChild: [key XMLElementBySerializing]]; - [pair addChild: keyElement]; - valueElement = [OFXMLElement - elementWithName: @"value" + objectElement = [OFXMLElement + elementWithName: @"object" namespace: OF_SERIALIZATION_NS]; - [valueElement addChild: [object XMLElementBySerializing]]; - [pair addChild: valueElement]; + [objectElement addChild: [object XMLElementBySerializing]]; - [element addChild: pair]; + [element addChild: keyElement]; + [element addChild: objectElement]; [pool2 releaseObjects]; } - [pool release]; + [element retain]; + @try { + [pool release]; + } @finally { + [element autorelease]; + } return element; } @end