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

Last change on this file since 245 was 245, checked in by alloc, 17 years ago
File size: 6.5 KB
Line 
1unit _FileTypes;
2
3interface
4
5uses
6 TypeDefs, _TreeElement, Classes, Forms, _DataTypes;
7
8
9type
10 TRawCache = record
11 DatOffset: Integer;
12 RawStream: TMemoryStream;
13 end;
14
15 TFile = class(TTreeElement)
16 protected
17 FFileInfo: TFileInfo;
18 FFileStream: TMemoryStream;
19 FRawCaches: array of TRawCache;
20
21 FCached: Boolean;
22 FChanged: Boolean;
23
24 FDataFields: TBlock;
25
26 FEditor: TFrame;
27 FOpened: Boolean;
28
29 function GetChildCount: Integer; override;
30 function GetChild(ID: Integer): TTreeElement; override;
31 function GetCaption: String; override;
32 function GetType: String; override;
33 function GetEditor: TFrame;
34 function GetFieldByOffset(Offset: Integer): TDataField;
35 function GetRawCacheID(Offset: Integer): Integer;
36 procedure SetOpened(Opened: Boolean); virtual;
37 published
38 public
39 constructor Create(ConnectionID, FileID: Integer); virtual;
40 procedure Free;
41
42 procedure InitDataFields; virtual;
43 procedure InitEditor; virtual;
44
45 procedure ReCreateFile(fs: TStream);
46
47 procedure CacheFile;
48 procedure CacheRawFile(Offset: Integer);
49 procedure CacheAllRawFiles;
50 procedure DiscardFileCache;
51 procedure DiscardRawCache(Offset: Integer);
52 procedure DiscardAllRawCaches;
53 procedure StoreFileCache;
54 procedure StoreRawCache(Offset: Integer);
55 procedure StoreAllRawCaches;
56
57 property FileStream: TMemoryStream read FFileStream;
58 property FileInfo: TFileInfo read FFileInfo;
59
60 property Cached: Boolean read FCached;
61 property Changed: Boolean read FChanged write FChanged;
62
63 property Editor: TFrame read GetEditor;
64 property Opened: Boolean read FOpened write SetOpened;
65
66 property FieldByOffset[Offset: Integer]: TDataField read GetFieldByOffset;
67 end;
68
69
70 TFileType = class of TFile;
71
72
73
74implementation
75
76uses
77 DatLinks, RawList, ConnectionManager, Dialogs, _MetaTypes, _MetaManager,
78 SysUtils;
79
80{ TFileType }
81
82procedure TFile.CacheFile;
83begin
84 if not Assigned(FFileStream) then
85 begin
86 FFileStream := TMemoryStream.Create;
87 ConManager.Connection[FConnectionID].LoadDatFile(FFileInfo.ID, TStream(FFileStream));
88 end;
89end;
90
91
92procedure TFile.CacheRawFile(Offset: Integer);
93var
94 i: Integer;
95begin
96 for i := 0 to High(FRawCaches) do
97 begin
98 if FRawCaches[i].DatOffset = Offset then
99 begin
100 if not Assigned(FRawCaches[i].RawStream) then
101 begin
102 FRawCaches[i].RawStream := TMemoryStream.Create;
103 ConManager.Connection[ConnectionID].LoadRawFile(FFileInfo.ID, Offset, TStream(FRawCaches[i].RawStream));
104 end;
105 end;
106 end;
107end;
108
109procedure TFile.CacheAllRawFiles;
110var
111 i: Integer;
112begin
113 for i := 0 to High(FRawCaches) do
114 CacheRawFile(FRawCaches[i].DatOffset);
115end;
116
117
118
119procedure TFile.DiscardFileCache;
120begin
121 if Assigned(FFileStream) then
122 FFileStream.Free;
123 FFileStream := nil;
124end;
125
126procedure TFile.DiscardRawCache(Offset: Integer);
127var
128 i: Integer;
129begin
130 for i := 0 to High(FRawCaches) do
131 begin
132 if FRawCaches[i].DatOffset = Offset then
133 begin
134 if Assigned(FRawCaches[i].RawStream) then
135 FRawCaches[i].RawStream.Free;
136 FRawCaches[i].RawStream := nil;
137 end;
138 end;
139end;
140
141procedure TFile.DiscardAllRawCaches;
142var
143 i: Integer;
144begin
145 for i := 0 to High(FRawCaches) do
146 DiscardRawCache(FRawCaches[i].DatOffset);
147end;
148
149procedure TFile.StoreFileCache;
150begin
151 Exit;
152end;
153
154procedure TFile.StoreRawCache(Offset: Integer);
155begin
156 Exit;
157end;
158
159procedure TFile.StoreAllRawCaches;
160var
161 i: Integer;
162begin
163 for i := 0 to High(FRawCaches) do
164 StoreRawCache(FRawCaches[i].DatOffset);
165end;
166
167
168
169
170
171procedure TFile.SetOpened(Opened: Boolean);
172begin
173 FOpened := Opened;
174end;
175
176
177constructor TFile.Create(ConnectionID, FileID: Integer);
178var
179 rawlist: TRawDataList;
180 i: Integer;
181begin
182 FConnectionID := ConnectionID;
183 FFileInfo := ConManager.Connection[ConnectionID].GetFileInfo(FileID);
184
185 rawlist := ConManager.Connection[ConnectionID].GetRawList(FileID);
186 SetLength(FRawCaches, Length(rawlist));
187 for i := 0 to High(rawlist) do
188 FRawCaches[i].DatOffset := rawlist[i].SrcOffset;
189
190 FCached := False;
191 FChanged := False;
192
193 FDataFields := nil;
194 FEditor := nil;
195
196 if not (Self is TFile_Empty) then
197 InitDataFields;
198end;
199
200
201procedure TFile.Free;
202begin
203 FDataFields.Free;
204end;
205
206
207function TFile.GetFieldByOffset(Offset: Integer): TDataField;
208begin
209 Result := FDataFields.FieldByOffset[Offset];
210end;
211
212
213function TFile.GetRawCacheID(Offset: Integer): Integer;
214var
215 i: Integer;
216begin
217 Result := -1;
218 for i := 0 to High(FRawCaches) do
219 if FRawCaches[i].DatOffset = Offset then
220 Result := i;
221end;
222
223function TFile.GetType: String;
224begin
225 Result := FFileInfo.Extension;
226end;
227
228function TFile.GetCaption: String;
229begin
230 Result := FFileInfo.Name;
231 if Result = '' then
232 Result := 'Unnamed';
233 Result := Result + ' (' + IntToStr(FFileInfo.ID) + ')';
234end;
235
236function TFile.GetChild(ID: Integer): TTreeElement;
237begin
238 Result := FDataFields.Child[ID];
239end;
240
241function TFile.GetChildCount: Integer;
242begin
243 if FDataFields <> nil then
244 Result := FDataFields.ChildCount
245 else
246 Result := 0;
247end;
248
249
250function TFile.GetEditor: TFrame;
251begin
252 if not Assigned(FEditor) then
253 InitEditor;
254 Result := FEditor;
255end;
256
257
258procedure TFile.InitDataFields;
259begin
260 if Assigned(FDataFields) then
261 Exit;
262 FFileStream := TMemoryStream.Create;
263 ConManager.Connection[FConnectionID].LoadDatFile(FFileInfo.ID, TStream(FFileStream));
264end;
265
266
267procedure TFile.InitEditor;
268begin
269 Exit;
270end;
271
272
273//*********************************************************
274//*********************************************************
275//*********************************************************
276procedure TFile.ReCreateFile(fs: TStream);
277const
278 temp0: array[0..31] of Byte =
279 ($AD,$DE,$AD,$DE,$AD,$DE,$AD,$DE,
280 $AD,$DE,$AD,$DE,$AD,$DE,$AD,$DE,
281 $AD,$DE,$AD,$DE,$AD,$DE,$AD,$DE,
282 $AD,$DE,$AD,$DE,$AD,$DE,$AD,$DE);
283var
284 count: Integer;
285begin
286 FDataFields.WriteData(fs);
287 count := fs.Size mod 32;
288 if count > 0 then
289 fs.Write(temp0[count], 32 - count);
290end;
291//*********************************************************
292//*********************************************************
293//*********************************************************
294
295end.
Note: See TracBrowser for help on using the repository browser.