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

Last change on this file since 245 was 245, checked in by alloc, 15 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.