Changeset 10 for ProtocolBuffers/UProtocolBuffers.pas
- Timestamp:
- Oct 12, 2009, 12:52:28 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
ProtocolBuffers/UProtocolBuffers.pas
r9 r10 25 25 procedure SaveVariantToStream(Stream: TStream; Value: Integer); 26 26 function LoadVariantFromStream(Stream: TStream): Integer; 27 procedure SaveLengthDelimitedToStream(Stream: TStream; Block: TStream); 28 procedure LoadLengthDelimitedFromStream(Stream: TStream; Block: TStream); 27 29 procedure SaveHeadToStream(Stream: TStream); 28 30 procedure LoadHeadFromStream(Stream: TStream); … … 51 53 { TPBMessageItem } 52 54 TPBMessageItem = class(TPBItem) 55 GenerateHead: Boolean; 53 56 Items: TList; // TList<TPBItem>; 54 57 function SearchItemByTag(Tag: Integer): TPBItem; … … 78 81 procedure TProtocolBuffer.LoadFromStream(Stream: TStream); 79 82 begin 80 BaseMessage. LoadHeadFromStream(Stream);83 BaseMessage.GenerateHead := False; 81 84 BaseMessage.LoadFromStream(Stream); 82 85 end; … … 84 87 procedure TProtocolBuffer.SaveToStream(Stream: TStream); 85 88 begin 89 BaseMessage.GenerateHead := False; 86 90 BaseMessage.SaveToStream(Stream); 87 91 end; … … 118 122 var 119 123 I: Integer; 120 begin 121 inherited; 122 SaveHeadToStream(Stream); 124 TempStream: TMemoryStream; 125 begin 126 inherited; 127 // Generate message content to temporary stream 128 TempStream := TMemoryStream.Create; 123 129 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; 125 139 end; 126 140 … … 130 144 TempItem: TPBItem; 131 145 SearchItem: TPBItem; 132 begin 133 inherited; 146 EndIndex: Integer; 147 TempStream: TMemoryStream; 148 begin 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 134 157 TempItem := TPBItem.Create; 135 for I := 0 to Items.Count - 1do begin158 while Stream.Position < EndIndex do begin 136 159 TempItem.LoadHeadFromStream(Stream); 137 160 SearchItem := SearchItemByTag(TempItem.Tag); … … 146 169 else if SearchItem is TPBMessageItem then 147 170 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); 148 176 end; 149 177 end; 178 TempStream.Free; 150 179 end; 151 180 … … 154 183 ItemType := itLengthDelimited; 155 184 Items := TList.Create; 185 GenerateHead := True; 156 186 end; 157 187 … … 243 273 end; 244 274 275 procedure TPBItem.SaveLengthDelimitedToStream(Stream: TStream; Block: TStream); 276 begin 277 SaveVariantToStream(Stream, Block.Size); 278 Block.Position := 0; 279 TMemoryStreamEx(Block).ReadStream(Stream, Block.Size); 280 end; 281 282 procedure TPBItem.LoadLengthDelimitedFromStream(Stream: TStream; Block: TStream 283 ); 284 var 285 Size: Integer; 286 begin 287 Size := LoadVariantFromStream(Stream); 288 TMemoryStreamEx(Stream).ReadStream(Block, Size); 289 end; 290 245 291 { TPBIntegerItem } 246 292
Note:
See TracChangeset
for help on using the changeset viewer.