<> <> <> <<>> <> <<>> DIRECTORY BasicTime USING [Now, Period], Convert USING [Error, IntFromRope], FS USING [Error, FileInfo], VoiceCleanup USING [IsGarbageProc, RegisterClass]; VoiceGarbageProcs: CEDAR PROGRAM IMPORTS BasicTime, Convert, FS, VoiceCleanup ~ BEGIN <> <> <<>> FileNonExistent: VoiceCleanup.IsGarbageProc ~ { <> gone: BOOLEAN _ FALSE; [] _ FS.FileInfo[interest.refID ! FS.Error => { IF error.group = user AND error.code = $unknownFile THEN gone _ TRUE; CONTINUE}]; RETURN[gone]; }; <> <> <<>> TimeoutExpired: VoiceCleanup.IsGarbageProc ~ { <> timeout: INT; timeout _ Convert.IntFromRope[interest.data ! Convert.Error => {timeout _ 0; CONTINUE}]; RETURN[BasicTime.Period[from: interest.timestamp, to: BasicTime.Now[]] > timeout]; }; <> <> <<>> Permanent: VoiceCleanup.IsGarbageProc ~ { <> RETURN[FALSE]; }; <> <> <<>> MsgDeleted: VoiceCleanup.IsGarbageProc ~ { <> RETURN[FALSE]; }; <> VoiceCleanup.RegisterClass[class: "WalnutMsg", proc: MsgDeleted]; VoiceCleanup.RegisterClass[class: "SysNoises", proc: Permanent]; VoiceCleanup.RegisterClass[class: "Timeout", proc: TimeoutExpired]; VoiceCleanup.RegisterClass[class: "TiogaVoice", proc: FileNonExistent]; END. <> <> <> <> <> <> <> <> <> <<>> <<>>