PeekMail.mesa
Copyright © 1986 by Xerox Corporation. All rights reserved.
Andrew Birrell August 29, 1983 11:42 am
Willie-Sue, May 9, 1986 2:39:53 pm PDT
DIRECTORY
Commander USING[ CommandProc, Register ],
FS USING [Error, SetKeep],
GVBasics USING[ ItemHeader ],
GVRetrieve,
IO,
Process USING [Detach],
Rope USING[ Fetch, Length, ROPE ],
UserCredentials USING[ Get ],
ViewerClasses USING [Viewer],
ViewerIO USING[ CreateViewerStreams ],
ViewerOps USING [FindViewer, OpenIcon];
PeekMail: CEDAR PROGRAM
IMPORTS
Commander, FS, GVRetrieve, IO, Process, Rope, UserCredentials, ViewerIO, ViewerOps =
BEGIN
TypeMessage: PROC[out: IO.STREAM, handle: GVRetrieve.Handle] =
BEGIN
handleStr: IO.STREAM = handle.GetItem[];
buffer: REF TEXT = NEW[TEXT[300]];
UNTIL handleStr.EndOf[]
DO buffer.length ← handleStr.GetBlock[buffer, 0, buffer.maxLength];
out.PutBlock[buffer, 0, buffer.length];
ENDLOOP;
END;
DoIt: Commander.CommandProc =
TRUSTED { Process.Detach[FORK ReallyDoIt[] ] };
TSStream: PROC[name, tsLogFile, wDir: Rope.ROPE] RETURNS [out, tsLogStrm: IO.STREAM] = {
v: ViewerClasses.Viewer ← ViewerOps.FindViewer[name];
out ← ViewerIO.CreateViewerStreams[name, v, tsLogFile, FALSE].out;
FS.SetKeep[tsLogFile, 4 ! FS.Error => CONTINUE];
IF v#NIL THEN IF v.iconic THEN ViewerOps.OpenIcon[v];
};
ReallyDoIt: PROC =
BEGIN
peekLog: Rope.ROPE = "///temp/PeekMail.log";
out: IO.STREAM = TSStream["Peek Mail", peekLog, NIL].out;
handle: GVRetrieve.Handle = GVRetrieve.Create[300];
out.PutF["\n~~~~~~~~~~~~ PeekMail @ %g\n\n", IO.time[]];
GVRetrieve.NewUser[handle, UserCredentials.Get[].name,
UserCredentials.Get[].password];
DO noMore: BOOL;
state: GVRetrieve.ServerState;
type: GVRetrieve.ServerType;
[noMore, state, type] ← GVRetrieve.NextServer[handle];
IF noMore THEN EXIT;
out.PutF["Server \"%g\"\n\n--------\n\n", [rope[GVRetrieve.ServerName[handle]]] ];
IF state # notEmpty THEN LOOP;
DO ENABLE GVRetrieve.Failed => { out.PutF["\nFailed: %g\n", [rope[text]] ]; EXIT };
msgExists, archived, deleted: BOOL;
[msgExists, archived, deleted] ← GVRetrieve.NextMessage[handle];
IF NOT msgExists THEN EXIT;
IF deleted THEN LOOP;
BEGIN
toc: Rope.ROPE = GVRetrieve.ReadTOC[handle];
IF Rope.Length[toc] # 0 AND Rope.Fetch[toc,0] # '? THEN LOOP;
IF archived THEN out.PutRope["(archived)\n"];
DO header: GVBasics.ItemHeader = GVRetrieve.NextItem[handle];
IF header.type = LastItem THEN EXIT;
IF header.type # Text THEN LOOP;
TypeMessage[out, handle];
ENDLOOP;
GVRetrieve.WriteTOC[handle, " "];
out.PutRope["\n\n--------\n\n"];
END;
ENDLOOP;
ENDLOOP;
out.PutRope["End of messages\n"];
GVRetrieve.Close[handle];
out.Flush[];
END;
Commander.Register[key: "PeekMail", proc: DoIt,
doc: "Look at new mail without flushing it from the mail servers"];
END.