PeekMail.mesa
Andrew Birrell August 29, 1983 11:42 am
DIRECTORY
Commander USING[ CommandProc, Register ],
GVBasics USING[ ItemHeader ],
GVRetrieve,
IO USING[ EndOf, GetBlock, PutBlock, PutF, PutRope, STREAM ],
Rope USING[ Fetch, Length, ROPE ],
UserCredentials USING[ Get ],
ViewerIO USING[ CreateViewerStreams ];
PeekMail: PROGRAM
IMPORTS Commander, GVRetrieve, IO, Rope, UserCredentials, ViewerIO =
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
BEGIN
out: IO.STREAM = ViewerIO.CreateViewerStreams["Peek Mail"].out;
handle: GVRetrieve.Handle = GVRetrieve.Create[300];
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];
END;
Commander.Register[key: "PeekMail", proc: DoIt,
doc: "Look at new mail without flushing it from the mail servers"];
END.