home *** CD-ROM | disk | FTP | other *** search
/ POINT Software Programming / PPROG1.ISO / pascal / visionix / vshareu.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-12-28  |  12.2 KB  |  549 lines

  1. {
  2.  ══════════════════════════════════════════════════════════════════════════════
  3.  
  4.  Visionix DOS File-Sharing Functions Unit (VSHARE)
  5.    Version 0.1
  6.  Copyright 1992 Visionix
  7.  ALL RIGHTS RESERVED
  8.  
  9.  ──────────────────────────────────────────────────────────────────────────────
  10.  
  11.  Revision history in reverse chronological order:
  12.  
  13.  Initials  Date      Comment
  14.  ────────  ────────  ──────────────────────────────────────────────────────────
  15.  
  16.  lpg       03/16/93  Added Source Documentation
  17.  
  18.  lpg       12/27/92  Created
  19.  
  20.  ══════════════════════════════════════════════════════════════════════════════
  21.  
  22. File-Sharing Functions Summary
  23. ------------------------------
  24.  
  25. INT 21h
  26.  
  27. Func | Sub | Name                               | Use
  28. -----+-----+------------------------------------+--------------------------------------
  29.  44h | 0Bh | Set Sharing Retry Count            | Set number of times DOS retries a file sharing operation
  30.  5Ch | 00h | Lock File                          | Denies access to specified region in file
  31.  5Ch | 01h | Unlock File                        | Allow access to specified region in file
  32. -----+-----+------------------------------------+--------------------------------------
  33.  
  34.  
  35.  
  36. NOTE: Use Function GetExtendedError to Process and Parse Error Message
  37.  
  38. }
  39.  
  40. (*-
  41.  
  42. [TEXT]
  43.  
  44. <Overview>
  45.  
  46. This unit implements various file-share and record locking functions.
  47. It has been completely rewritten and will be replaced in the next
  48. BETA release.
  49.  
  50. JRT: I dont really even know where these functions came from...
  51.  
  52. <Interface>
  53.  
  54. -*)
  55.  
  56. Unit VShareU;
  57.  
  58. Interface
  59.  
  60. Uses
  61.  
  62.   DOS,
  63.   vcrtu;
  64.  
  65.  
  66. Const
  67.  
  68.   fmReadOnly   =   0;    {FileMode constants}
  69.   fmWriteOnly  =   1;
  70.   fmReadWrite  =   2;
  71.   fmDenyAll    =  16;
  72.   fmDenyWrite  =  32;
  73.   fmDenyRead   =  48;
  74.   fmDenyNone   =  64;
  75.   fmNoInherit  = 128;
  76.  
  77. Const
  78.  
  79.   Tries           : Word = 150;
  80.   TryDelay        : Word = 100;
  81.  
  82. Var
  83.  
  84.   FileError : Word;
  85.  
  86.  
  87.  
  88.  
  89.   Function SetShareRetryCnt(           RetryCnt  : WORD;
  90.                                        Pause     : WORD      ) : BYTE;
  91.  
  92.   Function LockFile(               VAR FileHandle;
  93.                                        LockArea  : LONGINT;
  94.                                        LockLen   : LONGINT   ) : BYTE;
  95.  
  96.   Function UnLockFile(             VAR FileHandle;
  97.                                        LockArea  : LONGINT;
  98.                                        LockLen   : LONGINT   ) : BYTE;
  99.  
  100.  
  101.   Function  LongLo(                    InNum     : LongInt   ): Word;
  102.  
  103.   Function  LongHi(                    InNum     : LongInt   ): Word;
  104.  
  105.   Function  LockFileAlt(           Var F;
  106.                                        LockStart : LongInt;
  107.                                        LockLength: LongInt   ): Word;
  108.  
  109.   Function  UnLockFileAlt(         Var F;
  110.                                        LockStart : LongInt;
  111.                                        LockLength: LongInt   ): Word;
  112.  
  113.   Function  shAssign(              Var F         : File;
  114.                                        FName     : String    ): Boolean;
  115.  
  116.   Function  shLock(                Var F;
  117.                                        LockStart : LONGINT;
  118.                                        LockLength: LONGINT   ): Word;
  119.  
  120.   Procedure FlushFile(             Var F                     ); {Dupe file handle, close dupe handle}
  121.  
  122.   Function  shReset(               Var F         : File;
  123.                                        RecSize   : Word      ): Boolean;
  124.  
  125.   Function  shRead(                Var F         : File;
  126.                                    Var Rec;
  127.                                        ReadSize  : Word;
  128.                                    Var NumRead   : Word      ): Boolean;
  129.  
  130.   Function  shWrite(               Var F         : File;
  131.                                    Var Rec;
  132.                                        ReadSize  : Word      ): Boolean;
  133.  
  134.   Function  shOpenFile(            Var F         : File;
  135.                                        PathName  : String    ): Boolean;
  136.  
  137.   Function  shMakeFile(            Var F         : File;
  138.                                        PathName  : String    ): Boolean;
  139.  
  140.   Procedure shCloseFile(           Var F         : File      );
  141.  
  142.   Function  shSeekFile(            Var F         : File;
  143.                                        FPos      : LongInt   ): Boolean;
  144.  
  145.  
  146.  
  147. Implementation
  148.  
  149.  
  150.  
  151. {──────────────────────────────────────────────────────────────────────────────}
  152.  
  153. (*-
  154.  
  155. [FUNCTION]
  156.  
  157. Function SetShareRetryCnt(   RetryCnt  : WORD;
  158.                              Pause     : WORD         ) : BYTE;
  159.  
  160. [PARAMETERS]
  161.  
  162. RetryCnt    Number of Times to Retry before Fail
  163. Pause       Pause Time between Retries
  164.  
  165. [RETURNS]
  166.  
  167. Status Code (0=Success)
  168.  
  169. [DESCRIPTION]
  170.  
  171. Sets number of times DOS retries a file sharing operation.
  172.  
  173. Default is 1 Loop, 3 Retries.  Pause depends upon computer clock speed.
  174.  
  175. [SEE-ALSO]
  176.  
  177. [EXAMPLE]
  178.  
  179. -*)
  180.  
  181. Function SetShareRetryCnt(   RetryCnt  : WORD;
  182.                              Pause     : WORD         ) : BYTE;
  183. Assembler;
  184. ASM
  185.  
  186.   MOV  CX, Pause
  187.   MOV  DX, RetryCnt
  188.  
  189.   MOV  AX, $440B
  190.   INT  $21
  191.  
  192.   JC   @@1                   { If Carry, Status = Error }
  193.  
  194.   XOR  AL, AL                { Status = No Error }
  195.  
  196.  @@1:
  197.  
  198. END;  { SetShareRetryCnt }
  199.  
  200.  
  201. {──────────────────────────────────────────────────────────────────────────────}
  202.  
  203. (*-
  204.  
  205. [FUNCTION]
  206.  
  207. Function LockFile(       VAR FileHandle;
  208.                              LockArea  : LONGINT;
  209.                              LockLen   : LONGINT      ) : BYTE;
  210.  
  211. [PARAMETERS]
  212.  
  213. FileHandle  VAR File Handle (not typed)
  214. LockArea    Offset of Region to Lock in File
  215. LockLen     Length of Region to Lock in File
  216.  
  217. [RETURNS]
  218.  
  219. Status Code (0=Success)
  220.  
  221. [DESCRIPTION]
  222.  
  223. Denies access to specified region in file.
  224.  
  225. NOTE: File Sharing MUST be loaded before using Lock on a Local Computer
  226.  
  227. [SEE-ALSO]
  228.  
  229. [EXAMPLE]
  230.  
  231. -*)
  232.  
  233. Function LockFile(       VAR FileHandle;
  234.                              LockArea  : LONGINT;
  235.                              LockLen   : LONGINT      ) : BYTE;
  236. Assembler;
  237. ASM
  238.  
  239.   MOV  BX, word PTR FileHandle
  240.  
  241.   MOV  CX, word PTR LockArea+2
  242.   MOV  DX, word PTR LockArea
  243.  
  244.   MOV  SI, word PTR [lockLen+2]
  245.   MOV  DI, word PTR [LockLen]
  246.  
  247.   MOV  AX, $5C00
  248.  
  249.   INT  $21
  250.  
  251.   JC   @@1                   { If Carry, Status = Error }
  252.  
  253.   XOR  AL,AL                 { Status = No Error }
  254.  
  255.  @@1:
  256.  
  257. END;  { LockFile }
  258.  
  259.  
  260. {──────────────────────────────────────────────────────────────────────────────}
  261.  
  262. (*-
  263.  
  264. [FUNCTION]
  265.  
  266. Function UnLockFile(     VAR FileHandle;
  267.                              LockArea  : LONGINT;
  268.                              LockLen   : LONGINT      ) : BYTE;
  269.  
  270. [PARAMETERS]
  271.  
  272. FileHandle  VAR File Handle (not typed)
  273. LockArea    Offset of Locked Region in File
  274. LockLen     Length of Locked Region in File
  275.  
  276. [RETURNS]
  277.  
  278. Status Code (0=Success)
  279.  
  280. [DESCRIPTION]
  281.  
  282. Allows access to specified region in file.
  283.  
  284. NOTE: Region Must be same one locked with LockFile Func.
  285.  
  286. [SEE-ALSO]
  287.  
  288. [EXAMPLE]
  289.  
  290. -*)
  291.  
  292. Function UnLockFile(     VAR FileHandle;
  293.                              LockArea  : LONGINT;
  294.                              LockLen   : LONGINT      ) : BYTE;
  295. Assembler;
  296. ASM
  297.  
  298.   MOV  BX, word PTR [FileHandle]
  299.  
  300.   MOV  CX, word PTR [LockArea+2]
  301.   MOV  DX, word PTR [LockArea  ]
  302.  
  303.   MOV  SI, word PTR [LockLen+2]
  304.   MOV  DI, word PTR [LockLen  ]
  305.  
  306.   MOV  AX, $5C00
  307.  
  308.   INT  $21
  309.  
  310.   JC   @@1                   { If Carry, Status = Error }
  311.  
  312.   XOR  AL,AL                 { Status = No Error }
  313.  
  314.  @@1:
  315.  
  316. END; { UnLockFile }
  317.  
  318.  
  319. Function shAssign(Var F: File; FName: String): Boolean;
  320. Begin
  321.    Assign(F, FName);
  322.    FileError := IoResult;
  323.    shAssign := (FileError = 0);
  324. End;
  325.  
  326.  
  327.  
  328. Function shRead(Var F: File; Var Rec; ReadSize: Word; Var NumRead: Word): Boolean;
  329. Var
  330.    Count: Word;
  331.    Code: Word;
  332.  
  333. Begin
  334.    Count := Tries;
  335.    Code := 5;
  336.    While ((Count > 0) and (Code = 5)) Do
  337.    Begin
  338.       BlockRead(F,Rec,ReadSize,NumRead);
  339.       Code := IoResult;
  340.    End;
  341.    FileError := Code;
  342.    ShRead := (Code = 0);
  343. End;
  344.  
  345.  
  346. Function shWrite(Var F: File; Var Rec; ReadSize: Word): Boolean;
  347. Var
  348.    Count: Word;
  349.    Code: Word;
  350.  
  351. Begin
  352.    Count := Tries;
  353.    Code := 5;
  354.    While ((Count > 0) and (Code = 5)) Do
  355.    Begin
  356.       BlockWrite(F,Rec,ReadSize);
  357.       Code := IoResult;
  358.    End;
  359.    FileError := Code;
  360.    shWrite := (Code = 0);
  361. End;
  362.  
  363.  
  364. Procedure CleanDir(FileDir: String);
  365. Var
  366.    SR: SearchRec;
  367.    F: File;
  368.  
  369. Begin
  370.    FindFirst(FileDir + '*.*', ReadOnly + Archive, SR);
  371.    While DosError = 0 Do
  372.    Begin
  373.       If Not shAssign(F, FileDir + SR.Name) Then;
  374.       Erase(F);
  375.       If IoResult <> 0 Then;
  376.       FindNext(SR);
  377.    End;
  378. End;
  379.  
  380.  
  381. Function GetCurrentPath: String;
  382. Var
  383.    CName: NameStr;
  384.    Path: DirStr;
  385.    CExt: ExtStr;
  386.  
  387. Begin
  388.    FSplit(FExpand('*.*'),Path,CName,CExt);
  389.    GetCurrentPath := Path;
  390. End;
  391.  
  392.  
  393. Function shLock(Var F; LockStart,LockLength: LongInt): Word;
  394. Var
  395.    Count: Word;
  396.    Code: Word;
  397.  
  398. Begin
  399.    Count := Tries;
  400.    Code := $21;
  401.    While ((Count > 0) and (Code = $21)) Do
  402.    Begin
  403.       Code := LockFile(F,LockStart,LockLength);
  404.       Dec(Count);
  405.       If Code = $21 Then
  406.          Delay(TryDelay);
  407.    End;
  408.    If Code = 1 Then
  409.    Code := 0;
  410.    shLock := Code;
  411. End;
  412.  
  413.  
  414. Function shReset(Var F: File; RecSize: Word): Boolean;
  415. Var
  416.    Count: Word;
  417.    Code: Word;
  418.  
  419. Begin
  420.    Count := Tries;
  421.    Code := 5;
  422.    While ((Count > 0) and (Code = 5)) Do
  423.    Begin
  424.       Reset(F,RecSize);
  425.       Code := IoResult;
  426.    End;
  427.    FileError := Code;
  428.    ShReset := (Code = 0);
  429. End;
  430.  
  431.  
  432. Procedure FlushFile(Var F); {Dupe file handle, close dupe handle}
  433. Var
  434.    Regs: Registers;
  435.    Handle: Word Absolute F;
  436.  
  437. Begin
  438.    Regs.Ah := $45;
  439.    Regs.Bx := Handle;
  440.    MsDos(Regs);
  441.    If  (Regs.Flags and 1) = 0 Then
  442.    Begin
  443.       Regs.Bx := Regs.Ax;
  444.       Regs.Ah := $3e;
  445.       MsDos(Regs);
  446.    End;
  447. End;
  448.  
  449.  
  450. Function LockFileAlt(Var F; LockStart: LongInt; LockLength: LongInt): Word;
  451. Var
  452.    Regs: Registers;
  453.    Handle: Word Absolute F;
  454.  
  455. Begin
  456.    Regs.Ah := $5c;
  457.    Regs.Al := $00;
  458.    Regs.Bx := Handle;
  459.    Regs.Cx := LongHi(LockStart);
  460.    Regs.Dx := LongLo(LockStart);
  461.    Regs.Si := LongHi(LockLength);
  462.    Regs.Di := LongLo(LockLength);
  463.    MsDos(Regs);
  464.    If ((Regs.Flags and 1) = 0) Then
  465.       LockFileAlt := 0                 {00h = success           }
  466.    Else
  467.       LockFileAlt := Regs.Ax           {01h = share not loaded  }
  468.                                     {06h = invalid handle    }
  469.                                     {21h = lock violation    }
  470.                                     {24h = share buffer full }
  471. End;
  472.  
  473.  
  474. Function UnLockFileAlt(Var F; LockStart: LongInt; LockLength: LongInt): Word;
  475. Var
  476.    Regs: Registers;
  477.    Handle: Word Absolute F;
  478.    Code: Word;
  479.  
  480. Begin
  481.    Regs.Ah := $5c;
  482.    Regs.Al := $01;
  483.    Regs.Bx := Handle;
  484.    Regs.Cx := LongHi(LockStart);
  485.    Regs.Dx := LongLo(LockStart);
  486.    Regs.Si := LongHi(LockLength);
  487.    Regs.Di := LongLo(LockLength);
  488.    MsDos(Regs);
  489.    If ((Regs.Flags and 1) = 0) Then
  490.       UnLockFileAlt := 0               {00h = success           }
  491.    Else
  492.    Begin
  493.       Code := Regs.Ax;              {01h = share not loaded  }
  494.       If Code = 1 Then              {06h = invalid handle    }
  495.          Code := 0;                 {21h = lock violation    }
  496.       UnLockFileAlt := Code            {24h = share buffer full }
  497.    End;
  498. End;
  499.  
  500.  
  501. Function LongLo(InNum: LongInt): Word;
  502. Begin
  503.    LongLo := InNum and $FFFF;
  504. End;
  505.  
  506. Function LongHi(InNum: LongInt): Word;
  507. Begin
  508.    LongHi := InNum Shr 16;
  509. End;
  510.  
  511. Function  shOpenFile(Var F: File; PathName: String): Boolean;
  512. Begin
  513.    Assign(f,pathname);
  514.    FileMode := fmReadWrite + fmDenyNone;
  515.    shOpenFile := shReset(f,1);
  516. End;
  517.  
  518.  
  519. Function  shMakeFile(Var F: File; PathName: String): Boolean;
  520. Begin
  521.    Assign(f,pathname);
  522.    ReWrite(f,1);
  523.    shMakeFile := (IOresult = 0);
  524. End;
  525.  
  526.  
  527. Procedure shCloseFile(Var F: File);
  528. Begin
  529.    Close(F);
  530.    If (IOresult <> 0) Then;
  531. End;
  532.  
  533.  
  534. Function  shSeekFile(Var F: File; FPos: LongInt): Boolean;
  535. Begin
  536.    Seek(F,FPos);
  537.    shSeekFile := (IOresult = 0);
  538. End;
  539.  
  540.  
  541.  
  542. {──────────────────────────────────────────────────────────────────────────────}
  543. {──────────────────────────────────────────────────────────────────────────────}
  544. {──────────────────────────────────────────────────────────────────────────────}
  545.  
  546.  
  547. BEGIN
  548. END.
  549.