1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
unit UNetworkCommon;
interface
uses
Classes, SysUtils;
procedure StreamAppend(Stream: TStream; SourceStream: TStream);
procedure StreamRemoveRead(Stream: TMemoryStream);
implementation
procedure StreamAppend(Stream: TStream; SourceStream: TStream);
var
Buffer: array of Byte;
ReadCount: Integer;
Base: Integer;
const
ChunkSize = 4096;
begin
SetLength(Buffer, 0);
Base := 0;
repeat
SetLength(Buffer, Length(Buffer) + ChunkSize);
ReadCount := SourceStream.Read(Buffer[Base], ChunkSize);
Inc(Base, ReadCount);
SetLength(Buffer, Base);
until ReadCount < ChunkSize;
if Length(Buffer) > 0 then begin
Stream.Position := Stream.Size;
Stream.Write(Buffer[0], Length(Buffer));
end;
end;
procedure StreamRemoveRead(Stream: TMemoryStream);
begin
// Remove already read data from start of memory stream
Move(PByte(Stream.Memory + Stream.Position)^, Stream.Memory^, Stream.Size - Stream.Position);
Stream.SetSize(Stream.Size - Stream.Position);
end;
end.
|