mirror of https://github.com/macssh/macssh.git
2914 lines
88 KiB
C
Executable File
2914 lines
88 KiB
C
Executable File
/* Configure.c
|
||
* New Configuration scheme (the death of config.tel)
|
||
*
|
||
* Revisions:
|
||
* 8/92 Telnet 2.6: Initial version. Jim Browne
|
||
*/
|
||
|
||
// BetterTelnet
|
||
// copyright 1997, 1998, 1999 Rolf Braun
|
||
|
||
// This is free software under the GNU General Public License (GPL). See the file COPYING
|
||
// which comes with the source code and documentation distributions for details.
|
||
|
||
// based on NCSA Telnet 2.7b5
|
||
|
||
// RAB BetterTelnet 2.0fc1 - seriously cleaned up large parts of this code
|
||
// (given that I had messed it up in previous versions :-)
|
||
|
||
#include "DlogUtils.proto.h"
|
||
#include "popup.h"
|
||
#include "popup.proto.h"
|
||
#include "configure.proto.h"
|
||
#include "netevent.proto.h" /* For Stask proto */
|
||
#include "prefs.proto.h"
|
||
#include "bkgr.proto.h" // For StartUpFTP proto
|
||
#include "menuseg.proto.h"
|
||
#include "macutil.proto.h"
|
||
#include "rsinterf.proto.h"
|
||
#include "LinkedList.proto.h"
|
||
#include "Sets.proto.h"
|
||
#include "movableModal.h"
|
||
#include "wind.h"
|
||
#include "Connections.proto.h"
|
||
#include "sshglue.proto.h"
|
||
#include "errors.proto.h"
|
||
#include "macros.proto.h"
|
||
#include "translate.proto.h"
|
||
|
||
/* ssh2.c */
|
||
extern void clearcachedpassphrase();
|
||
|
||
|
||
static Boolean isACopy(Str255 theName);//looks for an occurance of "copy" in a string
|
||
|
||
static pascal short TerminalModalProc( DialogPtr dptr, EventRecord *evt, short *item);
|
||
PROTO_UPP(TerminalModalProc, ModalFilter);
|
||
static pascal short SessionModalProc(DialogPtr dptr, EventRecord *evt, short *item);
|
||
PROTO_UPP(SessionModalProc, ModalFilter);
|
||
static pascal short MyDlogWListFilter( DialogPtr dptr, EventRecord *evt, short *item);
|
||
PROTO_UPP(MyDlogWListFilter, ModalFilter);
|
||
|
||
static pascal void listDitemproc(DialogPtr theDlg, short itemNo);
|
||
PROTO_UPP(listDitemproc, UserItem);
|
||
|
||
extern FTPServerPrefs* gFTPServerPrefs;
|
||
extern ApplicationPrefs* gApplicationPrefs;
|
||
extern MenuHandle myMenus[];
|
||
static void ZeroNumOnly(void);
|
||
static Boolean InNumOnly(short item);
|
||
|
||
/*static char configPassword[256], configPassword2[256];*/
|
||
static Str255 configPassword;
|
||
static Str255 configPassword2;
|
||
|
||
ConstStringPtr gDefaultName = "\p<Default>";
|
||
|
||
static LinkedListNode *currentHead;
|
||
static ListHandle currentList;
|
||
#define NUMONLYSIZE 8
|
||
short NumOnly[NUMONLYSIZE]; /* Items for which non-number keys are ignored */
|
||
// NumOnly[0] is number of "safe" item to return
|
||
|
||
extern Handle oldMacros;
|
||
extern NewMacroInfo oldMacroIndexes;
|
||
extern short dialogPane;
|
||
|
||
extern Boolean encryptOK; // true if des encryption routines available
|
||
extern Boolean authOK; // true if authentication driver available
|
||
|
||
|
||
void CONFIGUREunload(void) {}
|
||
void SetControlText(DialogPtr dptr, short item, Str255 text);
|
||
|
||
|
||
void SetControlText(DialogPtr dptr, short item, Str255 text)
|
||
{
|
||
short itemType;
|
||
Handle itemHandle;
|
||
Rect itemRect;
|
||
|
||
GetDialogItem(dptr, item, &itemType, &itemHandle, &itemRect);
|
||
SetControlTitle((ControlHandle)itemHandle, text);
|
||
}
|
||
|
||
void Cenviron( void)
|
||
{
|
||
DialogPtr dptr;
|
||
short ditem, defaultBoldColor;
|
||
Str255 scratchPstring;
|
||
long scratchlong;
|
||
OSType newtype;
|
||
PaletteHandle toSave;
|
||
Boolean tempBoolean;
|
||
Boolean cachePass;
|
||
|
||
SetUpMovableModalMenus();
|
||
dptr = GetNewMySmallStrangeDialog( PrefDLOG, NULL, kInFront, (void *)ThirdCenterDialog);
|
||
SetDialogDefaultItem(dptr, 1);
|
||
SetDialogCancelItem(dptr, 2);
|
||
SetDialogTracksCursor(dptr, 1);
|
||
|
||
SetCntrl(dptr, PrefDClose, gApplicationPrefs->WindowsDontGoAway);
|
||
SetCntrl(dptr, PrefStag, gApplicationPrefs->StaggerWindows);
|
||
defaultBoldColor = gApplicationPrefs->defaultBoldColor;
|
||
if (!gApplicationPrefs->StaggerWindows)
|
||
{
|
||
HideDialogItem(dptr,PrefStaggerOffset);
|
||
HideDialogItem(dptr,PrefStaggerBY);
|
||
tempBoolean = FALSE;
|
||
}
|
||
else
|
||
{
|
||
scratchlong = gApplicationPrefs->StaggerWindowsOffset;
|
||
NumToString(scratchlong, scratchPstring);
|
||
SetTEText(dptr, PrefStaggerOffset, scratchPstring);
|
||
tempBoolean = TRUE;
|
||
}
|
||
if (!TelInfo->haveColorQuickDraw)
|
||
HideDialogItem(dptr,PrefAnsiColor);
|
||
|
||
SetCntrl(dptr, PrefCMDkey, gApplicationPrefs->CommandKeys);
|
||
SetCntrl(dptr, PrefTMap, gApplicationPrefs->RemapTilde);
|
||
SetCntrl(dptr, PrefBlink, gApplicationPrefs->BlinkCursor);
|
||
SetCntrl(dptr, PrefKeyFuncMenus, gApplicationPrefs->KeyPadAndFuncMenus);
|
||
SetCntrl(dptr, PrefNotifyUser, gApplicationPrefs->NotifyUser);
|
||
SetCntrl(dptr, PrefBlockCursor, (gApplicationPrefs->CursorType == 0));
|
||
SetCntrl(dptr, PrefUnderscoreCursor, (gApplicationPrefs->CursorType == 1));
|
||
SetCntrl(dptr, PrefVerticalCursor, (gApplicationPrefs->CursorType == 2));
|
||
SetCntrl(dptr, PrefDestroyTickets, gApplicationPrefs->destroyKTickets);
|
||
SetCntrl(dptr, 30, gApplicationPrefs->autoOpenDialog);
|
||
SetCntrl(dptr, 31, gApplicationPrefs->dontWarnOnQuit);
|
||
SetCntrl(dptr, 42, gApplicationPrefs->dontWarnOnClose);
|
||
SetCntrl(dptr, 32, gApplicationPrefs->autoOpenDefault);
|
||
SetCntrl(dptr, 33, gApplicationPrefs->parseAliases);
|
||
SetCntrl(dptr, 34, gApplicationPrefs->monospacedOut);
|
||
|
||
SetCntrl(dptr, 35, gApplicationPrefs->clipTrailingSpaces);
|
||
SetCntrl(dptr, 36, gApplicationPrefs->globalSavePass);
|
||
SetCntrl(dptr, 37, !gApplicationPrefs->noLiveScrolling);
|
||
|
||
/* NONO */
|
||
SetCntrl(dptr, 38, gApplicationPrefs->cachePassphrase);
|
||
scratchlong = gApplicationPrefs->cacheDelay;
|
||
NumToString(scratchlong, scratchPstring);
|
||
SetTEText(dptr, 24, scratchPstring);
|
||
if ( !gApplicationPrefs->cachePassphrase ) {
|
||
GetIndString(scratchPstring, MISC_STRINGS, CACHE_PASSPHRASE_TITLE);
|
||
SetControlText(dptr, 38, scratchPstring);
|
||
HideDialogItem(dptr,24);
|
||
HideDialogItem(dptr,40);
|
||
cachePass = FALSE;
|
||
} else {
|
||
cachePass = TRUE;
|
||
}
|
||
if ( !TelInfo->haveKeyChain ) {
|
||
HideDialogItem(dptr, 41);
|
||
} else {
|
||
SetCntrl(dptr, 41, gApplicationPrefs->useKeyChain);
|
||
}
|
||
/* NONO */
|
||
|
||
scratchPstring[0] = 4;
|
||
BlockMoveData(&(gApplicationPrefs->CaptureFileCreator), &scratchPstring[1], sizeof(OSType));
|
||
SetTEText(dptr, PrefCaptTE, scratchPstring);
|
||
newtype = gApplicationPrefs->CaptureFileCreator;
|
||
|
||
scratchlong = gApplicationPrefs->CopyTableThresh;
|
||
NumToString(scratchlong, scratchPstring);
|
||
SetTEText(dptr, PrefCTt, scratchPstring);
|
||
SelectDialogItemText(dptr, PrefCTt, 0, 32767);
|
||
|
||
NumToString(gApplicationPrefs->TimeSlice, scratchPstring);
|
||
SetTEText(dptr, PrefTimeSlice, scratchPstring);
|
||
|
||
scratchlong = (long) gApplicationPrefs->OpenTimeout;
|
||
NumToString(scratchlong,scratchPstring);
|
||
SetTEText(dptr,PrefOpenTime, scratchPstring);
|
||
|
||
scratchlong = (long) gApplicationPrefs->SendTimeout;
|
||
NumToString(scratchlong,scratchPstring);
|
||
SetTEText(dptr,PrefSendTime, scratchPstring);
|
||
|
||
ShowWindow(dptr);
|
||
ditem=0; /* initially no hits */
|
||
while((ditem>2) || (ditem==0)) {
|
||
movableModalDialog(0,&ditem);
|
||
switch(ditem) {
|
||
case PrefDClose:
|
||
case PrefCMDkey:
|
||
case PrefTMap:
|
||
case PrefBlink:
|
||
case PrefNotifyUser:
|
||
case PrefKeyFuncMenus:
|
||
case PrefDestroyTickets:
|
||
case 30:
|
||
case 31:
|
||
case 32:
|
||
case 33:
|
||
case 34:
|
||
case 35:
|
||
case 36:
|
||
case 37:
|
||
case 41:
|
||
case 42:
|
||
FlipCheckBox( dptr, ditem);
|
||
break;
|
||
case PrefStag:
|
||
FlipCheckBox( dptr, ditem);
|
||
tempBoolean = !tempBoolean;
|
||
if (!tempBoolean)
|
||
{
|
||
HideDialogItem(dptr,PrefStaggerOffset);
|
||
HideDialogItem(dptr,PrefStaggerBY);
|
||
}
|
||
else
|
||
{
|
||
ShowDialogItem(dptr, PrefStaggerBY);
|
||
ShowDialogItem(dptr, PrefStaggerOffset);
|
||
scratchlong = gApplicationPrefs->StaggerWindowsOffset;
|
||
NumToString(scratchlong, scratchPstring);
|
||
SetTEText(dptr, PrefStaggerOffset, scratchPstring);
|
||
}
|
||
break;
|
||
|
||
case 38:
|
||
FlipCheckBox( dptr, ditem);
|
||
cachePass = !cachePass;
|
||
if (!cachePass)
|
||
{
|
||
GetIndString(scratchPstring, MISC_STRINGS, CACHE_PASSPHRASE_TITLE);
|
||
SetControlText(dptr, 38, scratchPstring);
|
||
HideDialogItem(dptr,24);
|
||
HideDialogItem(dptr,40);
|
||
}
|
||
else
|
||
{
|
||
GetIndString(scratchPstring, MISC_STRINGS, CACHE_PASSPHRASE_FOR_TITLE);
|
||
SetControlText(dptr, 38, scratchPstring);
|
||
ShowDialogItem(dptr, 24);
|
||
ShowDialogItem(dptr, 40);
|
||
}
|
||
break;
|
||
|
||
case PrefBlockCursor:
|
||
SetCntrl(dptr, PrefBlockCursor, 1);
|
||
SetCntrl(dptr, PrefUnderscoreCursor, 0);
|
||
SetCntrl(dptr, PrefVerticalCursor, 0);
|
||
break;
|
||
case PrefUnderscoreCursor:
|
||
SetCntrl(dptr, PrefBlockCursor, 0);
|
||
SetCntrl(dptr, PrefUnderscoreCursor, 1);
|
||
SetCntrl(dptr, PrefVerticalCursor, 0);
|
||
break;
|
||
case PrefVerticalCursor:
|
||
SetCntrl(dptr, PrefBlockCursor, 0);
|
||
SetCntrl(dptr, PrefUnderscoreCursor, 0);
|
||
SetCntrl(dptr, PrefVerticalCursor, 1);
|
||
break;
|
||
|
||
case PrefCaptCreat:
|
||
GetApplicationType(&newtype);
|
||
scratchPstring[0] = 4;
|
||
BlockMoveData(&newtype, &scratchPstring[1], sizeof(OSType));
|
||
SetTEText(dptr, PrefCaptTE, scratchPstring);
|
||
break;
|
||
case PrefAnsiColor:
|
||
AnsiPrompt(1, &defaultBoldColor);
|
||
break;
|
||
default:
|
||
break;
|
||
} /* switch */
|
||
}
|
||
|
||
if (ditem==DLOGCancel) {
|
||
DisposeDialog( dptr);
|
||
ResetMenus();
|
||
return;
|
||
}
|
||
|
||
gApplicationPrefs->defaultBoldColor = defaultBoldColor;
|
||
|
||
GetTEText(dptr, PrefCTt, scratchPstring);
|
||
StringToNum(scratchPstring, &scratchlong);
|
||
gApplicationPrefs->CopyTableThresh = (short) scratchlong;
|
||
|
||
GetTEText(dptr, PrefTimeSlice, scratchPstring);
|
||
StringToNum(scratchPstring, &scratchlong);
|
||
/* NONO */
|
||
/*BoundsCheck(&scratchlong, 100, 3);*/
|
||
BoundsCheck(&scratchlong, 100, 0);
|
||
/* NONO */
|
||
gApplicationPrefs->TimeSlice = scratchlong;
|
||
|
||
GetTEText(dptr,PrefOpenTime, scratchPstring);
|
||
StringToNum(scratchPstring, &scratchlong);
|
||
gApplicationPrefs->OpenTimeout = (short) scratchlong;
|
||
|
||
GetTEText(dptr,PrefSendTime, scratchPstring);
|
||
StringToNum(scratchPstring, &scratchlong);
|
||
gApplicationPrefs->SendTimeout = (short) scratchlong;
|
||
|
||
GetTEText(dptr, PrefCaptTE, scratchPstring);
|
||
BlockMoveData(&scratchPstring[1], &(gApplicationPrefs->CaptureFileCreator), sizeof(OSType));
|
||
GetTEText(dptr,PrefStaggerOffset, scratchPstring);
|
||
StringToNum(scratchPstring, &scratchlong);
|
||
gApplicationPrefs->StaggerWindowsOffset = (short) scratchlong;
|
||
|
||
/* NONO */
|
||
if ( gApplicationPrefs->cachePassphrase != cachePass ) {
|
||
gApplicationPrefs->cachePassphrase = cachePass;
|
||
if (!cachePass) {
|
||
clearcachedpassphrase();
|
||
}
|
||
}
|
||
GetTEText(dptr,24, scratchPstring);
|
||
StringToNum(scratchPstring, &scratchlong);
|
||
gApplicationPrefs->cacheDelay = scratchlong;
|
||
gApplicationPrefs->useKeyChain = GetCntlVal(dptr, 41);
|
||
/* NONO */
|
||
|
||
gApplicationPrefs->CommandKeys = GetCntlVal(dptr, PrefCMDkey);
|
||
gApplicationPrefs->WindowsDontGoAway = GetCntlVal(dptr, PrefDClose);
|
||
gApplicationPrefs->RemapTilde = GetCntlVal(dptr, PrefTMap);
|
||
gApplicationPrefs->StaggerWindows = GetCntlVal(dptr, PrefStag);
|
||
gApplicationPrefs->BlinkCursor = GetCntlVal(dptr, PrefBlink);
|
||
gApplicationPrefs->KeyPadAndFuncMenus = GetCntlVal(dptr, PrefKeyFuncMenus);
|
||
gApplicationPrefs->NotifyUser = GetCntlVal(dptr,PrefNotifyUser);
|
||
gApplicationPrefs->destroyKTickets = GetCntlVal(dptr,PrefDestroyTickets);
|
||
gApplicationPrefs->autoOpenDialog = GetCntlVal(dptr,30);
|
||
gApplicationPrefs->dontWarnOnQuit = GetCntlVal(dptr,31);
|
||
gApplicationPrefs->dontWarnOnClose = GetCntlVal(dptr,42);
|
||
gApplicationPrefs->autoOpenDefault = GetCntlVal(dptr,32);
|
||
gApplicationPrefs->parseAliases = GetCntlVal(dptr,33);
|
||
gApplicationPrefs->monospacedOut = GetCntlVal(dptr,34);
|
||
gApplicationPrefs->clipTrailingSpaces = GetCntlVal(dptr,35);
|
||
gApplicationPrefs->globalSavePass = GetCntlVal(dptr,36);
|
||
gApplicationPrefs->noLiveScrolling = !GetCntlVal(dptr,37);
|
||
gApplicationPrefs->CursorType = (GetCntlVal(dptr, PrefUnderscoreCursor) == 1) + (2 *
|
||
(GetCntlVal(dptr, PrefVerticalCursor) == 1));
|
||
|
||
if (TelInfo->haveColorQuickDraw)
|
||
{
|
||
RSUpdatePalette(); //reflects any ANSI change
|
||
|
||
UseResFile(TelInfo->SettingsFile);
|
||
toSave = (PaletteHandle)Get1Resource('pltt', 10001);
|
||
if (toSave == NULL)//this shouldnt happen; make a new copy
|
||
{
|
||
UseResFile(TelInfo->ApplicationFile);
|
||
//toSave = (PaletteHandle)GetNewPalette(9999);
|
||
toSave = (PaletteHandle)Get1Resource('pltt', 9999);
|
||
DetachResource((Handle)toSave);
|
||
UseResFile(TelInfo->SettingsFile);
|
||
AddResource((Handle)toSave, 'pltt', 10001, "\pANSI Colors");//make the new resource
|
||
UpdateResFile(TelInfo->SettingsFile);
|
||
}
|
||
CopyPalette(TelInfo->AnsiColors,toSave,0,0,16);
|
||
ChangedResource((Handle)toSave);
|
||
UpdateResFile(TelInfo->SettingsFile);
|
||
ReleaseResource((Handle)toSave);
|
||
}
|
||
switchMenus(gApplicationPrefs->CommandKeys, 1);
|
||
AdjustMenus();
|
||
DoTheMenuChecks();
|
||
SaveAppPreferences();
|
||
|
||
DisposeDialog( dptr);
|
||
ResetMenus();
|
||
}
|
||
|
||
|
||
void Cftp(void)
|
||
{
|
||
DialogPtr dptr;
|
||
short ditem;
|
||
Str255 scratchPstring;
|
||
OSType scratchOSType;
|
||
SFReply sfr;
|
||
FInfo fi;
|
||
Point where = {100,100};
|
||
|
||
SetUpMovableModalMenus();
|
||
dptr = GetNewMySmallStrangeDialog( FTPDLOG, NULL, kInFront, (void *)ThirdCenterDialog);
|
||
|
||
SetCntrl(dptr, FTPServerOff, (gFTPServerPrefs->ServerState == 0));
|
||
SetCntrl(dptr, FTPServerUnsecure, (gFTPServerPrefs->ServerState == 1));
|
||
SetCntrl(dptr, FTPServerPswdPlease, (gFTPServerPrefs->ServerState == 2));
|
||
SetCntrl(dptr, FTPShowFTPlog, gFTPServerPrefs->ShowFTPlog);
|
||
SetCntrl(dptr, FTPrevDNS, gFTPServerPrefs->DNSlookupconnections);
|
||
SetCntrl(dptr, FTPUseMacBinaryII, gFTPServerPrefs->UseMacBinaryII);
|
||
SetCntrl(dptr, FTPResetMacBinary, gFTPServerPrefs->ResetMacBinary);
|
||
SetCntrl(dptr, FTPISO, gFTPServerPrefs->DoISOtranslation);
|
||
|
||
HideDialogItem(dptr, FTPrevDNS); // Sometime later, perhaps.
|
||
|
||
scratchPstring[0] = 4;
|
||
|
||
BlockMoveData(&(gFTPServerPrefs->BinaryCreator), &scratchPstring[1], sizeof(OSType));
|
||
SetTEText(dptr, FTPbincreatTE, scratchPstring);
|
||
|
||
BlockMoveData(&(gFTPServerPrefs->BinaryType), &scratchPstring[1], sizeof(OSType));
|
||
SetTEText(dptr, FTPbintypeTE, scratchPstring);
|
||
SelectDialogItemText(dptr, FTPbintypeTE, 0, 32767);
|
||
|
||
BlockMoveData(&(gFTPServerPrefs->TextCreator), &scratchPstring[1], sizeof(OSType));
|
||
SetTEText(dptr, FTPtextcreatTE, scratchPstring);
|
||
|
||
ShowWindow(dptr);
|
||
ditem=0; /* initially no hits */
|
||
while((ditem>2) || (ditem==0)) {
|
||
/*ModalDialog(DLOGwOK_CancelUPP,&ditem);*/
|
||
movableModalDialog(DLOGwOK_CancelUPP,&ditem);
|
||
switch(ditem) {
|
||
case FTPShowFTPlog:
|
||
case FTPrevDNS:
|
||
case FTPUseMacBinaryII:
|
||
case FTPResetMacBinary:
|
||
case FTPISO:
|
||
FlipCheckBox( dptr, ditem);
|
||
break;
|
||
|
||
case FTPServerOff:
|
||
SetCntrl(dptr, FTPServerOff, 1);
|
||
SetCntrl(dptr, FTPServerUnsecure, 0);
|
||
SetCntrl(dptr, FTPServerPswdPlease, 0);
|
||
break;
|
||
case FTPServerUnsecure:
|
||
SetCntrl(dptr, FTPServerOff, 0);
|
||
SetCntrl(dptr, FTPServerUnsecure, 1);
|
||
SetCntrl(dptr, FTPServerPswdPlease, 0);
|
||
break;
|
||
case FTPServerPswdPlease:
|
||
SetCntrl(dptr, FTPServerOff, 0);
|
||
SetCntrl(dptr, FTPServerUnsecure, 0);
|
||
SetCntrl(dptr, FTPServerPswdPlease, 1);
|
||
break;
|
||
|
||
case FTPtextcreatorbutton:
|
||
if (GetApplicationType(&scratchOSType)) {
|
||
BlockMoveData(&scratchOSType, &scratchPstring[1], sizeof(OSType));
|
||
SetTEText(dptr, FTPtextcreatTE, scratchPstring);
|
||
}
|
||
break;
|
||
|
||
case FTPbinexamplebutton:
|
||
SFGetFile(where, NULL, NULL, -1, NULL, NULL, &sfr);
|
||
if (sfr.good) {
|
||
GetFInfo(sfr.fName, sfr.vRefNum, &fi);
|
||
scratchPstring[0] = sizeof(OSType);
|
||
BlockMoveData(&fi.fdCreator, &scratchPstring[1], sizeof(OSType));
|
||
SetTEText(dptr, FTPbincreatTE, scratchPstring);
|
||
BlockMoveData(&fi.fdType, &scratchPstring[1], sizeof(OSType));
|
||
SetTEText(dptr, FTPbintypeTE, scratchPstring);
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
} /* switch */
|
||
} /* while */
|
||
|
||
if (ditem==DLOGCancel) {
|
||
DisposeDialog( dptr);
|
||
ResetMenus();
|
||
return;
|
||
}
|
||
|
||
gFTPServerPrefs->ServerState = GetCntlVal(dptr, FTPServerUnsecure) +
|
||
GetCntlVal(dptr, FTPServerPswdPlease) * 2;
|
||
StartUpFTP(); // Make sure FTP server recognizes new mode.
|
||
|
||
gFTPServerPrefs->ShowFTPlog = GetCntlVal(dptr, FTPShowFTPlog);
|
||
gFTPServerPrefs->DNSlookupconnections = GetCntlVal(dptr, FTPrevDNS);
|
||
gFTPServerPrefs->UseMacBinaryII = GetCntlVal(dptr, FTPUseMacBinaryII);
|
||
gFTPServerPrefs->ResetMacBinary = GetCntlVal(dptr, FTPResetMacBinary);
|
||
gFTPServerPrefs->DoISOtranslation = GetCntlVal(dptr, FTPISO);
|
||
|
||
GetTEText(dptr, FTPbincreatTE, scratchPstring);
|
||
BlockMoveData(&scratchPstring[1], &(gFTPServerPrefs->BinaryCreator), sizeof(OSType));
|
||
|
||
GetTEText(dptr, FTPbintypeTE, scratchPstring);
|
||
BlockMoveData(&scratchPstring[1], &(gFTPServerPrefs->BinaryType), sizeof(OSType));
|
||
|
||
GetTEText(dptr, FTPtextcreatTE, scratchPstring);
|
||
BlockMoveData(&scratchPstring[1], &(gFTPServerPrefs->TextCreator), sizeof(OSType));
|
||
|
||
SaveFTPPreferences();
|
||
|
||
DisposeDialog( dptr);
|
||
ResetMenus();
|
||
}
|
||
|
||
Boolean GetApplicationType(OSType *type)
|
||
{
|
||
SFTypeList types;
|
||
SFReply sfr;
|
||
FInfo fi;
|
||
Point where;
|
||
|
||
SetPt(&where, 100, 100);
|
||
types[0] = 'APPL';
|
||
SFGetFile(where, NULL, NULL, 1, types, NULL, &sfr);
|
||
if (sfr.good) {
|
||
GetFInfo(sfr.fName, sfr.vRefNum, &fi);
|
||
BlockMoveData(&fi.fdCreator, type, sizeof(OSType)); // Copy the application creator type
|
||
}
|
||
|
||
return(sfr.good);
|
||
}
|
||
|
||
|
||
static Boolean GetCurrentSelection(ListHandle thelist, Point *theCell, StringPtr theString)
|
||
{
|
||
Point tempCell;
|
||
|
||
if ( theCell == NULL )
|
||
theCell = &tempCell;
|
||
SetPt(theCell, 0, 0);
|
||
if ( LGetSelect(TRUE, theCell, thelist) ) {
|
||
if ( theString != NULL ) {
|
||
short length = 254;
|
||
LGetCell(theString+1, &length, *theCell, thelist);
|
||
theString[0] = (char)length;
|
||
}
|
||
return TRUE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
static Boolean IsDefaultLabel(StringPtr theString)
|
||
{
|
||
return EqualString( theString, gDefaultName, TRUE, FALSE );
|
||
}
|
||
|
||
static Boolean IsDefaultSelected(ListHandle thelist)
|
||
{
|
||
Point theCell;
|
||
Str255 ItemName;
|
||
|
||
if (GetCurrentSelection(thelist, &theCell, ItemName)) {
|
||
return IsDefaultLabel(ItemName);
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
|
||
// Our standard modal dialog filter with code for handling user items containing lists.
|
||
SIMPLE_UPP(MyDlogWListFilter, ModalFilter);
|
||
pascal short MyDlogWListFilter( DialogPtr dptr, EventRecord *evt, short *item)
|
||
{
|
||
short key, iType;
|
||
Handle iHndl;
|
||
Rect iRect;
|
||
Point scratchPoint;
|
||
Cell tempCell;
|
||
static unsigned long lastTime = 0;
|
||
static char shortcut[] = {0,0,0,0,0,0,0,0,0,0,0};
|
||
Str255 tempString;
|
||
|
||
SetPort(dptr);
|
||
if ((evt->what == keyDown)||(evt->what == autoKey))
|
||
{
|
||
key = evt->message & charCodeMask;
|
||
//keyCode = (evt->message >>8) & 0xff ;
|
||
if ((key == 0x0d) || (key == 0x03) || (key == 27)) { // 0x0d == return, 0x03 == enter, 27 = esc
|
||
// RAB BetterTelnet 1.2 - we let StdFilterProc handle this
|
||
// *item = 1; // ok
|
||
// FlashButton(dptr, 1);
|
||
// return(-1);
|
||
return CallStdFilterProc(dptr, evt, item);
|
||
}
|
||
else if (evt->modifiers & cmdKey)
|
||
{
|
||
switch(evt->message & charCodeMask)
|
||
{
|
||
case 'e':
|
||
case 'E':
|
||
if (GetCurrentSelection(currentList, NULL, NULL)) {
|
||
*item = kChange;
|
||
} else {
|
||
evt->what == nullEvent;
|
||
return FALSE;
|
||
}
|
||
break;
|
||
case 'r':
|
||
case 'R':
|
||
if ( GetCurrentSelection(currentList, NULL, tempString)
|
||
&& !IsDefaultLabel(tempString) ) {
|
||
*item = kRemove;
|
||
} else {
|
||
evt->what == nullEvent;
|
||
return FALSE;
|
||
}
|
||
break;
|
||
case 'n':
|
||
case 'N':
|
||
*item = kNew;
|
||
break;
|
||
case 'd':
|
||
case 'D':
|
||
if (GetCurrentSelection(currentList, NULL, NULL)) {
|
||
*item = kDuplicate;
|
||
} else {
|
||
evt->what == nullEvent;
|
||
return FALSE;
|
||
}
|
||
break;
|
||
default:
|
||
evt->what == nullEvent;
|
||
return FALSE;
|
||
break;
|
||
}
|
||
FlashButton(dptr, *item);
|
||
return -1;
|
||
|
||
}
|
||
else // a normal key
|
||
{
|
||
char keyCode = (evt->message & keyCodeMask) >> 8;
|
||
|
||
if (keyCode >=0x7B) //CCP: arrow keys
|
||
{
|
||
tempCell.h = tempCell.v = 0;
|
||
switch(keyCode)
|
||
{
|
||
case 0x7E: //up
|
||
case 0x7B: //left
|
||
if (LGetSelect(TRUE,&tempCell,currentList))
|
||
{
|
||
LSetSelect(FALSE,tempCell,currentList);//unselect it
|
||
tempCell.v--;
|
||
}
|
||
else
|
||
tempCell.v = 0;
|
||
break;
|
||
case 0x7D: //down
|
||
case 0x7C: //right
|
||
if (LGetSelect(TRUE,&tempCell,currentList))
|
||
{
|
||
LSetSelect(FALSE,tempCell,currentList);//unselect it
|
||
tempCell.v++;
|
||
}
|
||
else
|
||
tempCell.v = (**currentList).dataBounds.bottom - 1;
|
||
break;
|
||
default:
|
||
return (FALSE);
|
||
break;
|
||
}
|
||
if (tempCell.v > (**currentList).dataBounds.bottom - 1)
|
||
tempCell.v = (**currentList).dataBounds.bottom - 1;
|
||
if (tempCell.v < 0)
|
||
tempCell.v = 0;
|
||
LSetSelect(TRUE,tempCell,currentList);//select it
|
||
LAutoScroll(currentList);
|
||
Hilite(dptr, kRemove, IsDefaultSelected(currentList) ? 255 : 0);
|
||
Hilite(dptr, kChange, 0);
|
||
Hilite(dptr, kDuplicate, 0);
|
||
return(FALSE);
|
||
}
|
||
else if (currentHead)
|
||
{
|
||
//CCP go to right list item based on keystroke
|
||
if ((TickCount() - lastTime) > GetCaretTime() )
|
||
shortcut[0] = 0;
|
||
lastTime = TickCount();
|
||
shortcut[(shortcut[0]++) +1] = key;
|
||
tempCell.h = tempCell.v = 0;
|
||
if (LGetSelect(TRUE,&tempCell,currentList))
|
||
LSetSelect(FALSE,tempCell,currentList);
|
||
tempCell.v = findClosestNodeIndex(currentHead,(StringPtr)shortcut);
|
||
LSetSelect(TRUE,tempCell,currentList);
|
||
LAutoScroll(currentList);
|
||
if (shortcut[0] == 10)
|
||
shortcut[0] = 0;
|
||
|
||
Hilite(dptr, kRemove, IsDefaultSelected(currentList) ? 255 : 0);
|
||
Hilite(dptr, kChange, 0);
|
||
Hilite(dptr, kDuplicate, 0);
|
||
}
|
||
}
|
||
}
|
||
else if (evt->what == updateEvt)
|
||
{
|
||
if ((WindowPtr)evt->message == dptr)
|
||
{
|
||
// RAB BetterTelnet 1.2 - we let StdFilterProc handle this
|
||
// GetDialogItem(dptr,1,&iType,&iHndl,&iRect); // ok
|
||
// PenSize(3,3);
|
||
// InsetRect(&iRect,-4,-4);
|
||
// FrameRoundRect(&iRect,16,16);
|
||
CallStdFilterProc(dptr, evt, item);
|
||
return 0;
|
||
}
|
||
}
|
||
else if (evt->what == mouseDown)
|
||
{
|
||
GetDialogItem(dptr, kItemList, &iType, &iHndl, &iRect);
|
||
scratchPoint = evt->where;
|
||
GlobalToLocal(&scratchPoint);
|
||
if (PtInRect(scratchPoint, &iRect))
|
||
{
|
||
ListHandle theList;
|
||
*item = kItemList;
|
||
if (LClick(scratchPoint, evt->modifiers, currentList)
|
||
&& GetCurrentSelection(currentList, NULL, NULL)) {
|
||
*item = kChange;
|
||
FlashButton(dptr, kChange);
|
||
}
|
||
return(-1);
|
||
}
|
||
}
|
||
|
||
return CallStdFilterProc(dptr, evt, item);
|
||
}
|
||
|
||
Boolean isACopy(Str255 theName)
|
||
{
|
||
Boolean yes=FALSE;
|
||
char copyString[] = "copy";
|
||
p2cstr(theName);
|
||
if (strstr((char *)theName,copyString))
|
||
yes = TRUE;
|
||
c2pstr((char *)theName);
|
||
return(yes);
|
||
}
|
||
|
||
|
||
// User Dialog Item Procedure for a list. Assumes the Dialog's refcon contains the list
|
||
// handle.
|
||
SIMPLE_UPP(listDitemproc, UserItem);
|
||
pascal void listDitemproc(DialogPtr theDlg, short itemNo)
|
||
{
|
||
short itemType;
|
||
Handle ControlHndl;
|
||
Rect scratchRect;
|
||
|
||
GetDialogItem(theDlg, itemNo, &itemType, &ControlHndl, &scratchRect);
|
||
|
||
PenNormal();
|
||
InsetRect(&scratchRect, -1, -1);
|
||
FrameRect(&scratchRect);
|
||
LUpdate(theDlg->visRgn, (ListHandle)GetWRefCon(theDlg));
|
||
}
|
||
|
||
void BoundsCheck(long *value, long high, long low)
|
||
{
|
||
if (*value > high) *value = high;
|
||
if (*value < low) *value = low;
|
||
}
|
||
|
||
|
||
|
||
/*#define kSCListMods lNoNilHilite+lOnlyOne*/
|
||
#define kSCListMods (lNoNilHilite+lOnlyOne)
|
||
|
||
void EditConfigType(ResType ConfigResourceType, Boolean (*EditFunction)(StringPtr))
|
||
{
|
||
DialogPtr dptr;
|
||
Handle iHndl;
|
||
short iType, length, ditem,numberofitems, index;
|
||
Rect ListBox, ListBounds;
|
||
Point cellSize, theCell;
|
||
ListHandle thelist;
|
||
Handle ItemResource;
|
||
Str255 ItemName;
|
||
LinkedListNode *theHead, *leader;
|
||
|
||
SetUpMovableModalMenus();
|
||
dptr = GetNewMySmallDialog(kItemDLOG, NULL, kInFront, (void *)ThirdCenterDialog);
|
||
SetDialogDefaultItem(dptr, 1);
|
||
SetDialogCancelItem(dptr, 1);
|
||
SetDialogTracksCursor(dptr, 1);
|
||
|
||
ItemName[0] = '\0';
|
||
switch ( ConfigResourceType ) {
|
||
case SESSIONPREFS_RESTYPE:
|
||
GetIndString(ItemName, MISC_STRINGS, TITLE_FAVORITES);
|
||
break;
|
||
case TERMINALPREFS_RESTYPE:
|
||
GetIndString(ItemName, MISC_STRINGS, TITLE_TERMINALS);
|
||
break;
|
||
case FTPUSERPREFS_RESTYPE:
|
||
GetIndString(ItemName, MISC_STRINGS, TITLE_FTPUSERS);
|
||
break;
|
||
}
|
||
SetWTitle(dptr, ItemName);
|
||
|
||
ditem = 3;
|
||
|
||
GetDialogItem(dptr, kItemList, &iType, &iHndl, &ListBox);
|
||
SetDialogItem(dptr, kItemList, iType, (Handle)listDitemprocUPP, &ListBox);
|
||
|
||
ListBox.right -= 15; // Make room for scrollbar
|
||
SetRect(&ListBounds, 0,0,1,0);
|
||
SetPt(&cellSize,(ListBox.right-ListBox.left),16);
|
||
thelist = LNew(&ListBox, &ListBounds, cellSize, 0, (WindowPtr)dptr,0,0,0,1);
|
||
/* NONO: was wrong field */
|
||
/* (*(thelist))->listFlags = kSCListMods;*/
|
||
(*(thelist))->selFlags = kSCListMods;
|
||
(*(thelist))->listFlags = lDoVAutoscroll;
|
||
/* NONO */
|
||
currentList = thelist;
|
||
SetWRefCon(dptr, (long)thelist); // So the Ditem proc can find the list
|
||
|
||
UseResFile(TelInfo->SettingsFile);
|
||
numberofitems = Count1Resources(ConfigResourceType);
|
||
if (numberofitems)
|
||
theHead = createSortedList(ConfigResourceType,numberofitems,gDefaultName); //now we have a sorted linked list of the names
|
||
else
|
||
theHead = NULL;
|
||
leader = theHead;
|
||
for(index = 1, theCell.v = 0, theCell.h = 0; index <= numberofitems;index++, theCell.v++)
|
||
{
|
||
LAddRow(1,-1, thelist);
|
||
HLock((Handle)leader->name);
|
||
LSetCell(*(leader->name) +1, (*leader->name)[0], theCell, thelist);
|
||
HUnlock((Handle)leader->name);
|
||
leader = leader->next;
|
||
}
|
||
theCell.v = 0;
|
||
theCell.h = 0;
|
||
if (numberofitems) LSetSelect(1, theCell, thelist);
|
||
LSetDrawingMode(1, thelist);
|
||
|
||
/* item <default> can't be deleted */
|
||
if ( IsDefaultSelected(thelist) ) {
|
||
Hilite(dptr, kRemove, 255);
|
||
}
|
||
if (!GetCurrentSelection(thelist, NULL, NULL)) {
|
||
Hilite(dptr, kRemove, 255);
|
||
Hilite(dptr, kChange, 255);
|
||
Hilite(dptr, kDuplicate, 255);
|
||
}
|
||
|
||
ShowWindow(dptr);
|
||
|
||
currentHead = theHead; //let dialog filter know about the list
|
||
while (ditem > 1) {
|
||
movableModalDialog(MyDlogWListFilterUPP, &ditem);
|
||
|
||
switch(ditem)
|
||
{
|
||
case kRemove:
|
||
if ( GetCurrentSelection(thelist, &theCell, ItemName)
|
||
&& !IsDefaultLabel(ItemName) ) {
|
||
deleteItem(&theHead,ItemName);//delete it from the linked list
|
||
currentHead = theHead; //in case list is now empty
|
||
LDelRow(1,theCell.v,thelist);
|
||
theCell.v--;
|
||
LSetSelect(TRUE,theCell,thelist);
|
||
UseResFile(TelInfo->SettingsFile);
|
||
ItemResource = Get1NamedResource(ConfigResourceType, ItemName);
|
||
RemoveTaggedResource(ItemResource, ConfigResourceType, ItemName);
|
||
ReleaseResource(ItemResource);
|
||
UpdateResFile(TelInfo->SettingsFile);
|
||
}
|
||
break;
|
||
|
||
case kChange:
|
||
SetPt(&theCell, 0, 0);
|
||
if (LGetSelect(TRUE, &theCell, thelist))
|
||
{
|
||
short newPosition;
|
||
length = 254;
|
||
LGetCell(ItemName+1, &length, theCell, thelist);
|
||
ItemName[0] = (char)length;
|
||
leader = findNode(theHead,ItemName);
|
||
|
||
if ((*EditFunction)((StringPtr)&ItemName))
|
||
{
|
||
if (!(EqualString(ItemName,*leader->name,TRUE,FALSE)))//new name
|
||
{
|
||
DisposeHandle((Handle)leader->name);
|
||
leader->name = NewString(ItemName);//set the new name
|
||
newPosition = reSortElement(&theHead,leader);//resort
|
||
LDelRow(1,theCell.v,thelist);//delete the old row
|
||
theCell.v = newPosition;
|
||
LAddRow(1,newPosition,thelist); //add a new row
|
||
LSetCell(&ItemName[1], ItemName[0],theCell, thelist);//write the name in
|
||
LSetSelect(TRUE,theCell,thelist);
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
|
||
case kNew:
|
||
ItemName[0] = 0; // Signal new shortcut
|
||
if ((*EditFunction)((StringPtr)&ItemName))
|
||
{
|
||
short whereAt = createNodeAndSort(&theHead, ItemName);
|
||
currentHead = theHead; //in case list was empty
|
||
if (LGetSelect(TRUE, &theCell, thelist))
|
||
LSetSelect(FALSE,theCell,thelist); //turn off old selection
|
||
theCell.v = LAddRow(1, whereAt, thelist);
|
||
LSetCell(ItemName+1, StrLength(ItemName), theCell, thelist);
|
||
LSetSelect(TRUE,theCell,thelist); //turn on new selection
|
||
}
|
||
break;
|
||
|
||
case kDuplicate:
|
||
if ( GetCurrentSelection(thelist, &theCell, ItemName) ) {
|
||
Handle oldResource,newResource;
|
||
unsigned char copyString[] = " copy";
|
||
short resourceID;
|
||
short index;
|
||
LSetSelect(FALSE,theCell,thelist);
|
||
leader = findNode(theHead,ItemName);
|
||
UseResFile(TelInfo->SettingsFile);
|
||
oldResource = GetNamedResource(ConfigResourceType,ItemName);
|
||
if (!isACopy(ItemName))//add the copy extension
|
||
{
|
||
ItemName[0] += 5;
|
||
BlockMoveData(copyString, &(ItemName[ItemName[0]-4]),5);
|
||
}
|
||
getAUniqueName(theHead,ItemName);
|
||
resourceID = UniqueID(ConfigResourceType);
|
||
newResource = myNewHandle(GetHandleSize(oldResource));
|
||
BlockMoveData(*oldResource,*newResource,GetHandleSize(newResource));
|
||
AddResource((Handle)newResource, ConfigResourceType, resourceID, ItemName);
|
||
UpdateResFile(TelInfo->SettingsFile);
|
||
index = createNodeAndSort(¤tHead,ItemName);
|
||
theCell.v = index;
|
||
LAddRow(1,index,thelist); //add a new row
|
||
LSetCell(&ItemName[1], ItemName[0],theCell, thelist);//write the name in
|
||
LSetSelect(TRUE,theCell,thelist);
|
||
ReleaseResource((Handle)newResource);
|
||
ReleaseResource((Handle)oldResource);
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
} // switch
|
||
|
||
if ( GetCurrentSelection(thelist, &theCell, ItemName) ) {
|
||
Hilite(dptr, kRemove, (IsDefaultLabel(ItemName)) ? 255 : 0);
|
||
Hilite(dptr, kChange, 0);
|
||
Hilite(dptr, kDuplicate, 0);
|
||
} else {
|
||
Hilite(dptr, kRemove, 255);
|
||
Hilite(dptr, kChange, 255);
|
||
Hilite(dptr, kDuplicate, 255);
|
||
}
|
||
} // while
|
||
|
||
LDispose(thelist);
|
||
DisposeDialog(dptr);
|
||
ResetMenus();
|
||
deleteList(&theHead);
|
||
}
|
||
|
||
void ZeroNumOnly(void)
|
||
{
|
||
short i;
|
||
|
||
for(i=0; i<NUMONLYSIZE; i++) NumOnly[i]=0;
|
||
}
|
||
|
||
Boolean InNumOnly(short item)
|
||
{
|
||
short index = 1;
|
||
|
||
while ((NumOnly[index] != item) && (NumOnly[index] != 0)) index++;
|
||
|
||
return(NumOnly[index] == item);
|
||
}
|
||
|
||
short NumberOfColorBoxes;
|
||
short BoxColorItems[16];
|
||
RGBColor BoxColorData[16];
|
||
|
||
SIMPLE_UPP(ColorBoxItemProc, UserItem);
|
||
pascal void ColorBoxItemProc(DialogPtr theDlg, short itemNo)
|
||
{
|
||
short itemType, index = 0;
|
||
Handle ControlHndl;
|
||
Rect scratchRect;
|
||
RGBColor rgb;
|
||
|
||
GetDialogItem(theDlg, itemNo, &itemType, &ControlHndl, &scratchRect);
|
||
PenNormal();
|
||
FrameRect(&scratchRect);
|
||
InsetRect(&scratchRect, 1, 1); // Why isn't this framing the boxes?
|
||
|
||
GetForeColor(&rgb);
|
||
|
||
while ((index < NumberOfColorBoxes) && (BoxColorItems[index] != itemNo)) index++;
|
||
|
||
RGBForeColor(&BoxColorData[index]); /* color corresponding to item */
|
||
PaintRect(&scratchRect);
|
||
|
||
RGBForeColor(&rgb); /* restore previous foreground color */
|
||
}
|
||
|
||
SIMPLE_UPP(ColorBoxModalProc, ModalFilter);
|
||
pascal short ColorBoxModalProc( DialogPtr dptr, EventRecord *evt, short *item)
|
||
{
|
||
short keyCode, key, iType, index;
|
||
Handle iHndl;
|
||
Rect iRect;
|
||
|
||
if ((evt->what == keyDown) || (evt->what == autoKey)) {
|
||
key = evt->message & charCodeMask;
|
||
keyCode = (evt->message >>8) & 0xff;
|
||
if ((key == 0x0d) || (key == 0x03)) { // 0x0d == return, 0x03 == enter
|
||
// *item = DLOGOk;
|
||
// return(-1); /* BYU LSC - pascal doesn't like "1" as true */
|
||
return CallStdFilterProc(dptr, evt, item);
|
||
}
|
||
if (((key == '.') && (evt->modifiers & cmdKey)) ||
|
||
((key == 0x1b) && (keyCode == 0x35)) ) { // 0x35 == escKey
|
||
// *item = DLOGCancel;
|
||
// return(-1); /* BYU LSC - pascal doesn't like "1" as true */
|
||
return CallStdFilterProc(dptr, evt, item);
|
||
}
|
||
|
||
if ((key < '0' || key > '9') &&
|
||
!(key == 0x08 || key == 0x09 || (key > 0x1B && key < 0x20))
|
||
&& InNumOnly(((DialogPeek)dptr)->editField + 1)) {
|
||
/* Reject non-numbers for this TE */
|
||
*item = NumOnly[0]; /* Kludge -- Return "safe" item */
|
||
return(-1);
|
||
}
|
||
}
|
||
|
||
if (evt->what == updateEvt) {
|
||
if ((WindowPtr)evt->message == dptr) {
|
||
// RAB BetterTelnet 1.2 - We let StdFilterProc handle this.
|
||
// GetDialogItem(dptr,DLOGOk,&iType,&iHndl,&iRect); // ok
|
||
// PenSize(3,3);
|
||
// InsetRect(&iRect,-4,-4);
|
||
// FrameRoundRect(&iRect,16,16);
|
||
for (index = 0; index < NumberOfColorBoxes; index++)
|
||
ColorBoxItemProc(dptr, BoxColorItems[index]); // update color boxes
|
||
}
|
||
CallStdFilterProc(dptr, evt, item);
|
||
}
|
||
|
||
Stask();
|
||
return CallStdFilterProc(dptr, evt, item);
|
||
}
|
||
|
||
popup TPopup[] = {{TermFontPopup, (MenuHandle) 0, 1},
|
||
{41, (MenuHandle) 0, 1},
|
||
{0, (MenuHandle) 0, 0}};
|
||
|
||
SIMPLE_UPP(TerminalModalProc, ModalFilter);
|
||
pascal short TerminalModalProc( DialogPtr dptr, EventRecord *evt, short *item)
|
||
{
|
||
if ( evt->what == mouseDown ) {
|
||
short oldChoice = TPopup[0].choice;
|
||
short result = PopupMousedown(dptr, evt, item);
|
||
if ( result && *item == TPopup[0].item ) {
|
||
TPopup[1].choice = TPopup[0].choice;
|
||
DrawPopUp(dptr, TPopup[1].item);
|
||
}
|
||
return result;
|
||
}
|
||
return(ColorBoxModalProc(dptr, evt, item));
|
||
}
|
||
|
||
/* NONO */
|
||
static void CheckPortPopup( DialogPtr dptr, unsigned short port, short id )
|
||
{
|
||
int i;
|
||
Str255 scratchPstring;
|
||
long scratchlong;
|
||
|
||
i = 0;
|
||
do {
|
||
scratchPstring[0] = 0;
|
||
GetIndString(scratchPstring, 2008, ++i);
|
||
if ( scratchPstring[0] ) {
|
||
StringToNum(scratchPstring, &scratchlong);
|
||
if ((unsigned short)scratchlong == port) {
|
||
break;
|
||
}
|
||
}
|
||
} while (scratchPstring[0]);
|
||
SetCntrl(dptr, id, i);
|
||
}
|
||
/* NONO */
|
||
|
||
SIMPLE_UPP(SessionModalProc, ModalFilter);
|
||
pascal short SessionModalProc(DialogPtr dptr, EventRecord *evt, short *item)
|
||
{
|
||
short key;
|
||
short tempLen, editField;
|
||
short start,end;
|
||
Handle hText;
|
||
char *pbuf;
|
||
char buffer[256];
|
||
long val;
|
||
|
||
|
||
// if ((evt->what == keyDown) || (evt->what == autoKey))
|
||
// if ((evt->message & charCodeMask) == ' ') {
|
||
// *item = NumOnly[0]; /* Kludge -- Return "safe" item */
|
||
// return(-1);
|
||
// }
|
||
|
||
editField = ((DialogPeek)dptr)->editField + 1;
|
||
/* NONO */
|
||
if ((evt->what == keyDown || evt->what == autoKey) && editField > 0 ) {
|
||
|
||
if ( editField == 51 || editField == 59 ) {
|
||
if (!PasswordFilter(dptr, evt, (editField == 51) ? configPassword : configPassword2, 250)) {
|
||
return TerminalModalProc(dptr, evt, item);
|
||
}
|
||
} else if ( editField == 81 || editField == 83 || editField == SessPort ) {
|
||
int updt = 0;
|
||
|
||
key = evt->message & charCodeMask;
|
||
switch (key) {
|
||
case '.': // Cmd-.
|
||
if (!(evt->modifiers & cmdKey))
|
||
break;
|
||
case '\r': // Return
|
||
case '\003': // Enter
|
||
case '\033': // Esc
|
||
case '\t': // Tab
|
||
case '\034': // Left arrow
|
||
case '\035': // Right arrow
|
||
case '\036': // Up arrow
|
||
case '\037': // Down arrow
|
||
return TerminalModalProc(dptr, evt, item);
|
||
default: // Everything else falls through to be dealt with
|
||
break; // below
|
||
}
|
||
start = (**((DialogPeek)dptr)->textH).selStart; // Get the current selection
|
||
end = (**((DialogPeek)dptr)->textH).selEnd;
|
||
hText = TEGetText(((DialogPeek)dptr)->textH);
|
||
|
||
/* filter port number */
|
||
buffer[0] = GetHandleSize(hText);
|
||
BlockMoveData(*hText, buffer + 1, (unsigned char)buffer[0]);
|
||
if (start != end) { // If there's a selection, delete it
|
||
DeleteRange(buffer,start,end);
|
||
StringToNum((unsigned char *)buffer, &val);
|
||
updt = 1;
|
||
}
|
||
if (key == '\010') { // Backspace
|
||
if (start != 0) {
|
||
DeleteRange(buffer,start-1,start); // Delete the character to the left
|
||
StringToNum((unsigned char *)buffer, &val);
|
||
updt = 1;
|
||
}
|
||
} else {
|
||
if ((evt->modifiers & cmdKey)) {
|
||
if (key == 'v' || key == 'V') {
|
||
// get scrap
|
||
OSErr err;
|
||
if ((err = GetScrapHandle('TEXT', &hText)) == noErr) {
|
||
int len = GetHandleSize(hText);
|
||
if (len && len + *buffer <= 255) {
|
||
int i;
|
||
for (i = 0; i < len ; i++) {
|
||
key = (*hText)[i];
|
||
InsertChar(buffer,start++,key);
|
||
StringToNum((unsigned char *)buffer, &val);
|
||
if ( key < '0' || key > '9' || val > 65535 ) {
|
||
SysBeep(5);
|
||
break;
|
||
}
|
||
// Insert the real key into the buffer
|
||
TEKey((*hText)[i], ((DialogPeek)dptr)->textH);
|
||
updt = 1;
|
||
}
|
||
}
|
||
DisposeHandle(hText);
|
||
evt->what = nullEvent;
|
||
}
|
||
}
|
||
} else {
|
||
InsertChar(buffer,start,key); // Insert the real key into the buffer
|
||
StringToNum((unsigned char *)buffer, &val);
|
||
if ( key < '0' || key > '9' || val > 65535 ) {
|
||
SysBeep(5);
|
||
evt->what = nullEvent;
|
||
} else {
|
||
updt = 1;
|
||
}
|
||
}
|
||
}
|
||
if (updt) {
|
||
/* update popup */
|
||
if (editField == 81) {
|
||
CheckPortPopup(dptr, val, 88);
|
||
} else if (editField == 83) {
|
||
CheckPortPopup(dptr, val, 89);
|
||
} else if (editField == SessPort) {
|
||
CheckPortPopup(dptr, val, 90);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
/* NONO */
|
||
|
||
return TerminalModalProc(dptr, evt, item);
|
||
}
|
||
|
||
void ShowTermPanel(DialogPtr dptr, short panel)
|
||
{
|
||
switch (panel) {
|
||
case 1:
|
||
ShowDialogItemRange(dptr, 11, 16);
|
||
ShowDialogItemRange(dptr, 22, 23);
|
||
ShowDialogItemRange(dptr, 25, 26);
|
||
ShowDialogItemRange(dptr, 29, 30);
|
||
ShowDialogItem(dptr, 32);
|
||
ShowDialogItemRange(dptr, 45, 46);
|
||
if ( GetCntlVal(dptr, TermType) != 1 ) {
|
||
ShowDialogItem(dptr, 48);
|
||
}
|
||
//ShowDialogItem(dptr, 48);
|
||
ShowDialogItem(dptr, 50);
|
||
break;
|
||
|
||
case 2:
|
||
ShowDialogItemRange(dptr, 27, 28);
|
||
ShowDialogItem(dptr, 31);
|
||
ShowDialogItemRange(dptr, 33, 37);
|
||
ShowDialogItem(dptr, TermMetaIsOff);
|
||
break;
|
||
|
||
case 3:
|
||
ShowDialogItemRange(dptr, 19, 21);
|
||
ShowDialogItemRange(dptr, 38, 42);
|
||
DrawPopUp(dptr, 20);
|
||
DrawPopUp(dptr, 41);
|
||
ShowDialogItem(dptr, 44);
|
||
break;
|
||
|
||
case 4:
|
||
ShowDialogItemRange(dptr, 3, 10);
|
||
ShowDialogItem(dptr, 24);
|
||
ShowDialogItem(dptr, 47);
|
||
break;
|
||
}
|
||
}
|
||
|
||
void HideTermPanel(DialogPtr dptr, short panel)
|
||
{
|
||
switch (panel) {
|
||
case 1:
|
||
HideDialogItemRange(dptr, 11, 16);
|
||
HideDialogItemRange(dptr, 22, 23);
|
||
HideDialogItemRange(dptr, 25, 26);
|
||
HideDialogItemRange(dptr, 29, 30);
|
||
HideDialogItem(dptr, 32);
|
||
HideDialogItemRange(dptr, 45, 46);
|
||
HideDialogItem(dptr, 48);
|
||
HideDialogItem(dptr, 50);
|
||
break;
|
||
|
||
case 2:
|
||
HideDialogItemRange(dptr, 27, 28);
|
||
HideDialogItem(dptr, 31);
|
||
HideDialogItemRange(dptr, 33, 37);
|
||
HideDialogItem(dptr, TermMetaIsOff);
|
||
break;
|
||
|
||
case 3:
|
||
DrawBlank(dptr, 20);
|
||
DrawBlank(dptr, 41);
|
||
HideDialogItemRange(dptr, 19, 21);
|
||
HideDialogItemRange(dptr, 38, 42);
|
||
HideDialogItem(dptr, 44);
|
||
break;
|
||
|
||
case 4:
|
||
HideDialogItemRange(dptr, 3, 10);
|
||
HideDialogItem(dptr, 24);
|
||
HideDialogItem(dptr, 47);
|
||
break;
|
||
}
|
||
}
|
||
|
||
Boolean EditTerminal(StringPtr PrefRecordNamePtr)
|
||
{
|
||
DialogPtr dptr;
|
||
short ditem, scratchshort, resourceID, i, currentPanel, newPanel;
|
||
long scratchlong;
|
||
ResType scratchResType;
|
||
Boolean IsNewPrefRecord, UserLikesNewColor,wasInAliasText;
|
||
TerminalPrefs** TermPrefsHdl;
|
||
TerminalPrefs* TermPrefsPtr;
|
||
Str255 scratchPstring;
|
||
RGBColor scratchRGBcolor;
|
||
Point ColorBoxPoint;
|
||
MenuHandle WeNeedAFontMenuHandle, WeNeedAnotherFontMenuHandle;
|
||
short editField;
|
||
|
||
SetUpMovableModalMenus();
|
||
dptr = GetNewMySmallStrangeDialog(TermDLOG, NULL, kInFront, (void *)ThirdCenterDialog);
|
||
ditem = 3;
|
||
SetDialogDefaultItem(dptr, 1);
|
||
SetDialogCancelItem(dptr, 2);
|
||
SetDialogTracksCursor(dptr, 1);
|
||
currentPanel = TelInfo->lastPanelTerminal + 1;
|
||
|
||
SetCntrl(dptr, 43, currentPanel);
|
||
|
||
WeNeedAFontMenuHandle = NewMenu(666, "\p");
|
||
//get the fonts from the font menu in the menu bar
|
||
scratchshort = CountMItems(myMenus[Font]);
|
||
for (i = 1; i <= scratchshort; i++)
|
||
{
|
||
GetMenuItemText(myMenus[Font],i,scratchPstring);
|
||
/* NONO */
|
||
//AppendMenu(WeNeedAFontMenuHandle,scratchPstring);
|
||
AppendMenu( WeNeedAFontMenuHandle, "\pempty" );
|
||
SetMenuItemText( WeNeedAFontMenuHandle, i, scratchPstring );
|
||
/* NONO */
|
||
}
|
||
|
||
TPopup[0].h = WeNeedAFontMenuHandle;
|
||
|
||
WeNeedAnotherFontMenuHandle = NewMenu(667, "\p");
|
||
//get the fonts from the font menu in the menu bar
|
||
scratchshort = CountMItems(myMenus[Font]);
|
||
for (i = 1; i <= scratchshort; i++)
|
||
{
|
||
GetMenuItemText(myMenus[Font],i,scratchPstring);
|
||
/* NONO */
|
||
//AppendMenu(WeNeedAnotherFontMenuHandle,scratchPstring);
|
||
AppendMenu( WeNeedAnotherFontMenuHandle, "\pempty" );
|
||
SetMenuItemText( WeNeedAnotherFontMenuHandle, i, scratchPstring );
|
||
/* NONO */
|
||
}
|
||
|
||
TPopup[1].h = WeNeedAnotherFontMenuHandle;
|
||
|
||
/* need to call PopupInit before ShowTermPanel(3) !!! */
|
||
PopupInit(dptr, TPopup);
|
||
|
||
HideTermPanel(dptr, 1);
|
||
HideTermPanel(dptr, 2);
|
||
HideTermPanel(dptr, 3);
|
||
HideTermPanel(dptr, 4);
|
||
|
||
if (PrefRecordNamePtr[0] != 0) {
|
||
IsNewPrefRecord = FALSE;
|
||
UseResFile(TelInfo->SettingsFile);
|
||
TermPrefsHdl = (TerminalPrefs **)Get1NamedSizedResource(TERMINALPREFS_RESTYPE, PrefRecordNamePtr, sizeof(TerminalPrefs));
|
||
if (IsDefaultLabel(PrefRecordNamePtr)) {
|
||
HideDialogItem(dptr, TermNameStatText);
|
||
HideDialogItem(dptr, TermName);
|
||
}
|
||
} else { //make sure we have a unique name
|
||
TermPrefsHdl = GetDefaultTerminal();
|
||
IsNewPrefRecord = TRUE;
|
||
GetIndString(PrefRecordNamePtr, MISC_STRINGS, MISC_NEWTERM);
|
||
getAUniqueName(currentHead,PrefRecordNamePtr);
|
||
}
|
||
HLock((Handle) TermPrefsHdl);
|
||
TermPrefsPtr = *TermPrefsHdl;
|
||
SetTEText(dptr, TermName, PrefRecordNamePtr);
|
||
SetCntrl(dptr, TermANSIEsc, TermPrefsPtr->ANSIgraphics);
|
||
SetCntrl(dptr, TermXterm, TermPrefsPtr->Xtermsequences);
|
||
SetCntrl(dptr, 37, TermPrefsPtr->remapCtrlD);
|
||
SetCntrl(dptr, 38, TermPrefsPtr->allowBold);
|
||
SetCntrl(dptr, 39, TermPrefsPtr->colorBold);
|
||
SetCntrl(dptr, 42, TermPrefsPtr->boldFontStyle);
|
||
SetCntrl(dptr, 44, TermPrefsPtr->realbold);
|
||
SetCntrl(dptr, 45, TermPrefsPtr->oldScrollback);
|
||
SetCntrl(dptr, 46, TermPrefsPtr->jumpScroll);
|
||
SetCntrl(dptr, Termvtwrap, TermPrefsPtr->vtwrap);
|
||
// SetCntrl(dptr, Termmeta, TermPrefsPtr->emacsmetakey);
|
||
SetCntrl(dptr, TermMetaIsCmdCntrol, (TermPrefsPtr->emacsmetakey == 1));
|
||
SetCntrl(dptr, TermMetaIsOption, (TermPrefsPtr->emacsmetakey == 2));
|
||
SetCntrl(dptr, TermMetaIsCmd, (TermPrefsPtr->emacsmetakey == 3));
|
||
SetCntrl(dptr, TermMetaIsOff, (TermPrefsPtr->emacsmetakey == 0));
|
||
SetCntrl(dptr, Termarrow, TermPrefsPtr->emacsarrows);
|
||
SetCntrl(dptr, TermMAT, TermPrefsPtr->MATmappings);
|
||
SetCntrl(dptr, Termeightbit, TermPrefsPtr->eightbit);
|
||
SetCntrl(dptr, Termclearsave, TermPrefsPtr->clearsave);
|
||
SetCntrl(dptr, TermType, TermPrefsPtr->vtemulation + 1);
|
||
|
||
SetCntrl(dptr, TermRemapKeypad, TermPrefsPtr->remapKeypad);
|
||
SetCntrl(dptr, 47, TermPrefsPtr->realBlink);
|
||
SetCntrl(dptr, 48, TermPrefsPtr->vt7bits);
|
||
|
||
SetCntrl(dptr, 50, TermPrefsPtr->hideScrollBars);
|
||
|
||
scratchlong = (long)(TermPrefsPtr->vtwidth);
|
||
NumToString(scratchlong, scratchPstring);
|
||
SetTEText(dptr, TermWidth, scratchPstring);
|
||
scratchlong = (short)(TermPrefsPtr->vtheight);
|
||
NumToString(scratchlong, scratchPstring);
|
||
SetTEText(dptr, TermHeight, scratchPstring);
|
||
scratchlong = TermPrefsPtr->fontsize;
|
||
NumToString(scratchlong, scratchPstring);
|
||
SetTEText(dptr, TermFontSize, scratchPstring);
|
||
scratchlong = (unsigned short)TermPrefsPtr->numbkscroll;
|
||
NumToString(scratchlong, scratchPstring);
|
||
SetTEText(dptr, TermScrollback, scratchPstring);
|
||
SetTEText(dptr, TermAnswerback, TermPrefsPtr->AnswerBackMessage);
|
||
|
||
for(scratchshort = CountMItems(TPopup[0].h); scratchshort; scratchshort--) {
|
||
GetMenuItemText(TPopup[0].h, scratchshort, scratchPstring);
|
||
if (EqualString(scratchPstring, (TermPrefsPtr->DisplayFont), TRUE, FALSE))
|
||
TPopup[0].choice = scratchshort;
|
||
}
|
||
|
||
for(scratchshort = CountMItems(TPopup[1].h); scratchshort; scratchshort--) {
|
||
GetMenuItemText(TPopup[1].h, scratchshort, scratchPstring);
|
||
if (EqualString(scratchPstring, (TermPrefsPtr->BoldFont), TRUE, FALSE))
|
||
TPopup[1].choice = scratchshort;
|
||
}
|
||
|
||
ZeroNumOnly();
|
||
NumOnly[0] = TermSafeItem;
|
||
NumOnly[1] = TermWidth; NumOnly[2] = TermHeight; NumOnly[3] = TermFontSize;
|
||
NumOnly[4] = TermScrollback;
|
||
NumOnly[5] = 0;
|
||
// if (TermPrefsPtr->vtemulation == 0)
|
||
// {
|
||
// HideDialogItem(dptr,TermRemapKeypad);
|
||
// HideDialogItem(dptr,TermMAT);
|
||
// }
|
||
|
||
if (TelInfo->haveColorQuickDraw) {
|
||
for (scratchshort = 0, NumberOfColorBoxes = 4; scratchshort < NumberOfColorBoxes; scratchshort++) {
|
||
BoxColorItems[scratchshort] = TermNFcolor + scratchshort;
|
||
BlockMoveData(&(TermPrefsPtr->nfcolor) + scratchshort,
|
||
&BoxColorData[scratchshort], sizeof(RGBColor));
|
||
UItemAssign( dptr, TermNFcolor + scratchshort, ColorBoxItemProcUPP);
|
||
}
|
||
}
|
||
else
|
||
NumberOfColorBoxes = 0; // B&W machine
|
||
|
||
ColorBoxPoint.h = 0; // Have the color picker center the box on the main
|
||
ColorBoxPoint.v = 0; // screen
|
||
|
||
ShowTermPanel(dptr, currentPanel);
|
||
|
||
if ( ((DialogPeek)dptr)->editField >= 0 ) {
|
||
SelectDialogItemText(dptr, ((DialogPeek)dptr)->editField + 1, 0, 255);
|
||
}
|
||
|
||
ShowWindow(dptr);
|
||
wasInAliasText = FALSE;
|
||
while (ditem > 2)
|
||
{
|
||
movableModalDialog(TerminalModalProcUPP, &ditem);
|
||
if ((wasInAliasText)&&(ditem != TermName))
|
||
{
|
||
wasInAliasText = FALSE;
|
||
GetTEText(dptr, TermName,scratchPstring);
|
||
if (EqualString(scratchPstring,PrefRecordNamePtr,FALSE,FALSE))
|
||
goto okayTermName;
|
||
if (scratchPstring[0] == 0) {
|
||
DialogPtr alertUser;
|
||
short alertDItem = 3;
|
||
alertUser = GetNewMyDialog(kBadPrefNameDLOG, NULL, kInFront, (void *)ThirdCenterDialog);
|
||
while (alertDItem > 1)
|
||
{
|
||
ModalDialog(DLOGwOK_CancelUPP,&alertDItem);
|
||
DisposeDialog(alertUser);
|
||
}
|
||
SetPort(dptr); //back to old dialog
|
||
SetTEText(dptr,TermName,PrefRecordNamePtr);//set the string back to the original
|
||
SelectDialogItemText(dptr,TermName,0,32767);
|
||
ditem = TermName; //so that if they hit ok or cancel, it doesn't kill the window
|
||
}
|
||
else if(findNodeNC(currentHead,scratchPstring)) //we already have that name
|
||
{
|
||
DialogPtr alertUser;
|
||
short alertDItem = 3;
|
||
alertUser = GetNewMyDialog(kBadPrefNameDLOG, NULL, kInFront, (void *)ThirdCenterDialog);
|
||
while (alertDItem > 1)
|
||
{
|
||
ModalDialog(DLOGwOK_CancelUPP,&alertDItem);
|
||
DisposeDialog(alertUser);
|
||
}
|
||
SetPort(dptr); //back to old dialog
|
||
SetTEText(dptr,TermName,PrefRecordNamePtr);//set the string back to the original
|
||
SelectDialogItemText(dptr,TermName,0,32767);
|
||
ditem = TermName; //so that if they hit ok or cancel, it doesn't kill the window
|
||
}
|
||
else
|
||
goto okayTermName;
|
||
}
|
||
else
|
||
{
|
||
okayTermName:
|
||
switch (ditem) {
|
||
case TermANSIEsc:
|
||
case TermXterm:
|
||
case 37:
|
||
case 38:
|
||
case 39:
|
||
case 42:
|
||
case 44:
|
||
case 45:
|
||
case 46:
|
||
case 47:
|
||
case 48:
|
||
case 50:
|
||
case Termvtwrap:
|
||
case Termarrow:
|
||
case TermMAT:
|
||
case Termeightbit:
|
||
case Termclearsave:
|
||
case TermRemapKeypad:
|
||
FlipCheckBox(dptr, ditem);
|
||
break;
|
||
|
||
case TermType:
|
||
switch (GetCntlVal(dptr, ditem)) {
|
||
case 1:
|
||
SetTEText(dptr, TermAnswerback, "\pvt100");
|
||
HideDialogItem(dptr, 48);
|
||
//HideDialogItem(dptr,TermRemapKeypad);
|
||
//HideDialogItem(dptr,TermMAT);
|
||
break;
|
||
case 2:
|
||
SetTEText(dptr, TermAnswerback, "\pvt220");
|
||
ShowDialogItem(dptr, 48);
|
||
//ShowDialogItem(dptr,TermRemapKeypad);
|
||
//ShowDialogItem(dptr,TermMAT);
|
||
break;
|
||
case 3:
|
||
SetTEText(dptr, TermAnswerback, "\pansi");
|
||
ShowDialogItem(dptr, 48);
|
||
//ShowDialogItem(dptr,TermRemapKeypad);
|
||
//ShowDialogItem(dptr,TermMAT);
|
||
break;
|
||
case 4:
|
||
SetTEText(dptr, TermAnswerback, "\plinux");
|
||
ShowDialogItem(dptr, 48);
|
||
//ShowDialogItem(dptr,TermRemapKeypad);
|
||
//ShowDialogItem(dptr,TermMAT);
|
||
break;
|
||
}
|
||
break;
|
||
|
||
case TermMetaIsCmdCntrol:
|
||
SetCntrl(dptr, TermMetaIsCmdCntrol, 1);
|
||
SetCntrl(dptr, TermMetaIsOption, 0);
|
||
SetCntrl(dptr, TermMetaIsCmd, 0);
|
||
SetCntrl(dptr, TermMetaIsOff, 0);
|
||
break;
|
||
case TermMetaIsOption:
|
||
SetCntrl(dptr, TermMetaIsCmdCntrol, 0);
|
||
SetCntrl(dptr, TermMetaIsOption, 1);
|
||
SetCntrl(dptr, TermMetaIsCmd, 0);
|
||
SetCntrl(dptr, TermMetaIsOff, 0);
|
||
break;
|
||
case TermMetaIsCmd:
|
||
SetCntrl(dptr, TermMetaIsCmdCntrol, 0);
|
||
SetCntrl(dptr, TermMetaIsOption, 0);
|
||
SetCntrl(dptr, TermMetaIsCmd, 1);
|
||
SetCntrl(dptr, TermMetaIsOff, 0);
|
||
break;
|
||
case TermMetaIsOff:
|
||
SetCntrl(dptr, TermMetaIsCmdCntrol, 0);
|
||
SetCntrl(dptr, TermMetaIsOption, 0);
|
||
SetCntrl(dptr, TermMetaIsCmd, 0);
|
||
SetCntrl(dptr, TermMetaIsOff, 1);
|
||
break;
|
||
case TermNFcolor:
|
||
case TermNBcolor:
|
||
case TermBFcolor:
|
||
case TermBBcolor:
|
||
if (TelInfo->haveColorQuickDraw) {
|
||
Str255 askColorString;
|
||
GetIndString(askColorString,MISC_STRINGS,PICK_NEW_COLOR_STRING);
|
||
UserLikesNewColor = GetColor(ColorBoxPoint, askColorString,
|
||
&BoxColorData[ditem-TermNFcolor], &scratchRGBcolor);
|
||
if (UserLikesNewColor)
|
||
BoxColorData[ditem-TermNFcolor] = scratchRGBcolor;
|
||
}
|
||
break;
|
||
case 43: // switch tabs
|
||
newPanel = GetCntlVal(dptr, ditem);
|
||
if (newPanel == currentPanel)
|
||
break;
|
||
editField = ((DialogPeek)dptr)->editField + 1;
|
||
HideTermPanel(dptr, currentPanel);
|
||
ShowTermPanel(dptr, newPanel);
|
||
currentPanel = newPanel;
|
||
if (editField != ((DialogPeek)dptr)->editField + 1
|
||
&& ((DialogPeek)dptr)->editField >= 0) {
|
||
SelectDialogItemText(dptr, ((DialogPeek)dptr)->editField + 1, 0, 255);
|
||
}
|
||
break;
|
||
|
||
case TermName:
|
||
wasInAliasText = TRUE;
|
||
default:
|
||
break;
|
||
|
||
} // switch
|
||
}//else not wasInAliasText
|
||
} // while
|
||
|
||
GetMenuItemText(TPopup[1].h, TPopup[1].choice, scratchPstring);
|
||
if (StrLength(scratchPstring) > 63) scratchPstring[0] = 63;
|
||
BlockMoveData(scratchPstring, (TermPrefsPtr->BoldFont), scratchPstring[0]+1);
|
||
|
||
GetMenuItemText(TPopup[0].h, TPopup[0].choice, scratchPstring);
|
||
PopupCleanup();
|
||
|
||
if (ditem == 2) {
|
||
if (IsNewPrefRecord) DisposeHandle((Handle) TermPrefsHdl);
|
||
else ReleaseResource((Handle) TermPrefsHdl);
|
||
|
||
TelInfo->lastPanelTerminal = currentPanel - 1;
|
||
DisposeDialog(dptr);
|
||
ResetMenus();
|
||
return(FALSE); // No changes should be made.
|
||
}
|
||
|
||
|
||
if (TelInfo->haveColorQuickDraw) {
|
||
for (scratchshort = 0; scratchshort < NumberOfColorBoxes; scratchshort++) {
|
||
BlockMoveData(&BoxColorData[scratchshort],
|
||
&(TermPrefsPtr->nfcolor) + scratchshort, sizeof(RGBColor));
|
||
}
|
||
}
|
||
|
||
if (StrLength(scratchPstring) > 63) scratchPstring[0] = 63;
|
||
BlockMoveData(scratchPstring, (TermPrefsPtr->DisplayFont), scratchPstring[0]+1);
|
||
|
||
TermPrefsPtr->ANSIgraphics = GetCntlVal(dptr, TermANSIEsc);
|
||
TermPrefsPtr->Xtermsequences = GetCntlVal(dptr, TermXterm);
|
||
TermPrefsPtr->remapCtrlD = GetCntlVal(dptr, 37);
|
||
TermPrefsPtr->allowBold = GetCntlVal(dptr, 38);
|
||
TermPrefsPtr->colorBold = GetCntlVal(dptr, 39);
|
||
TermPrefsPtr->realbold = GetCntlVal(dptr, 44);
|
||
TermPrefsPtr->oldScrollback = GetCntlVal(dptr, 45);
|
||
TermPrefsPtr->jumpScroll = GetCntlVal(dptr, 46);
|
||
TermPrefsPtr->boldFontStyle = GetCntlVal(dptr, 42);
|
||
TermPrefsPtr->realBlink = GetCntlVal(dptr, 47);
|
||
TermPrefsPtr->vt7bits = GetCntlVal(dptr, 48);
|
||
TermPrefsPtr->hideScrollBars = GetCntlVal(dptr, 50);
|
||
TermPrefsPtr->vtwrap = GetCntlVal(dptr, Termvtwrap);
|
||
|
||
if (GetCntlVal(dptr, TermMetaIsCmdCntrol))
|
||
TermPrefsPtr->emacsmetakey = 1;
|
||
else if (GetCntlVal(dptr, TermMetaIsOption))
|
||
TermPrefsPtr->emacsmetakey = 2;
|
||
else if (GetCntlVal(dptr, TermMetaIsCmd))
|
||
TermPrefsPtr->emacsmetakey = 3;
|
||
else
|
||
TermPrefsPtr->emacsmetakey = 0;
|
||
|
||
TermPrefsPtr->emacsarrows = GetCntlVal(dptr, Termarrow);
|
||
TermPrefsPtr->MATmappings = GetCntlVal(dptr, TermMAT);
|
||
TermPrefsPtr->eightbit = GetCntlVal(dptr, Termeightbit);
|
||
TermPrefsPtr->clearsave = GetCntlVal(dptr, Termclearsave);
|
||
TermPrefsPtr->remapKeypad = GetCntlVal(dptr, TermRemapKeypad);
|
||
|
||
TermPrefsPtr->vtemulation = GetCntlVal(dptr, TermType) - 1;
|
||
|
||
GetTEText(dptr, TermWidth, scratchPstring);
|
||
StringToNum(scratchPstring, &scratchlong);
|
||
/* NONO */
|
||
/* BoundsCheck(&scratchlong, 133, 10);*/
|
||
BoundsCheck(&scratchlong, 255, 1);
|
||
/* NONO */
|
||
TermPrefsPtr->vtwidth = (short) scratchlong;
|
||
|
||
GetTEText(dptr, TermHeight, scratchPstring);
|
||
StringToNum(scratchPstring, &scratchlong);
|
||
// BoundsCheck(&scratchlong, 80, 10);
|
||
BoundsCheck(&scratchlong, 200, 1);
|
||
TermPrefsPtr->vtheight = (short) scratchlong;
|
||
|
||
GetTEText(dptr, TermFontSize, scratchPstring);
|
||
StringToNum(scratchPstring, &scratchlong);
|
||
BoundsCheck(&scratchlong, 24, 4);
|
||
TermPrefsPtr->fontsize = (short) scratchlong;
|
||
|
||
GetTEText(dptr, TermScrollback, scratchPstring);
|
||
StringToNum(scratchPstring, &scratchlong);
|
||
BoundsCheck(&scratchlong, 32767, 24);
|
||
TermPrefsPtr->numbkscroll = (unsigned short) scratchlong;
|
||
|
||
GetTEText(dptr, TermAnswerback, scratchPstring);
|
||
if (StrLength(scratchPstring) > 63) scratchPstring[0] = 63;
|
||
BlockMoveData(scratchPstring, TermPrefsPtr->AnswerBackMessage, scratchPstring[0]+1);
|
||
|
||
GetTEText(dptr, TermName, PrefRecordNamePtr);
|
||
|
||
if (IsNewPrefRecord) {
|
||
UseResFile(TelInfo->SettingsFile);
|
||
resourceID = UniqueID(TERMINALPREFS_RESTYPE);
|
||
AddResource((Handle)TermPrefsHdl, TERMINALPREFS_RESTYPE, resourceID, PrefRecordNamePtr);
|
||
UpdateResFile(TelInfo->SettingsFile);
|
||
ReleaseResource((Handle)TermPrefsHdl);
|
||
}
|
||
else {
|
||
UseResFile(TelInfo->SettingsFile);
|
||
GetResInfo((Handle)TermPrefsHdl, &resourceID, &scratchResType,(StringPtr) &scratchPstring);
|
||
SetResInfo((Handle)TermPrefsHdl, resourceID, PrefRecordNamePtr);
|
||
ChangedResource((Handle)TermPrefsHdl);
|
||
UpdateResFile(TelInfo->SettingsFile);
|
||
ReleaseResource((Handle)TermPrefsHdl);
|
||
}
|
||
|
||
TelInfo->lastPanelTerminal = currentPanel - 1;
|
||
DisposeDialog(dptr);
|
||
ResetMenus();
|
||
return(TRUE); // A resource has changed or been added.
|
||
}
|
||
|
||
/* NONO */
|
||
static void CheckSSH2Method(DialogPtr dptr, short method)
|
||
{
|
||
if ( method ) {
|
||
if ( method == 3 ) {
|
||
ShowDialogItem(dptr, 81);
|
||
HideDialogItemRange(dptr, 82, 83);
|
||
ShowDialogItem(dptr, 84);
|
||
HideDialogItemRange(dptr, 85, 86);
|
||
ShowDialogItemRange(dptr, 87, 88);
|
||
HideDialogItem(dptr, 89);
|
||
} else if ( method == 4 ) {
|
||
ShowDialogItem(dptr, 81);
|
||
HideDialogItemRange(dptr, 82, 83);
|
||
ShowDialogItem(dptr, 84);
|
||
HideDialogItemRange(dptr, 85, 86);
|
||
ShowDialogItemRange(dptr, 87, 88);
|
||
HideDialogItem(dptr, 89);
|
||
} else {
|
||
ShowDialogItemRange(dptr, 81, 89);
|
||
}
|
||
} else {
|
||
HideDialogItemRange(dptr, 81, 89);
|
||
}
|
||
}
|
||
/* NONO */
|
||
|
||
void ShowSessPanel(DialogPtr dptr, short panel)
|
||
{
|
||
switch (panel) {
|
||
case 1: // general
|
||
ShowDialogItemRange(dptr, 19, 20);
|
||
ShowDialogItemRange(dptr, 25, 27);
|
||
ShowDialogItem(dptr, 29);
|
||
ShowDialogItemRange(dptr, 36, 37);
|
||
ShowDialogItemRange(dptr, 40, 41);
|
||
DrawPopUp(dptr, 25);
|
||
DrawPopUp(dptr, 26);
|
||
ShowDialogItem(dptr, 72);
|
||
ShowDialogItem(dptr, 90);
|
||
break;
|
||
|
||
case 2: // network
|
||
ShowDialogItemRange(dptr, 6, 7);
|
||
ShowDialogItemRange(dptr, 21, 24);
|
||
ShowDialogItem(dptr, 12);
|
||
ShowDialogItem(dptr, 14);
|
||
ShowDialogItem(dptr, 17);
|
||
ShowDialogItem(dptr, 31);
|
||
ShowDialogItemRange(dptr, 33, 35);
|
||
ShowDialogItemRange(dptr, 38, 39);
|
||
break;
|
||
|
||
case 3: // terminal
|
||
ShowDialogItemRange(dptr, 3, 5);
|
||
ShowDialogItemRange(dptr, 8, 11);
|
||
ShowDialogItem(dptr, 13);
|
||
ShowDialogItem(dptr, 30);
|
||
ShowDialogItem(dptr, 32);
|
||
ShowDialogItemRange(dptr, 42, 44);
|
||
ShowDialogItem(dptr, 91);
|
||
ShowDialogItem(dptr, 94);
|
||
break;
|
||
|
||
case 4: // security
|
||
ShowDialogItemRange(dptr, 15, 16);
|
||
ShowDialogItemRange(dptr, 53, 61);
|
||
ShowDialogItem(dptr, 92);
|
||
break;
|
||
|
||
case 5: // otp
|
||
ShowDialogItemRange(dptr, 46, 52);
|
||
break;
|
||
|
||
case 6: // ssh2
|
||
ShowDialogItemRange(dptr, 62, 63);
|
||
/* NONO */
|
||
ShowDialogItemRange(dptr, 73, 80);
|
||
CheckSSH2Method( dptr, GetCntlVal(dptr, 80) - 1 );
|
||
ShowDialogItem(dptr, 93);
|
||
/* NONO */
|
||
|
||
// Hide "Encryption", "Authentication", "Compression" menus
|
||
HideDialogItem(dptr, 62);
|
||
HideDialogItem(dptr, 73);
|
||
HideDialogItem(dptr, 74);
|
||
|
||
// Don't show "Initialize SSH Key" and "Export public key" buttons
|
||
HideDialogItem(dptr, 63);
|
||
HideDialogItem(dptr, 79);
|
||
break;
|
||
|
||
case 7: // firewall
|
||
ShowDialogItemRange(dptr, 64, 71);
|
||
break;
|
||
}
|
||
}
|
||
|
||
void HideSessPanel(DialogPtr dptr, short panel)
|
||
{
|
||
switch (panel) {
|
||
case 1:
|
||
DrawBlank(dptr, 25);
|
||
DrawBlank(dptr, 26);
|
||
HideDialogItemRange(dptr, 19, 20);
|
||
HideDialogItemRange(dptr, 25, 27);
|
||
HideDialogItem(dptr, 29);
|
||
HideDialogItemRange(dptr, 36, 37);
|
||
HideDialogItemRange(dptr, 40, 41);
|
||
HideDialogItem(dptr, 72);
|
||
HideDialogItem(dptr, 90);
|
||
break;
|
||
|
||
case 2:
|
||
HideDialogItemRange(dptr, 6, 7);
|
||
HideDialogItemRange(dptr, 21, 24);
|
||
HideDialogItem(dptr, 12);
|
||
HideDialogItem(dptr, 14);
|
||
HideDialogItem(dptr, 17);
|
||
HideDialogItem(dptr, 31);
|
||
HideDialogItemRange(dptr, 33, 35);
|
||
HideDialogItemRange(dptr, 38, 39);
|
||
break;
|
||
|
||
case 3:
|
||
HideDialogItemRange(dptr, 3, 5);
|
||
HideDialogItemRange(dptr, 8, 11);
|
||
HideDialogItem(dptr, 13);
|
||
HideDialogItem(dptr, 30);
|
||
HideDialogItem(dptr, 32);
|
||
HideDialogItemRange(dptr, 42, 44);
|
||
HideDialogItem(dptr, 91);
|
||
HideDialogItem(dptr, 94);
|
||
break;
|
||
|
||
case 4:
|
||
HideDialogItemRange(dptr, 15, 16);
|
||
HideDialogItemRange(dptr, 53, 61);
|
||
HideDialogItem(dptr, 92);
|
||
break;
|
||
|
||
case 5:
|
||
HideDialogItemRange(dptr, 46, 52);
|
||
break;
|
||
|
||
case 6:
|
||
HideDialogItemRange(dptr, 62, 63);
|
||
/* NONO */
|
||
HideDialogItemRange(dptr, 73, 89);
|
||
HideDialogItem(dptr, 93);
|
||
/* NONO */
|
||
break;
|
||
|
||
case 7:
|
||
HideDialogItemRange(dptr, 64, 71);
|
||
}
|
||
}
|
||
|
||
Boolean EditSession(StringPtr PrefRecordNamePtr)
|
||
{
|
||
DialogPtr dptr;
|
||
short ditem, scratchshort, resourceID, currentPanel, newPanel, i;
|
||
short numberOfTerms;
|
||
long scratchlong;
|
||
ResType scratchResType;
|
||
Boolean IsNewPrefRecord, wasInAliasText;
|
||
SessionPrefs** SessPrefsHdl;
|
||
SessionPrefs* SessPrefsPtr;
|
||
TerminalPrefs** tempTermPrefsHdl;
|
||
Str255 scratchPstring, scratchPstring2;
|
||
LinkedListNode *savedList;
|
||
EventRecord optKeyEvtRec;
|
||
popup SPopup[] = {{SessTermPopup, (MenuHandle) 0, 1},
|
||
{SessTransTablePopup, (MenuHandle) 0, 1},
|
||
{0, (MenuHandle) 0, 0}};
|
||
short editField;
|
||
|
||
SetUpMovableModalMenus();
|
||
dptr = GetNewMySmallStrangeDialog(SessionConfigDLOG, NULL, kInFront, (void *)ThirdCenterDialog);
|
||
ditem = 3;
|
||
SetDialogDefaultItem(dptr, 1);
|
||
SetDialogCancelItem(dptr, 2);
|
||
SetDialogTracksCursor(dptr, 1);
|
||
currentPanel = TelInfo->lastPanelSession + 1;
|
||
|
||
savedList = currentHead; //save the current list, so the list that got us here works
|
||
SPopup[0].h = NewMenu(666, "\p");
|
||
UseResFile(TelInfo->SettingsFile);
|
||
numberOfTerms = Count1Resources(TERMINALPREFS_RESTYPE);
|
||
currentHead = createSortedList(TERMINALPREFS_RESTYPE,numberOfTerms,gDefaultName);
|
||
addListToMenu(SPopup[0].h, currentHead, 1);
|
||
EnableItem(SPopup[0].h, 0); // Make sure the entire menu is enabled
|
||
deleteList(¤tHead);
|
||
|
||
UseResFile(TelInfo->ApplicationFile);
|
||
SPopup[1].h = NewMenu(667, "\p");
|
||
BuildTranslateMenu(SPopup[1].h);
|
||
|
||
UseResFile(TelInfo->SettingsFile);
|
||
currentHead = savedList;
|
||
PopupInit(dptr, SPopup);
|
||
|
||
if (PrefRecordNamePtr[0] != 0) {
|
||
IsNewPrefRecord = FALSE;
|
||
UseResFile(TelInfo->SettingsFile);
|
||
SessPrefsHdl = (SessionPrefs **)Get1NamedSizedResource(SESSIONPREFS_RESTYPE, PrefRecordNamePtr, sizeof(SessionPrefs));
|
||
if (IsDefaultLabel(PrefRecordNamePtr)) {
|
||
HideDialogItem(dptr, SessAlias);
|
||
HideDialogItem(dptr, SessAliasStatText);
|
||
}
|
||
} else {
|
||
SessPrefsHdl = GetDefaultSession();
|
||
IsNewPrefRecord = TRUE;
|
||
GetIndString(PrefRecordNamePtr, MISC_STRINGS, MISC_NEWSESSION);
|
||
getAUniqueName(currentHead,PrefRecordNamePtr);
|
||
}
|
||
|
||
HLock((Handle) SessPrefsHdl);
|
||
SessPrefsPtr = *SessPrefsHdl;
|
||
SetCntrl(dptr, SessTEKinhib, (SessPrefsPtr->tektype == -1));
|
||
SetCntrl(dptr, SessTEK4014, (SessPrefsPtr->tektype == 0));
|
||
SetCntrl(dptr, SessTEK4105, (SessPrefsPtr->tektype == 1));
|
||
SetCntrl(dptr, SessPasteQuick, (SessPrefsPtr->pastemethod == 0));
|
||
SetCntrl(dptr, SessPasteBlock, (SessPrefsPtr->pastemethod == 1));
|
||
SetCntrl(dptr, SessDeleteDel, (SessPrefsPtr->bksp == 1));
|
||
SetCntrl(dptr, SessDeleteBS, (SessPrefsPtr->bksp == 0));
|
||
SetCntrl(dptr, SessForceSave, SessPrefsPtr->forcesave);
|
||
SetCntrl(dptr, SessBezerkeley, SessPrefsPtr->crmap);
|
||
SetCntrl(dptr, 42, SessPrefsPtr->alwaysBSD);
|
||
SetCntrl(dptr, 43, SessPrefsPtr->ignoreBeeps);
|
||
SetCntrl(dptr, 44, SessPrefsPtr->ignoreff);
|
||
SetCntrl(dptr, SessLinemode, SessPrefsPtr->linemode);
|
||
SetCntrl(dptr, SessTEKclear, SessPrefsPtr->tekclear);
|
||
SetCntrl(dptr, SessHalfDuplex, SessPrefsPtr->halfdup);
|
||
SetCntrl(dptr, SessAuthenticate, SessPrefsPtr->authenticate);
|
||
SetCntrl(dptr, SessEncrypt, SessPrefsPtr->encrypt);
|
||
SetCntrl(dptr, 92, SessPrefsPtr->forward);
|
||
SetCntrl(dptr, SessLocalEcho, SessPrefsPtr->localecho);
|
||
SetCntrl(dptr, 46, SessPrefsPtr->otpauto);
|
||
SetCntrl(dptr, 47, SessPrefsPtr->otpmulti);
|
||
SetCntrl(dptr, 48, SessPrefsPtr->otphex);
|
||
SetCntrl(dptr, 49, SessPrefsPtr->otpnoprompt);
|
||
SetCntrl(dptr, 52, SessPrefsPtr->otpsavepass);
|
||
SetCntrl(dptr, 53, SessPrefsPtr->protocol + 1);
|
||
SetCntrl(dptr, 62, SessPrefsPtr->encryption + 1);
|
||
SetCntrl(dptr, 64, SessPrefsPtr->usesocks);
|
||
SetCntrl(dptr, 65, SessPrefsPtr->socks4a);
|
||
|
||
/* NONO */
|
||
SetCntrl(dptr, 73, SessPrefsPtr->authentication + 1);
|
||
SetCntrl(dptr, 74, SessPrefsPtr->compression + 1);
|
||
SetCntrl(dptr, 75, SessPrefsPtr->verbose);
|
||
SetCntrl(dptr, 76, SessPrefsPtr->trace);
|
||
SetCntrl(dptr, 77, SessPrefsPtr->debug);
|
||
SetCntrl(dptr, 78, SessPrefsPtr->restricted);
|
||
SetCntrl(dptr, 80, SessPrefsPtr->ssh2method + 1);
|
||
CheckSSH2Method(dptr, SessPrefsPtr->ssh2method);
|
||
NumToString((unsigned short)SessPrefsPtr->localport, scratchPstring);
|
||
SetTEText(dptr, 81, scratchPstring);
|
||
SetTEText(dptr, 82, (unsigned char *)SessPrefsPtr->remotehost);
|
||
NumToString((unsigned short)SessPrefsPtr->remoteport, scratchPstring);
|
||
SetTEText(dptr, 83, scratchPstring);
|
||
SetCntrl(dptr, 87, SessPrefsPtr->ssh2guests);
|
||
CheckPortPopup( dptr, SessPrefsPtr->localport, 88 );
|
||
CheckPortPopup( dptr, SessPrefsPtr->remoteport, 89 );
|
||
CheckPortPopup( dptr, (unsigned short)SessPrefsPtr->port, 90 );
|
||
SetCntrl(dptr, 91, SessPrefsPtr->launchurlesc);
|
||
SetCntrl(dptr, 93, SessPrefsPtr->x11forward);
|
||
SetCntrl(dptr, 94, SessPrefsPtr->keepselection);
|
||
// SetCntrl(dptr, 95, SessPrefsPtr->autoreconnect);
|
||
|
||
/* NONO */
|
||
|
||
if (!authOK) {
|
||
Hilite( dptr, SessAuthenticate, 255);
|
||
Hilite( dptr, SessEncrypt, 255);
|
||
Hilite( dptr, 92, 255);
|
||
} else if (!encryptOK) {
|
||
Hilite( dptr, SessEncrypt, 255);
|
||
}
|
||
if (GetCntlVal(dptr, SessAuthenticate)) {
|
||
Hilite(dptr, SessEncrypt, (encryptOK)? 0 : 255);
|
||
Hilite(dptr, 92, 0);
|
||
} else {
|
||
Hilite(dptr, SessEncrypt, 255);
|
||
Hilite( dptr, 92, 255);
|
||
SetCntrl(dptr, SessEncrypt, false);
|
||
SetCntrl(dptr, 92, false);
|
||
}
|
||
|
||
configPassword[0] = 0;
|
||
if (SessPrefsPtr->otppassword[0]) {
|
||
PLstrcpy(configPassword, (unsigned char *)SessPrefsPtr->otppassword);
|
||
scratchPstring[0] = configPassword[0];
|
||
for (i = 1; i < 250 && i <= configPassword[0]; i++)
|
||
scratchPstring[i] = '<EFBFBD>';
|
||
SetTEText(dptr, 51, scratchPstring);
|
||
}
|
||
configPassword2[0] = 0;
|
||
if (SessPrefsPtr->password[0]) {
|
||
PLstrcpy(configPassword2, (unsigned char *)SessPrefsPtr->password);
|
||
scratchPstring[0] = configPassword2[0];
|
||
for (i = 1; i < 250 && i <= configPassword2[0]; i++)
|
||
scratchPstring[i] = '<EFBFBD>';
|
||
SetTEText(dptr, 59, scratchPstring);
|
||
}
|
||
|
||
SetTEText(dptr, SessHostName, SessPrefsPtr->hostname);
|
||
SetTEText(dptr, SessAlias, PrefRecordNamePtr);
|
||
SetTEText(dptr, 58, (unsigned char *)SessPrefsPtr->username);
|
||
// SetTEText(dptr, 59, (unsigned char *)SessPrefsPtr->password);
|
||
SetTEText(dptr, 60, (unsigned char *)SessPrefsPtr->clientuser);
|
||
|
||
if ( SessPrefsPtr->protocol != PROTOCOL_SSH ) {
|
||
GetIndString(scratchPstring, MISC_STRINGS, MISC_COMMAND);
|
||
} else {
|
||
GetIndString(scratchPstring, MISC_STRINGS, MISC_ARGUMENTS);
|
||
}
|
||
SetTEText(dptr, 57, scratchPstring);
|
||
|
||
SetTEText(dptr, 61, (unsigned char *)SessPrefsPtr->command);
|
||
SetTEText(dptr, 66, (unsigned char *)SessPrefsPtr->sockshost);
|
||
SetTEText(dptr, 71, (unsigned char *)SessPrefsPtr->socksusername);
|
||
|
||
if (SessPrefsPtr->portNegative) {
|
||
NumToString((unsigned short)SessPrefsPtr->port, &scratchPstring[1]);
|
||
scratchPstring[0] = scratchPstring[1] + 1;
|
||
scratchPstring[1] = '-';
|
||
} else NumToString((unsigned short)SessPrefsPtr->port, scratchPstring);
|
||
SetTEText(dptr, SessPort, scratchPstring);
|
||
|
||
NumToString(SessPrefsPtr->pasteblocksize, scratchPstring);
|
||
SetTEText(dptr, SessBlockSize, scratchPstring);
|
||
|
||
if (!SessPrefsPtr->socksport) SessPrefsPtr->socksport = 1080;
|
||
NumToString((unsigned short)SessPrefsPtr->socksport, scratchPstring);
|
||
SetTEText(dptr, 67, scratchPstring);
|
||
|
||
if (SessPrefsPtr->NetBlockSize <= 512)
|
||
SessPrefsPtr->NetBlockSize = 512;
|
||
NumToString(SessPrefsPtr->NetBlockSize, scratchPstring);
|
||
SetTEText(dptr, SessBlockSizeTE, scratchPstring);
|
||
|
||
scratchPstring[0] = 2;
|
||
scratchPstring[1] = '^';
|
||
if (SessPrefsPtr->ckey != -1) {
|
||
scratchPstring[2] = SessPrefsPtr->ckey ^ 64;
|
||
SetTEText(dptr, SessInterrupt, scratchPstring);
|
||
}
|
||
if (SessPrefsPtr->skey != -1) {
|
||
scratchPstring[2] = SessPrefsPtr->skey ^ 64;
|
||
SetTEText(dptr, SessSuspend, scratchPstring);
|
||
}
|
||
if (SessPrefsPtr->qkey != -1) {
|
||
scratchPstring[2] = SessPrefsPtr->qkey ^ 64;
|
||
SetTEText(dptr, SessResume, scratchPstring);
|
||
}
|
||
for(scratchshort = CountMItems(SPopup[0].h); scratchshort; scratchshort--) {
|
||
GetMenuItemText(SPopup[0].h, scratchshort, scratchPstring);
|
||
if (EqualString(scratchPstring, (SessPrefsPtr->TerminalEmulation), TRUE, FALSE))
|
||
SPopup[0].choice = scratchshort;
|
||
}
|
||
for(scratchshort = CountMItems(SPopup[1].h); scratchshort; scratchshort--) {
|
||
GetMenuItemText(SPopup[1].h, scratchshort, scratchPstring);
|
||
if (EqualString(scratchPstring, (SessPrefsPtr->TranslationTable), TRUE, FALSE))
|
||
SPopup[1].choice = scratchshort;
|
||
}
|
||
|
||
NumberOfColorBoxes = 0;
|
||
ZeroNumOnly();
|
||
NumOnly[0] = SessSafeItem;
|
||
NumOnly[1] = SessBlockSize;
|
||
|
||
SetCntrl(dptr, 45, currentPanel);
|
||
|
||
for (i = 1; i < 8; i++)
|
||
HideSessPanel(dptr, i);
|
||
ShowSessPanel(dptr, currentPanel);
|
||
|
||
if ( ((DialogPeek)dptr)->editField >= 0 ) {
|
||
SelectDialogItemText(dptr, ((DialogPeek)dptr)->editField + 1, 0, 255);
|
||
}
|
||
|
||
ShowWindow(dptr);
|
||
wasInAliasText = FALSE;
|
||
while ((ditem > 2) || (ditem == 0)) {
|
||
movableModalDialog(SessionModalProcUPP, &ditem);
|
||
if (ditem == 0) continue;
|
||
if ((wasInAliasText)&&(ditem != SessAlias))
|
||
{
|
||
wasInAliasText = FALSE;
|
||
GetTEText(dptr, SessAlias, scratchPstring);
|
||
if (EqualString(scratchPstring,PrefRecordNamePtr,FALSE,FALSE))
|
||
goto okaySessName;
|
||
if (scratchPstring[0] == 0)
|
||
{
|
||
DialogPtr alertUser;
|
||
short alertDItem = 3;
|
||
alertUser = GetNewMyDialog(kBadPrefNameDLOG, NULL, kInFront, (void *)ThirdCenterDialog);
|
||
while (alertDItem > 1)
|
||
{
|
||
ModalDialog(DLOGwOK_CancelUPP,&alertDItem);
|
||
DisposeDialog(alertUser);
|
||
}
|
||
SetPort(dptr); //back to old dialog
|
||
SetTEText(dptr,SessAlias,PrefRecordNamePtr);//set the string back to the original
|
||
SelectDialogItemText(dptr,SessAlias,0,32767);
|
||
ditem = SessAlias; //so that if they hit ok or cancel, it doesn't kill the window
|
||
}
|
||
else if(findNodeNC(currentHead,scratchPstring)) //we already have that name
|
||
{
|
||
DialogPtr alertUser;
|
||
short alertDItem = 3;
|
||
alertUser = GetNewMyDialog(kBadPrefNameDLOG, NULL, kInFront, (void *)ThirdCenterDialog);
|
||
while (alertDItem > 1)
|
||
{
|
||
ModalDialog(DLOGwOK_CancelUPP,&alertDItem);
|
||
DisposeDialog(alertUser);
|
||
}
|
||
SetPort(dptr); //back to old dialog
|
||
SetTEText(dptr,SessAlias,PrefRecordNamePtr);//set the string back to the original
|
||
SelectDialogItemText(dptr,SessAlias,0,32767);
|
||
ditem = SessAlias; //so that if they hit ok or cancel, it doesn't kill the window
|
||
}
|
||
else
|
||
goto okaySessName;
|
||
}
|
||
else
|
||
{
|
||
okaySessName:
|
||
switch (ditem) {
|
||
|
||
case SessAuthenticate:
|
||
FlipCheckBox(dptr, ditem);
|
||
if (GetCntlVal(dptr, SessAuthenticate)) {
|
||
Hilite(dptr, SessEncrypt, (encryptOK)? 0 : 255);
|
||
Hilite(dptr, 92, 0);
|
||
} else {
|
||
Hilite(dptr, SessEncrypt, 255);
|
||
Hilite(dptr, 92, 255);
|
||
SetCntrl(dptr, SessEncrypt, false);
|
||
SetCntrl(dptr, 92, false);
|
||
}
|
||
break;
|
||
|
||
case SessForceSave:
|
||
case SessBezerkeley:
|
||
case SessLinemode:
|
||
case SessTEKclear:
|
||
case SessHalfDuplex:
|
||
case SessEncrypt:
|
||
case SessLocalEcho:
|
||
case 42:
|
||
case 43:
|
||
case 44:
|
||
case 46:
|
||
case 47:
|
||
case 48:
|
||
case 49:
|
||
case 52:
|
||
case 64:
|
||
case 65:
|
||
/* NONO */
|
||
case 75:
|
||
case 76:
|
||
case 77:
|
||
case 78:
|
||
case 87:
|
||
case 91:
|
||
case 92:
|
||
case 93:
|
||
case 94:
|
||
/* NONO */
|
||
FlipCheckBox(dptr, ditem);
|
||
break;
|
||
|
||
/* NONO */
|
||
case 79:
|
||
if (ssh_glue_installed())
|
||
ssh_glue_exportkey();
|
||
else OperationFailedAlert(6, 0, 0);
|
||
break;
|
||
case 80:
|
||
CheckSSH2Method( dptr, GetCntlVal(dptr, 80) - 1 );
|
||
break;
|
||
case 88:
|
||
case 89:
|
||
/* local/remote port popup */
|
||
GetIndString(scratchPstring, 2008, GetCntlVal(dptr, ditem));
|
||
if (scratchPstring[0]) {
|
||
SetTEText(dptr,(ditem == 88) ? 81 : 83,scratchPstring);
|
||
SelectDialogItemText(dptr,(ditem == 88) ? 81 : 83,0,32767);
|
||
}
|
||
break;
|
||
case 90:
|
||
GetIndString(scratchPstring, 2008, GetCntlVal(dptr, ditem));
|
||
if (scratchPstring[0]) {
|
||
SetTEText(dptr,SessPort,scratchPstring);
|
||
SelectDialogItemText(dptr,SessPort,0,32767);
|
||
}
|
||
break;
|
||
case 63:
|
||
if (ssh_glue_installed()) {
|
||
SetDialogTracksCursor(dptr, 0);
|
||
ssh_glue_randomize();
|
||
SetDialogTracksCursor(dptr, 1);
|
||
}
|
||
else OperationFailedAlert(6, 0, 0);
|
||
break;
|
||
/* NONO */
|
||
|
||
case 53:
|
||
{
|
||
short protocol, tempPort;
|
||
protocol = GetCntlVal(dptr, 53);
|
||
tempPort = getDefaultPort(protocol - 1);
|
||
NumToString((unsigned short)tempPort, scratchPstring);
|
||
SetTEText(dptr, SessPort, scratchPstring);
|
||
CheckPortPopup( dptr, (unsigned short)tempPort, 90 );
|
||
|
||
if ( protocol != 5 ) {
|
||
GetIndString(scratchPstring, MISC_STRINGS, MISC_COMMAND);
|
||
} else {
|
||
GetIndString(scratchPstring, MISC_STRINGS, MISC_ARGUMENTS);
|
||
}
|
||
SetTEText(dptr, 57, scratchPstring);
|
||
}
|
||
break;
|
||
|
||
case SessTEKinhib:
|
||
SetCntrl(dptr, SessTEKinhib, 1);
|
||
SetCntrl(dptr, SessTEK4014, 0);
|
||
SetCntrl(dptr, SessTEK4105, 0);
|
||
break;
|
||
case SessTEK4014:
|
||
SetCntrl(dptr, SessTEKinhib, 0);
|
||
SetCntrl(dptr, SessTEK4014, 1);
|
||
SetCntrl(dptr, SessTEK4105, 0);
|
||
break;
|
||
case SessTEK4105:
|
||
SetCntrl(dptr, SessTEKinhib, 0);
|
||
SetCntrl(dptr, SessTEK4014, 0);
|
||
SetCntrl(dptr, SessTEK4105, 1);
|
||
break;
|
||
|
||
case SessPasteQuick:
|
||
SetCntrl(dptr, SessPasteQuick, 1);
|
||
SetCntrl(dptr, SessPasteBlock, 0);
|
||
break;
|
||
|
||
case SessPasteBlock:
|
||
SetCntrl(dptr, SessPasteQuick, 0);
|
||
SetCntrl(dptr, SessPasteBlock, 1);
|
||
break;
|
||
|
||
case SessDeleteDel:
|
||
SetCntrl(dptr, SessDeleteDel, 1);
|
||
SetCntrl(dptr, SessDeleteBS, 0);
|
||
break;
|
||
|
||
case SessDeleteBS:
|
||
SetCntrl(dptr, SessDeleteDel, 0);
|
||
SetCntrl(dptr, SessDeleteBS, 1);
|
||
break;
|
||
|
||
case SessInterrupt:
|
||
case SessSuspend:
|
||
case SessResume:
|
||
GetTEText(dptr, ditem, scratchPstring);
|
||
if ((scratchPstring[1] < 32) && (scratchPstring[1] > 0)) {
|
||
scratchPstring[0] = 2;
|
||
scratchPstring[2] = scratchPstring[1] ^ 64;
|
||
scratchPstring[1] = '^';
|
||
SetTEText(dptr, ditem, scratchPstring);
|
||
}
|
||
break;
|
||
|
||
case 45: // tab control
|
||
newPanel = GetCntlVal(dptr, 45);
|
||
if (newPanel == currentPanel)
|
||
break;
|
||
editField = ((DialogPeek)dptr)->editField + 1;
|
||
HideSessPanel(dptr, currentPanel);
|
||
ShowSessPanel(dptr, newPanel);
|
||
SelectDialogItemText(dptr,((DialogPeek)dptr)->editField + 1,0,32767);
|
||
currentPanel = newPanel;
|
||
if (editField != ((DialogPeek)dptr)->editField + 1
|
||
&& ((DialogPeek)dptr)->editField >= 0) {
|
||
SelectDialogItemText(dptr, ((DialogPeek)dptr)->editField + 1, 0, 255);
|
||
}
|
||
break;
|
||
|
||
case 40: // Save as Set...
|
||
case 41: // Add to Set...
|
||
SetSessionData(dptr, SessPrefsPtr, (char *)SPopup, PrefRecordNamePtr);
|
||
UseResFile(TelInfo->SettingsFile);
|
||
tempTermPrefsHdl = (TerminalPrefs **)Get1NamedSizedResource
|
||
(TERMINALPREFS_RESTYPE, SessPrefsPtr->TerminalEmulation, sizeof(TerminalPrefs));
|
||
DetachResource((Handle) tempTermPrefsHdl);
|
||
HLock((Handle) tempTermPrefsHdl);
|
||
EventAvail(everyEvent, &optKeyEvtRec);
|
||
SaveSetFromSession(SessPrefsPtr, *tempTermPrefsHdl, (ditem == 41), (optKeyEvtRec.modifiers & 0x0800));
|
||
DisposeHandle((Handle) tempTermPrefsHdl);
|
||
break;
|
||
|
||
case 72: // Edit Session Macros
|
||
{
|
||
static NewMacroInfo tmpmacros, savedmacroidx;
|
||
Handle tmpmacrohdl, savedmacrohdl;
|
||
short macropanel, macroitem;
|
||
long len;
|
||
char *pos;
|
||
|
||
savedmacrohdl = oldMacros;
|
||
savedmacroidx = oldMacroIndexes;
|
||
macropanel = dialogPane;
|
||
|
||
setupNewMacros(&tmpmacros);
|
||
UseResFile(TelInfo->SettingsFile);
|
||
tmpmacrohdl = Get1NamedResource('uMac', PrefRecordNamePtr);
|
||
if (tmpmacrohdl) {
|
||
HLock(tmpmacrohdl);
|
||
DetachResource(tmpmacrohdl);
|
||
disposemacros(&tmpmacros);
|
||
ParseMacrosFromHandle(&tmpmacros, tmpmacrohdl);
|
||
}
|
||
macroitem = ModalMacros(&tmpmacros);
|
||
if (macroitem != 2) {
|
||
UseResFile(TelInfo->SettingsFile);
|
||
tmpmacrohdl = Get1NamedResource('uMac', PrefRecordNamePtr);
|
||
if (tmpmacrohdl) RemoveResource(tmpmacrohdl);
|
||
HLock(tmpmacros.handle);
|
||
len = GetHandleSize(tmpmacros.handle);
|
||
tmpmacrohdl = myNewHandle(len + 2);
|
||
HLock(tmpmacrohdl);
|
||
pos = *tmpmacrohdl;
|
||
*pos = '!'; pos++;
|
||
*pos = '\015'; pos++;
|
||
BlockMoveData(*(tmpmacros.handle), pos, len);
|
||
DisposeHandle(tmpmacros.handle);
|
||
HUnlock(tmpmacrohdl);
|
||
AddResource(tmpmacrohdl, 'uMac', UniqueID('uMac'), PrefRecordNamePtr);
|
||
UpdateResFile(TelInfo->SettingsFile);
|
||
ReleaseResource(tmpmacrohdl);
|
||
} else DisposeHandle(tmpmacros.handle);
|
||
|
||
oldMacros = savedmacrohdl;
|
||
oldMacroIndexes = savedmacroidx;
|
||
dialogPane = macropanel;
|
||
}
|
||
break;
|
||
case SessAlias:
|
||
wasInAliasText = TRUE;
|
||
break;
|
||
default:
|
||
break;
|
||
} // switch
|
||
} //else not bad alias
|
||
} // while
|
||
|
||
if (ditem == 2) {
|
||
PopupCleanup();
|
||
if (IsNewPrefRecord) DisposeHandle((Handle) SessPrefsHdl);
|
||
else ReleaseResource((Handle) SessPrefsHdl);
|
||
TelInfo->lastPanelSession = currentPanel - 1;
|
||
DisposeDialog(dptr);
|
||
ResetMenus();
|
||
return(FALSE); // No changes should be made.
|
||
}
|
||
|
||
SetSessionData(dptr, SessPrefsPtr, (char *)SPopup, PrefRecordNamePtr);
|
||
PopupCleanup();
|
||
|
||
if (IsNewPrefRecord) {
|
||
UseResFile(TelInfo->SettingsFile);
|
||
resourceID = UniqueID(SESSIONPREFS_RESTYPE);
|
||
AddResource((Handle)SessPrefsHdl, SESSIONPREFS_RESTYPE, resourceID, PrefRecordNamePtr);
|
||
UpdateResFile(TelInfo->SettingsFile);
|
||
ReleaseResource((Handle)SessPrefsHdl);
|
||
}
|
||
else {
|
||
UseResFile(TelInfo->SettingsFile);
|
||
GetResInfo((Handle)SessPrefsHdl, &resourceID, &scratchResType,(StringPtr) &scratchPstring);
|
||
SetTaggedSesResInfo((Handle)SessPrefsHdl, resourceID, scratchPstring, PrefRecordNamePtr);
|
||
ChangedResource((Handle)SessPrefsHdl);
|
||
UpdateResFile(TelInfo->SettingsFile);
|
||
ReleaseResource((Handle)SessPrefsHdl);
|
||
}
|
||
|
||
TelInfo->lastPanelSession = currentPanel - 1;
|
||
DisposeDialog(dptr);
|
||
ResetMenus();
|
||
return(TRUE); // A resource has changed or been added.
|
||
}
|
||
|
||
void SetSessionData(DialogPtr dptr, SessionPrefs *SessPrefsPtr,
|
||
char *SPopupRef, StringPtr PrefRecordNamePtr)
|
||
{
|
||
short scratchshort;
|
||
long scratchlong;
|
||
Str255 scratchPstring, scratchPstring2;
|
||
popup *SPopup = (popup *)SPopupRef;
|
||
|
||
GetMenuItemText(SPopup[0].h, SPopup[0].choice, scratchPstring);
|
||
GetMenuItemText(SPopup[1].h, SPopup[1].choice, scratchPstring2);
|
||
|
||
if (StrLength(scratchPstring) > 63) scratchPstring[0] = 63;
|
||
BlockMoveData(scratchPstring, (SessPrefsPtr->TerminalEmulation), scratchPstring[0]+1);
|
||
|
||
if (StrLength(scratchPstring2) > 63) scratchPstring[0] = 63;
|
||
BlockMoveData(scratchPstring2, (SessPrefsPtr->TranslationTable), scratchPstring2[0]+1);
|
||
|
||
SessPrefsPtr->tektype = (-1 * GetCntlVal(dptr, SessTEKinhib)) + GetCntlVal(dptr, SessTEK4105);
|
||
SessPrefsPtr->pastemethod = !GetCntlVal(dptr, SessPasteQuick);
|
||
SessPrefsPtr->bksp = GetCntlVal(dptr, SessDeleteDel);
|
||
SessPrefsPtr->forcesave = GetCntlVal(dptr, SessForceSave);
|
||
SessPrefsPtr->crmap = GetCntlVal(dptr, SessBezerkeley);
|
||
SessPrefsPtr->alwaysBSD = GetCntlVal(dptr, 42);
|
||
SessPrefsPtr->ignoreBeeps = GetCntlVal(dptr, 43);
|
||
SessPrefsPtr->ignoreff = GetCntlVal(dptr, 44);
|
||
SessPrefsPtr->linemode = GetCntlVal(dptr, SessLinemode);
|
||
SessPrefsPtr->tekclear = GetCntlVal(dptr, SessTEKclear);
|
||
SessPrefsPtr->halfdup = GetCntlVal(dptr, SessHalfDuplex);
|
||
SessPrefsPtr->authenticate = GetCntlVal(dptr, SessAuthenticate);
|
||
SessPrefsPtr->encrypt = GetCntlVal(dptr, SessEncrypt);
|
||
SessPrefsPtr->forward = GetCntlVal(dptr, 92);
|
||
SessPrefsPtr->localecho = GetCntlVal(dptr, SessLocalEcho);
|
||
SessPrefsPtr->otpauto = GetCntlVal(dptr, 46);
|
||
SessPrefsPtr->otpmulti = GetCntlVal(dptr, 47);
|
||
SessPrefsPtr->otphex = GetCntlVal(dptr, 48);
|
||
SessPrefsPtr->otpnoprompt = GetCntlVal(dptr, 49);
|
||
SessPrefsPtr->otpsavepass = GetCntlVal(dptr, 52);
|
||
SessPrefsPtr->protocol = GetCntlVal(dptr, 53) - 1;
|
||
SessPrefsPtr->encryption = GetCntlVal(dptr,62) - 1;
|
||
SessPrefsPtr->usesocks = GetCntlVal(dptr, 64);
|
||
SessPrefsPtr->socks4a = GetCntlVal(dptr, 65);
|
||
|
||
/* NONO */
|
||
SessPrefsPtr->authentication = GetCntlVal(dptr, 73) - 1;
|
||
SessPrefsPtr->compression = GetCntlVal(dptr, 74) - 1;
|
||
SessPrefsPtr->verbose = GetCntlVal(dptr, 75);
|
||
SessPrefsPtr->trace = GetCntlVal(dptr, 76);
|
||
SessPrefsPtr->debug = GetCntlVal(dptr, 77);
|
||
SessPrefsPtr->restricted = GetCntlVal(dptr, 78);
|
||
|
||
SessPrefsPtr->ssh2method = GetCntlVal(dptr, 80) - 1;
|
||
|
||
GetTEText(dptr, 81, scratchPstring);
|
||
StringToNum(scratchPstring, &scratchlong);
|
||
BoundsCheck(&scratchlong, 65535, 0);
|
||
SessPrefsPtr->localport = (short)scratchlong;
|
||
|
||
GetTEText(dptr, 82, scratchPstring);
|
||
if (StrLength(scratchPstring) > 63) scratchPstring[0] = 63;
|
||
BlockMoveData(scratchPstring, SessPrefsPtr->remotehost, scratchPstring[0]+1);
|
||
|
||
GetTEText(dptr, 83, scratchPstring);
|
||
StringToNum(scratchPstring, &scratchlong);
|
||
BoundsCheck(&scratchlong, 65535, 0);
|
||
SessPrefsPtr->remoteport = (short)scratchlong;
|
||
|
||
SessPrefsPtr->ssh2guests = GetCntlVal(dptr, 87);
|
||
SessPrefsPtr->launchurlesc = GetCntlVal(dptr, 91);
|
||
SessPrefsPtr->x11forward = GetCntlVal(dptr, 93);
|
||
SessPrefsPtr->keepselection = GetCntlVal(dptr, 94);
|
||
// SessPrefsPtr->autoreconnect = GetCntlVal(dptr, 95);
|
||
/* NONO */
|
||
|
||
memset(SessPrefsPtr->otppassword, 0, sizeof(SessPrefsPtr->otppassword));
|
||
// c2pstr(configPassword);
|
||
PLstrcpy((unsigned char *)SessPrefsPtr->otppassword, configPassword);
|
||
|
||
memset(SessPrefsPtr->password, 0, sizeof(SessPrefsPtr->password));
|
||
// c2pstr(configPassword2);
|
||
PLstrcpy((unsigned char *)SessPrefsPtr->password, configPassword2);
|
||
|
||
GetTEText(dptr, SessPort, scratchPstring);
|
||
SessPrefsPtr->portNegative = 0;
|
||
if (scratchPstring[1] == '-') {
|
||
SessPrefsPtr->portNegative = 1;
|
||
scratchPstring[1] = scratchPstring[0] - 1;
|
||
StringToNum(&scratchPstring[1], &scratchlong);
|
||
} else StringToNum(scratchPstring, &scratchlong);
|
||
BoundsCheck(&scratchlong, 65530, 1);
|
||
SessPrefsPtr->port = (short) scratchlong;
|
||
|
||
GetTEText(dptr, 67, scratchPstring);
|
||
StringToNum(scratchPstring, &scratchlong);
|
||
SessPrefsPtr->socksport = (short) scratchlong;
|
||
|
||
GetTEText(dptr, SessBlockSize, scratchPstring);
|
||
StringToNum(scratchPstring, &scratchlong);
|
||
BoundsCheck(&scratchlong, 4097, 10);
|
||
SessPrefsPtr->pasteblocksize = (short) scratchlong;
|
||
|
||
GetTEText(dptr, SessHostName, scratchPstring);
|
||
if (StrLength(scratchPstring) > 63) scratchPstring[0] = 63;
|
||
|
||
BlockMoveData(scratchPstring, SessPrefsPtr->hostname, scratchPstring[0]+1);
|
||
|
||
GetTEText(dptr, 66, scratchPstring);
|
||
if (StrLength(scratchPstring) > 63) scratchPstring[0] = 63;
|
||
BlockMoveData(scratchPstring, SessPrefsPtr->sockshost, scratchPstring[0]+1);
|
||
|
||
GetTEText(dptr, SessAlias, PrefRecordNamePtr);
|
||
GetTEText(dptr, 58, (unsigned char *)SessPrefsPtr->username);
|
||
// GetTEText(dptr, 59, (unsigned char *)SessPrefsPtr->password);
|
||
GetTEText(dptr, 60, (unsigned char *)SessPrefsPtr->clientuser);
|
||
GetTEText(dptr, 61, (unsigned char *)SessPrefsPtr->command);
|
||
GetTEText(dptr, 71, (unsigned char *)SessPrefsPtr->socksusername);
|
||
|
||
GetTEText(dptr, SessInterrupt, scratchPstring);
|
||
if (scratchPstring[0]) SessPrefsPtr->ckey = toupper(scratchPstring[2]) ^ 64;
|
||
else SessPrefsPtr->ckey = -1;
|
||
|
||
GetTEText(dptr, SessSuspend, scratchPstring);
|
||
if (scratchPstring[0]) SessPrefsPtr->skey = toupper(scratchPstring[2]) ^ 64;
|
||
else SessPrefsPtr->skey = -1;
|
||
|
||
GetTEText(dptr, SessResume, scratchPstring);
|
||
if (scratchPstring[0]) SessPrefsPtr->qkey = toupper(scratchPstring[2]) ^ 64;
|
||
else SessPrefsPtr->qkey = -1;
|
||
|
||
GetTEText(dptr,SessBlockSizeTE,scratchPstring);
|
||
StringToNum(scratchPstring,&scratchlong);
|
||
BoundsCheck(&scratchlong, 4096, 512);
|
||
SessPrefsPtr->NetBlockSize = (short) scratchlong;
|
||
}
|
||
|
||
Boolean EditFTPUser(StringPtr PrefRecordNamePtr)
|
||
{
|
||
DialogPtr dptr;
|
||
short ditem, scratchshort, resourceID, vRefNum;
|
||
ResType scratchResType;
|
||
Boolean IsNewPrefRecord;
|
||
FTPUserPrefs** FTPUHdl;
|
||
FTPUserPrefs* FTPUptr;
|
||
Str255 scratchPstring, scratchPstring2;
|
||
|
||
SetUpMovableModalMenus();
|
||
dptr = GetNewMySmallStrangeDialog(FTPUserDLOG, NULL, kInFront, (void *)ThirdCenterDialog);
|
||
ditem = 3;
|
||
|
||
HideDialogItem(dptr, FTPUcanchangeCWD); // Sometime later, perhaps
|
||
|
||
if (PrefRecordNamePtr[0] != 0) {
|
||
UseResFile(TelInfo->SettingsFile);
|
||
FTPUHdl = (FTPUserPrefs **)Get1NamedResource(FTPUSERPREFS_RESTYPE, PrefRecordNamePtr);
|
||
if ( FTPUHdl ) {
|
||
IsNewPrefRecord = FALSE;
|
||
HLock((Handle) FTPUHdl);
|
||
FTPUptr = *FTPUHdl;
|
||
SetCntrl(dptr, FTPUcanchangeCWD, FTPUptr->UserCanCWD);
|
||
SetTEText(dptr, FTPUusername, PrefRecordNamePtr);
|
||
for (scratchshort = 8, scratchPstring[0] = 8; scratchshort > 0; scratchshort--)
|
||
scratchPstring[scratchshort] = '<EFBFBD>';
|
||
SetTEText(dptr, FTPUpassword, scratchPstring);
|
||
vRefNum = VolumeNameToRefNum(FTPUptr->DefaultDirVolName);
|
||
} else {
|
||
PrefRecordNamePtr[0] = 0;
|
||
}
|
||
}
|
||
if (PrefRecordNamePtr[0] == 0) {
|
||
IsNewPrefRecord = TRUE;
|
||
FTPUHdl = (FTPUserPrefs **)myNewHandle(sizeof(FTPUserPrefs));
|
||
HLock((Handle) FTPUHdl);
|
||
FTPUptr = *FTPUHdl;
|
||
vRefNum = -1; // Default Volume
|
||
FTPUptr->DefaultDirDirID = 2; // Root directory
|
||
SetCntrl(dptr, FTPUcanchangeCWD, 0);
|
||
}
|
||
|
||
PathNameFromDirID(FTPUptr->DefaultDirDirID, vRefNum, scratchPstring);
|
||
SetTEText(dptr, FTPUDfltDirDsply, scratchPstring);
|
||
|
||
SelectDialogItemText(dptr, FTPUusername, 0, 32767);
|
||
ShowWindow(dptr);
|
||
|
||
while (ditem > 2) {
|
||
/*ModalDialog(DLOGwOK_CancelUPP, &ditem);*/
|
||
movableModalDialog(DLOGwOK_CancelUPP, &ditem);
|
||
switch (ditem) {
|
||
case FTPUcanchangeCWD:
|
||
FlipCheckBox(dptr, ditem);
|
||
break;
|
||
|
||
case FTPUDfltDirButton:
|
||
if (SelectDirectory(&vRefNum, &FTPUptr->DefaultDirDirID)) {
|
||
PathNameFromDirID(FTPUptr->DefaultDirDirID, vRefNum, scratchPstring);
|
||
SetTEText(dptr, FTPUDfltDirDsply, scratchPstring);
|
||
}
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
|
||
} // switch
|
||
} // while
|
||
|
||
if (ditem == 2) {
|
||
if (IsNewPrefRecord) DisposeHandle((Handle) FTPUHdl);
|
||
else ReleaseResource((Handle) FTPUHdl);
|
||
|
||
DisposeDialog(dptr);
|
||
ResetMenus();
|
||
return(FALSE); // No changes should be made.
|
||
}
|
||
|
||
FTPUptr->UserCanCWD = GetCntlVal(dptr, FTPUcanchangeCWD);
|
||
GetDirectoryName(vRefNum, 2, FTPUptr->DefaultDirVolName);
|
||
|
||
GetTEText(dptr, FTPUusername, PrefRecordNamePtr);
|
||
GetTEText(dptr, FTPUpassword, scratchPstring);
|
||
|
||
if (scratchPstring[1] != '<EFBFBD>') {
|
||
// Encrypt the new (or possibly modified) password.
|
||
PtoCstr(scratchPstring);
|
||
Sencompass((char *)scratchPstring, (char *)scratchPstring2);
|
||
CtoPstr((char *)scratchPstring2);
|
||
BlockMoveData(scratchPstring2, FTPUptr->EncryptedPassword, StrLength(scratchPstring2)+1);
|
||
}
|
||
|
||
if (IsNewPrefRecord) {
|
||
UseResFile(TelInfo->SettingsFile);
|
||
resourceID = UniqueID(FTPUSERPREFS_RESTYPE);
|
||
AddResource((Handle)FTPUHdl, FTPUSERPREFS_RESTYPE, resourceID, PrefRecordNamePtr);
|
||
UpdateResFile(TelInfo->SettingsFile);
|
||
ReleaseResource((Handle)FTPUHdl);
|
||
}
|
||
else {
|
||
UseResFile(TelInfo->SettingsFile);
|
||
GetResInfo((Handle)FTPUHdl, &resourceID, &scratchResType,(StringPtr) &scratchPstring);
|
||
SetResInfo((Handle)FTPUHdl, resourceID, PrefRecordNamePtr);
|
||
ChangedResource((Handle)FTPUHdl);
|
||
UpdateResFile(TelInfo->SettingsFile);
|
||
ReleaseResource((Handle)FTPUHdl);
|
||
}
|
||
|
||
DisposeDialog(dptr);
|
||
ResetMenus();
|
||
return(TRUE); // A resource has changed or been added.
|
||
}
|
||
|
||
short AnsiPrompt(short allowDefaultBoldSelect, short *defaultBoldColor)
|
||
{
|
||
/* puts up the dialog that lets the user examine and change the ANSI color
|
||
settings for the specified window. */
|
||
|
||
short scratchshort, ditem;
|
||
Point ColorBoxPoint;
|
||
DialogPtr dptr;
|
||
Boolean UserLikesNewColor;
|
||
RGBColor scratchRGB;
|
||
short itemType;
|
||
Handle itemHandle;
|
||
Rect itemRect;
|
||
|
||
SetUpMovableModalMenus();
|
||
dptr = GetNewMySmallDialog(ANSIColorDLOG, NULL, kInFront, (void *)ThirdCenterDialog);
|
||
SetDialogDefaultItem(dptr, 1);
|
||
SetDialogCancelItem(dptr, 2);
|
||
SetDialogTracksCursor(dptr, 1);
|
||
NumberOfColorBoxes = 16;
|
||
if ( allowDefaultBoldSelect && defaultBoldColor ) {
|
||
if ( *defaultBoldColor == -1 )
|
||
SetCntrl(dptr, ANSIForegroundRadio, 1);
|
||
else
|
||
SetCntrl(dptr, ANSIBlackRadio + *defaultBoldColor, 1);
|
||
} else {
|
||
for (scratchshort = 0; scratchshort < NumberOfColorBoxes; scratchshort++)
|
||
HideDialogItem(dptr, scratchshort + ANSIBlackRadio);
|
||
HideDialogItem(dptr, 13);
|
||
HideDialogItem(dptr, 14);
|
||
HideDialogItem(dptr, 47);
|
||
}
|
||
for (scratchshort = 0; scratchshort < NumberOfColorBoxes; scratchshort++)
|
||
{
|
||
BoxColorItems[scratchshort] = ANSIBlack + scratchshort;
|
||
GetEntryColor(TelInfo->AnsiColors, scratchshort, &BoxColorData[scratchshort]);
|
||
UItemAssign( dptr, scratchshort + ANSIBlack, ColorBoxItemProcUPP);
|
||
}
|
||
|
||
ColorBoxPoint.h = 0; // Have the color picker center the box on the main
|
||
ColorBoxPoint.v = 0; // screen
|
||
NumOnly[0] = 12; //safe item
|
||
ditem = 3;
|
||
|
||
ShowWindow(dptr);
|
||
|
||
while (ditem > 2) {
|
||
movableModalDialog(ColorBoxModalProcUPP, &ditem);
|
||
switch (ditem) {
|
||
case ANSIBlack:
|
||
case ANSIRed:
|
||
case ANSIGreen:
|
||
case ANSIYellow:
|
||
case ANSIBlue:
|
||
case ANSIMagenta:
|
||
case ANSICyan:
|
||
case ANSIWhite:
|
||
case ANSIBoldBlack:
|
||
case ANSIBoldRed:
|
||
case ANSIBoldGreen:
|
||
case ANSIBoldYellow:
|
||
case ANSIBoldBlue:
|
||
case ANSIBoldMagenta:
|
||
case ANSIBoldCyan:
|
||
case ANSIBoldWhite:
|
||
if (TelInfo->haveColorQuickDraw) {
|
||
Str255 askColorString;
|
||
GetIndString(askColorString,MISC_STRINGS,PICK_NEW_COLOR_STRING);
|
||
UserLikesNewColor = GetColor(ColorBoxPoint,askColorString,
|
||
&BoxColorData[ditem-ANSIBlack], &scratchRGB);
|
||
if (UserLikesNewColor) {
|
||
BoxColorData[ditem-ANSIBlack] = scratchRGB;
|
||
// force refresh
|
||
GetDialogItem(dptr, ditem, &itemType, &itemHandle, &itemRect);
|
||
InvalRect(&itemRect);
|
||
}
|
||
}
|
||
break;
|
||
case ANSIBlackRadio:
|
||
case ANSIRedRadio:
|
||
case ANSIGreenRadio:
|
||
case ANSIYellowRadio:
|
||
case ANSIBlueRadio:
|
||
case ANSIMagentaRadio:
|
||
case ANSICyanRadio:
|
||
case ANSIWhiteRadio:
|
||
case ANSIBoldBlackRadio:
|
||
case ANSIBoldRedRadio:
|
||
case ANSIBoldGreenRadio:
|
||
case ANSIBoldYellowRadio:
|
||
case ANSIBoldBlueRadio:
|
||
case ANSIBoldMagentaRadio:
|
||
case ANSIBoldCyanRadio:
|
||
case ANSIBoldWhiteRadio:
|
||
case ANSIForegroundRadio:
|
||
for (scratchshort = 0; scratchshort < NumberOfColorBoxes; scratchshort++)
|
||
SetCntrl(dptr, ANSIBlackRadio + scratchshort, 0);
|
||
if ( ditem != ANSIForegroundRadio )
|
||
SetCntrl(dptr, ANSIForegroundRadio, 0);
|
||
SetCntrl(dptr, ditem, 1);
|
||
default:
|
||
break;
|
||
|
||
} // switch
|
||
} // while
|
||
|
||
if (ditem == DLOGCancel)
|
||
{
|
||
DisposeDialog(dptr);
|
||
ResetMenus();
|
||
return -1;
|
||
}
|
||
if ( allowDefaultBoldSelect && defaultBoldColor ) {
|
||
if ( GetCntlVal(dptr, ANSIForegroundRadio) ) {
|
||
*defaultBoldColor = -1;
|
||
} else {
|
||
for (scratchshort = 0; scratchshort < NumberOfColorBoxes; scratchshort++) {
|
||
if (GetCntlVal(dptr, ANSIBlackRadio + scratchshort)) {
|
||
*defaultBoldColor = scratchshort;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
for (scratchshort = 0; scratchshort < NumberOfColorBoxes; scratchshort++)
|
||
SetEntryColor(TelInfo->AnsiColors, scratchshort, &BoxColorData[scratchshort]);
|
||
|
||
DisposeDialog(dptr);
|
||
ResetMenus();
|
||
}
|
||
|
||
void
|
||
DeleteRange(char *buffer,short start,short end)
|
||
{ register char *src,*dest,*last;
|
||
|
||
last = buffer + *buffer;
|
||
|
||
src = buffer + end + 1;
|
||
dest = buffer + start + 1;
|
||
|
||
while (src <= last) // Shift character to the left over the removed characters
|
||
*(dest++) = *(src++);
|
||
|
||
(*buffer) -= (end-start); // Adjust the buffer's length
|
||
}
|
||
|
||
void
|
||
InsertChar(char *buffer,short pos,char c)
|
||
{ register short index,len;
|
||
|
||
len = *buffer;
|
||
|
||
if (len == 0xFF) // if the string is full, return
|
||
return;
|
||
|
||
for (index = len;index > pos;index--) // Shift characters to the right to make room
|
||
buffer[index+1] = buffer[index];
|
||
|
||
buffer[pos+1] = c; // Fill in the new character
|
||
|
||
(*buffer)++; // Add one to the length of the string
|
||
}
|
||
|
||
OSErr
|
||
GetScrapHandle( FlavorType dataFlavor, Handle *dataHandle )
|
||
{
|
||
SInt32 scrapOffset;
|
||
SInt32 scrapResult;
|
||
OSErr err;
|
||
|
||
*dataHandle = NewHandle(0);
|
||
if ( ( err = MemError() ) != noErr )
|
||
return err;
|
||
if ( ( scrapResult = GetScrap( *dataHandle, dataFlavor, &scrapOffset ) ) < 0 ) {
|
||
err = scrapResult;
|
||
DisposeHandle( *dataHandle );
|
||
return err;
|
||
}
|
||
return noErr;
|
||
}
|
||
|
||
Boolean PasswordFilter(DialogPtr dptr, EventRecord *evt, unsigned char *buf, short max)
|
||
{
|
||
short key;
|
||
short start;
|
||
short end;
|
||
Handle hText;
|
||
char *pbuf;
|
||
|
||
key = evt->message & charCodeMask;
|
||
switch (key) {
|
||
case '.': // Cmd-.
|
||
if (!(evt->modifiers & cmdKey))
|
||
break;
|
||
case '\r': // Return
|
||
case '\003': // Enter
|
||
case '\033': // Esc
|
||
case '\t': // Tab
|
||
case '\034': // Left arrow
|
||
case '\035': // Right arrow
|
||
case '\036': // Up arrow
|
||
case '\037': // Down arrow
|
||
return 0;
|
||
default: // Everything else falls through to be dealt with
|
||
break; // below
|
||
}
|
||
|
||
start = (**((DialogPeek)dptr)->textH).selStart; // Get the current selection
|
||
end = (**((DialogPeek)dptr)->textH).selEnd;
|
||
hText = TEGetText(((DialogPeek)dptr)->textH);
|
||
|
||
pbuf = (char*)buf;
|
||
if (start != end) { // If there's a selection, delete it
|
||
DeleteRange(pbuf,start,end);
|
||
}
|
||
if (key == '\010') { // Backspace
|
||
if (start != 0) {
|
||
DeleteRange(pbuf,start-1,start); // Delete the character to the left
|
||
}
|
||
} else {
|
||
if ((evt->modifiers & cmdKey)) {
|
||
if (key == 'v' || key == 'V') {
|
||
// get scrap
|
||
Handle hText;
|
||
OSErr err;
|
||
if ((err = GetScrapHandle('TEXT', &hText)) == noErr) {
|
||
int len = GetHandleSize(hText);
|
||
if (len + *pbuf < max) {
|
||
int i;
|
||
for (i = 0; i < len; i++) {
|
||
InsertChar(pbuf,start++,(*hText)[i]); // Insert the real key into the buffer
|
||
TEKey('<EFBFBD>', ((DialogPeek)dptr)->textH);
|
||
}
|
||
}
|
||
// add scrap to textedit view
|
||
DisposeHandle(hText);
|
||
evt->what = nullEvent;
|
||
}
|
||
} else if ( key == 'x' || key == 'X'
|
||
|| key == 'c' || key == 'C' ) {
|
||
SysBeep(5);
|
||
evt->what = nullEvent;
|
||
}
|
||
} else {
|
||
InsertChar(pbuf,start,key); // Insert the real key into the buffer
|
||
evt->message = '<EFBFBD>'; // Character to use in field
|
||
}
|
||
}
|
||
return 0;
|
||
}
|