--LTSetProfileImpl.mesa
--Created by
-- JFung.PASA 15-Nov-83 15:44:26
--last edited by
-- JFung.PASA 17-Aug-84 15:16:01
DIRECTORY
CmFile,
Cursor,
Event,
EventTypes,
Exec,
Format,
FormSW,
Heap,
LispToolOps,
MFile,
MStream,
Process,
Profile,
Put,
Runtime,
Stream,
String,
StringLookUp,
Supervisor,
Time,
Token,
Tool,
ToolDriver,
ToolWindow,
UserInput,
Version,
Window;
LTSetProfileImpl: PROGRAM
IMPORTS
CmFile, Cursor, Event, Exec, FormSW, Heap, LispToolOps, MFile, MStream,
Process, Profile, Put, Runtime, Stream, String, Supervisor, Time, Token,
Tool, ToolDriver, ToolWindow, Version, Window
EXPORTS LispToolOps =
BEGIN OPEN ILT: LispToolOps;
ServerType: TYPE = {IFS, FS, FLOPPY};
DataHandle: TYPE = LONG POINTER TO Data;
Data: TYPE = MACHINE DEPENDENT RECORD [
-- Message subwindow stuff
msgSW(0): Window.Handle ← NIL,
-- File subwindow stuff
fileSW(2): Window.Handle ← NIL,
-- Form subwindow stuff
-- Note: enumerateds and booleans must be word boundary
-- aligned as addresses for them must be generated
--formSW: Window.Handle ← NIL,
paramSW(4): Window.Handle ← NIL,
commandSW(6): Window.Handle ← NIL,
busy(8): BOOLEAN ← FALSE, -- command is running
userName(9): LONG STRING ← NIL,
password(11): LONG STRING ← NIL,
domainName(13): LONG STRING ← NIL,
organizationName(15): LONG STRING ← NIL,
filePathName(17): LONG STRING ← NIL,
volName(19): LONG STRING ← NIL,
fileServerProtocol(21): LONG STRING ← NIL,
NSLisp(23): LONG STRING ← NIL,
PUPLisp(25): LONG STRING ← NIL,
FloppyLisp(27): LONG STRING ← NIL,
fileServer(29): ServerType ← FS];
active: BOOLEAN ← FALSE;
agent: Supervisor.SubsystemHandle = Supervisor.CreateSubsystem[
CheckDeactivate];
debug: BOOLEAN ← FALSE;
formDisplay: ToolWindow.DisplayProcType ← NIL;
heraldName: STRING ← [80];
profileWindow: Window.Handle ← NIL;
toolData: DataHandle ← NIL;
NSFileName: LONG STRING ←
"[Host:]<Directory><SubDirectories>FileName.sysout"L;
IFSFileName: LONG STRING ←
"[Host]<Directory><SubDirectories>FileName.sysout"L;
FloppyFileName: LONG STRING ← "Lisp.sysout"L;
CheckDeactivate: Supervisor.AgentProcedure =
BEGIN
IF event = EventTypes.deactivate AND profileWindow # NIL
AND profileWindow = eventData AND toolData.busy THEN
BEGIN
Put.Line[
toolData.msgSW, "The tool is busy: aborting deactivation"L];
ERROR Supervisor.EnumerationAborted;
END;
END; --CheckDeactivate
ClearCommandSubwindow: PROCEDURE =
BEGIN
item: FormSW.ItemHandle;
FOR i: CARDINAL ← 0, i + 1 UNTIL
(item ← FormSW.FindItem[toolData.commandSW, i]) = NIL DO
item.flags.invisible ← TRUE ENDLOOP;
FormSW.Display[toolData.commandSW];
END;
ClearFileSubwindow: PROCEDURE =
BEGIN
item: FormSW.ItemHandle;
FOR i: CARDINAL ← 0, i + 1 UNTIL
(item ← FormSW.FindItem[toolData.fileSW, i]) = NIL DO
item.flags.invisible ← TRUE ENDLOOP;
FormSW.Display[toolData.fileSW];
formDisplay ← Window.GetDisplayProc[toolData.fileSW];
END;
ClearMsgSubwindow: PROCEDURE =
BEGIN
item: FormSW.ItemHandle;
FOR i: CARDINAL ← 0, i + 1 UNTIL
(item ← FormSW.FindItem[toolData.msgSW, i]) = NIL DO
item.flags.invisible ← TRUE ENDLOOP;
FormSW.Display[toolData.msgSW];
formDisplay ← Window.GetDisplayProc[toolData.msgSW];
END;
ClearSubWindows: PROCEDURE =
BEGIN
--ClearFileSubwindow;
ClearMsgSubwindow;
END;
ClientTransition: ToolWindow.TransitionProcType =
-- This procedure is called whenever the system determines that this
-- Tool's state is undergoing a user invoked transition.
-- In this Example we demonstrate a technique that minimizes the memory
-- requirements for a Tool that is inactive.
BEGIN
SELECT TRUE FROM
old = inactive =>
BEGIN
IF toolData = NIL THEN
toolData ← Heap.systemZone.NEW[Data ← []];
ProcessUserDotCM[];
active ← TRUE;
END;
new = inactive =>
BEGIN
Supervisor.RemoveDependency[
client: agent, implementor: Event.toolWindow];
IF toolData # NIL THEN
BEGIN
FormSW.Destroy[toolData.paramSW];
FormSW.Destroy[toolData.commandSW];
Heap.systemZone.FREE[@toolData];
END;
--ToolDriver.RemoveSWs[tool: "LispTool"L];
active ← FALSE;
END;
ENDCASE
END;
FormSWMakeUserCM: FormSW.ProcType =
BEGIN
toolData.busy ← TRUE;
ClearSubWindows;
Put.Line[
toolData.fileSW,
"WARNING: will DESTROY your old user.cm, [Confirm?]"L];
IF ILT.Confirm[] THEN ILT.MakeUserCM[];
toolData.busy ← FALSE;
END; --FormSWMakeUserCM
FormSWQuitProc: FormSW.ProcType =
BEGIN
IF debug THEN {
Put.Line[toolData.fileSW, "Quit Proc..."L];
--Process.Pause[Process.SecondsToTicks[5]];
};
[] ← ToolWindow.Deactivate[profileWindow];
END; --FormSWQuitProc
GetUser: PUBLIC PROCEDURE [name, password: LONG STRING] =
BEGIN
z: UNCOUNTED ZONE = Heap.systemZone;
toolData.userName ← String.CopyToNewString[name, z];
toolData.password ← String.CopyToNewString[password, z]
END; --GetUser
GetDefaultDomain: PUBLIC PROCEDURE [domain: LONG STRING] =
BEGIN
z: UNCOUNTED ZONE = Heap.systemZone;
toolData.domainName ← String.CopyToNewString[domain, z]
END; --GetDefaultDomain
GetDefaultOrganization: PUBLIC PROCEDURE [organization: LONG STRING] =
BEGIN
z: UNCOUNTED ZONE = Heap.systemZone;
toolData.organizationName ← String.CopyToNewString[organization, z]
END; --GetDefaultOrganization
GetProfileInfo: PUBLIC PROCEDURE =
BEGIN
--Profile.GetUser[GetUser];
Profile.GetDefaultDomain[GetDefaultDomain];
Profile.GetDefaultOrganization[GetDefaultOrganization];
--Profile.GetDefaultRegistry[GetDefaultRegistry];
--Profile.GetLibrarianNames[GetLibrarianNames];
--Profile.GetLibrarian[GetLibrarian]
END; --GetProfileInfo
Init: PROCEDURE =
BEGIN
--h: Exec.Handle;
--execWrite: Format.StringProc ← Exec.OutputProc[h];
--execWrite["Creating tool window.."L];
--Process.Pause[Process.SecondsToTicks[5]];
Exec.AddCommand["SetDomain.~"L, ProfileExec, Unload];
--IF (profileWindow # NIL) AND ~active THEN
-- ToolWindow.Activate[profileWindow]
--ELSE profileWindow ← MakeTool[];
END; --Init
MakeCommands: FormSW.ClientItemsProcType =
BEGIN OPEN FormSW;
tabs: ARRAY [0..3) OF CARDINAL ← [0, 30, 60];
nItems: CARDINAL = 2;
items ← AllocateItemDescriptor[nItems];
items[0] ← CommandItem[
tag: "Set Profile"L, place: newLine, proc: FormSWMakeUserCM];
-- newLine is required, else will get 915 trap
items[1] ← CommandItem[tag: "Quit"L, proc: FormSWQuitProc];
SetTagPlaces[items, DESCRIPTOR[tabs], FALSE];
RETURN[items, TRUE];
END; --MakeCommands
MakeParams: FormSW.ClientItemsProcType =
BEGIN OPEN FormSW;
tabs: ARRAY [0..7) OF CARDINAL ← [0, 28, 52, 56, 60, 68, 75];
nItems: CARDINAL = 8;
serverForm: ARRAY [0..3) OF Enumerated ← [
["IFS"L, ServerType[IFS]], ["FS"L, ServerType[FS]], [
"FLOPPY"L, ServerType[FLOPPY]]];
items ← AllocateItemDescriptor[nItems];
items[0] ← StringItem[
tag: "User"L, string: @toolData.userName, inHeap: TRUE,
place: newLine];
items[1] ← StringItem[
tag: "Password"L, string: @toolData.password, inHeap: TRUE,
feedback: password];
items[2] ← StringItem[
tag: "Domain"L, place: newLine, string: @toolData.domainName,
inHeap: TRUE];
items[3] ← StringItem[
tag: "Organization"L, string: @toolData.organizationName,
inHeap: TRUE];
items[4] ← EnumeratedItem[
tag: "Device"L, z: Heap.systemZone, feedback: all,
value: @toolData.fileServer, copyChoices: TRUE,
proc: ServerNotifyProc, choices: DESCRIPTOR[serverForm]];
items[5] ← StringItem[
tag: "NSLisp"L, place: newLine, string: @toolData.NSLisp,
inHeap: TRUE];
items[6] ← StringItem[
tag: "PupLisp"L, place: newLine, string: @toolData.PUPLisp,
inHeap: TRUE];
items[7] ← StringItem[
tag: "FloppyLisp"L, place: newLine, string: @toolData.FloppyLisp,
inHeap: TRUE];
SetTagPlaces[items, DESCRIPTOR[tabs], FALSE];
RETURN[items, TRUE]
END; --MakeParams
MakeSWs: Tool.MakeSWsProc =
BEGIN
logName: STRING ← [40];
addresses: ARRAY [0..4) OF ToolDriver.Address;
Tool.UnusedLogName[unused: logName, root: "SetProfile.log"L];
toolData.msgSW ← Tool.MakeMsgSW[window: window, lines: 1];
toolData.paramSW ← Tool.MakeFormSW[window: window, formProc: MakeParams];
toolData.commandSW ← Tool.MakeFormSW[
window: window, formProc: MakeCommands];
toolData.fileSW ← Tool.MakeFileSW[window: window, name: logName];
Supervisor.AddDependency[client: agent, implementor: Event.toolWindow];
-- do the ToolDriver stuff
addresses ← [
[name: "msgSW"L, sw: toolData.msgSW], [
name: "ParamSW"L, sw: toolData.paramSW], [
name: "CmdSW"L, sw: toolData.commandSW], [
name: "fileSW"L, sw: toolData.fileSW]];
ToolDriver.NoteSWs[
tool: "SetProfile"L, subwindows: DESCRIPTOR[addresses]];
END;
MakeTool: PROCEDURE RETURNS [wh: Window.Handle] =
BEGIN
String.AppendString[heraldName, "XEROX AISBU: Profile Tool "L];
String.AppendString[heraldName, " of "L];
Time.Append[heraldName, Time.Unpack[Runtime.GetBcdTime[]]];
heraldName.length ← heraldName.length - 3;
--String.AppendString[heraldName, " on Pilot Version "L];
--Version.Append[heraldName];
RETURN[
Tool.Create[
makeSWsProc: MakeSWs, initialState: default,
clientTransition: ClientTransition, name: heraldName,
initialBox: [[0, 0], [1024, 800]],
--x, y, width, height
tinyName1: "Profile"L, tinyName2: "Tool"L]]
END;
MakeUserCM: PUBLIC PROCEDURE[] =
BEGIN
name: LONG STRING ← "User.cm"L;
myFile: MFile.Handle ← NIL;
--readS: MStream.Handle ← NIL;
writeS: MStream.Handle ← NIL;
IF debug THEN {
Put.Line[toolData.fileSW, "Enter MakeUserCM..."L];
Process.Pause[Process.SecondsToTicks[5]];
};
IF ~MFile.ValidFilename[name] THEN {
Put.Line[toolData.msgSW, "Invalid file name"L]; RETURN; };
IF debug THEN {
Put.Line[toolData.fileSW, "Acquire..."L];
Process.Pause[Process.SecondsToTicks[5]];
};
myFile ← MFile.Acquire[
name, anchor, MFile.dontRelease !
MFile.Error => {myFile ← NIL; CONTINUE}];
IF debug THEN {
Put.Line[toolData.fileSW, "Set hourGlass..."L];
Process.Pause[Process.SecondsToTicks[5]];
};
Cursor.Set[hourGlass];
--IF myFile # NIL THEN MFile.Release[myFile];
BEGIN
ENABLE MFile.Error => GOTO problem;
--ENABLE MFile.Error => {MFile.Release[myFile]; CONTINUE;};
IF myFile # NIL THEN
BEGIN
IF debug THEN {
Put.Line[toolData.fileSW, "SetAccess..."L];
Process.Pause[Process.SecondsToTicks[5]];
};
MFile.SetAccess[myFile, readWrite];
END
ELSE
BEGIN
IF debug THEN {
Put.Line[toolData.fileSW, "ReadWrite..."L];
Process.Pause[Process.SecondsToTicks[5]];
};
myFile ← MFile.ReadWrite[name, MFile.dontRelease, text];
END;
--myFile ← MFile.ReadWrite[name, MFile.dontRelease, text];
-- myFile is ReadWrite so can Copy handle with read later
IF debug THEN {
Put.Line[toolData.fileSW, "Create..."L];
Process.Pause[Process.SecondsToTicks[5]];
};
writeS ← MStream.Create[myFile, []];
IF debug THEN {
Put.Line[toolData.fileSW, "SetLength..."L];
Process.Pause[Process.SecondsToTicks[5]];
};
MStream.SetLength[writeS, 0];
IF toolData.fileServer = FS THEN
toolData.fileServerProtocol ← String.CopyToNewString[
s: "FS"L, z: Heap.systemZone]
ELSE
IF toolData.fileServer = IFS THEN
toolData.fileServerProtocol ← String.CopyToNewString[
s: "IFS"L, z: Heap.systemZone]
ELSE
toolData.fileServerProtocol ← String.CopyToNewString[
s: "FLOPPY"L, z: Heap.systemZone];
writeS.PutString["[User.cm]\n"L];
writeS.PutString["[System]\n"L];
IF debug THEN {
Put.Line[toolData.fileSW, "[User.cm]"L];
Put.Line[toolData.fileSW, "[System]"L];
};
IF ~String.Empty[toolData.userName] THEN {
writeS.PutString["User: "L];
writeS.PutString[toolData.userName];
writeS.PutString["\n"L];
IF debug THEN {
Put.Line[toolData.fileSW, "User: "L];
Put.Line[toolData.fileSW, toolData.userName];
Process.Pause[Process.SecondsToTicks[5]];
};
};
IF ~String.Empty[toolData.password] THEN {
writeS.PutString["Password: "L];
writeS.PutString[toolData.password];
writeS.PutString["\n"L];
IF debug THEN {
Put.Line[toolData.fileSW, "Password: "L];
Put.Line[toolData.fileSW, toolData.password];
Process.Pause[Process.SecondsToTicks[5]];
};
};
IF ~String.Empty[toolData.domainName] THEN {
writeS.PutString["Domain: "L];
writeS.PutString[toolData.domainName];
writeS.PutString["\n"L];
IF debug THEN {
Put.Line[toolData.fileSW, "Domain: "L];
Put.Line[toolData.fileSW, toolData.domainName];
Process.Pause[Process.SecondsToTicks[5]];
};
};
IF ~String.Empty[toolData.organizationName] THEN {
writeS.PutString["Organization: "L];
writeS.PutString[toolData.organizationName];
writeS.PutString["\n"L];
IF debug THEN {
Put.Line[toolData.fileSW, "Organization: "L];
Put.Line[toolData.fileSW, toolData.organizationName];
Process.Pause[Process.SecondsToTicks[5]];
};
};
IF ~String.Empty[toolData.fileServerProtocol] THEN {
writeS.PutString["FileServer: "L];
writeS.PutString[toolData.fileServerProtocol];
writeS.PutString["\n"L];
IF debug THEN {
Put.Line[toolData.fileSW, "FileServer: "L];
Put.Line[toolData.fileSW, toolData.fileServerProtocol];
Process.Pause[Process.SecondsToTicks[5]];
};
};
IF ~String.Empty[toolData.NSLisp] THEN {
writeS.PutString["NSLisp: "L];
writeS.PutString[toolData.NSLisp];
writeS.PutString["\n"L];
IF debug THEN {
Put.Line[toolData.fileSW, "NSLisp"L];
Put.Line[toolData.fileSW, toolData.NSLisp];
Process.Pause[Process.SecondsToTicks[5]];
};
};
IF ~String.Empty[toolData.PUPLisp] THEN {
writeS.PutString["PUPLisp: "L];
writeS.PutString[toolData.PUPLisp];
writeS.PutString["\n"L];
IF debug THEN {
Put.Line[toolData.fileSW, "PUPLisp: "L];
Put.Line[toolData.fileSW, toolData.PUPLisp];
Process.Pause[Process.SecondsToTicks[5]];
};
};
IF ~String.Empty[toolData.FloppyLisp] THEN {
writeS.PutString["FloppyLisp: "L];
writeS.PutString[toolData.FloppyLisp];
writeS.PutString["\n"L];
IF debug THEN {
Put.Line[toolData.fileSW, "FloppyLisp: "L];
Put.Line[toolData.fileSW, toolData.FloppyLisp];
Process.Pause[Process.SecondsToTicks[5]];
};
};
writeS.PutString["Screen: White\n"L];
writeS.PutString["Debug: No\n"L];
writeS.PutString["[SystemTools:System]\n"L];
writeS.PutString["InitialCommand: SystemTools\n"L];
IF debug THEN {
Put.Line[toolData.fileSW, "Screen: White\n"L];
Put.Line[toolData.fileSW, "Debug: No"L];
Put.Line[toolData.fileSW, "[SystemTools:System]"L];
Put.Line[toolData.fileSW, "InitialCommand: SystemTools"L];
Process.Pause[Process.SecondsToTicks[5]];
};
IF debug THEN {
Put.Line[toolData.fileSW, "SendNow..."L];
Process.Pause[Process.SecondsToTicks[5]];
};
writeS.SendNow;
IF debug THEN {
Put.Line[toolData.fileSW, "CopyFileHandle..."L];
Process.Pause[Process.SecondsToTicks[5]];
};
myFile ← MFile.CopyFileHandle[
MStream.GetFile[writeS], MFile.dontRelease, readOnly];
IF debug THEN {
Put.Line[toolData.fileSW, "Delete..."L];
Process.Pause[Process.SecondsToTicks[5]];
};
EXITS
problem => {
Put.Line[toolData.fileSW, "problem..."L];
IF myFile # NIL THEN
BEGIN
Put.Line[toolData.msgSW, "Error in auquiring file"L];
MFile.Release[myFile];
END;
}
END;
writeS.Delete;
IF myFile # NIL THEN MFile.Release[myFile];
Cursor.Set[textPointer];
Put.Line[toolData.fileSW, " Done"L];
END; --MakeUserCM
ProcessUserDotCM: PUBLIC PROCEDURE =
BEGIN
CMOption: TYPE = MACHINE DEPENDENT{
Domain, User, Password, NSFile, IFSFile, FloppyFile, Protocol, Org,
noMatch(StringLookUp.noMatch)};
DefinedOption: TYPE = CMOption [Domain..Org];
cmOptionTable: ARRAY DefinedOption OF LONG STRING ← [
Domain: "Domain"L, User: "User"L, Password: "Password"L,
Org: "Organization"L, NSFile: "NSLisp", IFSFile: "PUPLisp",
FloppyFile: "FloppyLisp", Protocol: "FileServer"L];
cmIndex: CMOption;
CheckType: PROCEDURE [h: CmFile.Handle, table: StringLookUp.TableDesc]
RETURNS [index: CARDINAL] = CmFile.NextValue;
MyNextValue: PROCEDURE [
h: CmFile.Handle,
table: LONG DESCRIPTOR FOR ARRAY DefinedOption OF LONG STRING]
RETURNS [index: CMOption] = LOOPHOLE[CheckType];
cmFile: CmFile.Handle ← CmFile.UserDotCmOpen[
! CmFile.Error => IF code = fileNotFound THEN GOTO return];
IF CmFile.FindSection[cmFile, "System"L] THEN
DO
SELECT
(cmIndex ← MyNextValue[
h: cmFile, table: DESCRIPTOR[cmOptionTable] !
CmFile.TableError => RESUME ]) FROM
noMatch => EXIT;
User =>
BEGIN
value: LONG STRING = Token.Item[cmFile];
toolData.userName ← String.CopyToNewString[
s: value, z: Heap.systemZone];
[] ← Token.FreeTokenString[value];
END;
Password =>
BEGIN
value: LONG STRING = Token.Item[cmFile];
toolData.password ← String.CopyToNewString[
s: value, z: Heap.systemZone];
[] ← Token.FreeTokenString[value];
END;
<< -- call twice for "xsis north" type tokens
Domain =>
BEGIN
value: LONG STRING = Token.Item[cmFile];
value1: LONG STRING = Token.Item[cmFile];
IF ~String.Empty[value1] THEN {
String.AppendString[value, " "L];
String.AppendString[value, value1];
};
toolData.domainName ← String.CopyToNewString[
s: value, z: Heap.systemZone];
[] ← Token.FreeTokenString[value];
[] ← Token.FreeTokenString[value1];
END;
Org =>
BEGIN
value: LONG STRING ← Token.Item[cmFile];
toolData.organizationName ← String.CopyToNewString[
s: value, z: Heap.systemZone];
[] ← Token.FreeTokenString[value];
END;
>>
NSFile =>
BEGIN
value: LONG STRING ← Token.Item[cmFile];
toolData.NSLisp ← String.CopyToNewString[
s: value, z: Heap.systemZone];
[] ← Token.FreeTokenString[value];
END;
IFSFile =>
BEGIN
value: LONG STRING ← Token.Item[cmFile];
toolData.PUPLisp ← String.CopyToNewString[
s: value, z: Heap.systemZone];
[] ← Token.FreeTokenString[value];
END;
FloppyFile =>
BEGIN
value: LONG STRING ← Token.Item[cmFile];
toolData.FloppyLisp ← String.CopyToNewString[
s: value, z: Heap.systemZone];
[] ← Token.FreeTokenString[value];
END;
Protocol =>
BEGIN
value: LONG STRING ← Token.Item[cmFile];
Put.Line[toolData.fileSW, value];
IF String.Equivalent[value, "FS"] THEN
toolData.fileServer ← FS
ELSE
IF String.Equivalent[value, "IFS"] THEN
toolData.fileServer ← IFS
ELSE toolData.fileServer ← FLOPPY;
[] ← Token.FreeTokenString[value];
END;
ENDCASE;
ENDLOOP;
IF String.Empty[toolData.NSLisp] THEN
toolData.NSLisp ← String.CopyToNewString[
s: NSFileName, z: Heap.systemZone];
IF String.Empty[toolData.PUPLisp] THEN
toolData.PUPLisp ← String.CopyToNewString[
s: IFSFileName, z: Heap.systemZone];
IF String.Empty[toolData.FloppyLisp] THEN
toolData.FloppyLisp ← String.CopyToNewString[
s: FloppyFileName, z: Heap.systemZone];
GetProfileInfo[];
[] ← CmFile.Close[cmFile];
EXITS return => NULL;
END; --ProcessUserDotCM
ProfileExec: Exec.ExecProc =
BEGIN
execWrite: Format.StringProc ← Exec.OutputProc[h];
--execWrite["Creating tool window.."L];
--Process.Pause[Process.SecondsToTicks[5]];
IF (profileWindow # NIL) AND ~active THEN
ToolWindow.Activate[profileWindow]
ELSE profileWindow ← MakeTool[];
END; --ProfileExec
ProfileToolActivate: PUBLIC PROCEDURE =
BEGIN
IF profileWindow = NIL THEN profileWindow ← MakeTool[];
ToolWindow.Activate[profileWindow];
Window.Stack[
profileWindow, Window.GetChild[Window.GetParent[profileWindow]]]; -- top me
Window.ValidateTree[];
END; --ProfileToolActivate
ServerNotifyProc: FormSW.EnumeratedNotifyProcType =
BEGIN
IF debug THEN {
Put.Line[toolData.fileSW, "ServerNotifyProc...."L];
Process.Pause[Process.SecondsToTicks[5]];
};
--DisplayFile[];
END; --ServerNotifyProc
Unload: Exec.ExecProc =
BEGIN
IF profileWindow # NIL THEN Tool.Destroy[profileWindow];
profileWindow ← NIL;
[] ← Exec.RemoveCommand[h, "SetProfile.~"L];
END;
---- ---- ---- ---- ---- ---- ---- ---- ---- --
-- Mainline code
Init[];
END...