ObjFW  Diff

Differences From Artifact [ec22393fcd]:

To Artifact [b73da14229]:


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_