Ignore:
Timestamp:
May 25, 2010, 1:51:46 PM (14 years ago)
Author:
george
Message:
  • Přidáno: Knihovna VectorObject pro vykreslování vektorových objektů.
  • Přidáno: Knihovna PersistentForm pro uchování stavu oken v registrech.
  • Přidáno: LastOpenedList pro uchování naposledy otevřených souborů.
  • Upraveno: Aktualizace různých knihoven.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • MemoryStreamEx/UMemoryStreamEx.pas

    r25 r26  
    66
    77uses
    8   Classes, DateUtils;
     8  Classes, DateUtils, syncobjs;
    99
    1010type
     
    2323    procedure WriteCardinal(Data: Cardinal);
    2424    procedure WriteInt64(Data: Int64);
     25    procedure WriteString(Data: string);
    2526    procedure WriteShortString(Data: ShortString);
    2627    procedure WriteAnsiString(Data: string);
    2728    procedure WriteUnixTime(Data: TDateTime);
    28     procedure WriteStream(Stream: TStream; Count: Integer);
    2929    procedure WriteDouble(Value: Double);
    3030    procedure WriteSingle(Value: Single);
     31    procedure WriteStream(Stream: TStream; Count: Integer);
     32    procedure WriteStreamPart(Stream: TStream; Count: Integer);
    3133    function ReadByte: Byte;
    3234    function ReadWord: Word;
    3335    function ReadCardinal: Cardinal;
    3436    function ReadInt64: Int64;
     37    function ReadString: string;
    3538    function ReadShortString: string;
    3639    function ReadAnsiString: string;
     40    function ReadStringTerminated(Terminator: string = #0): string;
    3741    function ReadUnixTime: TDateTime;
    3842    function ReadDouble: Double;
    3943    function ReadSingle: Single;
    4044    procedure ReadStream(var Stream: TStream; Count: Integer);
     45    procedure ReadStreamPart(var Stream: TStream; Count: Integer);
     46    function Sum: Byte;
     47    procedure FillByte(Data: Byte; Count: Integer);
    4148    constructor Create;
    4249    property Endianness: TEndianness read FEndianness write SetEndianness;
    4350  end;
    4451
     52  { TThreadMemoryStreamEx }
     53
     54  TThreadMemoryStreamEx = class(TMemoryStreamEx)
     55    Lock: TCriticalSection;
     56    constructor Create;
     57    destructor Destroy; override;
     58  end;
     59
    4560implementation
    4661
    4762{ TMemoryStreamEx }
    48 
    49 procedure TMemoryStreamEx.WriteAnsiString(Data: string);
    50 var
    51   StringLength: Longint;
    52 begin
    53   StringLength := Length(Data);
    54   Write(StringLength, SizeOf(StringLength));
    55   Write(Data[1], StringLength);
    56 end;
    5763
    5864function TMemoryStreamEx.ReadAnsiString: string;
     
    6773end;
    6874
     75function TMemoryStreamEx.ReadStringTerminated(Terminator: string = #0): string;
     76var
     77  Data: Char;
     78  I: Integer;
     79  OldPosition: Integer;
     80begin
     81  OldPosition := Position;
     82  Result := '';
     83  I := 1;
     84  repeat
     85    if Position >= Size then Break;
     86    Data := Chr(ReadByte);
     87    if Data <> Terminator[I] then Result := Result + Data
     88      else Inc(I);
     89  until I > Length(Terminator);
     90  if not (I > Length(Terminator)) then begin
     91    Result := '';
     92    Position := OldPosition;
     93  end;
     94end;
     95
    6996function TMemoryStreamEx.ReadByte: Byte;
    7097begin
     
    82109  ReadBuffer(Result, SizeOf(Int64));
    83110  if SwapData then Result := Swap(Result);
     111end;
     112
     113function TMemoryStreamEx.ReadString:string;
     114begin
     115  SetLength(Result, Size - Position);
     116  if (Size - Position) > 0 then
     117    Read(Result[1], Size - Position)
     118    else Result := '';
    84119end;
    85120
     
    106141end;
    107142
     143procedure TMemoryStreamEx.ReadStreamPart(var Stream:TStream;Count:Integer);
     144var
     145  Buffer: array of Byte;
     146begin
     147  if Count > 0 then begin
     148    SetLength(Buffer, Count);
     149    ReadBuffer(Buffer[0], Count);
     150    if Stream.Size < (Stream.Position + Count) then
     151      Stream.Size := Stream.Position + Count;
     152    Stream.Write(Buffer[0], Count);
     153  end;
     154end;
     155
     156procedure TMemoryStreamEx.WriteStreamPart(Stream:TStream;Count:Integer);
     157var
     158  Buffer: array of Byte;
     159begin
     160  if Count > Stream.Size then Count := Stream.Size; // Limit max. stream size
     161  if Count > 0 then begin
     162    SetLength(Buffer, Count);
     163    Stream.Read(Buffer[0], Count);
     164    Write(Buffer[0], Count);
     165  end;
     166end;
     167
    108168constructor TMemoryStreamEx.Create;
    109169begin
     
    124184begin
    125185  ReadBuffer(Result, SizeOf(Single));
     186end;
     187
     188function TMemoryStreamEx.Sum: Byte;
     189begin
     190  Result := 0;
     191  Position := 0;
     192  while Position < Size do
     193    Result := (Result + ReadByte) and $ff;
     194end;
     195
     196procedure TMemoryStreamEx.FillByte(Data:Byte;Count:Integer);
     197var
     198  I: Integer;
     199begin
     200  for I := 0 to Count - 1 do
     201    WriteByte(Data);
    126202end;
    127203
     
    135211begin
    136212  FEndianness := AValue;
    137   {$ifdef FPC_LITTLE_ENDIAN}
     213  {$if defined(FPC_LITTLE_ENDIAN)}
    138214  SwapData := FEndianness = enBig;
    139   {$elseifdef FPC_BIG_ENDIAN}
     215  {$elseif defined(FPC_BIG_ENDIAN)}
    140216  SwapData := FEndianness = enLittle;
    141217  {$endif}
    142218end;
    143219
     220procedure TMemoryStreamEx.WriteAnsiString(Data: string);
     221var
     222  StringLength: Longint;
     223begin
     224  StringLength := Length(Data);
     225  Write(StringLength, SizeOf(StringLength));
     226  Write(Data[1], StringLength);
     227end;
     228
    144229procedure TMemoryStreamEx.WriteByte(Data: Byte);
    145230begin
     
    157242  if SwapData then Data := Swap(Data);
    158243  Write(Data, SizeOf(Int64));
     244end;
     245
     246procedure TMemoryStreamEx.WriteString(Data:string);
     247begin
     248  if Length(Data) > 0 then
     249    Write(Data[1], Length(Data));
    159250end;
    160251
     
    202293end;
    203294
     295{ TThreadMemoryStreamEx }
     296
     297constructor TThreadMemoryStreamEx.Create;
     298begin
     299  inherited Create;
     300  Lock := TCriticalSection.Create;
     301end;
     302
     303destructor TThreadMemoryStreamEx.Destroy;
     304begin
     305  Lock.Destroy;
     306  inherited Destroy;
     307end;
     308
    204309end.
Note: See TracChangeset for help on using the changeset viewer.