This is TalkController.m in view mode; [Download] [Up]
#import "TalkController.h" #import "NetTalkThinker.h" #import <appkit/appkit.h> @implementation TalkController + newFromNib { NXRunLocalizedAlertPanel(NULL, "Alert", "TALKPROTO", "OK", NULL, NULL); return nil; } - init { [super init]; clientTable = [[HashTable alloc] initKeyDesc:"*" valueDesc:"@" capacity:0]; codeSet = NO; topic = NULL; return self; } - free { if (topic) free(topic); [clientTable empty]; [clientTable free]; return [super free]; } - setup { return self; } - (char *)keyFor:(const char *)aClientUName :(const char *)aCode { char *key; //#define DEBUGMALLOC #ifdef DEBUGMALLOC fprintf(stderr, "keyFor:%s :%s ", aClientUName, aCode); #endif key = malloc(strlen(aClientUName)+strlen(aCode)+2); #ifdef DEBUGMALLOC fprintf(stderr, "successful.\n"); #endif sprintf(key, "%s:%s", aClientUName, aCode); return key; } - (BOOL)clientIsDying:sender { return NO; } - (View *)addClientViewWith:(View *)aDocument from:(const char *)aClientUName forCode:(const char *)aCode { return nil; } - (const char *)connectionCode { if (!codeSet) { codeSet = YES; sprintf(connectionCode, "NTK%ux", (unsigned int)self); } return connectionCode; } - setConnectionCode:(const char*)aCode { NXBeep(); NXBeep(); codeSet = YES; strcpy(connectionCode, aCode); return self; } - (const char *)connectionName { return connectionUName; } - setConnectionName:(const char*)name { NXBeep(); NXBeep(); strcpy(connectionUName, name); return self; } - markClientUNameInvited:(const char *)aClientUName forCode:(const char *)aCode { char *key = [self keyFor:aClientUName :aCode]; [clientTable insertKey:key value:self]; return self; } - (BOOL)hasClientUName:(const char *)aClientUName andCode:(const char *)aCode { char *key = [self keyFor:aClientUName :aCode]; id value = [clientTable valueForKey:key]; free(key); return (value != nil); } - viewForClientUName:(const char *)aClientUName andCode:(const char *)aCode { char *key = [self keyFor:aClientUName :aCode]; id value = [clientTable valueForKey:key]; free(key); return value; } - removeClientUName:(const char *)aClientUName forCode:(const char *)aCode { char *key = [self keyFor:aClientUName :aCode]; [clientTable removeKey:key]; free(key); return self; } - (const char *)topic { return topic; } - setTopic:(const char*)aTopic { if (topic) free(topic); topic = NULL; if (aTopic) { topic = malloc(strlen(aTopic)+1); strcpy(topic, aTopic); } [[document window] setTitle:topic]; return self; } - (View *)document { return document; } - close:sender { if ([[document window] isDocEdited]) { switch (NXRunLocalizedAlertPanel(NULL , "Close" , "ReallyCloseConnections" , "Close", "Don't close", 0)) { case NX_ALERTDEFAULT: [[document window] setDocEdited:NO]; break; default: return nil; } } [[[NXApp delegate] client] sendDisconnectTo:connectionUName forCode:connectionCode]; [[document window] close]; return self; } - (BOOL)windowIsStayAbove { id window = [document window]; int number = [window windowNum]; int level; PScurrentwindowlevel(number, &level); return (level == NX_FLOATINGLEVEL); } - toggleStayAbove:sender { id window = [document window]; int number = [window windowNum]; int level; PScurrentwindowlevel(number, &level); if (level == NX_FLOATINGLEVEL) { PSsetwindowlevel(NX_NORMALLEVEL, number); } else { PSsetwindowlevel(NX_FLOATINGLEVEL, number); } return self; } @end @implementation TalkController(WindowDelegate) - windowWillClose:sender { if (![self close:sender]) return nil; [sender setDelegate:nil]; return [self free]; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.