Documentation and port name server fixes

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@17291 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
CaS 2003-07-22 08:52:37 +00:00
parent 6efeed0154
commit 1ba4b76c03
12 changed files with 230 additions and 169 deletions

View file

@ -4,6 +4,18 @@
* Source/NSUser.m: Use HOMEPATH in preference to USERPROFILE for * Source/NSUser.m: Use HOMEPATH in preference to USERPROFILE for
OPENSTEP compatibility and because USERPROFILE generally doesn't OPENSTEP compatibility and because USERPROFILE generally doesn't
work due to the presence of spaces. work due to the presence of spaces.
* Headers/gnustep/base/NSDebug.h: Minor documentation fix.
* Headers/gnustep/base/NSHashTable.h: ditto
* Headers/gnustep/base/NSPort.h: ditto
* Headers/gnustep/base/NSPortNameServer.h: ditto
* Source/DocMakefile: Document serialization classes
* Source/NSDebug.m: Fix broken cross reference
* Source/NSLog.m: ditto
* Source/NSMessagePortNameServer.m: Tidied
* Source/NSPortNameServer.m: Tidied and documented.
* Source/NSSocketPortNameServer.m: Documented and fixed methods
to return NO on failure rather than raising exception.
* Source/NSUndoManager.m: Fix documentation markup errors.
2003-07-21 Richard Frith-Macdonald <rfm@gnu.org> 2003-07-21 Richard Frith-Macdonald <rfm@gnu.org>

View file

@ -125,7 +125,7 @@ GS_EXPORT void GSDebugAllocationActiveRecordingObjects(Class c);
/** /**
* Returns an array containing all the allocated objects * Returns an array containing all the allocated objects
* of a certain class which have been recorded. * of a certain class which have been recorded.
* Presumably, you will immediately call -description on * Presumably, you will immediately call [NSObject-description] on
* them to find out the objects you are leaking. * them to find out the objects you are leaking.
* Warning - the objects are put in an array, so until * Warning - the objects are put in an array, so until
* the array is autoreleased, the objects are not released. * the array is autoreleased, the objects are not released.

View file

@ -50,22 +50,22 @@ typedef struct { void *map; void *node; size_t bucket; } NSHashEnumerator;
/** Callback functions. <br />*/ /** Callback functions. <br />*/
typedef struct _NSHashTableCallBacks typedef struct _NSHashTableCallBacks
{ {
/** hash() ... Hashing function. NOTE: Elements with equal values must have /** hash ... Hashing function. NOTE: Elements with equal values must have
* equal hash function values. <br />*/ * equal hash function values. <br />*/
unsigned int (*hash)(NSHashTable *, const void *); unsigned int (*hash)(NSHashTable *, const void *);
/** isEqual() ... Comparison function. <br />*/ /** isEqual ... Comparison function. <br />*/
BOOL (*isEqual)(NSHashTable *, const void *, const void *); BOOL (*isEqual)(NSHashTable *, const void *, const void *);
/** retain() ... Retaining function called when adding elements /** retain ... Retaining function called when adding elements
* to the table. <br />*/ * to the table. <br />*/
void (*retain)(NSHashTable *, const void *); void (*retain)(NSHashTable *, const void *);
/** release() ... Releasing function called when a data element is /** release ... Releasing function called when a data element is
* removed from the table. <br />*/ * removed from the table. <br />*/
void (*release)(NSHashTable *, void *); void (*release)(NSHashTable *, void *);
/** describe() ... Description function. <br />*/ /** describe ... Description function. <br />*/
NSString *(*describe)(NSHashTable *, const void *); NSString *(*describe)(NSHashTable *, const void *);
} NSHashTableCallBacks; } NSHashTableCallBacks;

View file

