This is ArchieServer.m in view mode; [Download] [Up]
#import "ArchieServer.h"
#import <appkit/appkit.h>
#import <ctype.h>
// Host browser cell string for custom archie server
static const char *CUSTOM_SERVER_STRING = "Custom Server";
@implementation ArchieServer
static List *archieServers;
static HashTable *archieServersByName;
/*\ ------ Initializing/accessing instance list ------ \*/
+ initArchieServers: serverTable
{
/* --- MethodDescription
ReturnValue: self if serverTable is not empty, Nil if it is;
Description: This method traverses the NXStringTable given by serverTable
and instantiates an ArchieServer object for each entry;
Args: serverTable: The NXStringTable with the server information;
*/
const char *key, *value;
NXHashState state;
ArchieServer *server;
if( [serverTable count] == 0 )
return Nil;
archieServers = [[List alloc] initCount: 0];
archieServersByName = [[HashTable alloc] initKeyDesc: "*" valueDesc: "@"];
state = [serverTable initState];
while([serverTable nextState: &state key: &key value: &value])
{ // Create next instance
server = [[ArchieServer alloc] initForName: key tableValue: value];
[archieServers addObject: server];
[archieServersByName insertKey: key value: server];
}
// Add a default 'Custom Server' object
server = [[ArchieServer alloc] initForName: CUSTOM_SERVER_STRING
tableValue: "123.345.678.90 (Your server)"];
[archieServers addObject: server];
[archieServersByName insertKey: CUSTOM_SERVER_STRING value: server];
return self;
}
+ (List *) archieServers
{
return archieServers;
}
+ archieServerAt:(int) index
{
/* --- MethodDescription
ReturnValue: The ArchieServer for index if it exists, nil otherwise;
Description: Retrieves and returns the ArchieSever instance from
the archieServers list. If the list is nil or the index does not
refer to a valid object nil is returned;
Args: index: the index into archieServers;
*/
ArchieServer *server;
if( archieServers == nil )
return nil;
server = [archieServers objectAt: index];
return server;
}
+ archieServerFor:(const char *) name
{
/* --- MethodDescription
ReturnValue: The ArchieServer for name if it exists, nil otherwise;
Description: Retrieves and returns the ArchieSever instance from
the archieServersByName list. If the table is nil or the name does
not refer to a valid object nil is returned;
Args: index: the index into archieServers;
*/
ArchieServer *server;
if( archieServersByName == nil )
return nil;
server = (ArchieServer *)[archieServersByName valueForKey: name];
return server;
}
/*\ ------ Instance methods ------ \*/
- initForName:(const char *) name tableValue:(const char *) value
{
/* --- MethodDescription
ReturnValue: self;
Description: Sets up the server instance from name and value. The
instance variables are simply pointer to or into the name and
value arguments since we assume that their storage is maintained
int the NXStringTable from which they were taken. The value string
is assumed to be of the form 'dot_dec_addr server_info'.;
Args:
name: the serverName string;
value: the 'dot_dec_addr server_info' string;
*/
int addrLen;
serverName = name;
addrLen = strspn(value, "0123456789.");
strncpy(serverDotAddr, value, addrLen);
serverInfo = value + addrLen;
// Move past any white space
while( *serverInfo != 0 && isspace(*serverInfo) )
serverInfo ++;
return self;
}
- (const char *) serverName
{
return serverName;
}
- (const char *) serverDotAddr
{
return serverDotAddr;
}
- (const char *) serverInfo
{
return serverInfo;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.