Changeset 10


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

Legend:

Unmodified
Added
Removed
  • ProtocolBuffers/Demo.compiled

    r5 r10  
    22<CONFIG>
    33  <Compiler Value="E:\Programy\Lazarus_0.9.27\fpc\2.2.4\bin\i386-win32\fpc.exe" Date="992089738"/>
    4   <Params Value=" -MObjFPC -Scgi -O1 -gl -WG -vewnhi -l -FiE:\Projekty\PascalClassLibrary\ProtocolBuffers\ -FuE:\Programy\Lazarus_0.9.27\lcl\units\i386-win32\ -FuE:\Programy\Lazarus_0.9.27\lcl\units\i386-win32\win32\ -FuE:\Programy\Lazarus_0.9.27\packager\units\i386-win32\ -FuE:\Projekty\PascalClassLibrary\ProtocolBuffers\ -Fu. -FEE:\Projekty\PascalClassLibrary\ProtocolBuffers\ -oDemo.exe -dLCL -dLCLwin32 Demo.lpr"/>
     4  <Params Value=" -MObjFPC -Scgi -Cirot -O1 -gl -WG -vewnhi -l -FiE:\Projekty\PascalClassLibrary\ProtocolBuffers\ -FuE:\Programy\Lazarus_0.9.27\lcl\units\i386-win32\ -FuE:\Programy\Lazarus_0.9.27\lcl\units\i386-win32\win32\ -FuE:\Programy\Lazarus_0.9.27\packager\units\i386-win32\ -FuE:\Projekty\PascalClassLibrary\ProtocolBuffers\ -Fu. -FEE:\Projekty\PascalClassLibrary\ProtocolBuffers\ -oDemo.exe -dLCL -dLCLwin32 Demo.lpr"/>
    55</CONFIG>
  • ProtocolBuffers/Demo.lpi

    r9 r10  
    99      <Icon Value="0"/>
    1010      <UseXPManifest Value="True"/>
    11       <ActiveEditorIndexAtStart Value="1"/>
     11      <ActiveEditorIndexAtStart Value="0"/>
    1212    </General>
    1313    <VersionInfo>
     
    3333      </Item1>
    3434    </RequiredPackages>
    35     <Units Count="9">
     35    <Units Count="10">
    3636      <Unit0>
    3737        <Filename Value="Demo.lpr"/>
    3838        <IsPartOfProject Value="True"/>
    3939        <UnitName Value="Demo"/>
    40         <CursorPos X="75" Y="10"/>
     40        <CursorPos X="23" Y="11"/>
    4141        <TopLine Value="1"/>
    4242        <EditorIndex Value="6"/>
    43         <UsageCount Value="30"/>
     43        <UsageCount Value="34"/>
    4444        <Loaded Value="True"/>
    4545      </Unit0>
     
    5050        <ResourceBaseClass Value="Form"/>
    5151        <UnitName Value="UMainForm"/>
    52         <CursorPos X="42" Y="112"/>
    53         <TopLine Value="79"/>
     52        <CursorPos X="19" Y="137"/>
     53        <TopLine Value="124"/>
    5454        <EditorIndex Value="0"/>
    55         <UsageCount Value="30"/>
     55        <UsageCount Value="34"/>
    5656        <Loaded Value="True"/>
    5757      </Unit1>
     
    6060        <IsPartOfProject Value="True"/>
    6161        <UnitName Value="UProtocolBuffers"/>
    62         <CursorPos X="45" Y="137"/>
    63         <TopLine Value="131"/>
     62        <CursorPos X="30" Y="223"/>
     63        <TopLine Value="217"/>
    6464        <EditorIndex Value="1"/>
    65         <UsageCount Value="30"/>
     65        <UsageCount Value="34"/>
    6666        <Loaded Value="True"/>
    6767      </Unit2>
     
    7070        <IsPartOfProject Value="True"/>
    7171        <UnitName Value="UMemoryStreamEx"/>
    72         <CursorPos X="1" Y="1"/>
    73         <TopLine Value="1"/>
    74         <EditorIndex Value="5"/>
    75         <UsageCount Value="30"/>
     72        <CursorPos X="3" Y="60"/>
     73        <TopLine Value="56"/>
     74        <EditorIndex Value="2"/>
     75        <UsageCount Value="34"/>
    7676        <Loaded Value="True"/>
    7777      </Unit3>
    7878      <Unit4>
    7979        <Filename Value="..\..\..\Programy\Lazarus_0.9.27\fpc\2.2.4\source\rtl\objpas\classes\classesh.inc"/>
    80         <CursorPos X="19" Y="826"/>
    81         <TopLine Value="810"/>
    82         <EditorIndex Value="4"/>
    83         <UsageCount Value="14"/>
     80        <CursorPos X="15" Y="806"/>
     81        <TopLine Value="790"/>
     82        <EditorIndex Value="5"/>
     83        <UsageCount Value="16"/>
    8484        <Loaded Value="True"/>
    8585      </Unit4>
     
    8989        <CursorPos X="20" Y="4"/>
    9090        <TopLine Value="1"/>
    91         <EditorIndex Value="3"/>
    92         <UsageCount Value="28"/>
     91        <EditorIndex Value="4"/>
     92        <UsageCount Value="32"/>
    9393        <Loaded Value="True"/>
    9494        <SyntaxHighlighter Value="None"/>
     
    100100        <CursorPos X="66" Y="26"/>
    101101        <TopLine Value="2"/>
    102         <EditorIndex Value="2"/>
    103         <UsageCount Value="27"/>
     102        <EditorIndex Value="3"/>
     103        <UsageCount Value="31"/>
    104104        <Loaded Value="True"/>
    105105      </Unit6>
     
    117117        <UsageCount Value="10"/>
    118118      </Unit8>
     119      <Unit9>
     120        <Filename Value="..\..\..\Programy\Lazarus_0.9.27\fpc\2.2.4\source\rtl\objpas\classes\streams.inc"/>
     121        <CursorPos X="47" Y="533"/>
     122        <TopLine Value="530"/>
     123        <UsageCount Value="10"/>
     124      </Unit9>
    119125    </Units>
    120126    <JumpHistory Count="30" HistoryIndex="29">
    121127      <Position1>
    122128        <Filename Value="UProtocolBuffers.pas"/>
    123         <Caret Line="219" Column="1" TopLine="203"/>
     129        <Caret Line="158" Column="1" TopLine="142"/>
    124130      </Position1>
    125131      <Position2>
    126132        <Filename Value="UProtocolBuffers.pas"/>
    127         <Caret Line="29" Column="15" TopLine="13"/>
     133        <Caret Line="159" Column="1" TopLine="143"/>
    128134      </Position2>
    129135      <Position3>
    130136        <Filename Value="UProtocolBuffers.pas"/>
    131         <Caret Line="227" Column="5" TopLine="195"/>
     137        <Caret Line="160" Column="1" TopLine="144"/>
    132138      </Position3>
    133139      <Position4>
    134         <Filename Value="UMainForm.pas"/>
    135         <Caret Line="156" Column="9" TopLine="135"/>
     140        <Filename Value="UProtocolBuffers.pas"/>
     141        <Caret Line="161" Column="1" TopLine="145"/>
    136142      </Position4>
    137143      <Position5>
    138         <Filename Value="UMainForm.pas"/>
    139         <Caret Line="155" Column="16" TopLine="134"/>
     144        <Filename Value="UProtocolBuffers.pas"/>
     145        <Caret Line="162" Column="1" TopLine="146"/>
    140146      </Position5>
    141147      <Position6>
    142148        <Filename Value="UProtocolBuffers.pas"/>
    143         <Caret Line="136" Column="27" TopLine="120"/>
     149        <Caret Line="165" Column="1" TopLine="149"/>
    144150      </Position6>
    145151      <Position7>
    146152        <Filename Value="UProtocolBuffers.pas"/>
    147         <Caret Line="112" Column="9" TopLine="121"/>
     153        <Caret Line="166" Column="1" TopLine="150"/>
    148154      </Position7>
    149155      <Position8>
    150156        <Filename Value="UProtocolBuffers.pas"/>
    151         <Caret Line="134" Column="1" TopLine="118"/>
     157        <Caret Line="159" Column="1" TopLine="143"/>
    152158      </Position8>
    153159      <Position9>
    154160        <Filename Value="UProtocolBuffers.pas"/>
    155         <Caret Line="135" Column="1" TopLine="119"/>
     161        <Caret Line="160" Column="1" TopLine="144"/>
    156162      </Position9>
    157163      <Position10>
    158164        <Filename Value="UProtocolBuffers.pas"/>
    159         <Caret Line="136" Column="1" TopLine="120"/>
     165        <Caret Line="161" Column="1" TopLine="145"/>
    160166      </Position10>
    161167      <Position11>
    162168        <Filename Value="UProtocolBuffers.pas"/>
    163         <Caret Line="137" Column="1" TopLine="121"/>
     169        <Caret Line="172" Column="1" TopLine="156"/>
    164170      </Position11>
    165171      <Position12>
    166172        <Filename Value="UProtocolBuffers.pas"/>
    167         <Caret Line="135" Column="1" TopLine="119"/>
     173        <Caret Line="173" Column="1" TopLine="157"/>
    168174      </Position12>
    169175      <Position13>
    170176        <Filename Value="UProtocolBuffers.pas"/>
    171         <Caret Line="136" Column="1" TopLine="120"/>
     177        <Caret Line="159" Column="1" TopLine="143"/>
    172178      </Position13>
    173179      <Position14>
    174180        <Filename Value="UProtocolBuffers.pas"/>
    175         <Caret Line="137" Column="1" TopLine="121"/>
     181        <Caret Line="160" Column="1" TopLine="144"/>
    176182      </Position14>
    177183      <Position15>
    178184        <Filename Value="UProtocolBuffers.pas"/>
    179         <Caret Line="138" Column="1" TopLine="122"/>
     185        <Caret Line="161" Column="1" TopLine="145"/>
    180186      </Position15>
    181187      <Position16>
    182188        <Filename Value="UProtocolBuffers.pas"/>
    183         <Caret Line="141" Column="1" TopLine="125"/>
     189        <Caret Line="162" Column="1" TopLine="146"/>
    184190      </Position16>
    185191      <Position17>
    186192        <Filename Value="UProtocolBuffers.pas"/>
    187         <Caret Line="142" Column="1" TopLine="126"/>
     193        <Caret Line="165" Column="1" TopLine="149"/>
    188194      </Position17>
    189195      <Position18>
    190196        <Filename Value="UProtocolBuffers.pas"/>
    191         <Caret Line="135" Column="1" TopLine="119"/>
     197        <Caret Line="166" Column="1" TopLine="150"/>
    192198      </Position18>
    193199      <Position19>
    194         <Filename Value="UProtocolBuffers.pas"/>
    195         <Caret Line="136" Column="1" TopLine="120"/>
     200        <Filename Value="Demo.lpr"/>
     201        <Caret Line="10" Column="75" TopLine="1"/>
    196202      </Position19>
    197203      <Position20>
    198         <Filename Value="UProtocolBuffers.pas"/>
    199         <Caret Line="137" Column="1" TopLine="121"/>
     204        <Filename Value="UMainForm.pas"/>
     205        <Caret Line="107" Column="11" TopLine="92"/>
    200206      </Position20>
    201207      <Position21>
    202208        <Filename Value="UProtocolBuffers.pas"/>
    203         <Caret Line="138" Column="1" TopLine="122"/>
     209        <Caret Line="132" Column="42" TopLine="118"/>
    204210      </Position21>
    205211      <Position22>
    206212        <Filename Value="UProtocolBuffers.pas"/>
    207         <Caret Line="141" Column="1" TopLine="125"/>
     213        <Caret Line="128" Column="1" TopLine="112"/>
    208214      </Position22>
    209215      <Position23>
    210216        <Filename Value="UProtocolBuffers.pas"/>
    211         <Caret Line="142" Column="1" TopLine="126"/>
     217        <Caret Line="129" Column="1" TopLine="113"/>
    212218      </Position23>
    213219      <Position24>
    214220        <Filename Value="UProtocolBuffers.pas"/>
    215         <Caret Line="149" Column="1" TopLine="133"/>
     221        <Caret Line="132" Column="22" TopLine="114"/>
    216222      </Position24>
    217223      <Position25>
    218224        <Filename Value="UProtocolBuffers.pas"/>
    219         <Caret Line="81" Column="39" TopLine="65"/>
     225        <Caret Line="128" Column="1" TopLine="112"/>
    220226      </Position25>
    221227      <Position26>
    222228        <Filename Value="UProtocolBuffers.pas"/>
    223         <Caret Line="134" Column="1" TopLine="118"/>
     229        <Caret Line="129" Column="1" TopLine="113"/>
    224230      </Position26>
    225231      <Position27>
    226232        <Filename Value="UProtocolBuffers.pas"/>
    227         <Caret Line="135" Column="1" TopLine="119"/>
     233        <Caret Line="130" Column="1" TopLine="114"/>
    228234      </Position27>
    229235      <Position28>
    230236        <Filename Value="UProtocolBuffers.pas"/>
    231         <Caret Line="136" Column="6" TopLine="120"/>
     237        <Caret Line="132" Column="12" TopLine="120"/>
    232238      </Position28>
    233239      <Position29>
    234240        <Filename Value="UProtocolBuffers.pas"/>
    235         <Caret Line="82" Column="19" TopLine="78"/>
     241        <Caret Line="185" Column="24" TopLine="181"/>
    236242      </Position29>
    237243      <Position30>
    238         <Filename Value="UMainForm.pas"/>
    239         <Caret Line="112" Column="39" TopLine="88"/>
     244        <Filename Value="UProtocolBuffers.pas"/>
     245        <Caret Line="316" Column="5" TopLine="302"/>
    240246      </Position30>
    241247    </JumpHistory>
     
    247253      <IncludeFiles Value="$(ProjOutDir)\"/>
    248254    </SearchPaths>
     255    <CodeGeneration>
     256      <Checks>
     257        <IOChecks Value="True"/>
     258        <RangeChecks Value="True"/>
     259        <OverflowChecks Value="True"/>
     260        <StackChecks Value="True"/>
     261      </Checks>
     262    </CodeGeneration>
    249263    <Linking>
    250264      <Options>
     
    259273  </CompilerOptions>
    260274  <Debugging>
    261     <BreakPoints Count="1">
    262       <Item1>
    263         <Source Value="UProtocolBuffers.pas"/>
    264         <Line Value="135"/>
    265       </Item1>
    266     </BreakPoints>
    267275    <Exceptions Count="3">
    268276      <Item1>
  • ProtocolBuffers/UMainForm.pas

    r9 r10  
    2222    procedure Button1Click(Sender: TObject);
    2323    procedure Button2Click(Sender: TObject);
     24    procedure Button3Click(Sender: TObject);
    2425    procedure FormCreate(Sender: TObject);
    2526    procedure FormDestroy(Sender: TObject);
     
    6162end;
    6263
     64procedure TMainForm.Button3Click(Sender: TObject);
     65begin
     66
     67end;
     68
    6369procedure TMainForm.Button1Click(Sender: TObject);
    6470var
     
    7379      Name := 'SampleMessage';
    7480      NewItem := TPBIntegerItem.Create;
    75       TPBIntegerItem(NewItem).Name := 'Height';
    76       TPBIntegerItem(NewItem).Tag := 1;
    77       TPBIntegerItem(NewItem).Value := 12;
    78       Items.Add(NewItem);
    79       NewItem := TPBIntegerItem.Create;
    80       TPBIntegerItem(NewItem).Name := 'Width';
    81       TPBIntegerItem(NewItem).Tag := 2;
    82       TPBIntegerItem(NewItem).Value := 34;
    83       Items.Add(NewItem);
    84       NewItem := TPBIntegerItem.Create;
    85       TPBIntegerItem(NewItem).Name := 'Age';
    86       TPBIntegerItem(NewItem).Tag := 3;
    87       TPBIntegerItem(NewItem).Value := 45;
    88       Items.Add(NewItem);
     81      with TPBIntegerItem(NewItem) do begin
     82        Name := 'Height';
     83        Tag := 1;
     84        Value := 12;
     85      end;
     86      Items.Add(NewItem);
     87      NewItem := TPBStringItem.Create;
     88      with TPBStringItem(NewItem) do begin
     89        Name := 'Name';
     90        Tag := 2;
     91        Value := 'John Doe';
     92      end;
     93      Items.Add(NewItem);
     94      NewItem := TPBIntegerItem.Create;
     95      with TPBIntegerItem(NewItem) do begin
     96        Name := 'Age';
     97        Tag := 3;
     98        Value := 45;
     99      end;
     100      Items.Add(NewItem);
     101      NewItem := TPBMessageItem.Create;
     102      Items.Add(NewItem);
     103      with TPBMessageItem(Items[Items.Count - 1]) do begin
     104        Name := 'Address';
     105        Tag := 5;
     106        NewItem := TPBIntegerItem.Create;
     107        with TPBIntegerItem(NewItem) do begin
     108          Name := 'Street';
     109          Tag := 1;
     110          Value := 67;
     111        end;
     112        Items.Add(NewItem);
     113      end;
    89114    end;
    90115    DisplayTree(PB, TreeView1);
     
    101126      Name := 'SampleMessage';
    102127      NewItem := TPBIntegerItem.Create;
    103       TPBIntegerItem(NewItem).Name := 'Height';
    104       TPBIntegerItem(NewItem).Tag := 1;
    105       Items.Add(NewItem);
    106       NewItem := TPBIntegerItem.Create;
    107       TPBIntegerItem(NewItem).Name := 'Age';
    108       TPBIntegerItem(NewItem).Tag := 3;
    109       Items.Add(NewItem);
    110       NewItem := TPBIntegerItem.Create;
    111       TPBIntegerItem(NewItem).Name := 'Weight';
    112       TPBIntegerItem(NewItem).Tag := 4;
    113       Items.Add(NewItem);
     128      with TPBIntegerItem(NewItem) do begin
     129        Name := 'Height';
     130        Tag := 1;
     131      end;
     132      Items.Add(NewItem);
     133      NewItem := TPBStringItem.Create;
     134      with TPBStringItem(NewItem) do begin
     135        Name := 'Name';
     136        Tag := 2;
     137        Value := '';
     138      end;
     139      Items.Add(NewItem);
     140      NewItem := TPBIntegerItem.Create;
     141      with TPBIntegerItem(NewItem) do begin
     142        Name := 'Weight';
     143        Tag := 4;
     144      end;
     145      Items.Add(NewItem);
     146      NewItem := TPBMessageItem.Create;
     147      Items.Add(NewItem);
     148      with TPBMessageItem(Items[Items.Count - 1]) do begin
     149        Name := 'Address';
     150        Tag := 5;
     151        NewItem := TPBIntegerItem.Create;
     152        with TPBIntegerItem(NewItem) do begin
     153          Name := 'Street';
     154          Tag := 1;
     155        end;
     156        Items.Add(NewItem);
     157      end;
    114158    end;
    115159    LoadFromStream(Stream);
  • 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.