source: oup/current/FileClasses/_FileTypes.pas@ 240

Last change on this file since 240 was 240, checked in by alloc, 18 years ago
File size: 4.6 KB
Line 
1unit _FileTypes;
2
3interface
4
5uses
6 TypeDefs, _TreeElement, Classes, Forms, _DataTypes;
7
8
9type
10 TFile = class(TTreeElement)
11 function GetChildCount: Integer; override;
12 function GetChild(ID: Integer): TTreeElement; override;
13 function GetCaption: String; override;
14 protected
15 FFileInfo: TFileInfo;
16 FFileStream: TMemoryStream;
17 FRawCaches: array of TMemoryStream;
18
19 FCached: Boolean;
20 FChanged: Boolean;
21
22 FDataFields: TBlock;
23
24 FEditor: TFrame;
25 FOpened: Boolean;
26
27 function GetEditor: TFrame;
28 function GetFieldByOffset(Offset: Integer): TDataField;
29 procedure SetOpened(Opened: Boolean); virtual;
30 published
31 public
32 constructor Create(ConnectionID, FileID: Integer); virtual;
33 procedure Free;
34
35 procedure InitDataFields; virtual;
36 procedure InitEditor; virtual;
37
38 procedure ReCreateFile(fs: TStream);
39
40 procedure CacheFile;
41 procedure CacheRawFile(Offset: Integer);
42
43 property FileStream: TMemoryStream read FFileStream;
44 property FileInfo: TFileInfo read FFileInfo;
45
46 property Cached: Boolean read FCached;
47 property Changed: Boolean read FChanged write FChanged;
48
49 property Editor: TFrame read GetEditor;
50 property Opened: Boolean read FOpened write SetOpened;
51
52 property FieldByOffset[Offset: Integer]: TDataField read GetFieldByOffset;
53 end;
54
55
56 TFileType = class of TFile;
57
58
59
60implementation
61
62uses
63 DatLinks, RawList, ConnectionManager, Dialogs, _MetaTypes, _MetaManager;
64
65{ TFileType }
66
67procedure TFile.CacheFile;
68begin
69 if not Assigned(FFileStream) then
70 begin
71 FFileStream := TMemoryStream.Create;
72 ConManager.Connection[FConnectionID].LoadDatFile(FFileInfo.ID, TStream(FFileStream));
73 end;
74end;
75
76
77procedure TFile.CacheRawFile(Offset: Integer);
78var
79 rawlist: TRawDataList;
80 i: Integer;
81begin
82 rawlist := ConManager.Connection[ConnectionID].GetRawList(FFileInfo.ID);
83 if Length(rawlist) > 0 then
84 begin
85 for i := 0 to High(rawlist) do
86 begin
87 if rawlist[i].SrcOffset = Offset then
88 begin
89 if not Assigned(FRawCaches[i]) then
90 begin
91 FRawCaches[i] := TMemoryStream.Create;
92 ConManager.Connection[ConnectionID].LoadRawFile(FFileInfo.ID, Offset, TStream(FRawCaches[i]));
93 end;
94 end;
95 end;
96 end;
97end;
98
99
100procedure TFile.SetOpened(Opened: Boolean);
101begin
102 FOpened := Opened;
103end;
104
105
106constructor TFile.Create(ConnectionID, FileID: Integer);
107begin
108 FConnectionID := ConnectionID;
109 FFileInfo := ConManager.Connection[ConnectionID].GetFileInfo(FileID);
110
111 SetLength(FRawCaches, Length(ConManager.Connection[ConnectionID].GetRawList(FileID)));
112
113 FCached := False;
114 FChanged := False;
115
116 FDataFields := nil;
117 FEditor := nil;
118
119 if not (Self is TFile_Empty) then
120 InitDataFields;
121end;
122
123
124procedure TFile.Free;
125begin
126 FDataFields.Free;
127end;
128
129
130function TFile.GetFieldByOffset(Offset: Integer): TDataField;
131begin
132 Result := FDataFields.FieldByOffset[Offset];
133end;
134
135
136function TFile.GetCaption: String;
137begin
138 Result := FFileInfo.Name;
139 if Result = '' then
140 Result := 'Unnamed';
141end;
142
143function TFile.GetChild(ID: Integer): TTreeElement;
144begin
145 Result := FDataFields.Child[ID];
146end;
147
148function TFile.GetChildCount: Integer;
149begin
150 if FDataFields <> nil then
151 Result := FDataFields.ChildCount
152 else
153 Result := 0;
154end;
155
156
157function TFile.GetEditor: TFrame;
158begin
159 if not Assigned(FEditor) then
160 InitEditor;
161 Result := FEditor;
162end;
163
164
165procedure TFile.InitDataFields;
166begin
167 if Assigned(FDataFields) then
168 Exit;
169 FFileStream := TMemoryStream.Create;
170 ConManager.Connection[FConnectionID].LoadDatFile(FFileInfo.ID, TStream(FFileStream));
171end;
172
173
174procedure TFile.InitEditor;
175begin
176 Exit;
177end;
178
179
180//*********************************************************
181//*********************************************************
182//*********************************************************
183procedure TFile.ReCreateFile(fs: TStream);
184const
185 temp0: array[0..31] of Byte =
186 ($AD,$DE,$AD,$DE,$AD,$DE,$AD,$DE,
187 $AD,$DE,$AD,$DE,$AD,$DE,$AD,$DE,
188 $AD,$DE,$AD,$DE,$AD,$DE,$AD,$DE,
189 $AD,$DE,$AD,$DE,$AD,$DE,$AD,$DE);
190var
191 count: Integer;
192begin
193 FDataFields.WriteData(fs);
194 count := fs.Size mod 32;
195 if count > 0 then
196 fs.Write(temp0[count], 32 - count);
197end;
198//*********************************************************
199//*********************************************************
200//*********************************************************
201
202end.
Note: See TracBrowser for help on using the repository browser.