source: ProtocolBuffers/UMainForm.pas

Last change on this file was 12, checked in by george, 15 years ago
  • Fixed: Handling repeated fileds.
File size: 7.7 KB
Line 
1unit UMainForm;
2
3{$mode delphi}{$H+}
4
5interface
6
7uses
8 Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
9 StdCtrls, ComCtrls, UProtocolBuffers, UMemoryStreamEx;
10
11const
12 SampleProtoFileName = 'Sample.proto';
13
14type
15 { TMainForm }
16 TMainForm = class(TForm)
17 Button1: TButton;
18 Button2: TButton;
19 Memo1: TMemo;
20 TreeView1: TTreeView;
21 TreeView2: TTreeView;
22 procedure Button1Click(Sender: TObject);
23 procedure Button2Click(Sender: TObject);
24 procedure Button3Click(Sender: TObject);
25 procedure FormCreate(Sender: TObject);
26 procedure FormDestroy(Sender: TObject);
27 private
28 procedure DisplayStream(Stream: TStream);
29 procedure DisplayTree(ProtocolBuffer: TProtocolBuffer; TreeView: TTreeView);
30 procedure ListToNode(PBRepeated: TPBRepeatedItem; Node: TTreeNode;
31 Definition: TPBDefinition);
32 procedure MessageToNode(PBMessage: TPBMessageItem; Node: TTreeNode;
33 Definition: TPBDefinition);
34 public
35 end;
36
37var
38 MainForm: TMainForm;
39
40implementation
41
42{ TMainForm }
43
44procedure TMainForm.FormCreate(Sender: TObject);
45begin
46end;
47
48procedure TMainForm.Button2Click(Sender: TObject);
49var
50 Stream: TMemoryStream;
51 StringList: TStringList;
52 PB: TProtocolBuffer;
53begin
54 Stream := TMemoryStreamEx.Create;
55 StringList := TStringList.Create;
56 StringList.LoadFromFile(SampleProtoFileName);
57 PB := TProtocolBuffer.Create;
58 with PB do begin
59 LoadFromProto(StringList);
60 SaveToStream(Stream);
61 end;
62 DisplayStream(Stream);
63 StringList.Free;
64 Stream.Free;
65end;
66
67procedure TMainForm.Button3Click(Sender: TObject);
68begin
69
70end;
71
72procedure TMainForm.Button1Click(Sender: TObject);
73var
74 Stream: TMemoryStreamEx;
75 NewItem: TPBDefinition;
76 PB: TProtocolBuffer;
77begin
78 Stream := TMemoryStreamEx.Create;
79 PB := TProtocolBuffer.Create;
80 with PB do begin
81 with Definition do begin
82 Name := 'SampleMessage';
83 NewItem := TPBDefinition.Create;
84 with TPBDefinition(NewItem) do begin
85 Name := 'Height';
86 Tag := 1;
87 ItemType := itInteger;
88 end;
89 Items.Add(NewItem);
90
91 NewItem := TPBDefinition.Create;
92 with TPBDefinition(NewItem) do begin
93 Name := 'Name';
94 Tag := 2;
95 ItemType := itString;
96 ItemMode := imRepeated;
97 end;
98 Items.Add(NewItem);
99
100 NewItem := TPBDefinition.Create;
101 with TPBDefinition(NewItem) do begin
102 Name := 'Age';
103 Tag := 3;
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
112 Name := 'Address';
113 Tag := 5;
114 ItemType := itMessage;
115 NewItem := TPBDefinition.Create;
116 ItemMode := imOptional;
117 with TPBDefinition(NewItem) do begin
118 Name := 'Street';
119 Tag := 1;
120 ItemType := itString;
121 ItemMode := imOptional;
122 end;
123 Items.Add(NewItem);
124 end;
125 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á';
130// TPBStringItem(PB.BaseMessage.Items[1]).Value := 'Abc';
131 with TPBRepeatedItem(PB.BaseMessage.Items[1]) do begin
132 Items.Add(nil);
133 Items.Add(nil);
134 Clear(TPBDefinition(Definition.Items[1]));
135 TPBStringItem(Items[0]).Value := 'Test';
136 TPBStringItem(Items[1]).Value := 'Hops';
137 end;
138
139 DisplayTree(PB, TreeView1);
140 SaveToStream(Stream);
141 Free;
142 end;
143
144 DisplayStream(Stream);
145 Stream.Position := 0;
146
147 PB := TProtocolBuffer.Create;
148 with PB do begin
149 with Definition do begin
150 Name := 'SampleMessage';
151 NewItem := TPBDefinition.Create;
152 with TPBDefinition(NewItem) do begin
153 Name := 'Height';
154 Tag := 1;
155 ItemType := itInteger;
156 DefaultInteger := 32;
157 end;
158 Items.Add(NewItem);
159
160 NewItem := TPBDefinition.Create;
161 with TPBDefinition(NewItem) do begin
162 Name := 'Name';
163 Tag := 2;
164 ItemType := itString;
165 //ItemMode := imRepeated;
166 DefaultString := 'Billy Joe';
167 end;
168 Items.Add(NewItem);
169
170 NewItem := TPBDefinition.Create;
171 with TPBDefinition(NewItem) do begin
172 Name := 'Work';
173 Tag := 4;
174 ItemType := itString;
175 DefaultString := 'EasyCompany';
176 end;
177 Items.Add(NewItem);
178
179 NewItem := TPBDefinition.Create;
180 Items.Add(NewItem);
181 with TPBDefinition(Items[Items.Count - 1]) do begin
182 Name := 'Address';
183 Tag := 5;
184 ItemType := itMessage;
185 NewItem := TPBDefinition.Create;
186 with TPBDefinition(NewItem) do begin
187 Name := 'Street';
188 Tag := 1;
189 ItemType := itString;
190 DefaultString := 'Ruská';
191 end;
192 Items.Add(NewItem);
193 end;
194 end;
195 BaseMessage.Clear(Definition);
196 LoadFromStream(Stream);
197 DisplayTree(PB, TreeView2);
198 Free;
199 end;
200 Stream.Free;
201end;
202
203procedure TMainForm.FormDestroy(Sender: TObject);
204begin
205end;
206
207procedure TMainForm.DisplayStream(Stream: TStream);
208var
209 I: Integer;
210 Text: string;
211begin
212 Stream.Position := 0;
213 Text := '';
214 for I := 1 to Stream.Size do begin
215 Text := Text + IntToHex(Stream.ReadByte, 2) + ' ';
216 end;
217 Memo1.Lines.Text := Text;
218end;
219
220procedure TMainForm.DisplayTree(ProtocolBuffer: TProtocolBuffer;
221 TreeView: TTreeView);
222begin
223 with TreeView do begin
224 BeginUpdate;
225 Items.Clear;
226 TopItem := Items.Add(nil, 'message');
227 MessageToNode(ProtocolBuffer.BaseMessage, TopItem, ProtocolBuffer.Definition);
228 TopItem.Expand(True);
229 EndUpdate;
230 end;
231end;
232
233procedure TMainForm.ListToNode(PBRepeated: TPBRepeatedItem; Node: TTreeNode;
234 Definition: TPBDefinition);
235var
236 I: Integer;
237 NewNode: TTreeNode;
238begin
239 for I := 0 to PBRepeated.Items.Count - 1 do
240 with Definition do begin
241 NewNode := Node.Owner.AddChild(Node, '');
242 if ItemType = itString then begin
243 NewNode.Text := IntToStr(Tag) + ': string ' + Name + ' = ' +
244 TPBStringItem(PBRepeated.Items[I]).Value;
245 end else
246 if ItemType = itInteger then begin
247 NewNode.Text := IntToStr(Tag) + ': uint32 ' + Name + ' = ' +
248 IntToStr(TPBIntegerItem(PBRepeated.Items[I]).Value);
249 end else
250 if ItemType = itMessage then begin
251 NewNode.Text := IntToStr(Tag) + ': message ' + Name;
252 MessageToNode(TPBMessageItem(PBRepeated.Items[I]), NewNode, Definition);
253 end;
254 end;
255end;
256
257procedure TMainForm.MessageToNode(PBMessage: TPBMessageItem; Node: TTreeNode;
258 Definition: TPBDefinition);
259var
260 I: Integer;
261 NewNode: TTreeNode;
262begin
263 for I := 0 to Definition.Items.Count - 1 do
264 with TPBDefinition(Definition.Items[I]) do begin
265 NewNode := Node.Owner.AddChild(Node, '');
266 if ItemMode = imRepeated then begin
267 NewNode.Text := 'repeated';
268 ListToNode(TPBRepeatedItem(PBMessage.Items[I]), NewNode, Definition.Items[I]);
269 end else
270 if ItemType = itString then begin
271 NewNode.Text := IntToStr(Tag) + ': string ' + Name + ' = ' +
272 TPBStringItem(PBMessage.Items[I]).Value;
273 end else
274 if ItemType = itInteger then begin
275 NewNode.Text := IntToStr(Tag) + ': uint32 ' + Name + ' = ' +
276 IntToStr(TPBIntegerItem(PBMessage.Items[I]).Value);
277 end else
278 if ItemType = itMessage then begin
279 NewNode.Text := IntToStr(Tag) + ': message ' + Name;
280 MessageToNode(TPBMessageItem(PBMessage.Items[I]), NewNode, Definition.Items[I]);
281 end;
282 end;
283end;
284
285initialization
286 {$I UMainForm.lrs}
287
288end.
289
Note: See TracBrowser for help on using the repository browser.