--MaintainFilesList.mesa
-- Last changed by Paxton, August 31, 1982 4:16 pm
-- Last changed by McGregor, September 10, 1982 2:21 pm
Last Edited by: Maxwell, January 6, 1983 12:19 pm
DIRECTORY
CedarSnapshot,
FileIO,
IO,
Process,
Rope,
MessageWindow,
UserCredentials,
ViewerClasses,
ViewerEvents;
MaintainFilesList: CEDAR MONITOR
IMPORTS CedarSnapshot, FileIO, IO, Process, Rope, MessageWindow, UserCredentials, ViewerEvents = {
regProc: REF;
filesList: Rope.ROPE;
userName: Rope.ROPE = UserName[];
fileName: Rope.ROPE = Rope.Concat[userName, ".List"];
UserName: PROC RETURNS [name: Rope.ROPE] = {
dot: INT;
name ← UserCredentials.GetUserCredentials[].name;
dot ← Rope.Find[name, "."];
IF dot > 0 THEN name ← Rope.Substr[name, 0, dot] };
Add: ViewerEvents.EventProc = TRUSTED { Process.Detach[FORK AddToFilesList[viewer.file]] };
AddToFilesList: ENTRY PROC [name: Rope.ROPE] = {
ENABLE UNWIND => NULL;
AlreadyThere: PROC RETURNS [BOOL] = {
pos: INT ← 0;
len: INT = Rope.Size[name];
fileLen: INT = Rope.Size[filesList];
blank: CHAR = ' ;
WHILE (pos ← Rope.Find[filesList, name, pos, FALSE]) # -1 DO -- look for adjacent blanks
IF (pos>0 AND Rope.Fetch[filesList, pos-1] # blank) OR
(pos+len < fileLen AND Rope.Fetch[filesList, pos+len] # blank)
THEN { pos ← pos+len; LOOP };
RETURN [TRUE];
ENDLOOP;
RETURN [FALSE] };
IF Rope.Size[name]=0 THEN RETURN;
IF Rope.Equal[name, fileName, FALSE] THEN { -- record hand change to file holding list
GetFilesList[]; RETURN };
IF AlreadyThere[] THEN RETURN;
MessageWindow.Append["Adding ", TRUE];
MessageWindow.Append[name];
MessageWindow.Append[" to "];
MessageWindow.Append[fileName];
filesList ← Rope.Concat[filesList, Rope.Concat[" ", name]];
WriteFilesList[];
};
WriteFilesList: PROC = { OPEN IO;
ENABLE UNWIND => NULL;
s: STREAM ← FileIO.Open[fileName, overwrite];
PutRope[s, filesList];
Close[s] };
AfterRollback: PROCEDURE [when: CedarSnapshot.After] = {
IF when=checkpoint THEN RETURN;
GetFilesList[] --update cached copy-- };
GetFilesList: PROC = {
s: IO.STREAM = FileIO.Open[fileName, read !
FileIO.OpenFailed => {IF why=fileNotFound THEN GOTO Quit}];
len: INT = IO.GetLength[s];
readChar: SAFE PROC RETURNS [CHAR] = { RETURN [IO.GetChar[s]] };
filesList ← Rope.FromProc[len, readChar];
IO.Close[s];
EXITS Quit => filesList ← NIL;
};
UnReg: ENTRY PROC = {
ENABLE UNWIND => NULL;
IF regProc # NIL THEN ViewerEvents.UnRegisterEventProc[regProc, save];
regProc ← NIL;
filesList ← NIL };
Reg: ENTRY PROC = {
ENABLE UNWIND => NULL;
IF regProc # NIL THEN ViewerEvents.UnRegisterEventProc[regProc, save];
regProc ← ViewerEvents.RegisterEventProc[Add, save];
GetFilesList[] };
Reg[];
TRUSTED {CedarSnapshot.Register[r: AfterRollback]};
}...