--- oup/current/FileClasses/_MetaManager.pas 2007/06/12 17:00:48 213 +++ oup/current/FileClasses/_MetaManager.pas 2007/06/20 10:57:51 229 @@ -1,35 +1,29 @@ unit _MetaManager; interface -uses _FileTypes, TXAN, TXMP, _EmptyFile; - -type - TFileType = class of TFile; - TFileDesc = record - ext: String; - ftype: TFileType; - end; - -const - FileDescs: array[0..1] of TFileDesc = ( - (ext: 'TXAN'; ftype: TFile_TXAN), - (ext: 'TXMP'; ftype: TFile_TXMP) - ); +uses _MetaTypes; type TMetaManager = class protected FFiles: array of TFile; + FRoot: TExtensions; FConnectionID: Integer; + FDataAccess: TObject; function GetFileCount: Integer; function GetFileById(Id: Integer): TFile; + function GetExt(Ext: String): TExtension; + procedure AddExt(Ext: String); private - procedure InitRootFiles; + procedure InitExts; public - constructor Create(ConnectionID: Integer); + constructor Create(ConnectionID: Integer; DataAccess: TObject); + procedure InitExtFiles(Ext: String); procedure InitFile(id: Integer); procedure InitFileFields(id: Integer); + property Root: TExtensions read FRoot; + property RootExt[Ext: String]: TExtension read GetExt; property FileCount: Integer read GetFileCount; property FileById[Id: Integer]: TFile read GetFileById; end; @@ -37,14 +31,50 @@ type implementation uses - Classes, ConnectionManager, Access_OniArchive, TypeDefs, Dialogs, SysUtils, StrUtils; + Classes, ConnectionManager, Access_OniArchive, TypeDefs, + Dialogs, SysUtils, StrUtils, DataAccess; { TFileManager } -constructor TMetaManager.Create(ConnectionID: Integer); +constructor TMetaManager.Create(ConnectionID: Integer; DataAccess: TObject); begin FConnectionID := ConnectionID; - InitRootFiles; + FDataAccess := DataAccess; + SetLength(FFiles, TDataAccess(DataAccess).GetFileCount); + InitExts; +end; + +function TMetaManager.GetExt(Ext: String): TExtension; +var + i: Integer; +begin + Result := nil; + if Length(FRoot) > 0 then + for i := 0 to High(FRoot) do + if FRoot[i].Ext = Ext then + begin + Result := FRoot[i]; + Break; + end; +end; + +procedure TMetaManager.AddExt(Ext: String); +var + i: Integer; +begin + SetLength(FRoot, Length(FRoot) + 1); + for i := High(FRoot) downto 1 do + begin + if FRoot[i-1].Ext < Ext then + begin + FRoot[i] := TExtension.Create(FConnectionID, Ext); + Break; + end + else + FRoot[i] := FRoot[i-1]; + end; + if i = 0 then + FRoot[0] := TExtension.Create(FConnectionID, Ext); end; function TMetaManager.GetFileById(Id: Integer): TFile; @@ -73,7 +103,7 @@ begin begin if FileDescs[typei].ext = finfo.Extension then begin - FFiles[id] := TFileType(FileDescs[typei].ftype).Create(FConnectionID, id); + FFiles[id] := TFileClass(FileDescs[typei].ftype).Create(FConnectionID, id); Break; end; end; @@ -99,7 +129,7 @@ begin end; end; -procedure TMetaManager.InitRootFiles; +procedure TMetaManager.InitExtFiles(Ext: String); var files: TStrings; i: Integer; @@ -128,7 +158,7 @@ begin begin if FileDescs[typei].ext = finfo.Extension then begin - FFiles[fid] := TFileType(FileDescs[typei].ftype).Create(FConnectionID, fid); + FFiles[fid] := TFileClass(FileDescs[typei].ftype).Create(FConnectionID, fid); Break; end; end; @@ -143,4 +173,28 @@ begin TAccess_OniArchive(ConManager.Connection[FConnectionID]).UnloadWhenUnused := True; end; +procedure TMetaManager.InitExts; +var + files: TStrings; + i: Integer; + fid: Integer; + finfo: TFileInfo; +begin + files := TStringList.Create; + files := TDataAccess(FDataAccess).GetFilesList('', '', False, ST_IDAsc); + SetLength(FRoot, 0); + if files.Count > 0 then + begin + for i := 0 to files.Count - 1 do + begin + fid := StrToInt(MidStr(files.Strings[i], 1, 5)); + finfo := TDataAccess(FDataAccess).GetFileInfo(fid); + if Length(finfo.Name) > 0 then + if not Assigned(GetExt(finfo.Extension)) then + AddExt(finfo.Extension); + end; + end; + files.Free; +end; + end.