mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-23 00:41:02 +00:00
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:
parent
210daa2f78
commit
55e35306a2
4 changed files with 52 additions and 70 deletions
|
@ -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])
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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__)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue