-- LutherWatcherImpl.mesa
-- Last edited by
--   Kolling on October 21, 1983 5:00 pm
DIRECTORY
      AlpineEnvironment
        USING[FileStore],
      AlpInstance
        USING[Create, Failed, Handle],
      AlpTransaction
        USING[Create, OperationFailed],
      Commander
         USING[CommandProc, Register],
      Icons
         USING[IconFlavor, NewIconFromFile],
      IO
         USING[PutF, PutRope, rope],
      Process
        USING[Pause, SecondsToTicks],
      ProcessExtras
        USING[CheckForAbort],
      Rope
         USING[Equal, ROPE],
      RPC
         USING[CallFailed],
      SpecialCache
         USING[NameIt],
      UserProfile
         USING[Boolean],
      ViewerClasses
         USING[ViewerClass, ViewerClassRec, Viewer],
      ViewerOps
         USING[CreateViewer, DestroyViewer, PaintViewer, RegisterViewerClass];
LutherWatcherImpl: CEDAR PROGRAM
   IMPORTS AlpI: AlpInstance, AlpT: AlpTransaction, Commander, Icons, IO, Process,
      ProcessExtras, Rope, RPC, SpecialCache, UserProfile, ViewerOps
   SHARES SpecialCache =
BEGIN OPEN AE: AlpineEnvironment;
fileStore: AE.FileStore ← "luther.alpine";
quiescent: Icons.IconFlavor ← Icons.NewIconFromFile[file:
  "LutherWatcher.icons", n: 0];
stillDownFlavor1: Icons.IconFlavor ← Icons.NewIconFromFile[file:
  "LutherWatcher.icons", n: 1];
stillDownFlavor2: Icons.IconFlavor ← Icons.NewIconFromFile[file:
  "LutherWatcher.icons", n: 2];
stillDownFlavor3: Icons.IconFlavor ← Icons.NewIconFromFile[file:
  "LutherWatcher.icons", n: 3];
stillDownFlavor4: Icons.IconFlavor ← Icons.NewIconFromFile[file:
  "LutherWatcher.icons", n: 4];
viewerClass: ViewerClasses.ViewerClass ← NEW[ViewerClasses.ViewerClassRec ←
  [icon: quiescent]];   
LutherWatcherTool: ViewerClasses.Viewer;
viewerName: Rope.ROPE ← "LutherWatcher";
firstFail: BOOLEAN ← TRUE;
 
--  Commander.CommandProc  TYPE = PROC [cmd: Handle] RETURNS [result: REF ← NIL, msg: Rope.ROPE ← NIL];
LutherWatcherProc: Commander.CommandProc =
   BEGIN
   ENABLE ABORTED => IF NOT firstFail THEN ViewerOps.DestroyViewer[LutherWatcherTool];
   instHandle: AlpI.Handle ← NIL;
   lastMsg: Rope.ROPE ← NIL;
   DoNumber: PROCEDURE[what: Rope.ROPE] =
    BEGIN
    IF NOT Rope.Equal[lastMsg, what, TRUE]
       THEN BEGIN
               cmd.out.PutF["%g.
", IO.rope[what]];
               lastMsg ← what;
                   END;
    IF firstFail
      THEN BEGIN
              ViewerOps.RegisterViewerClass[$LutherWatcher, viewerClass];
              LutherWatcherTool ← ViewerOps.CreateViewer[
                 flavor: $LutherWatcher,
                 info: [
                    name: viewerName,
                    iconic: TRUE,
                    column: right,
                    icon: quiescent,
                    scrollable: FALSE
                 ]];
              firstFail ← FALSE;
              END;
    LutherWatcherTool.icon ← quiescent;
    ViewerOps.PaintViewer[LutherWatcherTool, all];
    Process.Pause[10];
    LutherWatcherTool.icon ← stillDownFlavor1;
    ViewerOps.PaintViewer[LutherWatcherTool, all];
    Process.Pause[10];
    LutherWatcherTool.icon ← stillDownFlavor2;
    ViewerOps.PaintViewer[LutherWatcherTool, all];
    Process.Pause[10];
    LutherWatcherTool.icon ← stillDownFlavor3;
    ViewerOps.PaintViewer[LutherWatcherTool, all];
    Process.Pause[10];
    LutherWatcherTool.icon ← stillDownFlavor4;
    ViewerOps.PaintViewer[LutherWatcherTool, all];
    Process.Pause[20];
    LutherWatcherTool.icon ← quiescent;
    ViewerOps.PaintViewer[LutherWatcherTool, all];
    THROUGH [1..15]
       DO Process.Pause[Process.SecondsToTicks[6]]; ProcessExtras.CheckForAbort[];
       ENDLOOP;
     END;
    firstFail ← TRUE;
   DO
    instHandle ← AlpI.Create[fileStore, , 
        ! AlpI.Failed => SELECT why FROM
               grapevineDownOrCommunications =>
                     BEGIN DoNumber["Grapevine down or Ethernet problem"]; LOOP; END;
               alpineDownOrCommunications =>
                     BEGIN DoNumber["Luther down or Ethernet problem"]; LOOP; END;
               alpineDown =>
                     BEGIN DoNumber["Luther down"]; LOOP; END;
            ENDCASE;];
    [] ← AlpT.Create[instHandle, TRUE
        ! RPC.CallFailed => SELECT why FROM
               timeout => BEGIN DoNumber["Luther down or Ethernet problem"]; LOOP; END;
               unbound => BEGIN DoNumber["Luther down"]; LOOP; END;
            ENDCASE;
         AlpT.OperationFailed => IF why = busy
                      THEN BEGIN DoNumber["Luther busy"]; RETRY; END;];
    cmd.out.PutRope["Luther up.
"];
    IF NOT firstFail
       THEN BEGIN 
                  IF UserProfile.Boolean["LutherWatcher.Armageddon", TRUE] 
                 THEN TRUSTED BEGIN SpecialCache.NameIt[viewerName]; END;
              ViewerOps.DestroyViewer[LutherWatcherTool];
                  END;
    EXIT;
    ENDLOOP;
   END;
-- main line code.
Commander.Register["LutherWatcher", LutherWatcherProc, NIL, ];
END.
                                                                      Edit Log
Initial: Kolling:  July 18, 1983 2:28 pm