home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / useful / os20 / cdity / devicelock.lha / DeviceLock / Txt / DLprefs.mod < prev    next >
Text File  |  1993-12-05  |  13KB  |  384 lines

  1. MODULE DLprefs; 
  2.  
  3. IMPORT c  := Conversions,
  4.        d  := Dos,
  5.        DLs:= DLstrings,
  6.        DLr:= DLrequester,
  7.        e  := Exec,
  8.        fs := FileSystem,
  9.        hot:= HotKey,
  10.        I  := Intuition,
  11.        ol := OberonLib,
  12.        s  := Strings,
  13.        sys:= SYSTEM,
  14.        u  := Utility,
  15.        WB := WBReadArgs,
  16.        w  := Workbench;
  17.  
  18.  
  19. (*-------------------------------------------------------------------------*)
  20.  
  21. CONST
  22.   identLength     = 20;  (*  * drivenum * 2 *)
  23.   passkeyLength   = 30;  (*  * drivenum    *)
  24.   pubLength       = 60;  (*  * 1  *)
  25.   lockLength      = 30;  (*  * 2  *)
  26.  
  27.   lckallHot    *= -1;
  28.   opencloseHot *= -2;
  29.   gotofrontHot *= -3;
  30.  
  31.   template = "SETTINGS/K,PS=PUBSCREEN/K,NOWARNINGS/S,TOOLPRI/N/K,"
  32.              "CX_PRIORITY/N/K,CX_POPUP/K,CX_POPKEY/K";
  33.  
  34. (*-------------------------------------------------------------------------*)
  35.  
  36. TYPE
  37.   LPOINTER = UNTRACED POINTER TO LONGINT;
  38.  
  39.   ARGV = STRUCT
  40.            settings  : e.STRPTR;
  41.            pubscr    : e.STRPTR;
  42.            noWarnings: LONGINT;
  43.            toolpri   : LPOINTER;
  44.            pri      -: LPOINTER;
  45.            popup     : e.STRPTR;
  46.            popkey    : e.STRPTR;
  47.          END;  
  48.  
  49.   driveT * = RECORD
  50.              GadPtr         *: I.GadgetPtr;
  51.              PrintName      *: ARRAY identLength OF CHAR;
  52.              DeviceName     *: ARRAY identLength OF CHAR;          
  53.              PassKey        *: ARRAY passkeyLength OF CHAR;
  54.              disabled       *: BOOLEAN;
  55.              locked         *: BOOLEAN;
  56.              preflocked     -: BOOLEAN; 
  57.              disabledchanged*: BOOLEAN;
  58.            END;
  59.   driveP * = POINTER TO ARRAY OF driveT;
  60.  
  61.   PrefsT = RECORD
  62.              LeftEdge       -: INTEGER;
  63.              TopEdge        -: INTEGER;
  64.              SizeOnlyZoom   -: BOOLEAN;
  65.              LeftEdgeZoomed -: INTEGER;
  66.              TopEdgeZoomed  -: INTEGER;
  67.              OpenWindow     -: BOOLEAN;
  68.              OpenZoomed     -: BOOLEAN;
  69.              CheckTime      -: INTEGER;
  70.  
  71.   (* do not store HotKeyDescriptions, only add them and then forget them
  72.      (for now!)
  73.              KeyLock        -: ARRAY OF CHAR;
  74.              KeyWindow      -: ARRAY OF CHAR;
  75.              KeyFront       -: ARRAY OF CHAR; *)
  76.  
  77.              PubScreen      -: ARRAY pubLength  OF CHAR;
  78.              LockString     -: ARRAY lockLength OF CHAR;
  79.              UnlockString   -: ARRAY lockLength OF CHAR;
  80.              NotifyDL       -: BOOLEAN;   (* not implemented *)
  81.              UnlockBeep     -: BOOLEAN;
  82.              LockAllBeep    -: BOOLEAN;
  83.              RemPosition    -: BOOLEAN;   (* not implemented *)
  84.              DriveNum       -: INTEGER;
  85.            END;
  86.  
  87.  
  88. (*-------------------------------------------------------------------------*)
  89.  
  90. VAR
  91.   OSrelease3     -: BOOLEAN;
  92.  
  93.  
  94.   Buffer1      *: ARRAY 256 OF CHAR;
  95.   Buffer2       : ARRAY 256 OF CHAR;
  96.  
  97.   drive        *: driveP;
  98.   Prefs        *: PrefsT;
  99.  
  100.   Argv         -: ARGV;
  101.   Arguments     : d.RDArgsPtr;
  102.   wbargs        : WB.Arguments;
  103.   wbm           : w.WBStartupPtr;
  104.  
  105. (*-------------------------------------------------------------------------*)
  106.  
  107. CONST
  108.   PrefsConst = PrefsT(0,0,FALSE,-10,-10,TRUE,FALSE,5,"",
  109.                       "lock %s on %s","lock %s off %s",FALSE,TRUE,FALSE,FALSE,0);
  110.   prgName  = "DeviceLock";
  111.  
  112.  
  113.  
  114. (*------ Read Prefs in DeviceLock.prefs from "", ENV: or PROGDIR: --------*)
  115.  
  116. PROCEDURE ReadPrefs*();
  117. VAR
  118.     wrongCV : BOOLEAN;
  119.     conf    : fs.File;
  120.     opwin   : BOOLEAN;
  121.     length  : INTEGER;
  122.  
  123.   (*---- Tries to Open settings and checks Version and returns TRUE
  124.          if there is a valid settings file                            -----*)
  125.  
  126.   PROCEDURE SearchPrefs(path: ARRAY OF CHAR):BOOLEAN;  (* $CopyArrays- *)
  127.   BEGIN
  128.     IF ~ (fs.Open(conf,path,FALSE) AND fs.ReadString(conf,Buffer1)) THEN RETURN(FALSE) END;
  129.     s.Cut(Buffer1,s.Occurs(Buffer1,"VER")+5,16,Buffer2);
  130.     IF u.Strnicmp("DeviceLock.Prefs",Buffer2,17)#0 THEN
  131.       wrongCV := TRUE;
  132.       IF conf.handle # NIL THEN IF fs.Close(conf) THEN END END;
  133.       RETURN(FALSE);
  134.     ELSE
  135.       RETURN(TRUE)
  136.     END;
  137.   END SearchPrefs;
  138.  
  139.   (*---- Read Line from input, skipping lines beginning with ; ------------*)
  140.  
  141.   PROCEDURE GetNewLine():BOOLEAN;
  142.   VAR i     : INTEGER;
  143.       ret   : BOOLEAN;
  144.       equpos: INTEGER;
  145.   BEGIN
  146.     REPEAT
  147.       ret := fs.ReadString(conf,Buffer1);
  148.     UNTIL ((Buffer1[0]#";") & (Buffer1[0]#" ") & (Buffer1[0]#0X)) OR (ret=FALSE);
  149.     IF ret THEN
  150.        length := SHORT(s.Length(Buffer1));
  151.        i := 0;
  152.        WHILE ((i < length) & (Buffer1[i]#";")) DO
  153.          INC(i);
  154.        END; (* WHILE *)
  155.        IF Buffer1[i]=";" THEN Buffer1[i] := 0X END;
  156.        i := SHORT(s.Length(Buffer1))-1;
  157.        WHILE (i > 0) & ((Buffer1[i]=" ") OR (Buffer1[i]=09X)) DO
  158.          DEC(i);
  159.        END;
  160.        Buffer1[i+1]:=0X;
  161.        length := SHORT(s.Length(Buffer1));
  162.        i := 0;
  163.        WHILE ((i < length) & (Buffer1[i]#"=")) DO
  164.          INC(i);
  165.        END; (* WHILE *)
  166.        IF Buffer1[i]="=" THEN equpos := i ELSE equpos := -1 END;
  167.        IF (equpos = -1) OR (equpos+1 = length) THEN
  168.          Buffer2 := "INVALID";
  169.        ELSE
  170.          s.Cut(Buffer1,equpos+1,length-equpos-1,Buffer2);
  171.          Buffer1[equpos]:="\o";
  172.          length := SHORT(s.Length(Buffer2));
  173.        END;
  174.     END;
  175.     RETURN ret;
  176.   END GetNewLine;
  177.  
  178.   (*---- Convert Number, complain if not possible -------------------------*)
  179.  
  180.   PROCEDURE ConvNumber():INTEGER;
  181.   VAR number  : LONGINT;
  182.   BEGIN
  183.     IF c.StringToInt(Buffer2,number) & (number <= MAX(INTEGER)) THEN
  184.       RETURN(SHORT(number))
  185.     ELSE
  186.       DLr.RequestWarning(DLs.GetString(DLs.WarnCorruptNumber),sys.ADR(Buffer2));
  187.       RETURN (0);
  188.     END;
  189.   END ConvNumber;
  190.  
  191.   (*---- Convert Boolean, complain if not possible ------------------------*)
  192.  
  193.   PROCEDURE ConvBool():BOOLEAN;
  194.   BEGIN
  195.     IF CAP(Buffer2[0]) = "N" THEN RETURN FALSE
  196.     ELSIF CAP(Buffer2[0]) = "Y" THEN RETURN TRUE
  197.     ELSE
  198.       DLr.RequestWarning(DLs.GetString(DLs.WarnCorruptBoolean),sys.ADR(Buffer2));
  199.       RETURN(FALSE);
  200.     END;
  201.   END ConvBool;
  202.  
  203.   (*---- Copy String and check if orginal length --------------------------*)
  204.  
  205.   PROCEDURE CopyTo(VAR str: ARRAY OF CHAR);
  206.   BEGIN
  207.     COPY(Buffer2,str);
  208.     str[LEN(str)-1] := "\o"; (* Our strings end with \o ! *)
  209.     IF (s.Length(str) # s.Length(Buffer2)) THEN
  210.       DLr.RequestWarning(DLs.GetString(DLs.WarnStringTooLong),sys.ADR(str));
  211.     END;
  212.   END CopyTo;
  213.  
  214.   (*---- Tries to add Hotkey and warns on failure -------------------------*)
  215.   PROCEDURE AddKey (ID: INTEGER);
  216.   BEGIN
  217.     IF ~hot.AddKey (Buffer2,ID) THEN
  218.       IF hot.badDescription IN hot.ErrorSet THEN
  219.          DLr.RequestWarning(DLs.GetString(DLs.WarnNotValidKeyCode),sys.ADR(Buffer2));
  220.       ELSE
  221.        DLr.RequestWarning(DLs.GetString(DLs.WarnCannotAddKeyCode),sys.ADR(Buffer2));
  222.       END;
  223.     END;
  224.   END AddKey;
  225.  
  226.   (*---- Tries to determine number of drives ------------------------------*)
  227.   PROCEDURE GetNumberOfDrives():INTEGER;
  228.   VAR num: INTEGER;
  229.       ret: BOOLEAN;
  230.   BEGIN
  231.     num := 0;
  232.     REPEAT
  233.       ret := fs.ReadString(conf,Buffer1);
  234.       IF ret & (Buffer1[0]#";") & (Buffer1[0]#" ") & (Buffer1[0]#0X) THEN
  235.         IF u.Strnicmp("DeviceName=",Buffer1,11)=0 THEN INC(num) END;
  236.       END;
  237.     UNTIL ret=FALSE;
  238.     IF fs.Move(conf,0) THEN END;
  239.     RETURN(num);
  240.   END GetNumberOfDrives;
  241.  
  242.  
  243. BEGIN
  244. wrongCV := FALSE;
  245. opwin := FALSE;
  246. IF Argv.settings # NIL THEN
  247.   IF ~ SearchPrefs(Argv.settings^) THEN
  248.     IF wrongCV THEN
  249.       DLr.BailOut(DLs.GetString(DLs.ErrGivenSettingsNotValid)^);
  250.     ELSE
  251.       DLr.BailOut(DLs.GetString(DLs.ErrCantOpenOrReadGivenSettings)^);
  252.     END;
  253.   END;
  254. ELSE
  255.   IF ~ SearchPrefs("DeviceLock.Prefs") THEN
  256.     IF ~ SearchPrefs("ENV:DeviceLock.Prefs") THEN
  257.       IF ~ SearchPrefs("PROGDIR:DeviceLock.Prefs") THEN
  258.         IF wrongCV THEN
  259.           DLr.BailOut(DLs.GetString(DLs.ErrWrongPrefs)^);
  260.         ELSE
  261.           DLr.BailOut(DLs.GetString(DLs.ErrCantFindAnyPrefs)^);
  262.         END;
  263.       END;
  264.     END;
  265.   END;
  266. END;
  267.  
  268. Prefs.DriveNum := GetNumberOfDrives();
  269. IF Prefs.DriveNum >= MAX(INTEGER) THEN Prefs.DriveNum := MAX(INTEGER)-1 END;
  270. IF Prefs.DriveNum = 0 THEN DLr.BailOut(DLs.GetString(DLs.ErrZeroDrives)^) END;
  271. NEW(drive,Prefs.DriveNum);
  272.  
  273. Prefs.DriveNum := -1;
  274. WHILE GetNewLine() DO
  275.   IF    u.Stricmp(Buffer2,"INVALID")       = 0 THEN 
  276.     DLr.RequestWarning(DLs.GetString(DLs.WarnCommentIsNoComment),sys.ADR(Buffer1));
  277.   ELSIF u.Stricmp(Buffer1,"LeftEdge")      = 0 THEN Prefs.LeftEdge       := ConvNumber()
  278.   ELSIF u.Stricmp(Buffer1,"TopEdge")       = 0 THEN Prefs.TopEdge        := ConvNumber()
  279.   ELSIF u.Stricmp(Buffer1,"LeftEdgeZoomed")= 0 THEN Prefs.LeftEdgeZoomed := ConvNumber()
  280.   ELSIF u.Stricmp(Buffer1,"TopEdgeZoomed") = 0 THEN Prefs.TopEdgeZoomed  := ConvNumber()
  281.   ELSIF u.Stricmp(Buffer1,"CheckTime")     = 0 THEN Prefs.CheckTime      := ConvNumber()
  282.   ELSIF u.Stricmp(Buffer1,"OpenWindow")    = 0 THEN Prefs.OpenWindow     := ConvBool()
  283.   ELSIF u.Stricmp(Buffer1,"OpenZoomed")    = 0 THEN Prefs.OpenZoomed     := ConvBool()
  284.   ELSIF u.Stricmp(Buffer1,"SizeOnlyZoom")  = 0 THEN Prefs.SizeOnlyZoom   := ConvBool()
  285.   ELSIF u.Stricmp(Buffer1,"UnlockBeep")    = 0 THEN Prefs.UnlockBeep     := ConvBool()
  286.   ELSIF u.Stricmp(Buffer1,"LockAllBeep")   = 0 THEN Prefs.LockAllBeep    := ConvBool()
  287.   ELSIF u.Stricmp(Buffer1,"RemPosition")   = 0 THEN Prefs.RemPosition    := ConvBool()
  288.   ELSIF u.Stricmp(Buffer1,"NotifyDL")      = 0 THEN Prefs.NotifyDL       := ConvBool()
  289.   ELSIF u.Stricmp(Buffer1,"KeyLock")       = 0 THEN AddKey(lckallHot)
  290.   ELSIF u.Stricmp(Buffer1,"KeyWindow")     = 0 THEN
  291.     IF Argv.popkey # NIL THEN COPY(Argv.popkey^,Buffer2) END;
  292.     AddKey(opencloseHot);
  293.   ELSIF u.Stricmp(Buffer1,"KeyFront")      = 0 THEN AddKey(gotofrontHot)
  294.   ELSIF u.Stricmp(Buffer1,"PubScreen")     = 0 THEN CopyTo(Prefs.PubScreen);
  295.   ELSIF u.Stricmp(Buffer1,"LockString")    = 0 THEN CopyTo(Prefs.LockString)
  296.   ELSIF u.Stricmp(Buffer1,"UnlockString")  = 0 THEN CopyTo(Prefs.UnlockString)
  297.   ELSIF u.Stricmp(Buffer1,"DeviceName")    = 0 THEN
  298.     INC(Prefs.DriveNum);
  299.     CopyTo(drive[Prefs.DriveNum].DeviceName);
  300.     COPY(drive[Prefs.DriveNum].DeviceName, drive[Prefs.DriveNum].PrintName);
  301.     drive[Prefs.DriveNum].preflocked := TRUE;
  302.   ELSIF u.Stricmp(Buffer1,"PrintName")     = 0 THEN
  303.     IF (Prefs.DriveNum >= 0) THEN CopyTo(drive[Prefs.DriveNum].PrintName) END
  304.   ELSIF u.Stricmp(Buffer1,"PassKey")       = 0 THEN
  305.     IF (Prefs.DriveNum >= 0) THEN CopyTo(drive[Prefs.DriveNum].PassKey) END
  306.   ELSIF u.Stricmp(Buffer1,"Lock")          = 0 THEN
  307.     IF (Prefs.DriveNum >= 0) THEN drive[Prefs.DriveNum].preflocked := ConvBool() END
  308.   ELSIF u.Stricmp(Buffer1,"HotKey")        = 0 THEN
  309.     IF (Prefs.DriveNum >= 0) THEN AddKey(Prefs.DriveNum+1) END
  310.   ELSE DLr.RequestWarning(DLs.GetString(DLs.WarnUnknownOption),sys.ADR(Buffer1)) 
  311.   END; (* IF *)
  312. END; (* WHILE *)
  313.  
  314. INC(Prefs.DriveNum);
  315. IF (Prefs.SizeOnlyZoom & OSrelease3) THEN
  316.   Prefs.LeftEdgeZoomed := -1;
  317.   Prefs.TopEdgeZoomed := -1;
  318. ELSE
  319.   IF (Prefs.LeftEdgeZoomed = -10) THEN Prefs.LeftEdgeZoomed := Prefs.LeftEdge END;
  320.   IF (Prefs.TopEdgeZoomed  = -10) THEN Prefs.TopEdgeZoomed  := Prefs.TopEdge END;
  321. END;
  322.  
  323. IF Argv.popup  # NIL THEN
  324.   COPY(Argv.popup^,Buffer2);
  325.   Prefs.OpenWindow := ConvBool();
  326. END; (* IF *)
  327. IF Argv.pubscr # NIL THEN
  328.   COPY(Argv.pubscr^,Buffer2);
  329.   CopyTo(Prefs.PubScreen);
  330. END; (* IF *)
  331.  
  332. IF conf.handle#NIL THEN IF fs.Close(conf) THEN END END;
  333.  
  334. END ReadPrefs;
  335.  
  336. (*------ Read CLI or Workbench arguments ---------------------------------*)
  337.  
  338. PROCEDURE ReadArgs*();
  339. BEGIN
  340.   NEW(Argv.pri); NEW(Argv.toolpri);
  341.   Argv.pri^ := 0; Argv.toolpri^ := 1;
  342.   
  343.   IF ol.wbStarted THEN
  344.     wbm := ol.wbenchMsg;
  345.     IF ~ WB.ReadArgs(wbm.argList[0],template,Argv,wbargs) THEN
  346.       DLr.BailOut(DLs.GetString(DLs.ErrWBReadArgs)^);
  347.     END;
  348.   ELSE
  349.   Arguments := d.OldReadArgs(template,Argv,NIL);
  350.   IF Arguments = NIL THEN
  351.     IF d.PrintFault(d.IoErr(),prgName) THEN END;
  352.     HALT(20);
  353.   END;
  354.   END;
  355.  
  356.   IF Argv.noWarnings = d.DOSTRUE THEN DLr.noWarnings := TRUE END;
  357.   sys.SETREG(0,e.SetTaskPri(DLr.NoDosRequester(),Argv.toolpri^));
  358. END ReadArgs;
  359.  
  360. (*------ Free CLI or Workbench arguments ---------------------------------*)
  361.  
  362. PROCEDURE FreeArgs*();
  363. BEGIN
  364.   (* Save to call with NIL ! *)
  365.   d.FreeArgs(Arguments); Arguments := NIL;
  366.   WB.FreeArgs(wbargs);
  367. END FreeArgs;
  368.  
  369. (***************************************************************************
  370.          M A I N
  371.  ***************************************************************************)
  372.  
  373. BEGIN
  374.   OSrelease3 := I.int.libNode.version > 38;
  375.   Prefs := PrefsConst;
  376.   IF OSrelease3 THEN Prefs.SizeOnlyZoom := TRUE END;
  377.  
  378. CLOSE
  379.     (* Save to call with NIL ! *)
  380.     d.FreeArgs(Arguments);
  381.     WB.FreeArgs(wbargs);
  382.  
  383. END DLprefs.
  384.