This is NetTalkServer.m in view mode; [Download] [Up]
/**************************************************/ /* (c) 1994 by S Leuker, all rights reserved. */ /* This source code may be used as a basis for */ /* a server managing distributred objects. */ /* It is part of nettalkd, the server managing */ /* NetTalk clients. */ /**************************************************/ #import "NetTalkServer.h" #import <remote/NXConnection.h> #include <stdio.h> #import <machkit/NXPort.h> @implementation NetTalkServer - init { [super init]; clientList = [[List alloc] init]; channelList = [[List alloc] init]; connection = [NXConnection registerRoot:self withName:NETTALK]; [connection registerForInvalidationNotification:self]; [NXPort worryAboutPortInvalidation]; return self; } - run { [connection run]; return self; } - setTimeOut:(float)aTime { timeOut = aTime; return self; } - (float) timeOut { return timeOut; } /*****************************************************************/ /* Methods from the NTKPserver protocol */ /*****************************************************************/ - (id) clientList { return clientList; } - (id<NTKPserver>) addClient:(in id<NTKPclient>)aClient { id connectionToClient; connectionToClient = [(NXProxy*)aClient connectionForProxy]; [connectionToClient registerForInvalidationNotification:self]; [(NXProxy*)aClient setProtocolForProxy:@protocol(NTKPclient)]; [clientList addObjectIfAbsent:aClient]; [clientList makeObjectsPerform:@selector(newClientNamed:) with:(void*)[aClient uniqueName]]; [[clientList objectAt:0] setServerStarter:YES]; return self; } - (id<NTKPserver>) removeClient:(in id<NTKPclient>)aClient { int i = 0; char *uName; if ([clientList indexOf:aClient] == NX_NOT_IN_LIST) return nil; NX_DURING uName = (char *)[aClient uniqueName]; NX_HANDLER uName = "UNKNOWN@UNKNOWN"; NX_ENDHANDLER [clientList removeObject:aClient]; if (aClient == serverStarter) { serverStarter = [clientList objectAt:0]; [serverStarter setServerStarter:YES]; } while (i < [clientList count]) { [(id<NTKPclient>)[clientList objectAt:i++] client:uName wantsToDisconnectForCode:"*"]; } return self; } - (id<NTKPclient>) findClientNamed:(const char *)uName { id client = nil; int i = 0; while (i < [clientList count]) { NX_DURING if (strcmp([[clientList objectAt:i] uniqueName], uName) == 0) { client = [clientList objectAt:i]; i = [clientList count]; } i++; NX_HANDLER [self removeClient:[clientList objectAt:i]]; NX_ENDHANDLER } return client; } - (oneway void) connect:(in id<NTKPclient>)me to:(in const char *)uName via:(in id)aServerText withCode:(in const char *)aCode topicIs:(in const char *)aTopic; { [[self findClientNamed:uName] client:[me uniqueName] sendsVia:aServerText forCode:aCode topicIs:aTopic]; } - (oneway void) disconnect:(in id<NTKPclient>)me from:(in const char *)uName forCode:(in const char *)aCode { [[self findClientNamed:uName] client:[me uniqueName] wantsToDisconnectForCode:aCode]; } - (oneway void) refuseConnection:(in id<NTKPclient>)me to:(in const char *)uName forCode:(in const char *)aCode { [[self findClientNamed:uName] client:[me uniqueName] refusesConnectionForCode:aCode]; } /*****************************************************************/ /* Methods from the NXSenderIsInvalid protocol */ /*****************************************************************/ - (id) senderIsInvalid:sender { int i = 0; BOOL replaceServerStarter = NO; while (i < [clientList count]) { if ([[(id)[clientList objectAt:i] connectionForProxy] isValid]) i++; else { if ([clientList objectAt:i] == serverStarter) replaceServerStarter = YES; [clientList removeObjectAt:i]; } } if (replaceServerStarter) { serverStarter = [clientList objectAt:0]; [serverStarter setServerStarter:YES]; } return self; } /*****************************************************************/ /* Methods from the NTKPtrading protocol */ /*****************************************************************/ - (const char *)hostList { return NULL; } - (BOOL)setAlternateHostName:(const char *)hostName { return NO; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.