source: tags/1.3.1/Network/UNetworkCommon.pas

Last change on this file was 423, checked in by chronos, 2 years ago
  • Modified: Do not use explicit mode delphi directive as it is already set in project.
  • Modified: Use UNIX instead of LINUX for conditional code to work also on FreeBSD.
File size: 1003 bytes
Line 
1unit UNetworkCommon;
2
3interface
4
5uses
6 Classes, SysUtils;
7
8procedure StreamAppend(Stream: TStream; SourceStream: TStream);
9procedure StreamRemoveRead(Stream: TMemoryStream);
10
11
12implementation
13
14procedure StreamAppend(Stream: TStream; SourceStream: TStream);
15var
16 Buffer: array of Byte;
17 ReadCount: Integer;
18 Base: Integer;
19const
20 ChunkSize = 4096;
21begin
22 SetLength(Buffer, 0);
23 Base := 0;
24 repeat
25 SetLength(Buffer, Length(Buffer) + ChunkSize);
26 ReadCount := SourceStream.Read(Buffer[Base], ChunkSize);
27 Inc(Base, ReadCount);
28 SetLength(Buffer, Base);
29 until ReadCount < ChunkSize;
30
31 if Length(Buffer) > 0 then begin
32 Stream.Position := Stream.Size;
33 Stream.Write(Buffer[0], Length(Buffer));
34 end;
35end;
36
37procedure StreamRemoveRead(Stream: TMemoryStream);
38begin
39 // Remove already read data from start of memory stream
40 Move(PByte(Stream.Memory + Stream.Position)^, Stream.Memory^, Stream.Size - Stream.Position);
41 Stream.SetSize(Stream.Size - Stream.Position);
42end;
43
44end.
45
Note: See TracBrowser for help on using the repository browser.