--ILTUserCMImpl.mesa
--Created by
--   JFung.PASA	  	10-Nov-83 15:48:47

--last edited by
--   JFung.PASA	   	19-Dec-83 16:51:12



DIRECTORY
     Cursor USING [Set],
     Heap, 
     LispToolOps,
     MFile,
     MStream,
     Process,
     Put,
     Stream,
     Volume;


ILTUserCMImpl: PROGRAM
     IMPORTS Cursor, Heap, LispToolOps, MFile, MStream, Process, Put, Stream, Volume
     EXPORTS LispToolOps =

     BEGIN OPEN ILT: LispToolOps;
	
     debug: BOOLEAN ← TRUE;
     nVols: CARDINAL;

<<
     PasswordCM: PUBLIC PROCEDURE[] =
          BEGIN
	  i: CARDINAL;
          s: STRING ← [80];
          v: Volume.ID;
          all: Volume.TypeSet = [
               normal: TRUE, debugger: TRUE, debuggerDebugger: TRUE];


          name: LONG STRING ← "VolumeFile"L;
          myFile: MFile.Handle ← NIL;
          --readS: MStream.Handle ← NIL;
          writeS: MStream.Handle ← NIL;
	  
          IF ~MFile.ValidFilename[name] THEN {
               Put.Line[ILT.toolData.msgSW, "Invalid file name"L]; RETURN; };

          myFile ← MFile.Acquire[
               name, anchor, MFile.dontRelease !
               MFile.Error => {myFile ← NIL; CONTINUE}];

          BEGIN
          ENABLE MFile.Error => GOTO problem;

          IF myFile # NIL THEN
               BEGIN
               IF debug THEN {
                    Put.Line[ILT.toolData.fileSW, "SetAccess..."L];
                    Process.Pause[Process.SecondsToTicks[5]];
                    };
               MFile.SetAccess[myFile, readWrite];
               END
          ELSE
               BEGIN
               IF debug THEN {
                    Put.Line[ILT.toolData.fileSW, "ReadWrite..."L];
                    Process.Pause[Process.SecondsToTicks[5]];
                    };
               myFile ← MFile.ReadWrite[name, MFile.dontRelease, text];
               END;

          writeS ← MStream.Create[myFile, []];

          MStream.SetLength[writeS, 0];

          IF ILT.toolData.volName # NIL THEN RETURN;
          -- First, count the logical volumes.
          nVols ← 0;
          FOR v ← Volume.GetNext[Volume.nullID, all], Volume.GetNext[v, all] WHILE
               v ~= Volume.nullID DO nVols ← nVols + 1; ENDLOOP;

          -- Now build up the table
          ILT.toolData.volHints ← Heap.systemZone.NEW[ILT.VolHints[nVols]];
          FOR i IN [0..nVols) DO
               v ← Volume.GetNext[v, all];
               Volume.GetLabelString[v, s];
	       writeS.PutString[s];
               ENDLOOP;
          writeS.SendNow;
          myFile ← MFile.CopyFileHandle[
               MStream.GetFile[writeS], MFile.dontRelease, readWrite];
          EXITS
               problem => {
                    Put.Line[ILT.toolData.fileSW, "problem in volume file.."L];

                    IF myFile # NIL THEN
                         BEGIN
                         Put.Line[ILT.toolData.msgSW, "Error in auquiring file"L];
                         MFile.Release[myFile];
                         END;
                    }
          END;
          writeS.Delete;
          IF myFile # NIL THEN MFile.Release[myFile];
          
          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 ILT.debug THEN {
               Put.Line[ILT.toolData.fileSW, "Acquire..."L];
               Process.Pause[Process.SecondsToTicks[5]];
               };

          myFile ← MFile.Acquire[
               name, anchor, MFile.dontRelease !
               MFile.Error => {myFile ← NIL; CONTINUE}];

          IF ILT.debug THEN {
               Put.Line[ILT.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 ILT.debug THEN {
                    Put.Line[ILT.toolData.fileSW, "SetAccess..."L];
                    Process.Pause[Process.SecondsToTicks[5]];
                    };
               MFile.SetAccess[myFile, readWrite];
               END
          ELSE
               BEGIN
               IF ILT.debug THEN {
                    Put.Line[ILT.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 ILT.debug THEN {
               Put.Line[ILT.toolData.fileSW, "Create..."L];
               Process.Pause[Process.SecondsToTicks[5]];
               };

          writeS ← MStream.Create[myFile, []];

          IF ILT.debug THEN {
               Put.Line[ILT.toolData.fileSW, "SetLength..."L];
               Process.Pause[Process.SecondsToTicks[5]];
               };

          MStream.SetLength[writeS, 0];

          IF ILT.debug THEN {
               Put.Line[ILT.toolData.fileSW, "PutString..."L];
               Process.Pause[Process.SecondsToTicks[5]];
               };

          writeS.PutString["[User.cm]\n"];
          --writeS.PutString["[Executive]\n"];
          --writeS.PutString["WindowBox: [x: 574, y: 100, w: 450, h: 315]\n"];
          --writeS.PutString["InitialState: active\n"];

          writeS.PutString["[System]\n"];
          writeS.PutString["Domain: "];
          writeS.PutString[ILT.toolData.domainName];
          writeS.PutString["\n"];
          writeS.PutString["Organization: "];
          writeS.PutString[ILT.toolData.organizationName];
          writeS.PutString["\n"];
          writeS.PutString["Screen: White\n"];
          writeS.PutString["Debug: No\n"];

          writeS.PutString["[Diagnostics:System]\n"];
          writeS.PutString["InitialCommand: InstallLispTool\n"];

          IF ILT.debug THEN {
               Put.Line[ILT.toolData.fileSW, "SendNow..."L];
               Process.Pause[Process.SecondsToTicks[5]];
               };

          writeS.SendNow;
          IF ILT.debug THEN {
               Put.Line[ILT.toolData.fileSW, "CopyFileHandle..."L];
               Process.Pause[Process.SecondsToTicks[5]];
               };

          myFile ← MFile.CopyFileHandle[
               MStream.GetFile[writeS], MFile.dontRelease, readOnly];

          IF ILT.debug THEN {
               Put.Line[ILT.toolData.fileSW, "Delete..."L];
               Process.Pause[Process.SecondsToTicks[5]];
               };

          EXITS
               problem => {
                    IF ILT.debug THEN Put.Line[ILT.toolData.fileSW, "problem..."L];

                    IF myFile # NIL THEN
                         BEGIN
                         Put.Line[ILT.toolData.msgSW, "Error in auquiring file"L];
                         MFile.Release[myFile];
                         END;
                    }
          END;
          writeS.Delete;
          IF myFile # NIL THEN MFile.Release[myFile];
	  
	  PasswordCM[];
          Cursor.Set[textPointer];
          Put.Line[ILT.toolData.fileSW, " Done"L];
          END;

     END...-- Program ILTUserCMImpl