23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#import "OFArray.h"
#import "OFString.h"
#import "OFXMLElement.h"
#import "OFAutoreleasePool.h"
#import "OFEnumerationMutationException.h"
#import "OFInvalidArgumentException.h"
#import "OFOutOfRangeException.h"
#import "macros.h"
struct of_dictionary_bucket of_dictionary_deleted_bucket = {};
#define DELETED &of_dictionary_deleted_bucket
|
>
|
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
|
return self;
}
- initWithSerialization: (OFXMLElement*)element
{
@try {
OFAutoreleasePool *pool, *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]])
@throw [OFInvalidArgumentException newWithClass: isa
selector: _cmd];
dictionary = [OFMutableDictionary dictionary];
pairs = [element elementsForName: @"pair"
namespace: OF_SERIALIZATION_NS];
enumerator = [pairs objectEnumerator];
pool2 = [[OFAutoreleasePool alloc] init];
while ((pair = [enumerator nextObject]) != nil) {
OFXMLElement *keyElement, *valueElement;
id <OFSerialization, OFCopying> key;
id <OFSerialization> 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];
[pool2 releaseObjects];
}
self = [self initWithDictionary: dictionary];
[pool release];
|
>
|
|
|
|
<
<
|
|
<
<
>
|
|
>
>
>
>
>
|
>
>
>
|
|
<
<
|
|
|
<
|
|
|
|
<
<
<
|
<
<
<
|
<
<
<
|
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 *pool2;
OFMutableDictionary *dictionary;
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];
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 ((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];
[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
|
*/
ret->isa = [OFString class];
return ret;
}
- (OFXMLElement*)XMLElementBySerializing
{
OFAutoreleasePool *pool, *pool2;
OFXMLElement *element;
OFEnumerator *keyEnumerator, *objectEnumerator;
id <OFSerialization> key, object;
element = [OFXMLElement elementWithName: @"object"
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];
keyElement = [OFXMLElement
elementWithName: @"key"
namespace: OF_SERIALIZATION_NS];
[keyElement addChild: [key XMLElementBySerializing]];
[pair addChild: keyElement];
valueElement = [OFXMLElement
elementWithName: @"value"
namespace: OF_SERIALIZATION_NS];
[valueElement addChild: [object XMLElementBySerializing]];
[pair addChild: valueElement];
[element addChild: pair];
[pool2 releaseObjects];
}
[pool release];
return element;
}
@end
@implementation OFDictionaryEnumerator
- initWithDictionary: (OFDictionary*)dictionary_
|
>
|
|
<
<
<
<
<
>
|
<
<
<
<
|
|
|
<
|
>
>
>
|
>
>
>
|
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 *pool2;
OFXMLElement *element;
OFEnumerator *keyEnumerator, *objectEnumerator;
id <OFSerialization> key, object;
element = [OFXMLElement elementWithName: [self className]
namespace: OF_SERIALIZATION_NS];
keyEnumerator = [self keyEnumerator];
objectEnumerator = [self objectEnumerator];
pool2 = [[OFAutoreleasePool alloc] init];
while ((key = [keyEnumerator nextObject]) != nil &&
(object = [objectEnumerator nextObject]) != nil) {
OFXMLElement *keyElement, *objectElement;
keyElement = [OFXMLElement
elementWithName: @"key"
namespace: OF_SERIALIZATION_NS];
[keyElement addChild: [key XMLElementBySerializing]];
objectElement = [OFXMLElement
elementWithName: @"object"
namespace: OF_SERIALIZATION_NS];
[objectElement addChild: [object XMLElementBySerializing]];
[element addChild: keyElement];
[element addChild: objectElement];
[pool2 releaseObjects];
}
[element retain];
@try {
[pool release];
} @finally {
[element autorelease];
}
return element;
}
@end
@implementation OFDictionaryEnumerator
- initWithDictionary: (OFDictionary*)dictionary_
|