MODULE; IMPORT (*** Pathname, ***) Process, (*** Text, ***) Thread, Wr; IMPORT Quake, QMachine, QValue, QVal; IMPORT ConfigItem, Default, ErrLog, LineWr; CONST Browser = ConfigItem.Desc [ConfigItem.T.Start_browser].name; TYPE BrowseClosure = Thread.Closure OBJECT url : TEXT; mach : Quake.Machine; proc : QValue.T; OVERRIDES apply := DoBrowse; END; PROCEDURE Display Start () = VAR start := Default.server_href;
** user_home := ConfigItem.X [ConfigItem.T.Homepage].text; **
BEGIN
**
IF (user_home # NIL) AND Text.Length (user_home) > 0 THEN
start := start & user/
& Pathname.Last (user_home);
END;
**
EVAL Thread.Fork (NEW (BrowseClosure, url := start)); END Start; PROCEDUREDoBrowse (cl: BrowseClosure): REFANY = VAR sav_echo : BOOLEAN; sav_wr : Wr.T; wr := LineWr.New (DumpLine, NIL); v : QValue.T; shutdown : BOOLEAN; BEGIN ErrLog.Msg ("calling ", Browser, "(", cl.url & ")"); TRY Default.GetConfigProc (ConfigItem.T.Start_browser, cl.mach, cl.proc); IF (cl.mach = NIL) THEN RETURN NIL; END; sav_echo := cl.mach.exec_echo (ConfigItem.X [ConfigItem.T.Verbose_log].bool); sav_wr := cl.mach.cur_wr (); cl.mach.set_wr (wr); cl.mach.start_call (cl.proc); QMachine.PushText (cl.mach, cl.url); cl.mach.call_proc (n_args := 1, isFunc := TRUE); cl.mach.pop (v); shutdown := QVal.ToBool (cl.mach, v); cl.mach.set_wr (sav_wr); EVAL cl.mach.exec_echo (sav_echo); EXCEPT | Thread.Alerted => LineWr.Clear (wr); ErrLog.Msg ("** interrupted while running ", Browser, "()"); shutdown := FALSE; | Quake.Error (msg) => LineWr.Clear (wr); ErrLog.Msg ("** error while running ", Browser, "() : ", msg); shutdown := FALSE; END; (* dump the output to the error log *) LineWr.Clear (wr); IF (shutdown) THEN ErrLog.Msg ("CM3-IDE is shutting down because ", Browser, "() returned TRUE."); Process.Exit(0); ELSE ErrLog.Msg (Browser, "() returned FALSE."); END; RETURN NIL; END DoBrowse; PROCEDUREDumpLine (<*UNUSED*> ref: REFANY; line: TEXT) = BEGIN ErrLog.Msg (line); END DumpLine; BEGIN END Display.