Initial import
This commit is contained in:
parent
6d418d6380
commit
a6c9c4657a
|
@ -0,0 +1,240 @@
|
|||
Unit m_Pipe_Disk;
|
||||
|
||||
{$I M_OPS.PAS}
|
||||
|
||||
Interface
|
||||
|
||||
Uses
|
||||
m_DateTime,
|
||||
m_FileIO,
|
||||
m_Strings;
|
||||
|
||||
Const
|
||||
PipeClientResetTimer = 6000; // 60 seconds
|
||||
PipeServerTimeout = 9000; // 90 seconds
|
||||
|
||||
PipeInFileName = '__mys_in.';
|
||||
PipeOutFileName = '__mys_out.';
|
||||
PipeCmdFileName = '__mys_cmd.';
|
||||
|
||||
Type
|
||||
TPipeDiskBuffer = Array[0..8 * 1024 - 1] of Char;
|
||||
|
||||
TPipeDisk = Class
|
||||
PipeID : Word;
|
||||
PipeInput : File;
|
||||
PipeOutput : File;
|
||||
Connected : Boolean;
|
||||
ResetTimer : LongInt;
|
||||
IsClient : Boolean;
|
||||
PipeDir : String;
|
||||
|
||||
Constructor Create (Dir: String; Client: Boolean; ID: Word);
|
||||
Destructor Destroy; Override;
|
||||
// Server functions
|
||||
Function CreatePipe : Boolean;
|
||||
Function WaitForPipe (Secs: LongInt) : Boolean;
|
||||
// Client functions
|
||||
Function ConnectPipe (Secs: LongInt) : Boolean;
|
||||
// General functions
|
||||
Procedure DeleteFiles;
|
||||
Procedure SendToPipe (Var Buf; Len: Longint);
|
||||
Procedure ReadFromPipe (Var Buf; Len: LongInt; Var bRead: LongInt);
|
||||
Procedure Disconnect;
|
||||
End;
|
||||
|
||||
Implementation
|
||||
|
||||
Procedure TPipeDisk.DeleteFiles;
|
||||
Begin
|
||||
If IsClient Then
|
||||
FileErase (PipeDir + PipeCmdFileName + strI2S(PipeID))
|
||||
Else Begin
|
||||
FileErase (PipeDir + PipeInFileName + strI2S(PipeID));
|
||||
FileErase (PipeDir + PipeOutFileName + strI2S(PipeID));
|
||||
End;
|
||||
End;
|
||||
|
||||
Constructor TPipeDisk.Create (Dir: String; Client: Boolean; ID: Word);
|
||||
Begin
|
||||
Connected := False;
|
||||
IsClient := Client;
|
||||
ResetTimer := 0;
|
||||
PipeDir := DirSlash(Dir);
|
||||
FileMode := 66;
|
||||
PipeID := ID;
|
||||
|
||||
DeleteFiles;
|
||||
End;
|
||||
|
||||
Destructor TPipeDisk.Destroy;
|
||||
Begin
|
||||
If Connected Then Disconnect;
|
||||
|
||||
DeleteFiles;
|
||||
|
||||
Inherited Destroy;
|
||||
End;
|
||||
|
||||
Function TPipeDisk.CreatePipe : Boolean;
|
||||
Begin
|
||||
Result := False;
|
||||
FileMode := 66;
|
||||
IsClient := False;
|
||||
|
||||
Assign (PipeInput, PipeDir + PipeInFileName + strI2S(PipeID));
|
||||
ReWrite (PipeInput, 1);
|
||||
|
||||
If IoResult <> 0 Then Exit;
|
||||
|
||||
Assign (PipeOutput, PipeDir + PipeOutFileName + strI2S(PipeID));
|
||||
ReWrite (PipeOutput, 1);
|
||||
|
||||
If IoResult <> 0 Then Begin
|
||||
Close (PipeInput);
|
||||
Exit;
|
||||
End;
|
||||
|
||||
Result := True;
|
||||
End;
|
||||
|
||||
Procedure TPipeDisk.SendToPipe (Var Buf; Len: LongInt);
|
||||
Var
|
||||
bWrite : LongInt;
|
||||
Begin
|
||||
If Not Connected Then Exit;
|
||||
|
||||
FileMode := 66;
|
||||
|
||||
If Not IsClient Then Begin
|
||||
If FilePos(PipeInput) <> FileSize(PipeInput) Then Begin
|
||||
ReWrite (PipeOutput, 1);
|
||||
Seek (PipeInput, FileSize(PipeInput));
|
||||
|
||||
ResetTimer := TimerSet(PipeServerTimeout);
|
||||
End;
|
||||
|
||||
If TimerUp(ResetTimer) Then Begin
|
||||
Disconnect;
|
||||
Exit;
|
||||
End;
|
||||
End;
|
||||
|
||||
If Len = 0 Then Exit;
|
||||
|
||||
BlockWrite (PipeOutput, Buf, Len, bWrite);
|
||||
End;
|
||||
|
||||
Procedure TPipeDisk.ReadFromPipe (Var Buf; Len: LongInt; Var bRead: LongInt);
|
||||
Var
|
||||
Buffer : TPipeDiskBuffer Absolute Buf;
|
||||
Ch : Char;
|
||||
OldSize : LongInt;
|
||||
Begin
|
||||
bRead := 0;
|
||||
|
||||
If Not Connected Then Exit;
|
||||
|
||||
FileMode := 66;
|
||||
|
||||
BlockRead (PipeInput, Buffer[0], Len, bRead);
|
||||
|
||||
If IsClient And TimerUp(ResetTimer) Then Begin
|
||||
Ch := #1;
|
||||
|
||||
SendToPipe(Ch, 1);
|
||||
|
||||
OldSize := FileSize(PipeInput);
|
||||
|
||||
Close (PipeInput);
|
||||
|
||||
Repeat
|
||||
WaitMS(100);
|
||||
|
||||
Assign (PipeInput, PipeDir + PipeOutFileName + strI2S(PipeID));
|
||||
Reset (PipeInput, 1);
|
||||
Until FileSize(PipeInput) < OldSize;
|
||||
|
||||
ResetTimer := TimerSet(PipeClientResetTimer);
|
||||
End;
|
||||
End;
|
||||
|
||||
Function TPipeDisk.WaitForPipe (Secs: LongInt) : Boolean;
|
||||
Var
|
||||
TimeOut : LongInt;
|
||||
Begin
|
||||
Result := Connected;
|
||||
FileMode := 66;
|
||||
|
||||
If Connected Then Exit;
|
||||
|
||||
TimeOut := TimerSet(Secs);
|
||||
|
||||
While Not TimerUp(TimeOut) Do Begin
|
||||
If FileExist(PipeDir + PipeCmdFileName + strI2S(PipeID)) Then Begin
|
||||
Connected := True;
|
||||
ResetTimer := TimerSet(PipeServerTimeout);
|
||||
Break;
|
||||
End;
|
||||
|
||||
WaitMS(100);
|
||||
End;
|
||||
|
||||
Result := Connected;
|
||||
End;
|
||||
|
||||
Function TPipeDisk.ConnectPipe (Secs: LongInt) : Boolean;
|
||||
Var
|
||||
TempStr : String;
|
||||
TimeOut : LongInt;
|
||||
Begin
|
||||
Result := False;
|
||||
Connected := False;
|
||||
TimeOut := TimerSet(Secs);
|
||||
FileMode := 66;
|
||||
IsClient := True;
|
||||
|
||||
While Not TimerUp(TimeOut) Do Begin
|
||||
Assign (PipeInput, PipeDir + PipeCmdFileName + strI2S(PipeID));
|
||||
ReWrite (PipeInput, 1);
|
||||
Close (PipeInput);
|
||||
|
||||
Assign (PipeInput, PipeDir + PipeOutFileName + strI2S(PipeID));
|
||||
Reset (PipeInput, 1);
|
||||
|
||||
If IoResult <> 0 Then Begin
|
||||
WaitMS(100);
|
||||
Continue;
|
||||
End;
|
||||
|
||||
Assign (PipeOutput, PipeDir + PipeInFileName + strI2S(PipeID));
|
||||
Reset (PipeOutput, 1);
|
||||
|
||||
If IoResult <> 0 Then Begin
|
||||
Close (PipeInput);
|
||||
WaitMS (100);
|
||||
Continue;
|
||||
End Else Begin
|
||||
Connected := True;
|
||||
ResetTimer := TimerSet(PipeClientResetTimer);
|
||||
|
||||
Break;
|
||||
End;
|
||||
End;
|
||||
|
||||
Result := Connected;
|
||||
End;
|
||||
|
||||
Procedure TPipeDisk.Disconnect;
|
||||
Begin
|
||||
If Not Connected Then Exit;
|
||||
|
||||
Connected := False;
|
||||
|
||||
Close (PipeInput);
|
||||
Close (PipeOutput);
|
||||
|
||||
DeleteFiles;
|
||||
End;
|
||||
|
||||
End.
|
Loading…
Reference in New Issue