source: oup/current/FileClasses/_MetaManager.pas@ 232

Last change on this file since 232 was 229, checked in by alloc, 17 years ago
File size: 5.3 KB
RevLine 
[212]1unit _MetaManager;
2interface
3
[228]4uses _MetaTypes;
[212]5
6type
7 TMetaManager = class
8 protected
9 FFiles: array of TFile;
[229]10 FRoot: TExtensions;
[212]11 FConnectionID: Integer;
[229]12 FDataAccess: TObject;
[212]13 function GetFileCount: Integer;
14 function GetFileById(Id: Integer): TFile;
[229]15 function GetExt(Ext: String): TExtension;
16 procedure AddExt(Ext: String);
[212]17 private
[229]18 procedure InitExts;
[212]19 public
[229]20 constructor Create(ConnectionID: Integer; DataAccess: TObject);
21 procedure InitExtFiles(Ext: String);
[212]22 procedure InitFile(id: Integer);
[213]23 procedure InitFileFields(id: Integer);
[212]24
[229]25 property Root: TExtensions read FRoot;
26 property RootExt[Ext: String]: TExtension read GetExt;
[212]27 property FileCount: Integer read GetFileCount;
28 property FileById[Id: Integer]: TFile read GetFileById;
29 end;
30
31implementation
32
33uses
[228]34 Classes, ConnectionManager, Access_OniArchive, TypeDefs,
[229]35 Dialogs, SysUtils, StrUtils, DataAccess;
[212]36
37{ TFileManager }
38
[229]39constructor TMetaManager.Create(ConnectionID: Integer; DataAccess: TObject);
[212]40begin
41 FConnectionID := ConnectionID;
[229]42 FDataAccess := DataAccess;
43 SetLength(FFiles, TDataAccess(DataAccess).GetFileCount);
44 InitExts;
[212]45end;
46
[229]47function TMetaManager.GetExt(Ext: String): TExtension;
48var
49 i: Integer;
50begin
51 Result := nil;
52 if Length(FRoot) > 0 then
53 for i := 0 to High(FRoot) do
54 if FRoot[i].Ext = Ext then
55 begin
56 Result := FRoot[i];
57 Break;
58 end;
59end;
60
61procedure TMetaManager.AddExt(Ext: String);
62var
63 i: Integer;
64begin
65 SetLength(FRoot, Length(FRoot) + 1);
66 for i := High(FRoot) downto 1 do
67 begin
68 if FRoot[i-1].Ext < Ext then
69 begin
70 FRoot[i] := TExtension.Create(FConnectionID, Ext);
71 Break;
72 end
73 else
74 FRoot[i] := FRoot[i-1];
75 end;
76 if i = 0 then
77 FRoot[0] := TExtension.Create(FConnectionID, Ext);
78end;
79
[212]80function TMetaManager.GetFileById(Id: Integer): TFile;
81begin
82 Result := FFiles[Id];
83end;
84
85function TMetaManager.GetFileCount: Integer;
86begin
87 Result := Length(FFiles);
88end;
89
90procedure TMetaManager.InitFile(id: Integer);
91var
92 typei: Integer;
93 finfo: TFileInfo;
94begin
95 if id < ConManager.Connection[FConnectionID].GetFileCount then
96 begin
97 if not Assigned(FFiles[id]) then
98 begin
99 finfo := ConManager.Connection[FConnectionID].GetFileInfo(id);
100 if finfo.Size > 0 then
101 begin
102 for typei := 0 to High(FileDescs) do
103 begin
104 if FileDescs[typei].ext = finfo.Extension then
105 begin
[228]106 FFiles[id] := TFileClass(FileDescs[typei].ftype).Create(FConnectionID, id);
[212]107 Break;
108 end;
109 end;
110 if typei > High(FileDescs) then
111 FFiles[id] := TFile_Empty.Create(FConnectionID, id);
112 end else
113 FFiles[id] := TFile_Empty.Create(FConnectionID, id);
114 Exit;
115 end;
116 end;
117end;
118
[213]119procedure TMetaManager.InitFileFields(id: Integer);
120begin
121 if id < ConManager.Connection[FConnectionID].GetFileCount then
122 begin
123 if not Assigned(FFiles[id]) then
124 begin
125 InitFile(id);
126 if not (FFiles[id] is TFile_Empty) then
127 FFiles[id].InitDataFields;
128 end;
129 end;
130end;
131
[229]132procedure TMetaManager.InitExtFiles(Ext: String);
[212]133var
134 files: TStrings;
135 i: Integer;
136 typei: Integer;
137 fid: Integer;
138 finfo: TFileInfo;
139begin
140 if ConManager.Connection[FConnectionID] is TAccess_OniArchive then
141 TAccess_OniArchive(ConManager.Connection[FConnectionID]).UnloadWhenUnused := False;
142 files := TStringList.Create;
143 files := ConManager.Connection[FConnectionID].GetFilesList('', '', False, ST_IDAsc);
144 SetLength(FFiles, ConManager.Connection[FConnectionID].GetFileCount);
145 for i := 0 to High(FFiles) do
146 FFiles[i] := nil;
147 if files.Count > 0 then
148 begin
149 for i := 0 to files.Count - 1 do
150 begin
151 fid := StrToInt(MidStr(files.Strings[i], 1, 5));
152 finfo := ConManager.Connection[FConnectionID].GetFileInfo(fid);
153 if Length(finfo.Name) > 0 then
154 begin
155 if finfo.Size > 0 then
156 begin
157 for typei := 0 to High(FileDescs) do
158 begin
159 if FileDescs[typei].ext = finfo.Extension then
160 begin
[228]161 FFiles[fid] := TFileClass(FileDescs[typei].ftype).Create(FConnectionID, fid);
[212]162 Break;
163 end;
164 end;
165 end
166 else
167 FFiles[fid] := TFile_Empty.Create(FConnectionID, fid);
168 end;
169 end;
170 end;
171 files.Free;
172 if ConManager.Connection[FConnectionID] is TAccess_OniArchive then
173 TAccess_OniArchive(ConManager.Connection[FConnectionID]).UnloadWhenUnused := True;
174end;
175
[229]176procedure TMetaManager.InitExts;
177var
178 files: TStrings;
179 i: Integer;
180 fid: Integer;
181 finfo: TFileInfo;
182begin
183 files := TStringList.Create;
184 files := TDataAccess(FDataAccess).GetFilesList('', '', False, ST_IDAsc);
185 SetLength(FRoot, 0);
186 if files.Count > 0 then
187 begin
188 for i := 0 to files.Count - 1 do
189 begin
190 fid := StrToInt(MidStr(files.Strings[i], 1, 5));
191 finfo := TDataAccess(FDataAccess).GetFileInfo(fid);
192 if Length(finfo.Name) > 0 then
193 if not Assigned(GetExt(finfo.Extension)) then
194 AddExt(finfo.Extension);
195 end;
196 end;
197 files.Free;
198end;
199
[212]200end.
Note: See TracBrowser for help on using the repository browser.