Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 6.71 KB | None | 0 0
  1. unit JDRMBuffer;
  2.  
  3. //This unit contains all necessary functionality to handle incoming
  4. // socket data and trigger events when new FULL sets of data are available.
  5.  
  6. interface
  7.  
  8.  
  9. uses
  10.   Windows, SysUtils, Classes, StrUtils{, JDRMPackets};
  11.  
  12. type
  13.   TJDRMBuffer = class;
  14.   TJDRMCustomBuffer = class;
  15.  
  16.  
  17.   TJDRMBufferType = (btText, btStream);
  18.   //Two modes, strictly one or the other only
  19.  
  20.  
  21.   TJDRMBufferStreamEvent = procedure(Sender: TObject; Stream: TMemoryStream) of object;
  22.   TJDRMBufferPacketEvent = procedure(Sender: TObject; Packet: String) of object;
  23.  
  24.  
  25.   TJDRMCustomBuffer = class(TComponent)
  26.   private
  27.     fStream: TMemoryStream;
  28.     fBuffer: String;
  29.     fType: TJDRMBufferType;
  30.     fStreamSize: Integer;
  31.     fStreamRec: Integer;
  32.     fReceiving: Boolean;
  33.  
  34.     fStreamEvent: TJDRMBufferStreamEvent;
  35.     fPacketEvent: TJDRMBufferPacketEvent;
  36.  
  37.     procedure NewStream(Stream: TMemoryStream);
  38.     procedure NewPacket(Packet: String);
  39.  
  40.     function GetSize: Integer;
  41.     function GetStreamSize: Integer;
  42.  
  43.     procedure SetStreamSize(Value: Integer);
  44.     procedure SetType(Value: TJDRMBufferType);
  45.  
  46.   public
  47.     constructor Create(AOwner: TComponent); override;
  48.     destructor Destroy; override;
  49.  
  50.     procedure Add(Data: String);
  51.     function GetNextPacket: String;
  52.     procedure Clear;
  53.     procedure Reset;
  54.  
  55.     property Data: String read fBuffer;
  56.     property DataSize: Integer read GetSize;
  57.     property StreamSize: Integer read fStreamSize write fStreamSize;
  58.     property BufferType: TJDRMBufferType read fType write SetType;
  59.  
  60.     property OnStream: TJDRMBufferStreamEvent
  61.       read fStreamEvent write fStreamEvent;
  62.     property OnPacket: TJDRMBufferPacketEvent
  63.       read fPacketEvent write fPacketEvent;
  64.  
  65.   end;
  66.  
  67.   TJDRMBuffer = class(TJDRMCustomBuffer)
  68.   published
  69.     property Data;
  70.     property DataSize;
  71.     property StreamSize;
  72.     property BufferType;
  73.  
  74.     property OnStream;
  75.     property OnPacket;
  76.   end;
  77.  
  78. procedure Register;
  79.  
  80. implementation
  81.  
  82. procedure Register;
  83. begin
  84.   RegisterComponents('JD Remote Desktop', [TJDRMBuffer]);
  85. end;
  86.  
  87.  
  88.  
  89. constructor TJDRMCustomBuffer.Create(AOwner: TComponent);
  90. begin
  91.   inherited Create(AOwner);
  92.   Self.fStream:= TMemoryStream.Create;
  93.   Self.fBuffer:= '';
  94.   Self.fType:= btText;
  95.   Self.fReceiving:= False;
  96. end;
  97.  
  98. destructor TJDRMCustomBuffer.Destroy;
  99. begin
  100.  
  101.   Self.fStream.Clear;
  102.   Self.fStream.Free;
  103.   inherited Destroy;
  104. end;
  105.  
  106. procedure TJDRMCustomBuffer.SetType(Value: TJDRMBufferType);
  107. begin
  108.   Self.fType:= Value;
  109.   if Value = btStream then begin
  110.     Self.fStreamRec:= 0;
  111.   end;
  112. end;
  113.  
  114. function TJDRMCustomBuffer.GetStreamSize: Integer;
  115. begin
  116.   Result:= Self.fStream.Size;
  117. end;
  118.  
  119. procedure TJDRMCustomBuffer.SetStreamSize(Value: Integer);
  120. begin
  121.   Self.fStream.Size:= Value;
  122. end;
  123.  
  124. function TJDRMCustomBuffer.GetSize: Integer;
  125. begin
  126.   Result:= Length(Self.fBuffer);
  127. end;
  128.  
  129. //This is the universal procedure to add new data to the buffer.
  130. //As data is added to buffer, it needs to recognize if the packet is complete
  131. // or not. If it is complete, it needs to trigger the proper event.
  132. // It also needs to recognize when there's more data than expected
  133. // and carry it on to the next stream. It may be possible for two streams
  134. // to get combined together
  135.  
  136. procedure TJDRMCustomBuffer.Add(Data: String);
  137. var
  138.   SL: String;   //??? (copied source)
  139.   ID: String;   //Incoming data (used for streaming)
  140. begin
  141.   if Self.fType = btStream then begin //If component is in the stream mode
  142.     if not Self.fReceiving then begin
  143.       //Begin receiving stream
  144.       SetLength(SL, StrLen(PChar(Data)) + 1);         //??? (copied source)
  145.       StrLCopy(@SL[1], PChar(Data), Length(SL) - 1);  //??? (copied source)
  146.       Self.fStreamSize:= StrToIntDef(SL, 0);          //Tell component how much data to expect
  147.       Delete(Data, 1, Length(SL));                    //Remove the pre-defined data size
  148.       Self.fStream.Write(Data[1], Length(Data));      //Write the actual data to stream
  149.       Self.fReceiving:= True;                         //Tell component it's receiving
  150.     end else begin
  151.  
  152.       //AREA WHERE I NEED HELP!
  153.  
  154.       //Check size of data compared to size expected
  155.       if Length(Data) > (Self.fStreamSize - Self.fStream.Size) then
  156.       begin
  157.         //More data received than expected, only add necessary data
  158.         ID:= Copy(Data, 1, Self.fStreamSize - Self.fStream.Size);
  159.         //Save extra data to new temporary location
  160.           //(and later add to stream)
  161.  
  162.       end else begin
  163.         ID:= Data;  //Simply just add new data to stream
  164.       end;
  165.  
  166.       //Add data to stream
  167.       Self.fStream.Write(ID[1], Length(ID));
  168.  
  169.       //Check if all data has been received
  170.       if (Self.fStream.Size = Self.fStreamSize) then begin
  171.         //All data has arrived, trigger new event
  172.         Self.fReceiving:= False;      //No longer receiving
  173.         Self.fStream.Position:= 0;    //Set position to beginning
  174.         Self.NewStream(Self.fStream); //Trigger new stream event
  175.         Self.fStream.Clear;           //Clear stream for new data
  176.       end;
  177.  
  178.     end;
  179.   end else begin
  180.     //Simply add new data to buffer string
  181.     Self.fBuffer:= Self.fBuffer + Data;
  182.  
  183.     //Check for a newly complete packet
  184.     //(Should I run this on a timer instead?)
  185.   end;
  186. end;
  187.  
  188. procedure TJDRMCustomBuffer.Clear;
  189. begin
  190.   Self.fBuffer:= '';
  191.   Self.fStream.Clear;
  192. end;
  193.  
  194. procedure TJDRMCustomBuffer.Reset;
  195. begin
  196.   Self.Clear;
  197.   Self.fType:= btText;
  198. end;
  199.  
  200. //I will be removing this once I get the events working
  201. function TJDRMCustomBuffer.GetNextPacket: String;    {
  202. var
  203.   P: Integer;    }
  204. begin   {
  205.   //Check if new packet is available
  206.   P:= pos(JDRMPacketFooter, Self.fBuffer);
  207.   if Self.fType = btStream then begin
  208.     //Check if there's more data than expected
  209.     if Self.GetSize > (Self.fStreamSize - Self.fStreamRec) then begin
  210.       //There's more available than expected
  211.  
  212.     end else begin
  213.      
  214.      
  215.     end;
  216.  
  217.     if P > 0 then begin  
  218.       Result:= Copy(Self.fBuffer, 1, P + Length(JDRMPacketFooter));
  219.       Delete(Self.fBuffer, 1, P + Length(JDRMPacketFooter));
  220.     end else begin
  221.       Result:= Self.fBuffer;
  222.       Self.Clear;
  223.     end;
  224.   end else begin
  225.     if P > 0 then begin
  226.       Result:= Copy(Self.fBuffer, 1, P + Length(JDRMPacketFooter));
  227.       Delete(Self.fBuffer, 1, P + Length(JDRMPacketFooter));
  228.     end else begin
  229.       Result:= '';
  230.     end;
  231.   end; }
  232. end;
  233.  
  234.  
  235. procedure TJDRMCustomBuffer.NewStream(Stream: TMemoryStream);
  236. begin
  237.   if assigned(Self.fStreamEvent) then begin
  238.     Self.fStreamEvent(Self, Stream);
  239.   end;
  240. end;
  241.  
  242. procedure TJDRMCustomBuffer.NewPacket(Packet: String);
  243. begin
  244.   if assigned(Self.fPacketEvent) then begin
  245.     Self.fPacketEvent(Self, Packet);
  246.   end;
  247. end;
  248.  
  249.  
  250. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement