Ignore:
Timestamp:
Oct 12, 2009, 11:01:02 AM (15 years ago)
Author:
george
Message:
  • Modified: Enhanced loading from stream.
  • Added: Demo form is displaying original PB tree and target loaded PB tree.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • ProtocolBuffers/UProtocolBuffers.pas

    r8 r9  
    2525    procedure SaveVariantToStream(Stream: TStream; Value: Integer);
    2626    function LoadVariantFromStream(Stream: TStream): Integer;
     27    procedure SaveHeadToStream(Stream: TStream);
     28    procedure LoadHeadFromStream(Stream: TStream);
    2729    procedure SaveToStream(Stream: TStream); virtual;
    2830    procedure LoadFromStream(Stream: TStream); virtual;
     
    5052  TPBMessageItem = class(TPBItem)
    5153    Items: TList; // TList<TPBItem>;
     54    function SearchItemByTag(Tag: Integer): TPBItem;
    5255    procedure SaveToStream(Stream: TStream); override;
    5356    procedure LoadFromStream(Stream: TStream); override;
     
    7578procedure TProtocolBuffer.LoadFromStream(Stream: TStream);
    7679begin
     80  BaseMessage.LoadHeadFromStream(Stream);
    7781  BaseMessage.LoadFromStream(Stream);
    7882end;
     
    101105{ TPBMessageItem }
    102106
     107function TPBMessageItem.SearchItemByTag(Tag: Integer): TPBItem;
     108var
     109  I: Integer;
     110begin
     111  I := 0;
     112  while (I < Items.Count) and (TPBItem(Items[I]).Tag <> Tag) do Inc(I);
     113  if I < Items.Count then Result := Items[I]
     114    else Result := nil;
     115end;
     116
    103117procedure TPBMessageItem.SaveToStream(Stream: TStream);
    104118var
    105119  I: Integer;
    106120begin
    107   inherited SaveToStream(Stream);
     121  inherited;
     122  SaveHeadToStream(Stream);
    108123  for I := 0 to Items.Count - 1 do
    109124    TPBItem(Items[I]).SaveToStream(Stream);
     
    113128var
    114129  I: Integer;
    115 begin
    116   inherited LoadFromStream(Stream);
    117   for I := 0 to Items.Count - 1 do
    118     TPBItem(Items[I]).LoadFromStream(Stream);
     130  TempItem: TPBItem;
     131  SearchItem: TPBItem;
     132begin
     133  inherited;
     134  TempItem := TPBItem.Create;
     135  for I := 0 to Items.Count - 1 do begin
     136    TempItem.LoadHeadFromStream(Stream);
     137    SearchItem := SearchItemByTag(TempItem.Tag);
     138    if Assigned(SearchItem) then begin
     139      if SearchItem.ItemType <> TempItem.ItemType then
     140        raise Exception.Create('Bad type for item "' + SearchItem.Name +
     141          '" with tag ' + IntToStr(SearchItem.Tag));
     142      if SearchItem is TPBIntegerItem then
     143        TPBIntegerItem(SearchItem).LoadFromStream(Stream)
     144      else if SearchItem is TPBStringItem then
     145        TPBStringItem(SearchItem).LoadFromStream(Stream)
     146      else if SearchItem is TPBMessageItem then
     147        TPBMessageItem(SearchItem).LoadFromStream(Stream);
     148    end;
     149  end;
    119150end;
    120151
     
    154185end;
    155186
    156 procedure TPBItem.SaveToStream(Stream: TStream);
     187procedure TPBItem.SaveHeadToStream(Stream: TStream);
    157188var
    158189  ByteIndex: Byte;
     
    171202end;
    172203
    173 procedure TPBItem.LoadFromStream(Stream: TStream);
     204procedure TPBItem.LoadHeadFromStream(Stream: TStream);
    174205var
    175206  Data: Byte;
     
    187218end;
    188219
     220procedure TPBItem.SaveToStream(Stream: TStream);
     221begin
     222
     223end;
     224
     225procedure TPBItem.LoadFromStream(Stream: TStream);
     226begin
     227
     228end;
     229
    189230function TPBItem.LoadVariantFromStream(Stream: TStream): Integer;
    190231var
     
    206247procedure TPBIntegerItem.SaveToStream(Stream: TStream);
    207248begin
    208   inherited SaveToStream(Stream);
     249  inherited;
     250  SaveHeadToStream(Stream);
    209251  SaveVariantToStream(Stream, Value);
    210252end;
     
    212254procedure TPBIntegerItem.LoadFromStream(Stream: TStream);
    213255begin
    214   inherited LoadFromStream(Stream);
    215   LoadVariantFromStream(Stream);
     256  inherited;
     257  Value := LoadVariantFromStream(Stream);
    216258end;
    217259
     
    225267procedure TPBStringItem.SaveToStream(Stream: TStream);
    226268begin
    227   inherited SaveToStream(Stream);
     269  inherited;
     270  SaveHeadToStream(Stream);
    228271  SaveVariantToStream(Stream, Length(Value));
    229272  TMemoryStreamEx(Stream).Write(Value[1], Length(Value));
     
    232275procedure TPBStringItem.LoadFromStream(Stream: TStream);
    233276begin
    234   inherited LoadFromStream(Stream);
     277  inherited;
    235278  SetLength(Value, LoadVariantFromStream(Stream));
    236279  TMemoryStreamEx(Stream).Read(Value[1], Length(Value));
Note: See TracChangeset for help on using the changeset viewer.