(*
(*
 * $Id: MHRequests.mod,v 1.5 1994/02/23 00:30:08 mh Exp $
 *
 * Requests with Timeouts, without Assert() and Fail(),
 *          using BuildEasyRequests() and
 *          a version for Liblink (compiled with "SET Lib")
 *
 * $Log: MHRequests.mod,v $
 * Revision 1.5  1994/02/23  00:30:08  mh
 * Fixed bug in OOM
 *
 * Revision 1.4  1994/02/20  15:17:14  mh
 * Lib-OOM "Cancel" -> "Guru"
 *
 *)
 *)

MODULE MHRequests;

IMPORT sys := SYSTEM,
       I*  := Intuition,
       ol  := OberonLib,
       Dos;

VAR
  Timeout* : LONGINT;

PROCEDURE RequestWin*(head,msg,pos,neg: ARRAY OF CHAR; win: I.WindowPtr;
                      timeout: LONGINT): BOOLEAN; (* $CopyArrays- *)
VAR
  req: I.WindowPtr;
  res: LONGINT;
  eas: I.EasyStruct;

BEGIN
  eas.structSize := SIZE(eas);
  eas.flags := LONGSET{};
  eas.title := sys.ADR("Oberon Request");
  eas.textFormat := sys.ADR("%s\n%s");
  IF pos = "" THEN
    eas.gadgetFormat := sys.ADR("%s%s");
  ELSE
    eas.gadgetFormat := sys.ADR("%s|%s");
  END;
  req := I.BuildEasyRequest(win,sys.ADR(eas),LONGSET{I.intuiTicks},
                            sys.ADR(head),sys.ADR(msg),sys.ADR(pos),sys.ADR(neg));
  timeout := timeout * 10;
  REPEAT
    res := I.SysReqHandler(req,NIL,I.LTRUE);
    DEC(timeout);
  UNTIL (res>=0) OR (timeout=0);
  I.FreeSysRequest(req);
  RETURN res=1;
END RequestWin;


PROCEDURE Request*(head,msg,pos,neg: ARRAY OF CHAR): BOOLEAN; (* $CopyArrays- *)
BEGIN
  RETURN RequestWin(head,msg,pos,neg,NIL,Timeout);
END Request;


(*-------------------------------------------------------------------------*)


PROCEDURE BreakPoint*(msg: ARRAY OF CHAR); (* $CopyArrays- *)

BEGIN
  IF ~ Request("Oberon Breakpoint:",msg,"CONTINUE","HALT") THEN HALT(10) END;
END BreakPoint;


(*-------------------------------------------------------------------------*)
(* $IF Lib *)

PROCEDURE OOM;
BEGIN
  (* $IF English *)
    IF ~ Request("Oberon library","Out of memory!",
                 " Retry "," Guru ") THEN  
      sys.INLINE(04E49H);   (* TRAP #9 *)
    END;
  (* $ELSE *)
    IF ~ Request("Oberon library","Speichermangel!",
                 " Nochmal versuchen "," Guru ") THEN
      sys.INLINE(04E49H);   (* TRAP #9 *)
    END;
  (* $END *)
END OOM;

(* $ELSE *)

PROCEDURE OOM;
VAR
  thisCommand : ARRAY 40 OF CHAR;

BEGIN
  (* $IF English *)
    IF NOT Dos.GetProgramName(thisCommand,SIZE(thisCommand)) THEN
      COPY("unnamed program",thisCommand);
    END;
    IF ~ Request(thisCommand,"Out of memory!",
                             " Retry "," Cancel ") THEN HALT(20) END;
  (* $ELSE *)
    IF NOT Dos.GetProgramName(thisCommand,SIZE(thisCommand)) THEN
      COPY("Programm ohne Name",thisCommand);
    END;
    IF ~ Request(thisCommand,"Speichermangel!",
                             " Nochmal versuchen "," Abbruch ") THEN HALT(20) END;
  (* $END *)
END OOM;

(* $END *)
(*-------------------------------------------------------------------------*)


BEGIN
  Timeout := 30;
  ol.OutOfMemHandler := OOM;
  IF I.int.libNode.version<36 THEN  HALT(20)  END;
END MHRequests.
