23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
+
|
#import "OFArray.h"
#import "OFString.h"
#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 = {};
#define DELETED &of_dictionary_deleted_bucket
|
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
|
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
|
+
-
+
-
-
-
+
+
+
-
-
-
-
+
+
-
-
+
-
-
+
+
+
+
+
+
+
-
+
+
+
+
-
-
+
+
-
-
-
-
-
+
+
+
-
-
+
-
-
-
+
+
+
-
-
-
-
+
-
-
-
-
+
-
-
-
|
return self;
}
- initWithSerialization: (OFXMLElement*)element
{
@try {
OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init];
OFAutoreleasePool *pool, *pool2;
OFAutoreleasePool *pool2;
OFMutableDictionary *dictionary;
OFArray *pairs;
OFEnumerator *enumerator;
OFXMLElement *pair;
OFArray *keys, *objects;
OFEnumerator *keyEnumerator, *objectEnumerator;
OFXMLElement *keyElement, *objectElement;
pool = [[OFAutoreleasePool alloc] init];
if (![[element name] isEqual: @"object"] ||
![[element namespace] isEqual: OF_SERIALIZATION_NS] ||
if (![[element name] isEqual: [self className]] ||
![[element namespace] isEqual: OF_SERIALIZATION_NS])
![[[element attributeForName: @"class"] stringValue]
isEqual: [self className]])
@throw [OFInvalidArgumentException newWithClass: isa
selector: _cmd];
dictionary = [OFMutableDictionary dictionary];
pairs = [element elementsForName: @"pair"
namespace: OF_SERIALIZATION_NS];
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];
enumerator = [pairs objectEnumerator];
keyEnumerator = [keys objectEnumerator];
objectEnumerator = [objects objectEnumerator];
pool2 = [[OFAutoreleasePool alloc] init];
while ((keyElement = [keyEnumerator nextObject]) != nil &&
while ((pair = [enumerator nextObject]) != nil) {
OFXMLElement *keyElement, *valueElement;
(objectElement = [objectEnumerator nextObject]) != nil) {
OFXMLElement *key, *object;
id <OFSerialization, OFCopying> key;
id <OFSerialization> object;
keyElement = [pair elementForName: @"key"
namespace: OF_SERIALIZATION_NS];
valueElement = [pair
key = [[keyElement elementsForNamespace:
OF_SERIALIZATION_NS] firstObject];
object = [[objectElement elementsForNamespace:
elementForName: @"value"
namespace: OF_SERIALIZATION_NS];
OF_SERIALIZATION_NS] firstObject];
if (keyElement == nil || valueElement == nil)
@throw [OFInvalidArgumentException
newWithClass: isa
if (key == nil || object == nil)
@throw [OFInvalidFormatException
newWithClass: isa];
selector: _cmd];
key = [[keyElement elementForName: @"object"
namespace: OF_SERIALIZATION_NS]
objectByDeserializing];
[dictionary setObject: [object objectByDeserializing]
object = [[valueElement
elementForName: @"object"
namespace: OF_SERIALIZATION_NS]
objectByDeserializing];
forKey: [key objectByDeserializing]];
[dictionary setObject: object
forKey: key];
[pool2 releaseObjects];
}
self = [self initWithDictionary: dictionary];
[pool release];
|
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
|
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
|
+
-
+
-
+
-
-
-
-
-
+
-
+
-
-
-
-
-
-
+
+
-
+
-
-
+
+
+
+
-
+
+
+
+
|
*/
ret->isa = [OFString class];
return ret;
}
- (OFXMLElement*)XMLElementBySerializing
{
OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init];
OFAutoreleasePool *pool, *pool2;
OFAutoreleasePool *pool2;
OFXMLElement *element;
OFEnumerator *keyEnumerator, *objectEnumerator;
id <OFSerialization> 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;
OFXMLElement *keyElement, *objectElement;
pair = [OFXMLElement elementWithName: @"pair"
namespace: OF_SERIALIZATION_NS];
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]];
[objectElement addChild: [object XMLElementBySerializing]];
[pair addChild: valueElement];
[element addChild: pair];
[element addChild: keyElement];
[element addChild: objectElement];
[pool2 releaseObjects];
}
[element retain];
@try {
[pool release];
[pool release];
} @finally {
[element autorelease];
}
return element;
}
@end
@implementation OFDictionaryEnumerator
- initWithDictionary: (OFDictionary*)dictionary_
|