@ -22,6 +22,7 @@
AutogsdocSource: NSPort.m AutogsdocSource: NSPort.m
AutogsdocSource: NSSocketPort.m AutogsdocSource: NSSocketPort.m
AutogsdocSource: NSMessagePort.m
*/ */
#ifndef __NSPort_h_GNUSTEP_BASE_INCLUDE #ifndef __NSPort_h_GNUSTEP_BASE_INCLUDE
@ -115,9 +116,9 @@ typedef SOCKET NSSocketNativeHandle;
} }
+ (NSSocketPort*) existingPortWithNumber: (gsu16)number + (NSSocketPort*) existingPortWithNumber: (gsu16)number
onHost: (NSHost*)host; onHost: (NSHost*)aHost;
+ (NSSocketPort*) portWithNumber: (gsu16)number + (NSSocketPort*) portWithNumber: (gsu16)number
onHost: (NSHost*)host onHost: (NSHost*)aHost
forceAddress: (NSString*)addr forceAddress: (NSString*)addr
listener: (BOOL)shouldListen; listener: (BOOL)shouldListen;
@ -129,7 +130,7 @@ typedef SOCKET NSSocketNativeHandle;
- (void) handlePortMessage: (NSPortMessage*)m; - (void) handlePortMessage: (NSPortMessage*)m;
- (NSHost*) host; - (NSHost*) host;
- (gsu16) portNumber; - (gsu16) portNumber;
- (void) removeHandle: (GSTcpHandle*)h; - (void) removeHandle: (GSTcpHandle*)handle;
/* /*
{ {
@ -178,7 +179,7 @@ typedef SOCKET NSSocketNativeHandle;
- (int) _listener; - (int) _listener;
- (const unsigned char *) _name; - (const unsigned char *) _name;
+ (NSMessagePort*) _portWithName: (const unsigned char *)name + (NSMessagePort*) _portWithName: (const unsigned char *)socketName
listener: (BOOL)shouldListen; listener: (BOOL)shouldListen;
- (void) addHandle: (GSMessageHandle*)handle forSend: (BOOL)send; - (void) addHandle: (GSMessageHandle*)handle forSend: (BOOL)send;

View file

@ -1,5 +1,5 @@
/* Interface of NSPortNameServer class for Distributed Objects /** Interface of NSPortNameServer class for Distributed Objects
Copyright (C) 1998,1999 Free Software Foundation, Inc. Copyright (C) 1998,1999,2003 Free Software Foundation, Inc.
Written by: Richard Frith-Macdonald <richard@brainstorm.co.uk> Written by: Richard Frith-Macdonald <richard@brainstorm.co.uk>
Created: October 1998 Created: October 1998
@ -19,6 +19,11 @@
You should have received a copy of the GNU Library General Public You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free License along with this library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
AutogsdocSource: NSPortNameServer.m
AutogsdocSource: NSSocketPortNameServer.m
AutogsdocSource: NSMessagePortNameServer.m
*/ */
#ifndef __NSPortNameServer_h_GNUSTEP_BASE_INCLUDE #ifndef __NSPortNameServer_h_GNUSTEP_BASE_INCLUDE
@ -58,6 +63,13 @@
NSMapTable *_nameMap; /* Registered names information. */ NSMapTable *_nameMap; /* Registered names information. */
} }
+ (id) sharedInstance; + (id) sharedInstance;
+ (id) systemDefaultPortNameServer;
- (NSPort*) portForName: (NSString*)name;
- (NSPort*) portForName: (NSString*)name
onHost: (NSString*)host;
- (BOOL) registerPort: (NSPort*)port
forName: (NSString*)name;
- (BOOL) removePortForName: (NSString*)name;
@end @end

View file

@ -85,6 +85,7 @@ NSProxy.h \
NSRange.h \ NSRange.h \
NSRunLoop.h \ NSRunLoop.h \
NSScanner.h \ NSScanner.h \
NSSerialization.h \
NSSet.h \ NSSet.h \
NSString.h \ NSString.h \
NSTask.h \ NSTask.h \

View file

@ -644,7 +644,7 @@ GSDebugAllocationRemove(Class c, id o)
* containing all the allocated objects of a certain class * containing all the allocated objects of a certain class
* which have been recorded ... to start the recording, you need * which have been recorded ... to start the recording, you need
* to invoke GSDebugAllocationActiveRecordingObjects(). * to invoke GSDebugAllocationActiveRecordingObjects().
* Presumably, you will immediately call -description on them * Presumably, you will immediately call [NSObject-description] on them
* to find out the objects you are leaking. The objects are * to find out the objects you are leaking. The objects are
* returned in an array, so until the array is autoreleased, * returned in an array, so until the array is autoreleased,
* the objects are not released. * the objects are not released.

View file

@ -215,8 +215,8 @@ NSLog (NSString* format, ...)
* perform actual output. Locking is performed around the call to * perform actual output. Locking is performed around the call to
* the function actually writing the message out, to ensure that * the function actually writing the message out, to ensure that
* logging is thread-safe. However, the actual creation of the * logging is thread-safe. However, the actual creation of the
* message written is only as safe as the -description methods of * message written is only as safe as the [NSObject-description] methods
* the arguments you supply. * of the arguments you supply.
* </p> * </p>
* <p> * <p>
* The function to write the data is pointed to by * The function to write the data is pointed to by

View file

