From dfa18a81da2a8cde026bd61377c2c41c852649ae Mon Sep 17 00:00:00 2001 From: Fred Kiefer Date: Wed, 11 May 2011 08:53:31 +0000 Subject: [PATCH] * Source/GSXibLoader.m: Add support for the "array" and "dictionary" elements found in newer XIB files (Version >= 8). git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@33022 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 5 ++ Source/GSXibLoader.m | 198 +++++++++++++++++++++++++------------------ 2 files changed, 120 insertions(+), 83 deletions(-) diff --git a/ChangeLog b/ChangeLog index ccff6d04d..65dec19b3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2011-05-11 Fred Kiefer + + * Source/GSXibLoader.m: Add support for the "array" and + "dictionary" elements found in newer XIB files (Version >= 8). + 2011-05-11 Eric Wasylishen * Source/Functions.m: For functions which set the fill or stroke diff --git a/Source/GSXibLoader.m b/Source/GSXibLoader.m index 655653838..5deb89f1e 100644 --- a/Source/GSXibLoader.m +++ b/Source/GSXibLoader.m @@ -794,6 +794,94 @@ didStartElement: (NSString *)elementName } } +- (id) decodeObjectForXib: (GSXibElement*)element + forClassName: (NSString *)classname + withKey: (NSString *)key +{ + GSXibElement *last; + Class c = [self classForClassName: classname]; + id o, r; + id delegate = [self delegate]; + + if (c == nil) + { + c = [[self class] classForClassName: classname]; + if (c == nil) + { + c = NSClassFromString(classname); + if (c == nil) + { + c = [delegate unarchiver: self + cannotDecodeObjectOfClassName: classname + originalClasses: nil]; + if (c == nil) + { + [NSException raise: NSInvalidUnarchiveOperationException + format: @"[%@ -%@]: no class for name '%@'", + NSStringFromClass([self class]), + NSStringFromSelector(_cmd), + classname]; + } + } + } + } + + // push + last = currentElement; + currentElement = element; + + // Create instance. + o = [c allocWithZone: [self zone]]; + // Make sure the object stays around, even when replaced. + RETAIN(o); + if (key != nil) + [decoded setObject: o forKey: key]; + r = [o initWithCoder: self]; + if (r != o) + { + [delegate unarchiver: self + willReplaceObject: o + withObject: r]; + ASSIGN(o, r); + if (key != nil) + [decoded setObject: o forKey: key]; + } + r = [o awakeAfterUsingCoder: self]; + if (r != o) + { + [delegate unarchiver: self + willReplaceObject: o + withObject: r]; + ASSIGN(o, r); + if (key != nil) + [decoded setObject: o forKey: key]; + } + if (delegate != nil) + { + r = [delegate unarchiver: self didDecodeObject: o]; + if (r != o) + { + [delegate unarchiver: self + willReplaceObject: o + withObject: r]; + ASSIGN(o, r); + if (key != nil) + [decoded setObject: o forKey: key]; + } + } + // Balance the retain above + RELEASE(o); + + // pop + currentElement = last; + + if (key != nil) + { + NSDebugLLog(@"XIB", @"decoded object %@ for key %@", o, key); + } + return AUTORELEASE(o); +} + - (id) objectForXib: (GSXibElement*)element { NSString *elementName; @@ -807,90 +895,10 @@ didStartElement: (NSString *)elementName elementName = [element type]; if ([@"object" isEqualToString: elementName]) { - GSXibElement *last; NSString *classname = [element attributeForKey: @"class"]; - Class c = [self classForClassName: classname]; - id o, r; - id delegate = [self delegate]; - - if (c == nil) - { - c = [[self class] classForClassName: classname]; - if (c == nil) - { - c = NSClassFromString(classname); - if (c == nil) - { - c = [delegate unarchiver: self - cannotDecodeObjectOfClassName: classname - originalClasses: nil]; - if (c == nil) - { - [NSException raise: - NSInvalidUnarchiveOperationException - format: @"[%@ +%@]: no class for name '%@'", - NSStringFromClass([self class]), - NSStringFromSelector(_cmd), - classname]; - } - } - } - } - - // push - last = currentElement; - currentElement = element; - - // Create instance. - o = [c allocWithZone: [self zone]]; - // Make sure the object stays around, even when replaced. - RETAIN(o); - if (key != nil) - [decoded setObject: o forKey: key]; - r = [o initWithCoder: self]; - if (r != o) - { - [delegate unarchiver: self - willReplaceObject: o - withObject: r]; - ASSIGN(o, r); - if (key != nil) - [decoded setObject: o forKey: key]; - } - r = [o awakeAfterUsingCoder: self]; - if (r != o) - { - [delegate unarchiver: self - willReplaceObject: o - withObject: r]; - ASSIGN(o, r); - if (key != nil) - [decoded setObject: o forKey: key]; - } - if (delegate != nil) - { - r = [delegate unarchiver: self didDecodeObject: o]; - if (r != o) - { - [delegate unarchiver: self - willReplaceObject: o - withObject: r]; - ASSIGN(o, r); - if (key != nil) - [decoded setObject: o forKey: key]; - } - } - // Balance the retain above - RELEASE(o); - - // pop - currentElement = last; - - if (key != nil) - { - NSDebugLLog(@"XIB", @"decoded object %@ for key %@", o, key); - } - return AUTORELEASE(o); + return [self decodeObjectForXib: element + forClassName: classname + withKey: key]; } else if ([@"string" isEqualToString: elementName]) { @@ -998,6 +1006,30 @@ didStartElement: (NSString *)elementName return new; } + else if ([@"array" isEqualToString: elementName]) + { + NSString *classname = [element attributeForKey: @"class"]; + + if (classname == nil) + { + classname = @"NSArray"; + } + return [self decodeObjectForXib: element + forClassName: classname + withKey: key]; + } + else if ([@"dictionary" isEqualToString: elementName]) + { + NSString *classname = [element attributeForKey: @"class"]; + + if (classname == nil) + { + classname = @"NSDictionary"; + } + return [self decodeObjectForXib: element + forClassName: classname + withKey: key]; + } else { NSLog(@"Unknown element type %@", elementName);