diff --git a/ChangeLog b/ChangeLog index 460ac4617..ddd91c909 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2015-08-23 Fred Kiefer + + * Source/NSBundleAdditions.m, + * Source/NSNibConnector.m: Move NSNibConnector and subclasses in + separate file. Add isEqual: method from Gorm. Switch to new + libobjc runtime ivar access for NSNibOutletConnector. + * Source/GNUmakefile: Add new file NSNibConnector.m + * Source/GSXibLoader.m: Similar change to IBOutletConnection. + Replace GSMime base64 decode method with standard one. + * Source/GSImageMagickImageRep.m, + * Source/GSTheme.m: Remove unused #import. + 2015-08-23 Fred Kiefer * Source/NSInputManager.m: Add binding processing code for escape diff --git a/Source/GNUmakefile b/Source/GNUmakefile index 35c27c183..500d99c69 100644 --- a/Source/GNUmakefile +++ b/Source/GNUmakefile @@ -121,6 +121,7 @@ NSMenuItemCell.m \ NSMovie.m \ NSMovieView.m \ NSNib.m \ +NSNibConnector.m \ NSNibBindingConnector.m \ NSNibAXAttributeConnector.m \ NSNibAXRelationshipConnector.m \ diff --git a/Source/GSImageMagickImageRep.m b/Source/GSImageMagickImageRep.m index 5b75f7289..3cbb08280 100644 --- a/Source/GSImageMagickImageRep.m +++ b/Source/GSImageMagickImageRep.m @@ -31,10 +31,10 @@ #import #import #import +#import #import #import #import -#import #import "AppKit/NSBitmapImageRep.h" #import "AppKit/NSGraphics.h" #import "AppKit/NSPasteboard.h" diff --git a/Source/GSTheme.m b/Source/GSTheme.m index a84f3aefd..58c979c49 100644 --- a/Source/GSTheme.m +++ b/Source/GSTheme.m @@ -39,7 +39,6 @@ #import #import #import -#import "GNUstepBase/GSObjCRuntime.h" #import "GNUstepGUI/GSTheme.h" #import "AppKit/NSApplication.h" #import "AppKit/NSButtonCell.h" diff --git a/Source/GSXibLoader.m b/Source/GSXibLoader.m index 7d6227f8c..5dbae8a50 100644 --- a/Source/GSXibLoader.m +++ b/Source/GSXibLoader.m @@ -38,7 +38,6 @@ #import #import #import -#import #import "AppKit/NSApplication.h" #import "AppKit/NSNib.h" @@ -330,20 +329,18 @@ } else { - const char *nam = [label cString]; - const char *type; - unsigned int size; - int offset; - - /* - * Use the GNUstep additional function to set the instance - * variable directly. - * FIXME - need some way to do this for libFoundation and - * Foundation based systems. + /* + * We cannot use the KVC mechanism here, as this would always retain _dst + * and it could also affect _setXXX methods and _XXX ivars that aren't + * affected by the Cocoa code. */ - if (GSObjCFindVariable(source, nam, &type, &size, &offset)) - { - GSObjCSetVariable(source, offset, size, (void*)&destination); + const char *name = [label cString]; + Class class = object_getClass(source); + Ivar ivar = class_getInstanceVariable(class, name); + + if (ivar != 0) + { + object_setIvar(source, ivar, destination); } } } @@ -1583,10 +1580,11 @@ didStartElement: (NSString*)elementName if ([type isEqualToString: @"base64-UTF8"]) { - NSData *d = [new dataUsingEncoding: NSASCIIStringEncoding]; - d = [GSMimeDocument decodeBase64: d]; + NSData *d = [[NSData alloc] initWithBase64EncodedString: new + options: 0]; new = AUTORELEASE([[NSString alloc] initWithData: d encoding: NSUTF8StringEncoding]); + RELEASE(d); } // empty strings are not nil! @@ -1697,9 +1695,8 @@ didStartElement: (NSString*)elementName } else if ([@"bytes" isEqualToString: elementName]) { - id new = [[element value] dataUsingEncoding: NSASCIIStringEncoding - allowLossyConversion: NO]; - new = [GSMimeDocument decodeBase64: new]; + id new = AUTORELEASE([[NSData alloc] initWithBase64EncodedString: [element value] + options: 0]); if (objID != nil) [decoded setObject: new forKey: objID]; diff --git a/Source/NSBundleAdditions.m b/Source/NSBundleAdditions.m index edb5ba5df..b94d34e58 100644 --- a/Source/NSBundleAdditions.m +++ b/Source/NSBundleAdditions.m @@ -33,200 +33,16 @@ #import "config.h" #import #import -#import #import #import #import -#import #import #import #import -#import -#import "AppKit/NSControl.h" #import "AppKit/NSNib.h" -#import "AppKit/NSNibConnector.h" #import "AppKit/NSNibLoading.h" #import "GNUstepGUI/GSModelLoaderFactory.h" -@implementation NSNibConnector - -- (void) dealloc -{ - RELEASE(_src); - RELEASE(_dst); - RELEASE(_tag); - [super dealloc]; -} - -- (id) destination -{ - return _dst; -} - -- (void) encodeWithCoder: (NSCoder*)aCoder -{ - if ([aCoder allowsKeyedCoding]) - { - if (_src != nil) - { - [aCoder encodeObject: _src forKey: @"NSSource"]; - } - if (_dst != nil) - { - [aCoder encodeObject: _dst forKey: @"NSDestination"]; - } - if (_tag != nil) - { - [aCoder encodeObject: _tag forKey: @"NSLabel"]; - } - } - else - { - [aCoder encodeObject: _src]; - [aCoder encodeObject: _dst]; - [aCoder encodeObject: _tag]; - } -} - -- (void) establishConnection -{ -} - -- (id) initWithCoder: (NSCoder*)aDecoder -{ - if ([aDecoder allowsKeyedCoding]) - { - if ([aDecoder containsValueForKey: @"NSDestination"]) - { - ASSIGN(_dst, [aDecoder decodeObjectForKey: @"NSDestination"]); - } - if ([aDecoder containsValueForKey: @"NSSource"]) - { - ASSIGN(_src, [aDecoder decodeObjectForKey: @"NSSource"]); - } - if ([aDecoder containsValueForKey: @"NSLabel"]) - { - ASSIGN(_tag, [aDecoder decodeObjectForKey: @"NSLabel"]); - } - } - else - { - [aDecoder decodeValueOfObjCType: @encode(id) at: &_src]; - [aDecoder decodeValueOfObjCType: @encode(id) at: &_dst]; - [aDecoder decodeValueOfObjCType: @encode(id) at: &_tag]; - } - return self; -} - -- (NSString*) label -{ - return _tag; -} - -- (void) replaceObject: (id)anObject withObject: (id)anotherObject -{ - if (_src == anObject) - { - ASSIGN(_src, anotherObject); - } - if (_dst == anObject) - { - ASSIGN(_dst, anotherObject); - } - if (_tag == anObject) - { - ASSIGN(_tag, anotherObject); - } -} - -- (id) source -{ - return _src; -} - -- (void) setDestination: (id)anObject -{ - ASSIGN(_dst, anObject); -} - -- (void) setLabel: (NSString*)label -{ - ASSIGN(_tag, label); -} - -- (void) setSource: (id)anObject -{ - ASSIGN(_src, anObject); -} - -- (NSString *)description -{ - NSString *desc = [NSString stringWithFormat: @"<%@ src=%@ dst=%@ label=%@>", - [super description], - [self source], - [self destination], - [self label]]; - return desc; -} -@end - -@implementation NSNibControlConnector -- (void) establishConnection -{ - SEL sel = NSSelectorFromString(_tag); - - [_src setTarget: _dst]; - [_src setAction: sel]; -} -@end - -@implementation NSNibOutletConnector -- (void) establishConnection -{ - NS_DURING - { - if (_src != nil) - { - NSString *selName; - SEL sel; - - selName = [NSString stringWithFormat: @"set%@%@:", - [[_tag substringToIndex: 1] uppercaseString], - [_tag substringFromIndex: 1]]; - sel = NSSelectorFromString(selName); - - if (sel && [_src respondsToSelector: sel]) - { - [_src performSelector: sel withObject: _dst]; - } - else - { - const char *nam = [_tag cString]; - const char *type; - unsigned int size; - int offset; - - /* - * Use the GNUstep additional function to set the instance - * variable directly. - * FIXME - need some way to do this for libFoundation and - * Foundation based systems. - */ - if (GSObjCFindVariable(_src, nam, &type, &size, &offset)) - { - GSObjCSetVariable(_src, offset, size, (void*)&_dst); - } - } - } - } - NS_HANDLER - { - NSLog(@"Error while establishing connection %@: %@",self,[localException reason]); - } - NS_ENDHANDLER; -} -@end - @implementation NSBundle (NSBundleAdditions) + (BOOL) loadNibFile: (NSString*)fileName externalNameTable: (NSDictionary*)context diff --git a/Source/NSNibConnector.m b/Source/NSNibConnector.m new file mode 100644 index 000000000..49555ee54 --- /dev/null +++ b/Source/NSNibConnector.m @@ -0,0 +1,237 @@ +/* + NSNibConnector + + Implementation of NSNibConnector and subclasses + + Copyright (C) 1999, 2015 Free Software Foundation, Inc. + + Author: Richard Frith-Macdonald + Date: 1999 + Author: Fred Kiefer + Date: August 2015 + + This file is part of the GNUstep GUI Library. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; see the file COPYING.LIB. + If not, see or write to the + Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#import "config.h" +#import +#import +#import +#import "AppKit/NSControl.h" +#import "AppKit/NSNibConnector.h" + +@implementation NSNibConnector + +- (void) dealloc +{ + RELEASE(_src); + RELEASE(_dst); + RELEASE(_tag); + [super dealloc]; +} + +- (id) destination +{ + return _dst; +} + +- (void) encodeWithCoder: (NSCoder*)aCoder +{ + if ([aCoder allowsKeyedCoding]) + { + if (_src != nil) + { + [aCoder encodeObject: _src forKey: @"NSSource"]; + } + if (_dst != nil) + { + [aCoder encodeObject: _dst forKey: @"NSDestination"]; + } + if (_tag != nil) + { + [aCoder encodeObject: _tag forKey: @"NSLabel"]; + } + } + else + { + [aCoder encodeObject: _src]; + [aCoder encodeObject: _dst]; + [aCoder encodeObject: _tag]; + } +} + +- (void) establishConnection +{ +} + +- (id) initWithCoder: (NSCoder*)aDecoder +{ + if ([aDecoder allowsKeyedCoding]) + { + if ([aDecoder containsValueForKey: @"NSDestination"]) + { + ASSIGN(_dst, [aDecoder decodeObjectForKey: @"NSDestination"]); + } + if ([aDecoder containsValueForKey: @"NSSource"]) + { + ASSIGN(_src, [aDecoder decodeObjectForKey: @"NSSource"]); + } + if ([aDecoder containsValueForKey: @"NSLabel"]) + { + ASSIGN(_tag, [aDecoder decodeObjectForKey: @"NSLabel"]); + } + } + else + { + [aDecoder decodeValueOfObjCType: @encode(id) at: &_src]; + [aDecoder decodeValueOfObjCType: @encode(id) at: &_dst]; + [aDecoder decodeValueOfObjCType: @encode(id) at: &_tag]; + } + return self; +} + +- (BOOL) isEqual: (id)object +{ + BOOL result = NO; + + if([object isKindOfClass: [NSNibConnector class]] == NO) + { + return NO; + } + + if(self == object) + { + result = YES; + } + else if([[self source] isEqual: [object source]] && + [[self destination] isEqual: [object destination]] && + [[self label] isEqual: [object label]] && + ([self class] == [object class])) + { + result = YES; + } + return result; +} + +- (NSString*) label +{ + return _tag; +} + +- (void) replaceObject: (id)anObject withObject: (id)anotherObject +{ + if (_src == anObject) + { + ASSIGN(_src, anotherObject); + } + if (_dst == anObject) + { + ASSIGN(_dst, anotherObject); + } + if (_tag == anObject) + { + ASSIGN(_tag, anotherObject); + } +} + +- (id) source +{ + return _src; +} + +- (void) setDestination: (id)anObject +{ + ASSIGN(_dst, anObject); +} + +- (void) setLabel: (NSString*)label +{ + ASSIGN(_tag, label); +} + +- (void) setSource: (id)anObject +{ + ASSIGN(_src, anObject); +} + +- (NSString *)description +{ + NSString *desc = [NSString stringWithFormat: @"<%@ src=%@ dst=%@ label=%@>", + [super description], + [self source], + [self destination], + [self label]]; + return desc; +} +@end + +@implementation NSNibControlConnector +- (void) establishConnection +{ + SEL sel = NSSelectorFromString(_tag); + + [_src setTarget: _dst]; + [_src setAction: sel]; +} +@end + +@implementation NSNibOutletConnector +- (void) establishConnection +{ + NS_DURING + { + if (_src != nil) + { + NSString *selName; + SEL sel; + + selName = [NSString stringWithFormat: @"set%@%@:", + [[_tag substringToIndex: 1] uppercaseString], + [_tag substringFromIndex: 1]]; + sel = NSSelectorFromString(selName); + + if (sel && [_src respondsToSelector: sel]) + { + [_src performSelector: sel withObject: _dst]; + } + else + { + /* + * We cannot use the KVC mechanism here, as this would always retain _dst + * and it could also affect _setXXX methods and _XXX ivars that aren't + * affected by the Cocoa code. + */ + const char *name = [_tag cString]; + Class class = object_getClass(_src); + Ivar ivar = class_getInstanceVariable(class, name); + + if (ivar != 0) + { + object_setIvar(_src, ivar, _dst); + } + } + } + } + NS_HANDLER + { + NSLog(@"Error while establishing connection %@: %@", self, [localException reason]); + } + NS_ENDHANDLER; +} +@end