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

  1. MODULE DLdrives;
  2.  
  3. IMPORT
  4.   d   := Dos,
  5.   e   := Exec,
  6.   DLp := DLprefs,
  7.   DLr := DLrequester,
  8.   DLs := DLstrings,
  9.   gt  := GadTools,
  10.   I   := Intuition,
  11.   pf  := Printf,
  12.   sd  := SecureDos,
  13.   sys := SYSTEM,
  14.   u   := Utility;
  15.  
  16. CONST
  17.   maxTitles -= 20;
  18.  
  19. TYPE
  20.   DoProc = PROCEDURE(VAR t: DLp.driveT);
  21.  
  22. VAR
  23.   mywin        *: I.WindowPtr;
  24.   winactive    *: BOOLEAN;
  25.   count         : INTEGER;
  26.   title         : ARRAY maxTitles+1 OF CHAR;
  27.   info          : d.InfoData;
  28.   outfhp        : d.FileHandlePtr;
  29.   infhp         : d.FileHandlePtr;
  30.  
  31. (*------ Repeat »what« for every drive in »with« --------------------------*)
  32.  
  33. PROCEDURE DoIt(VAR with: DLp.driveP; what: DoProc);
  34. BEGIN
  35.   FOR count := 1 TO DLp.Prefs.DriveNum DO
  36.     what(with[count-1]);
  37.   END;
  38. END DoIt;
  39.  
  40. (*------ Check whether drive locked or disabled ---------------------------*)
  41.  
  42. PROCEDURE * CheckD(VAR n: DLp.driveT);
  43. VAR olddisabled : BOOLEAN;
  44.     lockPtr     : d.FileLockPtr;
  45. BEGIN
  46.   olddisabled := n.disabled;
  47.   lockPtr := sd.Lock(n.DeviceName,d.accessRead);
  48.   IF lockPtr # NIL THEN
  49.     IF (d.Info(lockPtr,info) & (info.diskState # d.validating)) THEN
  50.       n.locked :=  info.diskState = d.writeProtect;
  51.       n.disabled := FALSE;
  52.     ELSE
  53.       n.disabled := TRUE;
  54.     END;
  55.     sd.UnLock(lockPtr);
  56.   ELSE
  57.     n.disabled := TRUE;
  58.   END;
  59.   IF n.disabled THEN n.locked := FALSE END;
  60.   n.disabledchanged := n.disabledchanged OR (olddisabled # n.disabled);
  61. END CheckD;
  62.  
  63. (*----- Lock n.DeviceName -----------------------------------------------------*)
  64.  
  65. PROCEDURE * LckOne*(VAR n: DLp.driveT);
  66. VAR result : LONGINT;
  67. BEGIN
  68.   CheckD(n);
  69.   IF n.disabled OR n.locked THEN
  70.     RETURN;
  71.   END;
  72.   pf.SPrintf2(DLp.Buffer1,DLp.Prefs.LockString,sys.ADR(n.DeviceName),sys.ADR(n.PassKey));
  73.   result := d.SystemTags(DLp.Buffer1,d.sysOutput,sys.VAL(e.ADDRESS,outfhp),
  74.                                      d.sysInput,sys.VAL(e.ADDRESS,infhp),u.done);
  75.   IF result < 0 THEN DLr.BailOut(DLs.GetString(DLs.ErrCantExLock)^) END;
  76.   IF result > 0 THEN
  77.     DLr.RequestNotify(DLs.GetString(DLs.MsgProblem),DLs.GetString(DLs.ProbCantLock),sys.ADR(n.PrintName));
  78.   END;
  79. END LckOne;
  80.  
  81. PROCEDURE * LckOneMini(VAR n: DLp.driveT);
  82. VAR result : LONGINT;
  83. BEGIN
  84.   pf.SPrintf2(DLp.Buffer1,DLp.Prefs.LockString,sys.ADR(n.DeviceName),sys.ADR(n.PassKey));
  85.   result := d.SystemTags(DLp.Buffer1,d.sysOutput,sys.VAL(e.ADDRESS,outfhp),
  86.                                      d.sysInput,sys.VAL(e.ADDRESS,infhp),u.done);
  87. END LckOneMini;
  88.  
  89. (*------ UnLock n.DeviceName --------------------------------------------------*)
  90.  
  91. PROCEDURE * UnLckOne*(VAR n: DLp.driveT);
  92. VAR result : LONGINT;
  93. BEGIN
  94.   CheckD(n);
  95.   IF n.disabled OR ~n.locked THEN
  96.     RETURN;
  97.   END;
  98.   pf.SPrintf2(DLp.Buffer1,DLp.Prefs.UnlockString,sys.ADR(n.DeviceName),sys.ADR(n.PassKey));
  99.   result := d.SystemTags(DLp.Buffer1,d.sysOutput,sys.VAL(e.ADDRESS,outfhp),
  100.                                 d.sysInput,sys.VAL(e.ADDRESS,infhp),u.done);
  101.   IF result < 0 THEN DLr.BailOut(DLs.GetString(DLs.ErrCantExUnlock)^) END;
  102.   IF result > 0 THEN
  103.     DLr.RequestNotify(DLs.GetString(DLs.MsgProblem),DLs.GetString(DLs.ProbCantUnlock),sys.ADR(n.PrintName));
  104.   END;
  105. END UnLckOne;
  106.  
  107. PROCEDURE * UnLckOneMini(VAR n: DLp.driveT);
  108. VAR result : LONGINT;
  109. BEGIN
  110.   pf.SPrintf2(DLp.Buffer1,DLp.Prefs.UnlockString,sys.ADR(n.DeviceName),sys.ADR(n.PassKey));
  111.   result := d.SystemTags(DLp.Buffer1,d.sysOutput,sys.VAL(e.ADDRESS,outfhp),
  112.                                 d.sysInput,sys.VAL(e.ADDRESS,infhp),u.done);
  113. END UnLckOneMini;
  114.  
  115. (*------ Set Gadgets dependend of n.locked and n.disabled -----------------*)
  116.  
  117. PROCEDURE * Refresh(VAR n: DLp.driveT);
  118. BEGIN
  119.   IF n.disabledchanged THEN 
  120.     gt.SetGadgetAttrs(n.GadPtr^,mywin,NIL,I.gaDisabled,sys.VAL(SHORTINT,n.disabled),u.done);
  121.     IF (count <= maxTitles) THEN title[count-1] := "·" END;
  122.   END;
  123.   IF n.disabled THEN
  124.     IF n.disabledchanged THEN 
  125.       gt.SetGadgetAttrs(n.GadPtr^,mywin,NIL,gt.cbChecked,I.LFALSE,u.done);
  126.     END;
  127.   ELSE
  128.     IF n.locked THEN
  129.       gt.SetGadgetAttrs(n.GadPtr^,mywin,NIL,gt.cbChecked,I.LTRUE,u.done);
  130.       IF (count <= maxTitles) THEN title[count-1] := "-" END;
  131.     ELSE
  132.       gt.SetGadgetAttrs(n.GadPtr^,mywin,NIL,gt.cbChecked,I.LFALSE,u.done);
  133.       IF (count <= maxTitles) THEN title[count-1] := "+" END;
  134.     END;
  135.   END;
  136.   I.SetWindowTitles(mywin,sys.ADR(title),-1);
  137.   n.disabledchanged := FALSE;
  138. END Refresh;
  139.  
  140. (*------ Auto-Lock procedures ---------------------------------------------*)
  141.  
  142. PROCEDURE * LockInit(VAR n: DLp.driveT);
  143. BEGIN
  144.   IF n.preflocked THEN LckOneMini(n) END;
  145. END LockInit;
  146.  
  147. PROCEDURE * LockIfNecessary(VAR n: DLp.driveT);
  148. BEGIN
  149.   IF n.disabledchanged THEN
  150.     IF n.preflocked & ~ n.disabled THEN
  151.       LckOneMini(n);
  152.       CheckD(n);
  153.     END;
  154.   END;
  155. END LockIfNecessary;
  156.  
  157. (*------ Check drives -----------------------------------------------------*)
  158.  
  159. PROCEDURE CheckDrivesInit*();
  160. BEGIN
  161.   DoIt(DLp.drive,CheckD);
  162.   DoIt(DLp.drive,LockInit);
  163. END CheckDrivesInit;
  164.  
  165. PROCEDURE CheckDrives*(force: BOOLEAN);
  166. BEGIN
  167.   DoIt(DLp.drive,CheckD);
  168.   DoIt(DLp.drive,LockIfNecessary);
  169.   IF (mywin # NIL) & ((~ winactive) OR force)
  170.   THEN DoIt(DLp.drive,Refresh)
  171.   END;
  172. END CheckDrives;
  173.  
  174. PROCEDURE OneLocked*():BOOLEAN;
  175. BEGIN
  176.   FOR count := 1 TO DLp.Prefs.DriveNum DO
  177.     IF DLp.drive[count-1].locked THEN RETURN (TRUE) END;
  178.   END;
  179.   RETURN (FALSE);
  180. END OneLocked;
  181.  
  182. (*------ (Un)Lock all drives ----------------------------------------------*)
  183.  
  184. PROCEDURE UnlockAll*(mini: BOOLEAN);
  185. BEGIN
  186.   IF mini THEN
  187.     DoIt(DLp.drive,UnLckOneMini)
  188.   ELSE
  189.     DoIt(DLp.drive,UnLckOne)
  190.   END;
  191. END UnlockAll;
  192.  
  193. PROCEDURE LockAll*(mini: BOOLEAN);
  194. BEGIN
  195.   IF mini THEN
  196.     DoIt(DLp.drive,LckOneMini)
  197.   ELSE
  198.     DoIt(DLp.drive,LckOne)
  199.   END;
  200. END LockAll;
  201.  
  202. (***************************************************************************
  203.          M A I N
  204.  ***************************************************************************)
  205.  
  206. BEGIN
  207.  
  208.   outfhp := sd.Open("NIL:",d.readWrite);
  209.   IF outfhp = NIL THEN DLr.FailOut("Open(out)") END;
  210.   infhp := sd.Open("NIL:",d.readWrite);
  211.   IF infhp = NIL THEN DLr.FailOut("Open(in)") END;
  212.  
  213. (***************************************************************************
  214.          C L O S E
  215.  ***************************************************************************)
  216.  
  217. CLOSE
  218.     IF infhp  # NIL THEN sd.Close(infhp)  END;
  219.     IF outfhp # NIL THEN sd.Close(outfhp) END;
  220.  
  221.  
  222. END DLdrives.
  223.