-- Inbox management program to run in Laurel --

-- [Indigo]<DMS>Laurel>User>Flush.mesa --

-- Mike Schroeder, 14 Oct. 1982 4:49 pm PDT (Thursday) --

DIRECTORY  IODefs, RetrieveDefs, String;

Flush: PROGRAM
IMPORTS IODefs, RetrieveDefs, String =

BEGIN

OPEN IODefs;

Yes: PROCEDURE RETURNS [BOOLEAN] =
BEGIN
  WriteString[" (y or n)? "L];
  DO
    SELECT String.LowerCase[ReadChar[]] FROM
      'y => {WriteChar['y]; RETURN[TRUE]};
      'n => {WriteChar['n]; RETURN[FALSE]};
      ENDCASE => WriteChar['?];
    ENDLOOP;
  END; --Yes--

Run: PROCEDURE =
BEGIN
  user: STRING = [64];
  pwd: STRING = [32];
  server: STRING = [32];
  messages: STRING = [4];
  msgCount: CARDINAL;
  h: RetrieveDefs.Handle = RetrieveDefs.Create[60];
  noMore: BOOLEAN;
  serverState: RetrieveDefs.ServerState;
  retProcs: RetrieveDefs.AccessProcs;
  failed: BOOLEAN;
  dots: STRING = " ... "L;
  firstTime: BOOLEAN ← TRUE;

  WriteString["Inbox flushing program for Grapevine administrators."];
  DO
    WriteChar[CR];
    WriteChar[CR];
    IF firstTime
      THEN firstTime ← FALSE
      ELSE {WriteString["Quit"L]; IF Yes[] THEN EXIT ELSE WriteChar[CR]};
    WriteString["Account name: "L];
    user.length ← 0;
    ReadID[user ! Rubout => {WriteString[" xxx"L]; LOOP}];
    WriteChar[CR];
    WriteString["Password: "L];
    pwd.length ← 0;
    DO
      c: CHARACTER = ReadChar[];
      SELECT c FROM
        DEL => GOTO delTyped;
        CR, SP, ESC => EXIT;
        ENDCASE => {WriteChar['*]; String.AppendChar[pwd, c]};
      REPEAT delTyped => {WriteString[" xxx"L]; LOOP};
      ENDLOOP;
    WriteString[dots];
    RetrieveDefs.NewUser[h, user, pwd];
    SELECT RetrieveDefs.MailboxState[h] FROM
      badName =>
        {WriteString["bad name."]; LOOP};
      badPwd =>
        {WriteString["bad password."]; LOOP};
      cantAuth, allDown, someEmpty =>
        {WriteString["some necessary servers down."]; LOOP};
      allEmpty =>
        {WriteString["all inboxes empty."]; LOOP};
      notEmpty =>
        NULL; 
      ENDCASE => ERROR;
    WriteChar[CR];
    WriteString["Do you really want to throw away all messages for this user"L];
    IF NOT Yes[] THEN LOOP;
    failed ← FALSE;
    DO
      WriteChar[CR];
      [noMore, serverState, retProcs] ← RetrieveDefs.NextServer[h];
      IF noMore THEN EXIT;
      RetrieveDefs.ServerName[h, server];
      WriteString["   "L];
      WriteString[server];
      WriteString[dots];
      SELECT serverState FROM
        unknown => {WriteString["no response"L]; failed ← TRUE; LOOP};
        empty => {WriteString["was empty"L]; LOOP};
        notEmpty => NULL;
        ENDCASE => ERROR;
      BEGIN
        ENABLE RetrieveDefs.Failed => BEGIN
        failed ← TRUE;
        WriteString [SELECT why FROM
          communicationFailure => "communication failure"L,
          connectionRejected => "connection rejected"L,
          noSuchServer, badCredentials, unknownFailure => "failed"L,
          ENDCASE => ERROR];
        LOOP;
        END;
        msgCount ← 0;
        UNTIL NOT retProcs.nextMessage[h].msgExists DO
          msgCount ← msgCount+1;
          ENDLOOP;
        retProcs.accept[h]; --flushes the inbox--
        END;
      messages.length ← 0;
      String.AppendDecimal[messages, msgCount];
      WriteString[messages];
      WriteString[" messages flushed"L];
      ENDLOOP;
    WriteString["Inbox flushing "L];
    IF failed THEN WriteString["not completely "L];
    WriteString["successful."L];
    ENDLOOP;
  RetrieveDefs.Destroy[h];
  WriteChar[CR];
  WriteChar[CR];
  WriteLine["Done."L];
  END; --Run--

Run[];

END.