Ignore:
Timestamp:
Oct 12, 2009, 12:52:28 PM (15 years ago)
Author:
george
Message:
  • Modified: Enhanced handling of submessage and string wire types.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • ProtocolBuffers/UProtocolBuffers.pas

    r9 r10  
    2525    procedure SaveVariantToStream(Stream: TStream; Value: Integer);
    2626    function LoadVariantFromStream(Stream: TStream): Integer;
     27    procedure SaveLengthDelimitedToStream(Stream: TStream; Block: TStream);
     28    procedure LoadLengthDelimitedFromStream(Stream: TStream; Block: TStream);
    2729    procedure SaveHeadToStream(Stream: TStream);
    2830    procedure LoadHeadFromStream(Stream: TStream);
     
    5153  { TPBMessageItem }
    5254  TPBMessageItem = class(TPBItem)
     55    GenerateHead: Boolean;
    5356    Items: TList; // TList<TPBItem>;
    5457    function SearchItemByTag(Tag: Integer): TPBItem;
     
    7881procedure TProtocolBuffer.LoadFromStream(Stream: TStream);
    7982begin
    80   BaseMessage.LoadHeadFromStream(Stream);
     83  BaseMessage.GenerateHead := False;
    8184  BaseMessage.LoadFromStream(Stream);
    8285end;
     
    8487procedure TProtocolBuffer.SaveToStream(Stream: TStream);
    8588begin
     89  BaseMessage.GenerateHead := False;
    8690  BaseMessage.SaveToStream(Stream);
    8791end;
     
    118122var
    119123  I: Integer;
    120 begin
    121   inherited;
    122   SaveHeadToStream(Stream);
     124  TempStream: TMemoryStream;
     125begin
     126  inherited;
     127  // Generate message content to temporary stream
     128  TempStream := TMemoryStream.Create;
    123129  for I := 0 to Items.Count - 1 do
    124     TPBItem(Items[I]).SaveToStream(Stream);
     130    TPBItem(Items[I]).SaveToStream(TempStream);
     131  // if head is used than write lenght-delimited head type with block byte length
     132  if GenerateHead then begin
     133    SaveHeadToStream(Stream);
     134    SaveVariantToStream(Stream, TempStream.Size);
     135  end;
     136  TempStream.Position := 0;
     137  TempStream.SaveToStream(Stream);
     138  TempStream.Free;
    125139end;
    126140
     
    130144  TempItem: TPBItem;
    131145  SearchItem: TPBItem;
    132 begin
    133   inherited;
     146  EndIndex: Integer;
     147  TempStream: TMemoryStream;
     148begin
     149  inherited;
     150  TempStream := TMemoryStream.Create;
     151
     152  if GenerateHead then begin
     153    I := LoadVariantFromStream(Stream);
     154    EndIndex := Stream.Position + I;
     155  end else EndIndex := Stream.Size;
     156
    134157  TempItem := TPBItem.Create;
    135   for I := 0 to Items.Count - 1 do begin
     158  while Stream.Position < EndIndex do begin
    136159    TempItem.LoadHeadFromStream(Stream);
    137160    SearchItem := SearchItemByTag(TempItem.Tag);
     
    146169      else if SearchItem is TPBMessageItem then
    147170        TPBMessageItem(SearchItem).LoadFromStream(Stream);
     171    end else begin
     172      if TempItem.ItemType = itVariant then
     173        TempItem.LoadVariantFromStream(Stream)
     174      else if TempItem.ItemType = itLengthDelimited then
     175        TempItem.LoadLengthDelimitedFromStream(Stream, TempStream);
    148176    end;
    149177  end;
     178  TempStream.Free;
    150179end;
    151180
     
    154183  ItemType := itLengthDelimited;
    155184  Items := TList.Create;
     185  GenerateHead := True;
    156186end;
    157187
     
    243273end;
    244274
     275procedure TPBItem.SaveLengthDelimitedToStream(Stream: TStream; Block: TStream);
     276begin
     277  SaveVariantToStream(Stream, Block.Size);
     278  Block.Position := 0;
     279  TMemoryStreamEx(Block).ReadStream(Stream, Block.Size);
     280end;
     281
     282procedure TPBItem.LoadLengthDelimitedFromStream(Stream: TStream; Block: TStream
     283  );
     284var
     285  Size: Integer;
     286begin
     287  Size := LoadVariantFromStream(Stream);
     288  TMemoryStreamEx(Stream).ReadStream(Block, Size);
     289end;
     290
    245291{ TPBIntegerItem }
    246292
Note: See TracChangeset for help on using the changeset viewer.