Rewrite NSProtocolChecker stuff ... seemed largely broken

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@19180 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Richard Frith-Macdonald 2004-04-25 07:06:41 +00:00
parent 210daa2f78
commit 55e35306a2
4 changed files with 52 additions and 70 deletions

View file

@ -1,3 +1,8 @@
2004-04-25 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSProtocolChecker.m: Rewrite ... appeared almost totally
non-functional.
2004-04-23 David Ayers <d.ayers@inode.at>
* Source/Additions/GSLock.m ([GSLazyLock -init])

View file

@ -36,18 +36,19 @@
// Creating a checker
+ (id) protocolCheckerWithTarget: (NSObject *)anObject
protocol: (Protocol *)aProtocol;
- (id) initWithTarget: (NSObject *)anObject protocol: (Protocol *)aProtocol;
+ (id) protocolCheckerWithTarget: (NSObject*)anObject
protocol: (Protocol*)aProtocol;
- (id) initWithTarget: (NSObject*)anObject
protocol: (Protocol*)aProtocol;
// Reimplemented NSObject methods
- (void)forwardInvocation: (NSInvocation *)anInvocation;
- (struct objc_method_description *) methodDescriptionForSelector: (SEL)aSelector;
- (void) forwardInvocation: (NSInvocation*)anInvocation;
// Getting information
- (Protocol *) protocol;
- (NSObject *) target;
- (Protocol*) protocol;
- (NSObject*) target;
@end

View file

@ -564,7 +564,7 @@ static NSFileManager* defaultManager = nil;
#endif
/* This is consitent with MacOSX - just return NO for an invalid path. */
if (path == nil)
if ([path length] == 0)
return NO;
#if defined(__MINGW__)
@ -719,7 +719,7 @@ static NSFileManager* defaultManager = nil;
#endif
/* This is consitent with MacOSX - just return NO for an invalid path. */
if (path == nil)
if ([path length] == 0)
return NO;
#if defined(__MINGW__)

View file

@ -3,26 +3,28 @@
Written by: Mike Kienenberger
Date: Jun 1998
Rewrite: Richard Frith-Macdonald
Date: April 2004
This file is part of the GNUstep Base Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
<title>NSProtocolChecker class reference</title>
$Date$ $Revision$
*/
*/
#include "config.h"
#include "GNUstepBase/preface.h"
@ -33,14 +35,13 @@
@implementation NSProtocolChecker
/*
/**
* Allocates and initializes an NSProtocolChecker instance that will
* forward any messages in the aProtocol protocol to anObject, its
* target. Thus, the checker can be vended in lieu of anObject to
* restrict the messages that can be sent to anObject. Returns the
* new instance.
*/
+ (id) protocolCheckerWithTarget: (NSObject*)anObject
protocol: (Protocol*)aProtocol
{
@ -48,51 +49,42 @@
protocol: aProtocol]);
}
- (void) dealloc
{
DESTROY(_myTarget);
[super dealloc];
}
/*
* Forwards any message to the delegate if the method is declared in
* the checker's protocol; otherwise raises an NSInvalidArgumentException.
*/
- (void) forwardInvocation: (NSInvocation*)anInvocation
{
unsigned int length;
void *buffer;
if ((struct objc_method_description *)NULL
!= [self methodDescriptionForSelector: [anInvocation selector]])
[[NSException exceptionWithName: NSInvalidArgumentException
reason: @"Method not declared in current protocol"
userInfo: nil] raise];
[anInvocation invokeWithTarget: _myTarget];
length = [[anInvocation methodSignature] methodReturnLength];
buffer = (void *)malloc(length);
[anInvocation getReturnValue: buffer];
if (0 == strcmp([[anInvocation methodSignature] methodReturnType],
[[anInvocation methodSignatureForSelector:
@selector(init: )] methodReturnType]) )
if (GSObjCIsInstance(_myTarget)
&& ![_myProtocol descriptionForInstanceMethod: [anInvocation selector]])
{
if (((id)buffer) == _myTarget)
{
buffer = self;
[anInvocation setReturnValue: buffer];
}
[NSException raise: NSInvalidArgumentException
format: @"<%s -%@> not declared",
[_myProtocol name], NSStringFromSelector([anInvocation selector])];
}
else if (![_myProtocol descriptionForClassMethod: [anInvocation selector]])
{
[NSException raise: NSInvalidArgumentException
format: @"<%s +%@> not declared",
[_myProtocol name], NSStringFromSelector([anInvocation selector])];
}
return;
}
[anInvocation invokeWithTarget: _myTarget];
}
- (id) init
{
_myProtocol = nil;
_myTarget = nil;
self = [self initWithTarget: nil protocol: nil];
return self;
}
/*
/**
* Initializes a newly allocated NSProtocolChecker instance that will
* forward any messages in the aProtocol protocol to anObject, its
* delegate. Thus, the checker can be vended in lieu of anObject to
@ -102,41 +94,25 @@
*/
- (id) initWithTarget: (NSObject*)anObject protocol: (Protocol*)aProtocol
{
[super init];
_myProtocol = aProtocol;
ASSIGN(_myTarget, anObject);
self = [super init];
if (self != nil)
{
_myProtocol = aProtocol;
ASSIGN(_myTarget, anObject);
}
return self;
}
/*
* Returns an Objective C description for a method in the checker's
* protocol, or NULL if aSelector isn't declared as an instance method
* in the protocol.
*/
- (struct objc_method_description*) methodDescriptionForSelector: (SEL)aSelector
{
return [_myProtocol descriptionForInstanceMethod: aSelector];
}
/*
/**
* Returns the protocol object the checker uses to verify whether a
* given message should be forwarded to its delegate, or the protocol
* checker should raise an NSInvalidArgumentException.
* given message should be forwarded to its delegate.
*/
- (Protocol*) protocol
{
if (nil == _myProtocol)
[[NSException exceptionWithName: NSInvalidArgumentException
reason: @"No protocol specified"
userInfo: nil] raise];
return _myProtocol;
}
/*
/**
* Returns the target of the NSProtocolChecker.
*/
- (NSObject*) target