source: oup/current/FileClasses/_DataTypes.pas@ 234

Last change on this file since 234 was 234, checked in by alloc, 18 years ago
File size: 15.4 KB
Line 
1unit _DataTypes;
2
3interface
4
5uses
6 Classes, _TreeElement;
7
8type
9 TDataField = class(TTreeElement)
10 function GetChildCount: Integer; override;
11 function GetChild(ID: Integer): TTreeElement; override;
12 function GetCaption: String; override;
13 protected
14 FOffset: Integer;
15 FName: String;
16 FDescription: String;
17 FDataLength: Integer;
18 FParentFile: TObject;
19 FParentField: TDataField;
20 FChanged: Boolean;
21 function GetValueAsString: String; virtual; abstract;
22 public
23 constructor Create(ParentFile: TObject; ParentField: TDataField;
24 Offset: Integer; Name, Description: String; ExtraArgs: Pointer); virtual;
25
26 procedure Update(Offset, Length: Integer); virtual; abstract;
27
28 property Offset: Integer read FOffset;
29 property Name: String read FName;
30 property Description: String read FDescription;
31 property DataLength: Integer read FDataLength;
32 property ValueAsString: String read GetValueAsString;
33 end;
34
35 TFieldType = class of TDataField;
36
37
38 TBlock = class(TDataField)
39 private
40 FDataFields: array of TDataField;
41 FBlockLength: Integer;
42 function GetChildCount: Integer; override;
43 function GetChild(ID: Integer): TTreeElement; override;
44 function GetFieldByOffset(Offset: Integer): TDataField;
45 public
46 // ExtraArgs: Pointer auf Integer: BlockLength
47 constructor Create(ParentFile: TObject; ParentField: TDataField;
48 Offset: Integer; Name, Description: String; ExtraArgs: Pointer); override;
49 procedure Update(Offset, Length: Integer); override;
50 property FieldByOffset[Offset: Integer]: TDataField read GetFieldByOffset;
51
52 function AddField(fieldtype: TFieldType; Offset: Integer;
53 Name, Description: String; ExtraArgs: Pointer): TDataField;
54 end;
55
56
57 TInt = class(TDataField)
58 private
59 FInt: Integer;
60 function GetValueAsString: String; override;
61 public
62 // ExtraArgs: Pointer auf Integer: Bytes of TInt
63 constructor Create(ParentFile: TObject; ParentField: TDataField;
64 Offset: Integer; Name, Description: String; ExtraArgs: Pointer); override;
65 procedure Update(Offset, Length: Integer); override;
66 end;
67
68
69 TBitSet = class(TDataField)
70 private
71 FBits: Byte;
72 FNames: TStringList;
73 function GetValueAsString: String; override;
74 public
75 // ExtraArgs: Pointer auf TStringList
76 constructor Create(ParentFile: TObject; ParentField: TDataField;
77 Offset: Integer; Name, Description: String; ExtraArgs: Pointer); override;
78 procedure Update(Offset, Length: Integer); override;
79 end;
80
81
82 TLevelID = class(TDataField)
83 private
84 FLevelID: Integer;
85 function GetValueAsString: String; override;
86 public
87 // ExtraArgs: keine
88 constructor Create(ParentFile: TObject; ParentField: TDataField;
89 Offset: Integer; Name, Description: String; ExtraArgs: Pointer); override;
90 procedure Update(Offset, Length: Integer); override;
91 end;
92
93
94 TFileID = class(TDataField)
95 private
96 FFileID: Integer;
97 function GetValueAsString: String; override;
98 public
99 // ExtraArgs: keine
100 constructor Create(ParentFile: TObject; ParentField: TDataField;
101 Offset: Integer; Name, Description: String; ExtraArgs: Pointer); override;
102 procedure Update(Offset, Length: Integer); override;
103 end;
104
105
106 TLinkByID = class(TDataField)
107 function GetChildCount: Integer; override;
108 function GetChild(ID: Integer): TTreeElement; override;
109 private
110 FFileID: Integer;
111 FPosExts: String;
112 function GetValueAsString: String; override;
113 public
114 // ExtraArgs: Pointer auf String: Possible Exts
115 constructor Create(ParentFile: TObject; ParentField: TDataField;
116 Offset: Integer; Name, Description: String; ExtraArgs: Pointer); override;
117 procedure Update(Offset, Length: Integer); override;
118 end;
119
120
121 TString = class(TDataField)
122 private
123 FString: String;
124 function GetValueAsString: String; override;
125 public
126 // ExtraArgs: Pointer auf Integer: Length
127 constructor Create(ParentFile: TObject; ParentField: TDataField;
128 Offset: Integer; Name, Description: String; ExtraArgs: Pointer); override;
129 procedure Update(Offset, Length: Integer); override;
130 end;
131
132
133 TArrayArgs = packed record
134 CounterSize: Integer;
135 BlockLength: Integer;
136 BlockCount: Integer;
137 end;
138 TArray = class(TDataField)
139 private
140 FDataFields: array of TBlock;
141 function GetChildCount: Integer; override;
142 function GetChild(ID: Integer): TTreeElement; override;
143 function GetFieldByOffset(Offset: Integer): TDataField;
144 public
145 // ExtraArgs: Pointer auf 3 Integer: CounterSize+Length+Count (packed record...)
146 constructor Create(ParentFile: TObject; ParentField: TDataField;
147 Offset: Integer; Name, Description: String; ExtraArgs: Pointer); override;
148 procedure Update(Offset, Length: Integer); override;
149
150 function AddField(fieldtype: TFieldType; Offset: Integer;
151 Name, Description: String; ExtraArgs: Pointer): TDataField;
152 end;
153
154
155 TRawLink = class(TDataField)
156 private
157 FRawAddress: Integer;
158 function GetValueAsString: String; override;
159 public
160 // ExtraArgs: keine
161 constructor Create(ParentFile: TObject; ParentField: TDataField;
162 Offset: Integer; Name, Description: String; ExtraArgs: Pointer); override;
163 procedure Update(Offset, Length: Integer); override;
164 end;
165
166
167 TUnused = class(TDataField)
168 private
169 function GetValueAsString: String; override;
170 public
171 // ExtraArgs: Pointer auf Integer: Length
172 constructor Create(ParentFile: TObject; ParentField: TDataField;
173 Offset: Integer; Name, Description: String; ExtraArgs: Pointer); override;
174 procedure Update(Offset, Length: Integer); override;
175 end;
176
177
178
179
180implementation
181
182uses
183 SysUtils, Dialogs, _FileTypes, ConnectionManager;
184
185
186
187
188{ TDataType }
189
190constructor TDataField.Create(ParentFile: TObject; ParentField: TDataField;
191 Offset: Integer; Name, Description: String; ExtraArgs: Pointer);
192begin
193 FOffset := Offset;
194 FName := Name;
195 FDescription := Description;
196 FParentFile := ParentFile;
197 FParentField := ParentField;
198 FConnectionID := TFile(ParentFile).ConnectionID;
199end;
200
201function TDataField.GetCaption: String;
202begin
203 Result := FName;
204end;
205
206function TDataField.GetChild(ID: Integer): TTreeElement;
207begin
208 Result := nil;
209end;
210
211function TDataField.GetChildCount: Integer;
212begin
213 Result := 0;
214end;
215
216
217
218{ TString }
219
220constructor TString.Create(ParentFile: TObject; ParentField: TDataField;
221 Offset: Integer; Name, Description: String; ExtraArgs: Pointer);
222var
223 fstream: TMemoryStream;
224 i: Integer;
225begin
226 inherited Create(ParentFile, ParentField, Offset, Name, Description, ExtraArgs);
227 FDataLength := Integer(ExtraArgs^);
228 fstream := TFile(ParentFile).FileStream;
229 fstream.Seek(Offset, soFromBeginning);
230 SetLength(FString, FDataLength);
231 fstream.Read(FString[1], FDataLength);
232 for i := 1 to FDataLength do
233 if FString[i] = Chr(0) then
234 begin
235 SetLength(FString, i - 1);
236 Break;
237 end;
238end;
239
240function TString.GetValueAsString: String;
241begin
242 Result := FString;
243end;
244
245procedure TString.Update(Offset, Length: Integer);
246begin
247 Exit;
248end;
249
250
251
252{ TInt }
253
254constructor TInt.Create(ParentFile: TObject; ParentField: TDataField;
255 Offset: Integer; Name, Description: String; ExtraArgs: Pointer);
256var
257 fstream: TMemoryStream;
258begin
259 inherited Create(ParentFile, ParentField, Offset, Name, Description, ExtraArgs);
260 FDataLength := Integer(ExtraArgs^);
261 FInt := 0;
262 fstream := TFile(ParentFile).FileStream;
263 fstream.Seek(Offset, soFromBeginning);
264 fstream.Read(FInt, FDataLength);
265end;
266
267function TInt.GetValueAsString: String;
268begin
269 Result := IntToStr(FInt);
270end;
271
272procedure TInt.Update(Offset, Length: Integer);
273begin
274 Exit;
275end;
276
277
278
279{ TArray }
280
281function TArray.AddField(fieldtype: TFieldType; Offset: Integer;
282 Name, Description: String; ExtraArgs: Pointer): TDataField;
283var
284 i: Integer;
285begin
286(*
287 if Length(FDataFields) > 0 then
288 begin
289 for i := 0 to High(FDataFields) do
290 if FDataFields[i].FOffset = Offset then
291 Break;
292 if i < Length(FDataFields) then
293 begin
294 ShowMessage('Field already exists');
295 Exit;
296 end;
297 end;
298 SetLength(FDataFields, Length(FDataFields) + 1);
299 FDataFields[High(FDataFields)] := TFieldType(fieldtype).Create(
300 FParentFile, Self, Offset, Name, Description, ExtraArgs);
301 Result := FDataFields[High(FDataFields)];
302*)
303end;
304
305constructor TArray.Create(ParentFile: TObject; ParentField: TDataField;
306 Offset: Integer; Name, Description: String; ExtraArgs: Pointer);
307var
308 i: Integer;
309 args: TArrayArgs;
310 fstream: TMemoryStream;
311begin
312 inherited Create(ParentFile, ParentField, Offset, Name, Description, ExtraArgs);
313 args := TArrayArgs(ExtraArgs^);
314 if args.CounterSize > 0 then
315 begin
316 fstream := TFile(ParentFile).FileStream;
317 fstream.Seek(Offset, soFromBeginning);
318 args.BlockCount := 0;
319 fstream.Read(args.BlockCount, args.CounterSize);
320 end;
321 SetLength(FDataFields, args.BlockCount);
322 if Length(FDataFields) > 0 then
323 begin
324 for i := 0 to High(FDataFields) do
325 begin
326 FDataFields[i] := TBlock.Create(ParentFile, Self,
327 Offset + args.CounterSize + i * args.BlockLength, Name+'['+IntToStr(i)+']', '', @args.BlockLength);
328 end;
329 end;
330end;
331
332function TArray.GetChildCount: Integer;
333begin
334 Result := Length(FDataFields);
335end;
336
337function TArray.GetChild(ID: Integer): TTreeElement;
338begin
339 Result := FDataFields[ID];
340end;
341
342function TArray.GetFieldByOffset(Offset: Integer): TDataField;
343begin
344 Exit;
345end;
346
347procedure TArray.Update(Offset, Length: Integer);
348begin
349 Exit;
350end;
351
352
353
354{ TBlock }
355
356function TBlock.AddField(fieldtype: TFieldType; Offset: Integer; Name,
357 Description: String; ExtraArgs: Pointer): TDataField;
358var
359 i: Integer;
360begin
361 if Length(FDataFields) > 0 then
362 begin
363 for i := 0 to High(FDataFields) do
364 if FDataFields[i].FOffset = Offset then
365 Break;
366 if i < Length(FDataFields) then
367 begin
368 ShowMessage('Field already exists');
369 Exit;
370 end;
371 end;
372 SetLength(FDataFields, Length(FDataFields) + 1);
373 FDataFields[High(FDataFields)] := TFieldType(fieldtype).Create(
374 FParentFile, Self, Offset, Name, Description, ExtraArgs);
375 Result := FDataFields[High(FDataFields)];
376end;
377
378constructor TBlock.Create(ParentFile: TObject; ParentField: TDataField;
379 Offset: Integer; Name, Description: String; ExtraArgs: Pointer);
380begin
381 inherited Create(ParentFile, ParentField, Offset, Name, Description, ExtraArgs);
382 if ExtraArgs <> nil then
383 FBlockLength := Integer(ExtraArgs^)
384 else
385 FBlockLength := -1;
386end;
387
388function TBlock.GetChild(ID: Integer): TTreeElement;
389begin
390 Result := FDataFields[ID];
391end;
392
393function TBlock.GetChildCount: Integer;
394begin
395 Result := Length(FDataFields);
396end;
397
398function TBlock.GetFieldByOffset(Offset: Integer): TDataField;
399begin
400 Exit;
401end;
402
403procedure TBlock.Update(Offset, Length: Integer);
404begin
405 Exit;
406end;
407
408
409
410{ TLevelID }
411
412constructor TLevelID.Create(ParentFile: TObject; ParentField: TDataField;
413 Offset: Integer; Name, Description: String; ExtraArgs: Pointer);
414var
415 fstream: TMemoryStream;
416begin
417 inherited Create(ParentFile, ParentField, Offset, Name, Description, ExtraArgs);
418 FDataLength := 4;
419 fstream := TFile(ParentFile).FileStream;
420 fstream.Seek(Offset, soFromBeginning);
421 fstream.Read(FLevelID, 4);
422 FLevelID := FLevelID div 256 div 256 div 256 div 2;
423end;
424
425function TLevelID.GetValueAsString: String;
426begin
427 Result := IntToStr(FLevelID);
428end;
429
430procedure TLevelID.Update(Offset, Length: Integer);
431begin
432 Exit;
433end;
434
435
436
437{ TFileID }
438
439constructor TFileID.Create(ParentFile: TObject; ParentField: TDataField;
440 Offset: Integer; Name, Description: String; ExtraArgs: Pointer);
441var
442 fstream: TMemoryStream;
443begin
444 inherited Create(ParentFile, ParentField, Offset, Name, Description, ExtraArgs);
445 FDataLength := 4;
446 fstream := TFile(ParentFile).FileStream;
447 fstream.Seek(Offset, soFromBeginning);
448 fstream.Read(FFileID, 4);
449 if FFileID > 0 then
450 FFileID := FFileID div 256
451 else
452 FFileID := -1;
453end;
454
455function TFileID.GetValueAsString: String;
456begin
457 Result := IntToStr(FFileID);
458end;
459
460procedure TFileID.Update(Offset, Length: Integer);
461begin
462 Exit;
463end;
464
465
466
467{ TLinkByID }
468
469constructor TLinkByID.Create(ParentFile: TObject; ParentField: TDataField;
470 Offset: Integer; Name, Description: String; ExtraArgs: Pointer);
471var
472 fstream: TMemoryStream;
473begin
474 inherited Create(ParentFile, ParentField, Offset, Name, Description, ExtraArgs);
475 FDataLength := 4;
476 FPosExts := String(ExtraArgs^);
477 fstream := TFile(ParentFile).FileStream;
478 fstream.Seek(Offset, soFromBeginning);
479 fstream.Read(FFileID, 4);
480 if FFileID > 0 then
481 FFileID := FFileID div 256
482 else
483 FFileID := -1;
484end;
485
486function TLinkByID.GetChild(ID: Integer): TTreeElement;
487begin
488 if FFileID > 0 then
489 Result := ConManager.Connection[FConnectionID].MetaData.FileById[FFileID].Child[ID]
490 else
491 Result := nil;
492end;
493
494function TLinkByID.GetChildCount: Integer;
495begin
496 if FFileID > 0 then
497 Result := ConManager.Connection[FConnectionID].MetaData.FileById[FFileID].ChildCount
498 else
499 Result := 0;
500end;
501
502function TLinkByID.GetValueAsString: String;
503begin
504 Result := IntToStr(FFileID);
505end;
506
507procedure TLinkByID.Update(Offset, Length: Integer);
508begin
509 Exit;
510end;
511
512
513
514{ TRawLink }
515
516constructor TRawLink.Create(ParentFile: TObject; ParentField: TDataField;
517 Offset: Integer; Name, Description: String; ExtraArgs: Pointer);
518var
519 fstream: TMemoryStream;
520begin
521 inherited Create(ParentFile, ParentField, Offset, Name, Description, ExtraArgs);
522 FDataLength := 4;
523 fstream := TFile(ParentFile).FileStream;
524 fstream.Seek(Offset, soFromBeginning);
525 fstream.Read(FRawAddress, 4);
526end;
527
528function TRawLink.GetValueAsString: String;
529begin
530 Result := IntToStr(FRawAddress);
531end;
532
533procedure TRawLink.Update(Offset, Length: Integer);
534begin
535 Exit;
536end;
537
538
539
540{ TUnused }
541
542constructor TUnused.Create(ParentFile: TObject; ParentField: TDataField;
543 Offset: Integer; Name, Description: String; ExtraArgs: Pointer);
544begin
545 inherited Create(ParentFile, ParentField, Offset, Name, Description, ExtraArgs);
546 FDataLength := Integer(ExtraArgs^);
547end;
548
549function TUnused.GetValueAsString: String;
550begin
551 Result := '';
552end;
553
554procedure TUnused.Update(Offset, Length: Integer);
555begin
556 Exit;
557end;
558
559
560
561{ TBitSet }
562
563constructor TBitSet.Create(ParentFile: TObject; ParentField: TDataField;
564 Offset: Integer; Name, Description: String; ExtraArgs: Pointer);
565var
566 fstream: TMemoryStream;
567begin
568 inherited Create(ParentFile, ParentField, Offset, Name, Description, ExtraArgs);
569 FNames := TStringList.Create;
570 FNames.AddStrings(TStringList(ExtraArgs^));
571 FDataLength := 1;
572 FBits := 0;
573 fstream := TFile(ParentFile).FileStream;
574 fstream.Seek(Offset, soFromBeginning);
575 fstream.Read(FBits, FDataLength);
576end;
577
578function TBitSet.GetValueAsString: String;
579begin
580 Result := IntToStr(FBits);
581end;
582
583procedure TBitSet.Update(Offset, Length: Integer);
584begin
585 Exit;
586end;
587
588end.
Note: See TracBrowser for help on using the repository browser.