This is NetTalkThinker.m in view mode; [Download] [Up]
#import "NetTalkThinker.h"
#import "NetTalkClient.h"
#import "OpenTalk.h"
#import "TalkController.h"
#import "MiscCode.subproj/MailSpeaker.h"
#import "MiscCode.subproj/MiscEmacsText.h"
#import <appkit/appkit.h>
#import <objc/objc-runtime.h>
#import <sys/types.h>
#import <ansi/ctype.h>
#import <bsd/pwd.h>
#define NXLS(bla) NXLocalizedString(bla, 0, 0)
@implementation NetTalkThinker
+ initialize
{
static NXDefaultsVector NetTalkDefaults =
{{NTD_AUTOLAUNCH, "YES"},
{NTD_MUTEALARM, "NO"},
{NTD_SOUNDNAME, "Ring.snd"},
{NTD_RINGSOUNDNAME, "Ring.snd"},
{NTD_RINGINGALLOWED, "YES"},
{NTD_SERVERLIST, "goanna.mpi-hd.mpg.de trantor.oph.rwth-aachen.de"},
{NTD_USESELECTED, "YES"},
{NTD_DEFAULTTOPIC, "blafasel"},
{NTD_NETNAME, ""},
{NULL, NULL}};
NXRegisterDefaults(APPNAME, NetTalkDefaults);
[MiscEmacsText poseAs:[Text class]];
return self;
}
- (BOOL)setPort
{
/* Should call this before any remote message to make sure Mail.app is
/ running and mailSpeaker 's port is current. Get named port ' Mail '.
/ This will launch Mail.app if not already.Get named port 'MailSendDemo'
/ (this is the one we will actually talk to).Set mailSpeaker 's port to be this one.
*/
port_t mailPort = NXPortFromName("Mail", NULL);
if (mailPort == PORT_NULL)
{
NXRunLocalizedAlertPanel(NULL
, "Accessing Mail", "Unable to connect to Mail.app"
, NULL, NULL, NULL);
return NO;
}
mailPort = NXPortFromName("MailSendDemo", NULL);
if (mailPort == PORT_NULL)
{
(NXRunLocalizedAlertPanel(NULL
, "Accessing Mail", "Unable to connect to Mail.app"
, NULL, NULL, NULL));
return NO;
}
[mailSpeaker setSendPort:mailPort];
return YES;
}
- sendComments:sender
{
char body[4096];
int winNum;
if ([self setPort])
{
sprintf(body, (const char *)NXLS("msg_comments")
, NTKVERSION, [client realUserName]);
[mailSpeaker openSend:&winNum];
[mailSpeaker setTo:NXLS("to_address") inWindow :winNum];
[mailSpeaker setSubject:NXLS("msg_nettalk") inWindow :winNum];
[mailSpeaker setBody:(const char *)body inWindow:winNum];
}
return self;
}
- (BOOL)closeActive:menuCell
{
BOOL shouldBeEnabled;
shouldBeEnabled = [[[NXApp mainWindow] delegate]
isKindOf:[TalkController class]];
if ([menuCell isEnabled] != shouldBeEnabled)
{
[menuCell setEnabled:shouldBeEnabled];
return YES; /* redisplay */
}
return NO; /* no change */
}
- (BOOL)stayAboveActive:menuCell
{
BOOL shouldBeEnabled;
id controller = [[NXApp mainWindow] delegate];
shouldBeEnabled = [controller isKindOf:[TalkController class]];
if ([controller windowIsStayAbove])
[menuCell setTitle:NXLS("Normal")];
else
[menuCell setTitle:NXLS("Stay above")];
[menuCell setEnabled:shouldBeEnabled];
return YES;
}
- free
{
[super free];
[requestList free];
return self;
}
- client
{
return client;
}
- showInfoPanel:sender
{
if (!infoPanel)
{
if ([NXApp loadNibSection:"Info.nib" owner:self withNames:NO] == nil)
return nil;
[infoPanel center];
}
[infoPanel makeKeyAndOrderFront:sender];
[versionField setStringValue:NTKVERSION];
return self;
}
- showPrefPanel:sender
{
if (!prefPanel)
{
if ([NXApp loadNibSection:"Preferences.nib" owner:self withNames:NO] == nil)
return nil;
[prefPanel setFrameAutosaveName:"Preferences"];
}
[prefPanel makeKeyAndOrderFront:sender];
return self;
}
- showRequestPanel:sender
{
if (!requestPanel)
{
return nil;
/* this shouldn't happen, because the panel is in NetTalk.nib! */
}
[requestPanel makeKeyAndOrderFront:sender];
return self;
}
- setRequest:sender
{
BOOL flag;
TalkRequest *theRequest;
Window *talkWindow = nil;
flag = ([requestBrowser selectedCell] != nil);
theRequest = [requestList objectAt:
[[requestBrowser matrixInColumn:0] selectedRow]];
talkWindow = [NXApp mainWindow];
if (![[talkWindow delegate] isKindOf:[TalkController class]])
talkWindow = nil;
[refuseButton setEnabled:flag];
[insertButton setEnabled:(talkWindow && flag)];
[connectButton setEnabled:flag];
if (theRequest)
[topicText setStringValue:[theRequest requestTopic]];
else
[topicText setStringValue:""];
[requestPanel display];
return self;
}
- openTalk:sender
{
OpenTalk *openTalk = [OpenTalk new];
char aClientUName[MAXPATHLEN];
Window *newWindow;
[openTalk setupPopupFrom:bundleList];
[openTalk setDelegate:self];
[openTalk setClassName:[currentControllerClass name]];
[openTalk setServerName:[client serverName]];
openTalkPanel = openTalk;
if ([openTalk runModal] == NX_OKTAG)
{
if ([self getUniqueName:aClientUName at:[openTalk clientNumber]]
== NT_NOCLIENT)
return nil;
if (([openTalk topic])
&& (newWindow = [self connectionForTopic:[openTalk topic]]))
{
[newWindow makeKeyAndOrderFront:nil];
[client
sendConnectTo:aClientUName
via:[[newWindow delegate] document]
withCode:[[newWindow delegate] connectionCode]
topicIs:[openTalk topic]];
[[newWindow delegate] markClientUNameInvited:aClientUName
forCode:[[newWindow delegate] connectionCode]];
}
else
{
TalkController *controller;
currentControllerClass = objc_lookUpClass([openTalk className]);
if (controller = [currentControllerClass newFromNib])
{
const char *topic = [openTalkPanel topic];
[controller setup];
[controller setTopic:topic];
[client
sendConnectTo:aClientUName
via:[controller document]
withCode:[controller connectionCode]
topicIs:topic];
[controller markClientUNameInvited:aClientUName
forCode:[controller connectionCode]];
}
}
}
openTalkPanel = nil;
return self;
}
@end
@implementation NetTalkThinker(BrowserDelegate)
- (int)browser:sender getNumRowsInColumn:(int)column
{
if ([requestList count] == 0)
[self _display:[imageList objectAt:0]];
return [requestList count];
}
- browser:sender loadCell:cell atRow:(int)row inColumn:(int)column
{
char title[1024];
TalkRequest *theRequest = [requestList objectAt:row];
const char *topic = [theRequest requestTopic];
const char *clientName;
clientName = [[[client server]
findClientNamed:[theRequest requestUName]] clientName];
if ((topic) && (topic[0]))
{
sprintf(title, "%s: %s", clientName, topic);
}
else
strcpy(title, clientName);
[cell setStringValue:title];
[cell setLoaded:YES];
[cell setLeaf:YES];
[cell setEnabled:YES];
return self;
}
@end
@implementation NetTalkThinker(ApplicationDelegate)
- appDidInit:sender
{
const char *value;
id connectionMenu = [connectionSubmenuCell target];
id windowMenu = [windowsSubmenuCell target];
/* load bundles containing talk stuff */
[self initializeBundles:NXApp];
/* Setting the AutoUpdate Messages for the MenuCells */
[conncloseCell setUpdateAction:@selector(closeActive:)
forMenu :connectionMenu];
[winCloseCell setUpdateAction:@selector(closeActive:)
forMenu :windowMenu];
[stayAboveCell setUpdateAction:@selector(stayAboveActive:)
forMenu :windowMenu];
[NXApp setAutoupdate:YES];
imageList = [[List alloc] init];
[imageList insertObject: [NXImage findImageNamed: "NetTalk"] at: 0];
[imageList insertObject: [NXImage findImageNamed: "OSTring1"] at: 1];
[imageList insertObject: [NXImage findImageNamed: "OSTring2"] at: 2];
[imageList insertObject: [NXImage findImageNamed: "OSTring3"] at: 3];
appTile = [NXImage findImageNamed: "NXAppTile"];
appIconContentView = [[NXApp appIcon] contentView];
client = [[NetTalkClient alloc] init];
if (!client)
{
[NXApp setDelegate:nil];
[NXApp terminate:nil];
}
[client setDelegate:self];
/* read defaults */
[[requestBrowser window] setFrameAutosaveName:"RequestPanel"];
if (value = NXGetDefaultValue([NXApp appName], "ShowRequestPanel"))
if (strcmp(value, "YES") == 0)
[[requestBrowser window] makeKeyAndOrderFront:nil];
if (!strcmp(NXGetDefaultValue([NXApp appName], "NXAutoLaunch"), "YES")
&& !strcmp(NXGetDefaultValue(APPNAME, NTD_AUTOLAUNCH), "YES"))
[NXApp hide:self];
value = NXGetDefaultValue(APPNAME, NTD_SOUNDNAME);
if (strrchr(value, '/') == NULL)
{
char path[MAXPATHLEN];
[[NXBundle mainBundle] getPath:path forResource:value ofType:NULL];
NXSetDefault(APPNAME, NTD_SOUNDNAME, path);
}
value = NXGetDefaultValue(APPNAME, NTD_RINGSOUNDNAME);
if (strrchr(value, '/') == NULL)
{
char path[MAXPATHLEN];
[[NXBundle mainBundle] getPath:path forResource:value ofType:NULL];
NXSetDefault(APPNAME, NTD_RINGSOUNDNAME, path);
}
requestList = [[List alloc] initCount:0];
[requestBrowser setAction:@selector(setRequest:)];
[requestBrowser setDoubleAction:@selector(connect:)];
[[requestBrowser window] setBecomeKeyOnlyIfNeeded:YES];
return self;
}
- appWillTerminate:sender
{
int count;
id window;
count = [[NXApp windowList] count];
while (count--)
{
window = [[NXApp windowList] objectAt:count];
if ([[window delegate] isKindOf:[TalkController class]])
[[window setDocEdited:NO] performClose:self];
}
[[client server] removeClient:client];
if ([[requestBrowser window] isVisible])
NXWriteDefault([NXApp appName], "ShowRequestPanel", "YES");
else
NXWriteDefault([NXApp appName], "ShowRequestPanel", "NO");
NXUpdateDefaults();
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.