Ignore:
Timestamp:
Oct 20, 2009, 11:06:34 AM (15 years ago)
Author:
george
Message:
  • Modified: Definition tree is now separated from data. This was needed for implementation of repeated fields.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • ProtocolBuffers/UMainForm.pas

    r10 r11  
    2828    procedure DisplayStream(Stream: TStream);
    2929    procedure DisplayTree(ProtocolBuffer: TProtocolBuffer; TreeView: TTreeView);
    30     procedure MessageToNode(PBMessage: TPBMessageItem; Node: TTreeNode);
     30    procedure ListToNode(PBRepeated: TPBRepeatedItem; Node: TTreeNode;
     31      Definition: TPBDefinition);
     32    procedure MessageToNode(PBMessage: TPBMessageItem; Node: TTreeNode;
     33      Definition: TPBDefinition);
    3134  public
    3235  end;
     
    7073var
    7174  Stream: TMemoryStreamEx;
    72   NewItem: TPBItem;
     75  NewItem: TPBDefinition;
    7376  PB: TProtocolBuffer;
    7477begin
     
    7679  PB := TProtocolBuffer.Create;
    7780  with PB do begin
    78     with BaseMessage do begin
     81    with Definition do begin
    7982      Name := 'SampleMessage';
    80       NewItem := TPBIntegerItem.Create;
    81       with TPBIntegerItem(NewItem) do begin
     83      NewItem := TPBDefinition.Create;
     84      with TPBDefinition(NewItem) do begin
    8285        Name := 'Height';
    8386        Tag := 1;
    84         Value := 12;
    85       end;
    86       Items.Add(NewItem);
    87       NewItem := TPBStringItem.Create;
    88       with TPBStringItem(NewItem) do begin
     87        ItemType := itInteger;
     88      end;
     89      Items.Add(NewItem);
     90
     91      NewItem := TPBDefinition.Create;
     92      with TPBDefinition(NewItem) do begin
    8993        Name := 'Name';
    9094        Tag := 2;
    91         Value := 'John Doe';
    92       end;
    93       Items.Add(NewItem);
    94       NewItem := TPBIntegerItem.Create;
    95       with TPBIntegerItem(NewItem) do begin
     95        ItemType := itString;
     96        ItemMode := imOptional;
     97      end;
     98      Items.Add(NewItem);
     99
     100      NewItem := TPBDefinition.Create;
     101      with TPBDefinition(NewItem) do begin
    96102        Name := 'Age';
    97103        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        ItemType := itInteger;
     105        ItemMode := imOptional;
     106      end;
     107      Items.Add(NewItem);
     108
     109      NewItem := TPBDefinition.Create;
     110      Items.Add(NewItem);
     111      with TPBDefinition(Items[Items.Count - 1]) do begin
    104112        Name := 'Address';
    105113        Tag := 5;
    106         NewItem := TPBIntegerItem.Create;
    107         with TPBIntegerItem(NewItem) do begin
     114        ItemType := itMessage;
     115        NewItem := TPBDefinition.Create;
     116        ItemMode := imOptional;
     117        with TPBDefinition(NewItem) do begin
    108118          Name := 'Street';
    109119          Tag := 1;
    110           Value := 67;
     120          ItemType := itString;
     121          ItemMode := imOptional;
    111122        end;
    112123        Items.Add(NewItem);
    113124      end;
    114125    end;
     126    BaseMessage.Clear(Definition);
     127    TPBIntegerItem(PB.BaseMessage.Items[0]).Value := 12;
     128    TPBStringItem(TPBMessageItem(PB.BaseMessage.Items[3]).
     129      Items[0]).Value := 'Vsetínská';
    115130    DisplayTree(PB, TreeView1);
    116131    SaveToStream(Stream);
     
    123138  PB := TProtocolBuffer.Create;
    124139  with PB do begin
    125     with BaseMessage do begin
     140    with Definition do begin
    126141      Name := 'SampleMessage';
    127       NewItem := TPBIntegerItem.Create;
    128       with TPBIntegerItem(NewItem) do begin
     142      NewItem := TPBDefinition.Create;
     143      with TPBDefinition(NewItem) do begin
    129144        Name := 'Height';
    130145        Tag := 1;
    131       end;
    132       Items.Add(NewItem);
    133       NewItem := TPBStringItem.Create;
    134       with TPBStringItem(NewItem) do begin
     146        ItemType := itInteger;
     147        DefaultInteger := 32;
     148      end;
     149      Items.Add(NewItem);
     150
     151      NewItem := TPBDefinition.Create;
     152      with TPBDefinition(NewItem) do begin
    135153        Name := 'Name';
    136154        Tag := 2;
    137         Value := '';
    138       end;
    139       Items.Add(NewItem);
    140       NewItem := TPBIntegerItem.Create;
    141       with TPBIntegerItem(NewItem) do begin
    142         Name := 'Weight';
     155        ItemType := itString;
     156        DefaultString := 'Billy Joe';
     157      end;
     158      Items.Add(NewItem);
     159
     160      NewItem := TPBDefinition.Create;
     161      with TPBDefinition(NewItem) do begin
     162        Name := 'Work';
    143163        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
     164        ItemType := itString;
     165        DefaultString := 'EasyCompany';
     166      end;
     167      Items.Add(NewItem);
     168
     169      NewItem := TPBDefinition.Create;
     170      Items.Add(NewItem);
     171      with TPBDefinition(Items[Items.Count - 1]) do begin
    149172        Name := 'Address';
    150173        Tag := 5;
    151         NewItem := TPBIntegerItem.Create;
    152         with TPBIntegerItem(NewItem) do begin
     174        ItemType := itMessage;
     175        NewItem := TPBDefinition.Create;
     176        with TPBDefinition(NewItem) do begin
    153177          Name := 'Street';
    154178          Tag := 1;
     179          ItemType := itString;
     180          DefaultString := 'Ruská';
    155181        end;
    156182        Items.Add(NewItem);
    157183      end;
    158184    end;
     185    BaseMessage.Clear(Definition);
    159186    LoadFromStream(Stream);
    160187    DisplayTree(PB, TreeView2);
     
    188215    Items.Clear;
    189216    TopItem := Items.Add(nil, 'message');
    190     MessageToNode(ProtocolBuffer.BaseMessage, TopItem);
     217    MessageToNode(ProtocolBuffer.BaseMessage, TopItem, ProtocolBuffer.Definition);
    191218    TopItem.Expand(True);
    192219    EndUpdate;
     
    194221end;
    195222
    196 procedure TMainForm.MessageToNode(PBMessage: TPBMessageItem; Node: TTreeNode);
     223procedure TMainForm.ListToNode(PBRepeated: TPBRepeatedItem; Node: TTreeNode;
     224  Definition: TPBDefinition);
    197225var
    198226  I: Integer;
    199227  NewNode: TTreeNode;
    200228begin
    201   for I := 0 to PBMessage.Items.Count - 1 do begin
     229  for I := 0 to Definition.Items.Count - 1 do
     230  with TPBDefinition(Definition) do begin
    202231    NewNode := Node.Owner.AddChild(Node, '');
    203     if TPBItem(PBMessage.Items[I]) is TPBStringItem then begin
    204       NewNode.Text := IntToStr(TPBItem(PBMessage.Items[I]).Tag) + ': string ' +
    205         TPBItem(PBMessage.Items[I]).Name + ' = ' +
     232    if ItemType = itString then begin
     233      NewNode.Text := IntToStr(Tag) + ': string ' + Name + ' = ' +
     234        TPBStringItem(PBRepeated.Items[I]).Value;
     235    end else
     236    if ItemType = itInteger then begin
     237      NewNode.Text := IntToStr(Tag) + ': uint32 ' + Name + ' = ' +
     238        IntToStr(TPBIntegerItem(PBRepeated.Items[I]).Value);
     239    end else
     240    if ItemType = itMessage then begin
     241      NewNode.Text := IntToStr(Tag) + ': message ' + Name;
     242      MessageToNode(TPBMessageItem(PBRepeated.Items[I]), NewNode, Definition);
     243    end;
     244  end;
     245end;
     246
     247procedure TMainForm.MessageToNode(PBMessage: TPBMessageItem; Node: TTreeNode;
     248  Definition: TPBDefinition);
     249var
     250  I: Integer;
     251  NewNode: TTreeNode;
     252begin
     253  for I := 0 to Definition.Items.Count - 1 do
     254  with TPBDefinition(Definition.Items[I]) do begin
     255    NewNode := Node.Owner.AddChild(Node, '');
     256    if ItemMode = imRepeated then begin
     257      NewNode.Text := 'repeated';
     258      ListToNode(TPBRepeatedItem(PBMessage.Items[I]), NewNode, Definition.Items[I]);
     259    end else
     260    if ItemType = itString then begin
     261      NewNode.Text := IntToStr(Tag) + ': string ' + Name + ' = ' +
    206262        TPBStringItem(PBMessage.Items[I]).Value;
    207263    end else
    208     if TPBItem(PBMessage.Items[I]) is TPBIntegerItem then begin
    209       NewNode.Text := IntToStr(TPBItem(PBMessage.Items[I]).Tag) + ': uint32 ' +
    210         TPBItem(PBMessage.Items[I]).Name + ' = ' +
     264    if ItemType = itInteger then begin
     265      NewNode.Text := IntToStr(Tag) + ': uint32 ' + Name + ' = ' +
    211266        IntToStr(TPBIntegerItem(PBMessage.Items[I]).Value);
    212267    end else
    213     if TPBItem(PBMessage.Items[I]) is TPBMessageItem then begin
    214       NewNode.Text := IntToStr(TPBItem(PBMessage.Items[I]).Tag) + ': message ' +
    215         TPBItem(PBMessage.Items[I]).Name;
    216       MessageToNode(TPBMessageItem(PBMessage.Items[I]), NewNode);
    217     end;
    218 
     268    if ItemType = itMessage then begin
     269      NewNode.Text := IntToStr(Tag) + ': message ' + Name;
     270      MessageToNode(TPBMessageItem(PBMessage.Items[I]), NewNode, Definition.Items[I]);
     271    end;
    219272  end;
    220273end;
Note: See TracChangeset for help on using the changeset viewer.