@ -74,31 +74,27 @@ static void clean_up_names(void)
{ {
if (defaultServer == nil) if (defaultServer == nil)
{ {
NSMessagePortNameServer *s;
[serverLock lock]; [serverLock lock];
if (defaultServer) if (defaultServer == nil)
{ {
[serverLock unlock]; defaultServer = (NSMessagePortNameServer *)NSAllocateObject(self,
return defaultServer; 0, NSDefaultMallocZone());
} }
s = (NSMessagePortNameServer *)NSAllocateObject(self, 0, NSDefaultMallocZone());
defaultServer = s;
[serverLock unlock]; [serverLock unlock];
} }
return defaultServer; return defaultServer;
} }
+(NSString *) _pathForName: (NSString *)name + (NSString *) _pathForName: (NSString *)name
{ {
NSString *path; static NSString *base_path = nil;
static NSString *base_path = nil; NSString *path;
[serverLock lock]; [serverLock lock];
if (!base_path) if (!base_path)
{ {
path=NSTemporaryDirectory(); path = NSTemporaryDirectory();
path = [path stringByAppendingPathComponent: @"NSMessagePort"]; path = [path stringByAppendingPathComponent: @"NSMessagePort"];
mkdir([path fileSystemRepresentation], 0700); mkdir([path fileSystemRepresentation], 0700);
@ -119,11 +115,11 @@ static NSString *base_path = nil;
} }
+(BOOL) _livePort: (NSString *)path + (BOOL) _livePort: (NSString *)path
{ {
FILE *f; FILE *f;
char socket_path[512]; char socket_path[512];
int pid; int pid;
struct stat sb; struct stat sb;
NSDebugLLog(@"NSMessagePort", @"_livePort: %@", path); NSDebugLLog(@"NSMessagePort", @"_livePort: %@", path);
@ -142,58 +138,57 @@ static NSString *base_path = nil;
fclose(f); fclose(f);
if (stat(socket_path,&sb)<0) if (stat(socket_path, &sb) < 0)
{ {
unlink([path fileSystemRepresentation]); unlink([path fileSystemRepresentation]);
NSDebugLLog(@"NSMessagePort", @"not live, couldn't stat socket (%m)"); NSDebugLLog(@"NSMessagePort", @"not live, couldn't stat socket (%m)");
return NO; return NO;
} }
if (kill(pid,0)<0) if (kill(pid, 0) < 0)
{ {
unlink([path fileSystemRepresentation]); unlink([path fileSystemRepresentation]);
unlink(socket_path); unlink(socket_path);
NSDebugLLog(@"NSMessagePort", @"not live, no such process (%m)"); NSDebugLLog(@"NSMessagePort", @"not live, no such process (%m)");
return NO; return NO;
} }
else
{
struct sockaddr_un sockAddr;
int desc;
{ memset(&sockAddr, '\0', sizeof(sockAddr));
struct sockaddr_un sockAddr; sockAddr.sun_family = AF_LOCAL;
int desc; strncpy(sockAddr.sun_path, socket_path, sizeof(sockAddr.sun_path));
memset(&sockAddr, '\0', sizeof(sockAddr)); if ((desc = socket(PF_LOCAL, SOCK_STREAM, PF_UNSPEC)) < 0)
sockAddr.sun_family = AF_LOCAL; {
strncpy(sockAddr.sun_path, socket_path, sizeof(sockAddr.sun_path)); unlink([path fileSystemRepresentation]);
unlink(socket_path);
if ((desc = socket(PF_LOCAL, SOCK_STREAM, PF_UNSPEC)) < 0) NSDebugLLog(@"NSMessagePort",
{ @"couldn't create socket, assuming not live (%m)");
unlink([path fileSystemRepresentation]); return NO;
unlink(socket_path); }
NSDebugLLog(@"NSMessagePort", @"couldn't create socket, assuming not live (%m)"); if (connect(desc, (struct sockaddr*)&sockAddr, SUN_LEN(&sockAddr)) < 0)
return NO; {
} unlink([path fileSystemRepresentation]);
if (connect(desc, (struct sockaddr*)&sockAddr, SUN_LEN(&sockAddr)) < 0) unlink(socket_path);
{ NSDebugLLog(@"NSMessagePort", @"not live, can't connect (%m)");
unlink([path fileSystemRepresentation]); return NO;
unlink(socket_path); }
NSDebugLLog(@"NSMessagePort", @"not live, can't connect (%m)"); close(desc);
return NO; NSDebugLLog(@"NSMessagePort", @"port is live");
} return YES;
close(desc); }
}
NSDebugLLog(@"NSMessagePort", @"port is live");
return YES;
} }
- (NSPort *) portForName: (NSString *)name - (NSPort*) portForName: (NSString *)name
onHost: (NSString *)host onHost: (NSString *)host
{ {
NSString *path; NSString *path;
FILE *f; FILE *f;
char socket_path[512]; char socket_path[512];
NSDebugLLog(@"NSMessagePort", @"portForName: %@ host: %@", name, host); NSDebugLLog(@"NSMessagePort", @"portForName: %@ host: %@", name, host);
@ -203,8 +198,8 @@ static NSString *base_path = nil;
return nil; return nil;
} }
path = [isa _pathForName: name]; path = [[self class] _pathForName: name];
if (![isa _livePort: path]) if (![[self class] _livePort: path])
{ {
NSDebugLLog(@"NSMessagePort", @"not a live port"); NSDebugLLog(@"NSMessagePort", @"not a live port");
return nil; return nil;
@ -228,24 +223,26 @@ static NSString *base_path = nil;
} }
- (BOOL) registerPort: (NSPort *)port - (BOOL) registerPort: (NSPort *)port
forName: (NSString *)name forName: (NSString *)name
{ {
int fd; int fd;
unsigned char buf[32]; unsigned char buf[32];
NSString *path; NSString *path;
const unsigned char *socket_name; const unsigned char *socket_name;
NSMutableArray *a;
NSDebugLLog(@"NSMessagePort", @"register %@ as %@\n", port, name); NSDebugLLog(@"NSMessagePort", @"register %@ as %@\n", port, name);
if (![port isKindOfClass: [NSMessagePort class]]) if ([port isKindOfClass: [NSMessagePort class]] == NO)
{ {
[NSException raise: NSInvalidArgumentException [NSException raise: NSInvalidArgumentException
format: @"Attempted to register a non-NSMessagePort with NSMessagePortNameServer"]; format: @"Attempted to register a non-NSMessagePort (%@)",
port];
return NO; return NO;
} }
path=[isa _pathForName: name]; path = [[self class] _pathForName: name];
if ([isa _livePort: path]) if ([[self class] _livePort: path])
{ {
NSDebugLLog(@"NSMessagePort", @"fail, is a live port"); NSDebugLLog(@"NSMessagePort", @"fail, is a live port");
return NO; return NO;
@ -267,38 +264,35 @@ static NSString *base_path = nil;
close(fd); close(fd);
{ [serverLock lock];
NSMutableArray *a; a = NSMapGet(portToNamesMap, port);
if (!a)
{
a = [[NSMutableArray alloc] init];
NSMapInsert(portToNamesMap, port, a);
RELEASE(a);
}
[serverLock lock]; [a addObject: [name copy]];
a = NSMapGet(portToNamesMap, port); [serverLock unlock];
if (!a)
{
a = [[NSMutableArray alloc] init];
NSMapInsert(portToNamesMap, port, a);
RELEASE(a);
}
[a addObject: [name copy]];
[serverLock unlock];
}
return YES; return YES;
} }
- (BOOL) removePortForName: (NSString *)name - (BOOL) removePortForName: (NSString *)name
{ {
NSString *path; NSString *path;
NSDebugLLog(@"NSMessagePort", @"removePortForName: %@", name); NSDebugLLog(@"NSMessagePort", @"removePortForName: %@", name);
path=[isa _pathForName: name]; path = [[self class] _pathForName: name];
unlink([path fileSystemRepresentation]); unlink([path fileSystemRepresentation]);
return YES; return YES;
} }
- (NSArray *) namesForPort: (NSPort *)port - (NSArray *) namesForPort: (NSPort *)port
{ {
NSMutableArray *a; NSMutableArray *a;
[serverLock lock]; [serverLock lock];
a = NSMapGet(portToNamesMap, port); a = NSMapGet(portToNamesMap, port);
a = [a copy]; a = [a copy];
@ -309,7 +303,7 @@ static NSString *base_path = nil;
- (BOOL) removePort: (NSPort *)port - (BOOL) removePort: (NSPort *)port
{ {
NSMutableArray *a; NSMutableArray *a;
int i; int i;
NSDebugLLog(@"NSMessagePort", @"removePort: %@", port); NSDebugLLog(@"NSMessagePort", @"removePort: %@", port);
@ -329,14 +323,14 @@ static NSString *base_path = nil;
- (BOOL) removePort: (NSPort*)port forName: (NSString*)name - (BOOL) removePort: (NSPort*)port forName: (NSString*)name
{ {
FILE *f; FILE *f;
char socket_path[512]; char socket_path[512];
NSString *path; NSString *path;
const unsigned char *port_path; const unsigned char *port_path;
NSDebugLLog(@"NSMessagePort", @"removePort: %@ forName: %@", port, name); NSDebugLLog(@"NSMessagePort", @"removePort: %@ forName: %@", port, name);
path = [isa _pathForName: name]; path = [[self class] _pathForName: name];
f = fopen([path fileSystemRepresentation], "rt"); f = fopen([path fileSystemRepresentation], "rt");
if (!f) if (!f)

View file

@ -26,41 +26,16 @@
#include "config.h" #include "config.h"
#include "Foundation/NSString.h" #include "Foundation/NSString.h"
#include "Foundation/NSByteOrder.h"
#include "Foundation/NSException.h" #include "Foundation/NSException.h"
#include "Foundation/NSAutoreleasePool.h"
#include "Foundation/NSLock.h"
#include "Foundation/NSFileHandle.h"
#include "Foundation/NSRunLoop.h"
#include "Foundation/NSNotificationQueue.h"
#include "Foundation/NSPort.h"
#include "Foundation/NSMapTable.h"
#include "Foundation/NSSet.h"
#include "Foundation/NSHost.h"
#include "Foundation/NSTask.h"
#include "Foundation/NSDate.h"
#include "Foundation/NSTimer.h"
#include "Foundation/NSPathUtilities.h"
#include "Foundation/NSPortNameServer.h" #include "Foundation/NSPortNameServer.h"
#include "Foundation/NSDebug.h" #include "Foundation/NSDebug.h"
#ifdef __MINGW__
#include <winsock2.h>
#include <wininet.h>
#else
#include <netinet/in.h>
#include <arpa/inet.h>
#endif
/*
* Protocol definition stuff for talking to gdomap process.
*/
#include "../Tools/gdomap.h"
#define stringify_it(X) #X
#define make_gdomap_port(X) stringify_it(X)
/**
* The abstract port name server class. This defines an API for
* working with port name servers ... objects used to manage access
* to ports in the distributed objects system (see [NSConnection]).
*/
@implementation NSPortNameServer @implementation NSPortNameServer
+ (id) allocWithZone: (NSZone*)aZone + (id) allocWithZone: (NSZone*)aZone
@ -77,6 +52,14 @@
} }
} }
/**
* Returns the default port name server for the process.<br />
* The MacOS-X documentation says that this is a nameserver
* dealing with NSMessagePort objects, but that is incompatible
* with OpenStep/OPENSTEP/NeXTstep behavior, so GNUstep returns
* a name server which deals with NSSocketPort objects capable
* of being used for inter-host communications.
*/
+ (id) systemDefaultPortNameServer + (id) systemDefaultPortNameServer
{ {
return [NSSocketPortNameServer sharedInstance]; return [NSSocketPortNameServer sharedInstance];
@ -89,11 +72,29 @@
format: @"attempt to deallocate default port name server"]; format: @"attempt to deallocate default port name server"];
} }
/**
* Looks up the port with the specified name on the local host and
* returns it or nil if no port is found with that name.<br />
* Different nameservers have different namespaces appropriate to the
* type of port they deal with, so failing to find a named port with one
* nameserver does not guarantee that a port does with that name does
* not exist.<br />
* This is a convenience method calling -portForName:onHost: with a nil
* host argument.
*/
- (NSPort*) portForName: (NSString*)name - (NSPort*) portForName: (NSString*)name
{ {
return [self portForName: name onHost: nil]; return [self portForName: name onHost: nil];
} }
/** <override-subclass />
* Looks up the port with the specified name on host and returns it
* or nil if no port is found with that name.<br />
* Different nameservers have different namespaces appropriate to the
* type of port they deal with, so failing to find a named port with one
* nameserver does not guarantee that a port does with that name does
* not exist.
*/
- (NSPort*) portForName: (NSString*)name - (NSPort*) portForName: (NSString*)name
onHost: (NSString*)host onHost: (NSString*)host
{ {
@ -101,6 +102,15 @@
return nil; return nil;
} }
/** <override-subclass />
* Registers port with the supplied name, so that other processes can
* look it up to contact it. A port may be registered with more than
* one name by making multiple calls to this method.<br />
* Returns YES on success, NO otherwise.<br />
* The common cause for failure is that another port is already registered
* with the name.
* Raises NSInvalidArgumentException if given bad arguments.
*/
- (BOOL) registerPort: (NSPort*)port - (BOOL) registerPort: (NSPort*)port
forName: (NSString*)name forName: (NSString*)name
{ {
@ -108,6 +118,13 @@
return NO; return NO;
} }
/** <override-subclass />
* Removes any port registration for the supplied name (whether
* registered in the current process or another).<br />
* The common cause for failure is that no port is registered
* with the name.<br />
* Raises NSInvalidArgumentException if given bad arguments.
*/
- (BOOL) removePortForName: (NSString*)name - (BOOL) removePortForName: (NSString*)name
{ {
[self subclassResponsibility: _cmd]; [self subclassResponsibility: _cmd];
@ -119,7 +136,8 @@
* Some extensions to make cleaning up port names easier. * Some extensions to make cleaning up port names easier.
*/ */
@implementation NSPortNameServer (GNUstep) @implementation NSPortNameServer (GNUstep)
/** Return all names for port /** <override-subclass />
* Return all names that have been registered with the receiver for port.
*/ */
- (NSArray*) namesForPort: (NSPort*)port - (NSArray*) namesForPort: (NSPort*)port
{ {
@ -128,8 +146,8 @@
} }
/** /**
* Remove all names for port. Probably inefficient ... subclasses * Remove all names registered with the receiver for port.
* should override this. * Probably inefficient ... subclasses might want to override this.
*/ */
- (BOOL) removePort: (NSPort*)port - (BOOL) removePort: (NSPort*)port
{ {
@ -147,8 +165,9 @@
return removed; return removed;
} }
/** /** <override-subclass />
* Remove the name if and only if it is registered by the given port. * Remove the name if and only if it is registered with the receiver
* for the given port.
*/ */
- (BOOL) removePort: (NSPort*)port forName: (NSString*)name - (BOOL) removePort: (NSPort*)port forName: (NSString*)name
{ {

View file

@ -171,7 +171,8 @@ typedef enum {
e = [userInfo objectForKey: GSFileHandleNotificationError]; e = [userInfo objectForKey: GSFileHandleNotificationError];
if (e != nil) if (e != nil)
{ {
NSDebugMLLog(@"NSSocketPortNameServer", @"failed connect to gdomap on %@ - %@", NSDebugMLLog(@"NSSocketPortNameServer",
@"failed connect to gdomap on %@ - %@",
[[notification object] socketAddress], e); [[notification object] socketAddress], e);
/* /*
* Remove our file handle, then either retry or fail. * Remove our file handle, then either retry or fail.
@ -527,6 +528,12 @@ typedef enum {
/**
* This is the nameserver handling ports used for distributed objects
* communications (see [NSConnection]) between hosts.<br />
* Use the +sharedInstance method to get a nameserver, rather than
* allocating and initialising one.
*/
@implementation NSSocketPortNameServer @implementation NSSocketPortNameServer
+ (id) allocWithZone: (NSZone*)aZone + (id) allocWithZone: (NSZone*)aZone
@ -550,6 +557,9 @@ typedef enum {
} }
} }
/**
* Returns the shared name server object for the process.
*/
+ (id) sharedInstance + (id) sharedInstance
{ {
if (defaultServer == nil) if (defaultServer == nil)
@ -562,7 +572,8 @@ typedef enum {
[serverLock unlock]; [serverLock unlock];
return defaultServer; return defaultServer;
} }
s = (NSSocketPortNameServer*)NSAllocateObject(self, 0, NSDefaultMallocZone()); s = (NSSocketPortNameServer*)NSAllocateObject(self, 0,
NSDefaultMallocZone());
s->_portMap = NSCreateMapTable(NSNonRetainedObjectMapKeyCallBacks, s->_portMap = NSCreateMapTable(NSNonRetainedObjectMapKeyCallBacks,
NSObjectMapValueCallBacks, 0); NSObjectMapValueCallBacks, 0);
s->_nameMap = NSCreateMapTable(NSObjectMapKeyCallBacks, s->_nameMap = NSCreateMapTable(NSObjectMapKeyCallBacks,
@ -674,11 +685,12 @@ typedef enum {
NS_HANDLER NS_HANDLER
{ {
/* /*
* If we had a problem - unlock before continueing. * If we had a problem - unlock before continuing.
*/ */
RELEASE(com); RELEASE(com);
[serverLock unlock]; [serverLock unlock];
[localException raise]; NSDebugMLLog(@"NSSocketPortNameServer", @"%@", localException);
return NO;
} }
NS_ENDHANDLER NS_ENDHANDLER
[serverLock unlock]; [serverLock unlock];
@ -778,10 +790,11 @@ typedef enum {
NS_HANDLER NS_HANDLER
{ {
/* /*
* If we had a problem - unlock before continueing. * If we had a problem - unlock before continuing.
*/ */
[serverLock unlock]; [serverLock unlock];
[localException raise]; NSDebugMLLog(@"NSSocketPortNameServer", @"%@", localException);
return NO;
} }
NS_ENDHANDLER NS_ENDHANDLER
[serverLock unlock]; [serverLock unlock];
@ -848,6 +861,11 @@ typedef enum {
[NSException raise: NSInvalidArgumentException [NSException raise: NSInvalidArgumentException
format: @"attempt to register nil port"]; format: @"attempt to register nil port"];
} }
if ([port isKindOfClass: [NSSocketPort class]] == NO)
{
[NSException raise: NSInvalidArgumentException
format: @"attempt to register non-NSSocketPort (%@)", port];
}
len = [name cStringLength]; len = [name cStringLength];
if (len == 0) if (len == 0)
{ {
@ -890,7 +908,8 @@ typedef enum {
if ([known count] == 0) if ([known count] == 0)
{ {
com = [GSPortCom new]; com = [GSPortCom new];
[com startPortUnregistration: [(NSSocketPort *)port portNumber] withName: nil]; [com startPortUnregistration: [(NSSocketPort*)port portNumber]
withName: nil];
while ([limit timeIntervalSinceNow] > 0 && [com isActive] == YES) while ([limit timeIntervalSinceNow] > 0 && [com isActive] == YES)
{ {
[loop runMode: mode [loop runMode: mode
@ -906,7 +925,8 @@ typedef enum {
} }
com = [GSPortCom new]; com = [GSPortCom new];
[com startPortRegistration: [(NSSocketPort *)port portNumber] withName: name]; [com startPortRegistration: [(NSSocketPort*)port portNumber]
withName: name];
while ([limit timeIntervalSinceNow] > 0 && [com isActive] == YES) while ([limit timeIntervalSinceNow] > 0 && [com isActive] == YES)
{ {
[loop runMode: mode beforeDate: limit]; [loop runMode: mode beforeDate: limit];
@ -987,11 +1007,12 @@ typedef enum {
NS_HANDLER NS_HANDLER
{ {
/* /*
* If we had a problem - close and unlock before continueing. * If we had a problem - close and unlock before continuing.
*/ */
DESTROY(com); DESTROY(com);
[serverLock unlock]; [serverLock unlock];
[localException raise]; NSDebugMLLog(@"NSSocketPortNameServer", @"%@", localException);
return NO;
} }
NS_ENDHANDLER NS_ENDHANDLER
[serverLock unlock]; [serverLock unlock];
@ -1090,11 +1111,11 @@ typedef enum {
NS_HANDLER NS_HANDLER
{ {
/* /*
* If we had a problem - unlock before continueing. * If we had a problem - unlock before continuing.
*/ */
RELEASE(com); RELEASE(com);
[serverLock unlock]; NSDebugMLLog(@"NSSocketPortNameServer", @"%@", localException);
[localException raise]; val = NO;
} }
NS_ENDHANDLER NS_ENDHANDLER
[serverLock unlock]; [serverLock unlock];
@ -1159,7 +1180,8 @@ typedef enum {
NS_HANDLER NS_HANDLER
{ {
[serverLock unlock]; [serverLock unlock];
[localException raise]; NSDebugMLLog(@"NSSocketPortNameServer", @"%@", localException);
return NO;
} }
NS_ENDHANDLER NS_ENDHANDLER
[serverLock unlock]; [serverLock unlock];

View file

@ -1,4 +1,4 @@
/** Implementatikon for <NSUndoManager> for GNUStep /** Implementation for NSUndoManager for GNUStep
Copyright (C) 1998 Free Software Foundation, Inc. Copyright (C) 1998 Free Software Foundation, Inc.
Written by: Richard Frith-Macdonald <richard@brainstorm.co.uk> Written by: Richard Frith-Macdonald <richard@brainstorm.co.uk>
@ -254,7 +254,7 @@ NSString *NSUndoManagerWillUndoChangeNotification =
* Returns whether the receiver has any action groupings * Returns whether the receiver has any action groupings
* on the stack to undo. It does not imply, that the * on the stack to undo. It does not imply, that the
* receiver is currently in a state to service an undo * receiver is currently in a state to service an undo
* request. Make sure [-endEndGrouping] is invoked before * request. Make sure [-endUndoGrouping] is invoked before
* requesting either an [-undo] or an [-undoNestedGroup]. * requesting either an [-undo] or an [-undoNestedGroup].
*/ */
- (BOOL) canUndo - (BOOL) canUndo
@ -380,7 +380,7 @@ NSString *NSUndoManagerWillUndoChangeNotification =
* Registers the invocation with the current undo grouping. * Registers the invocation with the current undo grouping.
* This method is part of the NSInvocation-based undo registration * This method is part of the NSInvocation-based undo registration
* as opposed to the simpler [-registerUndoWithTarget:selector:object:] * as opposed to the simpler [-registerUndoWithTarget:selector:object:]
* technique. <br/> * technique.<br />
* You generally never invoke this method directly. * You generally never invoke this method directly.
* Instead invoke [-prepareWithInvocationTarget:] with the target of the * Instead invoke [-prepareWithInvocationTarget:] with the target of the
* undo action and then invoke the targets method to undo the action * undo action and then invoke the targets method to undo the action
@ -388,16 +388,16 @@ NSString *NSUndoManagerWillUndoChangeNotification =
* which actually is the undo manager. * which actually is the undo manager.
* The runtime will then fallback to -forwardInvocation: to do the actual * The runtime will then fallback to -forwardInvocation: to do the actual
* registration of the invocation. * registration of the invocation.
* The invocation will added to the current grouping.<br/> * The invocation will added to the current grouping.<br />
* If the registrations have been disabled through [-disableUndoRegistration], * If the registrations have been disabled through [-disableUndoRegistration],
* this method does nothing.<br/> * this method does nothing.<br />
* Unless the reciever implicitly * Unless the reciever implicitly
* groups operations by event, the this method must have been preceeded * groups operations by event, the this method must have been preceeded
* with a [-beginUndoGrouping] message. Otherwise it will raise an * with a [-beginUndoGrouping] message. Otherwise it will raise an
* NSInternalInconsistencyException. <br/> * NSInternalInconsistencyException. <br />
* Unless this method is invoked as part of a [-undo] or [-undoNestedGroup] * Unless this method is invoked as part of a [-undo] or [-undoNestedGroup]
* processing, the redo stack is cleared.<br/> * processing, the redo stack is cleared.<br />
* If the reciever [-groupsByEvents] and this is the first call to this * If the reciever [-groupsByEvent] and this is the first call to this
* method since the last run loop processing, this method sets up * method since the last run loop processing, this method sets up
* the reciever to process the [-endUndoGrouping] at the * the reciever to process the [-endUndoGrouping] at the
* end of the event loop. * end of the event loop.
@ -554,7 +554,7 @@ NSString *NSUndoManagerWillUndoChangeNotification =
* Prepares the receiver to registers an invocation-based undo operation. * Prepares the receiver to registers an invocation-based undo operation.
* This method is part of the NSInvocation-based undo registration * This method is part of the NSInvocation-based undo registration
* as opposed to the simpler [-registerUndoWithTarget:selector:object:] * as opposed to the simpler [-registerUndoWithTarget:selector:object:]
* technique. <br/> * technique. <br />
* You invoke this method with the target of the * You invoke this method with the target of the
* undo action and then invoke the targets method to undo the action * undo action and then invoke the targets method to undo the action
* on the return value of this invocation * on the return value of this invocation
@ -576,7 +576,7 @@ NSString *NSUndoManagerWillUndoChangeNotification =
* on the redo stack, the top object is poped of the stack and invoked * on the redo stack, the top object is poped of the stack and invoked
* within a nested [-beginUndoGrouping]/[-endUndoGrouping]. During this * within a nested [-beginUndoGrouping]/[-endUndoGrouping]. During this
* pocessing, the operations registered for undo are recorded on the undo * pocessing, the operations registered for undo are recorded on the undo
* stack again.<br\> * stack again.<br />
*/ */
- (void) redo - (void) redo
{ {
@ -637,7 +637,7 @@ NSString *NSUndoManagerWillUndoChangeNotification =
/** /**
* Returns the full localized title of the actions to be displayed * Returns the full localized title of the actions to be displayed
* as a menu item. This method first invokes [-redoActionName] and * as a menu item. This method first invokes [-redoActionName] and
* passes it to [-redoMenuTitelForUndoActionName:] and returns the result. * passes it to [-redoMenuTitleForUndoActionName:] and returns the result.
*/ */
- (NSString*) redoMenuItemTitle - (NSString*) redoMenuItemTitle
{ {
@ -647,7 +647,7 @@ NSString *NSUndoManagerWillUndoChangeNotification =
/** /**
* Returns the localized title of the actions to be displayed * Returns the localized title of the actions to be displayed
* as a menu item identified by actionName, by appending a * as a menu item identified by actionName, by appending a
* localized command string like @"Redo <localized(actionName)>". * localized command string like @"Redo &lt;localized(actionName)&gt;".
*/ */
- (NSString*) redoMenuTitleForUndoActionName: (NSString*)actionName - (NSString*) redoMenuTitleForUndoActionName: (NSString*)actionName
{ {
@ -674,21 +674,21 @@ NSString *NSUndoManagerWillUndoChangeNotification =
* Registers an undo operation. * Registers an undo operation.
* This method is the simple target-action-based undo registration * This method is the simple target-action-based undo registration
* as opposed to the sophisticated [-forwardInvocation:] * as opposed to the sophisticated [-forwardInvocation:]
* mechanism. <br/> * mechanism. <br />
* You invoke this method with the target of the * You invoke this method with the target of the
* undo action providing the selector which can perform the undo with * undo action providing the selector which can perform the undo with
* the provided object. The object is often a dictionary of the * the provided object. The object is often a dictionary of the
* identifying the attribute and thier values before the change. * identifying the attribute and thier values before the change.
* The invocation will added to the current grouping.<br/> * The invocation will added to the current grouping.<br />
* If the registrations have been disabled through [-disableUndoRegistration], * If the registrations have been disabled through [-disableUndoRegistration],
* this method does nothing.<br/> * this method does nothing.<br />
* Unless the reciever implicitly * Unless the reciever implicitly
* groups operations by event, the this method must have been preceeded * groups operations by event, the this method must have been preceeded
* with a [-beginUndoGrouping] message. Otherwise it will raise an * with a [-beginUndoGrouping] message. Otherwise it will raise an
* NSInternalInconsistencyException. <br/> * NSInternalInconsistencyException. <br />
* Unless this method is invoked as part of a [-undo] or [-undoNestedGroup] * Unless this method is invoked as part of a [-undo] or [-undoNestedGroup]
* processing, the redo stack is cleared.<br/> * processing, the redo stack is cleared.<br />
* If the reciever [-groupsByEvents] and this is the first call to this * If the reciever [-groupsByEvent] and this is the first call to this
* method since the last run loop processing, this method sets up * method since the last run loop processing, this method sets up
* the reciever to process the [-endUndoGrouping] at the * the reciever to process the [-endUndoGrouping] at the
* end of the event loop. * end of the event loop.
@ -792,7 +792,7 @@ NSString *NSUndoManagerWillUndoChangeNotification =
/** /**
* Returns the run loop modes in which the receiver registers * Returns the run loop modes in which the receiver registers
* the [-endUndoGroup] processing when it [-groupsByEvent]. * the [-endUndoGrouping] processing when it [-groupsByEvent].
*/ */
- (NSArray*) runLoopModes - (NSArray*) runLoopModes
{ {
@ -854,7 +854,7 @@ NSString *NSUndoManagerWillUndoChangeNotification =
/** /**
* Sets the modes in which the reciever registers the calls * Sets the modes in which the reciever registers the calls
* with the current run loop to invoke * with the current run loop to invoke
* [-endUndoGroup] when it [-groupsByEvents]. This method * [-endUndoGrouping] when it [-groupsByEvent]. This method
* first cancels any pending registrations in the old modes and * first cancels any pending registrations in the old modes and
* registers the invokation in the new modes. * registers the invokation in the new modes.
*/ */
@ -914,7 +914,7 @@ NSString *NSUndoManagerWillUndoChangeNotification =
/** /**
* Returns the full localized title of the actions to be displayed * Returns the full localized title of the actions to be displayed
* as a menu item. This method first invokes [-undoActionName] and * as a menu item. This method first invokes [-undoActionName] and
* passes it to [-undoMenuTitelForUndoActionName:] and returns the result. * passes it to [-undoMenuTitleForUndoActionName:] and returns the result.
*/ */
- (NSString*) undoMenuItemTitle - (NSString*) undoMenuItemTitle
{ {
@ -924,7 +924,7 @@ NSString *NSUndoManagerWillUndoChangeNotification =
/** /**
* Returns the localized title of the actions to be displayed * Returns the localized title of the actions to be displayed
* as a menu item identified by actionName, by appending a * as a menu item identified by actionName, by appending a
* localized command string like @"Undo <localized(actionName)>". * localized command string like @"Undo &lt;localized(actionName)&gt;".
*/ */
- (NSString*) undoMenuTitleForUndoActionName: (NSString*)actionName - (NSString*) undoMenuTitleForUndoActionName: (NSString*)actionName
{ {
@ -955,7 +955,7 @@ NSString *NSUndoManagerWillUndoChangeNotification =
* on the undo stack, the top object is poped of the stack and invoked * on the undo stack, the top object is poped of the stack and invoked
* within a nested beginUndoGrouping/endUndoGrouping. During this * within a nested beginUndoGrouping/endUndoGrouping. During this
* pocessing, the undo operations registered for undo are recorded on the redo * pocessing, the undo operations registered for undo are recorded on the redo
* stack.<br\> * stack.<br />
*/ */
- (void) undoNestedGroup - (void) undoNestedGroup
{ {