home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / varia / devicelock / txt / dldrives.mod < prev    next >
Text File  |  1994-05-07  |  7KB  |  236 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.lockprefs = DLp.LPlock THEN LckOneMini(n)
  145.   ELSIF n.lockprefs = DLp.LPunlock THEN UnLckOneMini(n)
  146.   END;
  147. END LockInit;
  148.  
  149. PROCEDURE * LockIfNecessary(VAR n: DLp.driveT);
  150. BEGIN
  151.   IF n.disabledchanged THEN
  152.     IF (n.lockprefs = DLp.LPlock) & ~ n.disabled THEN
  153.       LckOneMini(n);
  154.       CheckD(n);
  155.     END;
  156.   END;
  157. END LockIfNecessary;
  158.  
  159. (*------ Check drives -----------------------------------------------------*)
  160.  
  161. PROCEDURE CheckDrivesInit*();
  162. BEGIN
  163.   DoIt(DLp.drive,CheckD);
  164.   DoIt(DLp.drive,LockInit);
  165. END CheckDrivesInit;
  166.  
  167. PROCEDURE CheckDrives*(force: BOOLEAN);
  168. BEGIN
  169.   DoIt(DLp.drive,CheckD);
  170.   DoIt(DLp.drive,LockIfNecessary);
  171.   IF (mywin # NIL) & ((~ winactive) OR force)
  172.   THEN DoIt(DLp.drive,Refresh)
  173.   END;
  174. END CheckDrives;
  175.  
  176. PROCEDURE OneLocked*():BOOLEAN;
  177. BEGIN
  178.   FOR count := 1 TO DLp.Prefs.DriveNum DO
  179.     IF DLp.drive[count-1].locked THEN RETURN (TRUE) END;
  180.   END;
  181.   RETURN (FALSE);
  182. END OneLocked;
  183.  
  184. (*------ (Un)Lock all drives ----------------------------------------------*)
  185.  
  186. PROCEDURE UnlockAll*(mini: BOOLEAN);
  187. BEGIN
  188.   IF mini THEN
  189.     DoIt(DLp.drive,UnLckOneMini)
  190.   ELSE
  191.     DoIt(DLp.drive,UnLckOne)
  192.   END;
  193. END UnlockAll;
  194.  
  195. PROCEDURE LockAll*(mini: BOOLEAN);
  196. BEGIN
  197.   IF mini THEN
  198.     DoIt(DLp.drive,LckOneMini)
  199.   ELSE
  200.     DoIt(DLp.drive,LckOne)
  201.   END;
  202. END LockAll;
  203.  
  204. PROCEDURE NormAll*();
  205. BEGIN
  206.   FOR count := 0 TO DLp.Prefs.DriveNum-1 DO
  207.     IF DLp.drive[count].lockprefs = DLp.LPlock THEN
  208.       LckOne(DLp.drive[count])
  209.     ELSIF DLp.drive[count].lockprefs = DLp.LPunlock THEN
  210.       UnLckOne(DLp.drive[count])
  211.     END;
  212.   END;
  213. END NormAll;
  214.  
  215. (***************************************************************************
  216.      M A I N
  217.  ***************************************************************************)
  218.  
  219. BEGIN
  220.  
  221.   outfhp := sd.Open("NIL:",d.readWrite);
  222.   IF outfhp = NIL THEN DLr.FailOut("Open(out)") END;
  223.   infhp := sd.Open("NIL:",d.readWrite);
  224.   IF infhp = NIL THEN DLr.FailOut("Open(in)") END;
  225.  
  226. (***************************************************************************
  227.      C L O S E
  228.  ***************************************************************************)
  229.  
  230. CLOSE
  231.     IF infhp  # NIL THEN sd.Close(infhp)  END;
  232.     IF outfhp # NIL THEN sd.Close(outfhp) END;
  233.  
  234.  
  235. END DLdrives.
  236.