<> <> <> <> 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.