This is NetTalkThinker.Connecting.m in view mode; [Download] [Up]
#import "NetTalkThinker.h" #import "NetTalkClient.h" #import "OpenTalk.h" #import "TalkController.h" #import <appkit/appkit.h> #define NXLS(bla) NXLocalizedString(bla, 0, 0) #define COCA const char * @implementation NetTalkThinker(Connecting) - connect:sender { const char *aClientUName; TalkRequest *aRequest; const char *realUserName; View<NTKPclientview> *newClientView; TalkController *controller = nil; Window *talkWindow; if ([requestBrowser selectedCell] == nil) return 0; aRequest = [requestList objectAt: [[requestBrowser matrixInColumn:0] selectedRow]]; aClientUName = [aRequest requestUName]; realUserName = [[[client server] findClientNamed:aClientUName] realUserName]; if (talkWindow = [self connectionForTopic:[aRequest requestTopic]]) { // if (NXRunLocalizedAlertPanel) << Ask for permission >> controller = [talkWindow delegate]; } if (!controller) controller = [[self controllerClassFor: [[[aRequest requestDocument] class] name]] newFromNib]; if (controller) { [controller setup]; [controller markClientUNameInvited:aClientUName forCode:[aRequest requestCode]]; [controller setTopic:[aRequest requestTopic]]; newClientView = [controller addClientViewWith:[aRequest requestDocument] from:aClientUName forCode:[aRequest requestCode]]; [newClientView setUserName:realUserName]; [client sendConnectTo:aClientUName via:[controller document] withCode:[aRequest requestCode] topicIs:[aRequest requestTopic]]; [requestList removeObject:aRequest]; [aRequest free]; [requestBrowser reloadColumn:0]; [self setRequest:nil]; } else { NXRunLocalizedAlertPanel(NULL , "Alert", "CouldNotEstablishConnection" , "OK", NULL, NULL); } return self; } - insert:sender { const char *aClientUName; TalkRequest *aRequest; const char *realUserName; View<NTKPclientview> *newClientView; TalkController *controller; if ([requestBrowser selectedCell] == nil) return 0; aRequest = [requestList objectAt: [[requestBrowser matrixInColumn:0] selectedRow]]; aClientUName = [aRequest requestUName]; realUserName = [[[client server] findClientNamed:aClientUName] realUserName]; controller = [[NXApp mainWindow] delegate]; if ([controller isKindOf:[TalkController class]]) { newClientView = [controller addClientViewWith:[aRequest requestDocument] from:aClientUName forCode:[aRequest requestCode]]; [newClientView setUserName:realUserName]; [client sendConnectTo:aClientUName via:[controller document] withCode:[aRequest requestCode] topicIs:[controller topic]]; [requestList removeObject:aRequest]; [aRequest free]; [requestBrowser reloadColumn:0]; [self setRequest:nil]; } return self; } - refuse:sender { const char *aClientUName; TalkRequest *aRequest; if ([requestBrowser selectedCell] == nil) return 0; aRequest = [requestList objectAt: [[requestBrowser matrixInColumn:0] selectedRow]]; aClientUName = [aRequest requestUName]; [client sendRefuseTo:aClientUName forCode:[aRequest requestCode]]; [requestList removeObject:aRequest]; [aRequest free]; [requestBrowser reloadColumn:0]; [self setRequest:nil]; return self; } - (Window *) connectionFor:(COCA)aClientUName andCode:(COCA)aCode { id window = nil; int i = [[NXApp windowList] count]; while (i-- > 0) { window = [[NXApp windowList] objectAt:i]; if ([[window delegate] isKindOf:[TalkController class]]) { if ([[window delegate] hasClientUName:aClientUName andCode:aCode]) i = 0; else window = nil; } else window = nil; } return window; } - (Window *)connectionForTopic:(COCA)aTopic { id window = nil; int i = [[NXApp windowList] count]; COCA topic; while (i-- > 0) { window = [[NXApp windowList] objectAt:i]; if ([[window delegate] isKindOf:[TalkController class]]) { topic = [[window delegate] topic]; if ((topic) && (strcmp(topic, aTopic) == 0)) i = 0; else window = nil; } else window = nil; } return window; } - (TalkRequest *)requestFromUName:(COCA)uName forCode:(COCA)aCode { TalkRequest *request = nil; int i = [requestList count]; BOOL codesMatch; COCA requestCode; while (i-- > 0) { request = [requestList objectAt:i]; requestCode = [request requestCode]; if (aCode) { codesMatch = ((requestCode) && (strcmp(requestCode, aCode) == 0)); } else codesMatch = YES; if (codesMatch && (strcmp([request requestUName], uName) == 0)) i = 0; else request = nil; } return request; } - (const char *) realNameFor:(COCA)aClientUName { return [[[client server] findClientNamed:aClientUName] realUserName]; } @end @implementation NetTalkThinker(OpenTalkDelegate) - (int)getClientCount { int count; NX_DURING count = [[[client server] clientList] count]; NX_HANDLER count = 0; NX_ENDHANDLER return count; } - (int)getClientName:(char*)cName at:(int)pos { id peer; const char *realName; NX_DURING if ((pos < 0) || (pos >= [[[client server] clientList] count])) return NT_NOCLIENT; peer = [[[client server] clientList] objectAt:pos]; realName = [peer clientName]; strcpy(cName, realName); if (peer != client) free((char*)realName); NX_HANDLER strcpy(cName, NXLS("Invalid")); return 0; NX_ENDHANDLER return (peer != client); } - (int)getUniqueName:(char*)aClientUName at:(int)pos { id peer; COCA uName; NX_DURING if ((pos < 0) || (pos >= [[[client server] clientList] count])) return NT_NOCLIENT; peer = [[[client server] clientList] objectAt:pos]; uName = [peer uniqueName]; strcpy(aClientUName, uName); if (peer != client) free((char *)uName); NX_HANDLER strcpy(aClientUName, NXLS("Invalid")); return 0; NX_ENDHANDLER return (strcmp(aClientUName, [client uniqueName]) != 0); } @end @implementation NetTalkThinker(NetTalkClientDelegate) - (id) updateClientData { if (openTalkPanel) [openTalkPanel rescan:nil]; return self; } - (id) handleDisconnectFrom:(COCA)aClientUName forCode:(COCA)aCode { TalkRequest *aRequest; fprintf(stderr, "NetTalk: Disconnecting from %s for %s.\n", aClientUName, aCode); if (openTalkPanel) [openTalkPanel rescan:nil]; if ((aCode) && (strcmp(aCode, "*") == 0)) aCode = NULL; while (aRequest = [self requestFromUName:aClientUName forCode:aCode]) { [requestList removeObject:aRequest]; [aRequest free]; } [requestBrowser reloadColumn:0]; [self setRequest:nil]; return self; } - (id) handleRefuseFrom:(COCA)aClientUName forCode:(COCA)aCode { id window; window = [self connectionFor:aClientUName andCode:aCode]; if (window) { const char *userName; userName = [[[client server] findClientNamed:aClientUName] realUserName]; if (!userName) userName = aClientUName; NXRunLocalizedAlertPanel(NULL , "ConnectionRefused", "ConnectionRefused-1-User", "OK", 0, 0 , userName); [[[window delegate] viewForClientUName:aClientUName andCode:aCode] freeDocument:self]; } return self; } - (id) handleConnectFrom:(COCA)aClientUName via:aDocument withCode:(COCA)aCode topicIs:(COCA)aTopic { id window = nil; id controller; window = [self connectionFor:aClientUName andCode:aCode]; if (window) { controller = [window delegate]; if ([controller viewForClientUName:aClientUName andCode:aCode] != controller) return self; if (aTopic) { if ([controller topic]) { if (strcmp(aTopic, [controller topic]) != 0) { switch(NXRunLocalizedAlertPanel(NULL , "Attention" , "TopicChange-3-Name-Old-New" , "OK", "Keep", "Refuse" , [self realNameFor:aClientUName], [controller topic], aTopic)) { case NX_ALERTDEFAULT: [controller setTopic:aTopic]; break; case NX_ALERTALTERNATE: window = nil; break; case NX_ALERTOTHER: [client sendRefuseTo:aClientUName forCode:aCode]; return nil; break; } } } else window = nil; } else window = nil; } if (window) { View<NTKPclientview> *newClientView; newClientView = [[window delegate] addClientViewWith:aDocument from:aClientUName forCode:aCode]; [newClientView setUserName:[self realNameFor:aClientUName]]; [client sendConnectTo:aClientUName via:[(TalkController *)[window delegate] document] withCode:aCode topicIs:aTopic]; } else { if (![self requestFromUName:aClientUName forCode:aCode]) { TalkRequest *newRequest; [self newRequest:nil]; newRequest = [[TalkRequest alloc] initFor:aDocument from:aClientUName code:aCode topicIs:aTopic]; [requestList addObject:newRequest]; [requestBrowser reloadColumn:0]; } } return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.