This is MyObject.m in view mode; [Download] [Up]
#import "MyObject.h"
#import "Term.h"
#import "Modem.h"
#import "Fdset.h"
#import "Escaper.h"
#import "StringResponder.h"
void fdHandler(int fd, void *selfp)
{
id self = selfp;
[self getLine];
}
int normal_key(int c, id escaper)
{
static escape='~';
static esc_flag=0;
if (esc_flag==0) {
if (c==escape) {
esc_flag=1;
return(0);
}
else {
return(1);
}
}
else { /* esc_flag == 1 ..handle escaped character.. */
esc_flag=0;
if (c==escape) { /* send escape character if two in a row */
return(1);
}
[escaper doEscape:c];
return(0);
}
}
@implementation MyObject
- init;
{
// int seteuid(uid_t);
[super init];
seteuid(getuid());
term = [Term new];
escaper = [Escaper newEscaperWithTerm:term andModem:modem];
fdset = [Fdset new];
if (term==nil || fdset==nil || escaper==nil)
NXRunAlertPanel(NULL, "Problem initialising", NULL, NULL, NULL);
/* change terminal to raw mode */
[[[term setRaw] unSetEcho] unSetCrmod];
sr = [StringResponder new];
[sr addString:"CONNECT!" returnValue:connected];
[sr addString:"CONNECT 1200" returnValue:connect1200];
[sr addString:"CONNECT 2400" returnValue:connect2400];
[sr addString:"CONNECT 9600" returnValue:connect9600];
[sr addString:"NO CARRIER!" returnValue:no_carrier];
[sr addString:"BUSY!" returnValue:busy];
[sr addString:"AT" returnValue:modem_command];
[sr addString:"at" returnValue:modem_command];
// put back in later?
// if (argc>1) {
// [escaper readScript:argv[1]];
// }
return self;
}
- free;
{
if (fdHandlerInstalled) {
DPSRemoveFD(mfd);
if (mfd) close(mfd);
}
return [super free];
}
//
// delegate methods
//
- awakeFromNib;
{
static NXDefaultsVector tipDefaults = {
{"DebugLevel", "0"},
{"Speed", "9600"},
{"Parity", "NONE"},
{"Dial", ""},
{"Init", ""},
{"Port", "2"},
{"Flow", "NO"},
{"Capture", ""},
{"SendProtocol", "Xmodem"},
{"ReceiveProtocol", "Xmodem"},
{NULL}
};
int num;
char *string;
NXRegisterDefaults("IBTip", tipDefaults);
sscanf(NXGetDefaultValue("IBTip", "DebugLevel"), "%d", &debug);
[self resetConfig:self];
sscanf(NXGetDefaultValue("IBTip", "Speed"), "%d", &num);
if (strcmp(NXGetDefaultValue("IBTip", "Port"), "1") == 0)
if (strcmp(NXGetDefaultValue("IBTip", "Flow"), "YES") == 0)
string = "/dev/cufa";
else
string = "/dev/cua";
else
if (strcmp(NXGetDefaultValue("IBTip", "Flow"), "YES") == 0)
string = "/dev/cufb";
else
string = "/dev/cub";
modem = [Modem newPort:string speed:num];
if (modem) {
mfd = [modem getfd];
[fdset addfd:mfd]; // listen on the modem
DPSAddFD(mfd, fdHandler, self, NX_RUNMODALTHRESHOLD);
fdHandlerInstalled = YES;
if (strcmp(NXGetDefaultValue("IBTip", "Init"), "") != 0) {
[modem writeOut:NXGetDefaultValue("IBTip", "Init")];
[modem writeOut:"\r"];
}
} else {
NXRunAlertPanel(NULL, "Unable to open port %s", NULL, NULL, NULL, string);
[[output window] orderOut:self];
}
connectSound = [Sound findSoundFor:"Connected"];
return self;
}
- windowDidBecomeMain:sender;
{
[input selectText:self];
return self;
}
//
// action methods
//
- captureFile:sender
{
id savePanel = [SavePanel new];
if ([savePanel runModal] == NX_OKTAG) {
[captureFile setStringValue:[savePanel filename]];
[captureFileWell setStringValue:[savePanel filename]];
}
return self;
}
- configure:sender
{
char string[80];
if ([flow state])
NXWriteDefault("IBTip", "Flow", "YES");
else
NXWriteDefault("IBTip", "Flow", "NO");
sprintf(string, "%d", [port selectedTag]);
if (NXGetDefaultValue("IBTip", "Port") != string)
NXWriteDefault("IBTip", "Port", string);
sprintf(string, "%d", [[[speedPopup target] itemList] selectedTag]);
if (strcmp(NXGetDefaultValue("IBTip", "Speed"), string) != 0)
NXWriteDefault("IBTip", "Speed", string);
if (NXGetDefaultValue("IBTip", "Dial") != [dialString stringValue])
NXWriteDefault("IBTip", "Dial", [dialString stringValue]);
if (NXGetDefaultValue("IBTip", "Init") != [initString stringValue])
NXWriteDefault("IBTip", "Init", [initString stringValue]);
if (NXGetDefaultValue("IBTip", "Capture") != [captureFile stringValue])
NXWriteDefault("IBTip", "Capture", [captureFile stringValue]);
return self;
}
- dial:sender;
{
char temp[200];
char dialPrefix[]="ATDT", dialPostfix[]="\r";
// constants for now; later local var's of modem
sprintf(temp,"%s%s%s\n",dialPrefix, [dialString stringValue], dialPostfix);
[modem writeOut:temp];
dialing = TRUE;
return self;
}
- hangup:sender
{
[[term pushState] reset];
[modem hangup];
dialing = FALSE;
[term popState];
return self;
}
- receiveFile:sender
{
[[term pushState] reset];
[modem receive];
[term popState];
return self;
}
- reset:sender
{
[term reset];
return self;
}
- resetConfig:sender
{
// {"Parity", "NONE"},
// {"SendProtocol", "Xmodem"},
// {"ReceiveProtocol", "Xmodem"},
int num;
if (strcmp(NXGetDefaultValue("IBTip", "Flow"), "YES") == 0)
[flow setState:1];
else
[flow setState:0];
sscanf(NXGetDefaultValue("IBTip", "Port"), "%d", &num);
[port selectCellWithTag:num];
// sscanf(NXGetDefaultValue("IBTip", "Speed", "%d", &num);
// [[speedPopup target] selectCellWithTag:num];
[speedPopup setTitle:NXGetDefaultValue("IBTip", "Speed")];
[dialString setStringValue:NXGetDefaultValue("IBTip", "Dial")];
[initString setStringValue:NXGetDefaultValue("IBTip", "Init")];
[captureFile setStringValue:NXGetDefaultValue("IBTip", "Capture")];
[captureFileWell setStringValue:NXGetDefaultValue("IBTip", "Capture")];
return self;
}
- runScript:sender;
{
id openPanel = [OpenPanel new];
FILE *script;
char buf[MAXPATHLEN];
if ([openPanel runModal] == NX_OKTAG) {
if ((script = fopen([openPanel filename], "r")) == NULL) {
NXRunAlertPanel(NULL, "Can't read script", NULL, NULL, NULL);
return self;
}
while (feof(script) == 0) {
fgets(buf, MAXPATHLEN, script);
buf[strlen(buf)-1] = '\r';
[modem writeOut:buf];
sleep(2);
}
fclose(script);
}
return self;
}
- sendFile:sender
{
id openPanel = [OpenPanel new];
if ([openPanel runModal] == NX_OKTAG) {
[[term pushState] reset];
[modem sendFile:[openPanel filename]];
[term popState];
}
return self;
}
- sendLine:sender;
{
if(normal_key([input stringValue][0],escaper)) {
[modem writeOut:[input stringValue]];
[modem writeOut:"\r"];
}
[input setStringValue:""];
[input selectText:self];
return self;
}
/* check for zmodem invitation to download -- the ZRQINIT frame --
* else write characters to screen.
*/
#define ZDLE 030
- getLine;
{
char buf[16384];
int nfound;
static char ZRQINITseq[] = "~B0"; // the first char will be ZDLE
// static char cr='\r';
int i, chars;
char ch;
enum responses seen;
nfound = [fdset waitOnInputFor:0];
if (nfound < 0) {
[term reset];
perror("Fdset:waitOnInputFor had an error\n");
NXRunAlertPanel(NULL, "Fdset:waitOnInputFor had an error", NULL, NULL, NULL);
DPSRemoveFD(mfd); /* end of file */
[NXApp terminate:self];
}
while (nfound--) {
if ([fdset getReadyfd] == mfd) {
if (!trigger) { // initialize trigger
trigger = [StringResponder new];
ZRQINITseq[0] = ZDLE;
[trigger addString:ZRQINITseq returnValue:1];
}
chars = [modem readInto:buf];
if ([trigger inputString:buf]) {
[modem receiveZmodem];
} else {
for (i=0;i<chars;i++) {
ch = buf[i] &= 0x7f; //mask any parity bit
// if (ch == '\n')
// write(1,&cr,1);
}
}
}
}
if (dialing) {
for (i=0; i < strlen(buf); i++) { // convert end of line chars to !
if (buf[i] == '\r' || buf[i] == '\n') buf[i]='!';
}
seen = [sr inputString:buf];
dialing = FALSE;
switch (seen) {
case connected:
[connectSound play];
break;
case connect1200:
[modem setSpeed:1200];
[connectSound play];
break;
case connect2400:
[modem setSpeed:2400];
[connectSound play];
break;
case connect9600:
[modem setSpeed:9600];
[connectSound play];
break;
case no_carrier:
[self output:"modem detected no carrier, trying again...\n"];
[self dial:self];
break;
case busy:
[self output:"busy, trying again...\n"];
sleep(10);
[self dial:self];
break;
case no_dialtone:
[self output:"modem couldn't get dialtone; check phone\n"];
break;
case user_abort:
[self output:"User aborted dialing\n"];
break;
case modem_command:
dialing = TRUE; // still, check next line
break;
}
} else {
[self output:buf];
}
[input selectText:self];
return self;
}
- toggleCapture:sender
{
if ([modem isCapturing]) {
[captureMenu setTitle:"Capture"];
[modem endCapture];
} else {
[captureMenu setTitle:"End Capture"];
if (strcmp([captureFile stringValue], "") == 0)
[modem captureSessionInFile:"tip.record"];
else
[modem captureSessionInFile:[captureFile stringValue]];
}
return self;
}
- output:(char *)string;
{
[output setSel:[output textLength] :0];
[output replaceSel:string];
[output scrollSelToVisible];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.