mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-26 15:10:25 +02:00
* Add LoadKnownTypes to load default set from OS (including registry on windows)
git-svn-id: trunk@42820 -
This commit is contained in:
parent
2a394402aa
commit
b81b4a3aa6
@ -46,9 +46,18 @@ Type
|
|||||||
Protected
|
Protected
|
||||||
Function FindMimeByType(Const AMime : String) : TMimeType;
|
Function FindMimeByType(Const AMime : String) : TMimeType;
|
||||||
Function FindMimeByExt(Const AExt : String) : TMimeType;
|
Function FindMimeByExt(Const AExt : String) : TMimeType;
|
||||||
|
Function DefaultMimeTypesLocation : String; virtual;
|
||||||
|
{$IFDEF WINDOWS}
|
||||||
|
Procedure LoadFromRegistry;
|
||||||
|
{$ENDIF}
|
||||||
Public
|
Public
|
||||||
Constructor Create(AOwner : TComponent); override;
|
Constructor Create(AOwner : TComponent); override;
|
||||||
Destructor Destroy; override;
|
Destructor Destroy; override;
|
||||||
|
// clear list
|
||||||
|
Procedure Clear;
|
||||||
|
// Load known types from OS.
|
||||||
|
// On unixy types, this reads from /etc/mime.types, on windows this reads from registry and from mime.types located next to binary
|
||||||
|
Procedure LoadKnownTypes; virtual;
|
||||||
// Extract an extension from an extension list as returned by GetMimeExtensions
|
// Extract an extension from an extension list as returned by GetMimeExtensions
|
||||||
class function GetNextExtension(var E: String): string;
|
class function GetNextExtension(var E: String): string;
|
||||||
// Load from stream
|
// Load from stream
|
||||||
@ -72,6 +81,10 @@ Function MimeTypes : TFPMimeTypes;
|
|||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
{$IFDEF WINDOWS}
|
||||||
|
uses registry;
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
{ TFPMimeTypes }
|
{ TFPMimeTypes }
|
||||||
var
|
var
|
||||||
FTypes : TFPMimeTypes;
|
FTypes : TFPMimeTypes;
|
||||||
@ -117,6 +130,7 @@ Var
|
|||||||
S : String;
|
S : String;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
Extensions:='';
|
||||||
P:=1;
|
P:=1;
|
||||||
Mime:=GetNextWord(ALine,p);
|
Mime:=GetNextWord(ALine,p);
|
||||||
Repeat
|
Repeat
|
||||||
@ -161,6 +175,20 @@ begin
|
|||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function TFPMimeTypes.DefaultMimeTypesLocation: String;
|
||||||
|
begin
|
||||||
|
{$IFDEF windows}
|
||||||
|
Result:=ExtractFilePath(ParamStr(0));
|
||||||
|
{$ELSE}
|
||||||
|
{$IFDEF DARWIN}
|
||||||
|
Result:='/private/etc/apache2/';
|
||||||
|
{$ELSE}
|
||||||
|
Result:='/etc/';
|
||||||
|
{$ENDIF}
|
||||||
|
{$ENDIF}
|
||||||
|
end;
|
||||||
|
|
||||||
constructor TFPMimeTypes.Create(AOwner: TComponent);
|
constructor TFPMimeTypes.Create(AOwner: TComponent);
|
||||||
begin
|
begin
|
||||||
inherited Create(AOwner);
|
inherited Create(AOwner);
|
||||||
@ -170,6 +198,15 @@ end;
|
|||||||
|
|
||||||
destructor TFPMimeTypes.Destroy;
|
destructor TFPMimeTypes.Destroy;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Clear;
|
||||||
|
FreeAndNil(FTypes);
|
||||||
|
FreeAndNil(FExtensions);
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TFPMimeTypes.Clear;
|
||||||
|
|
||||||
Var
|
Var
|
||||||
T : TMimeType;
|
T : TMimeType;
|
||||||
I : integer;
|
I : integer;
|
||||||
@ -180,11 +217,67 @@ begin
|
|||||||
T:=TMimeType(FTypes.Items[i]);
|
T:=TMimeType(FTypes.Items[i]);
|
||||||
FreeAndNil(T);
|
FreeAndNil(T);
|
||||||
end;
|
end;
|
||||||
FreeAndNil(FTypes);
|
FTypes.Clear;
|
||||||
FreeAndNil(FExtensions);
|
FExtensions.Clear;
|
||||||
inherited Destroy;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TFPMimeTypes.LoadKnownTypes;
|
||||||
|
|
||||||
|
Var
|
||||||
|
S : String;
|
||||||
|
|
||||||
|
begin
|
||||||
|
{$IFDEF WINDOWS}
|
||||||
|
LoadFromRegistry;
|
||||||
|
{$ENDIF}
|
||||||
|
S:=DefaultMimeTypesLocation;
|
||||||
|
if (S<>'') then
|
||||||
|
begin
|
||||||
|
S:=S+'mime.types';
|
||||||
|
if FileExists(S) then
|
||||||
|
LoadFromFile(S);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{$IFDEF WINDOWS}
|
||||||
|
procedure TFPMimeTypes.LoadFromRegistry;
|
||||||
|
|
||||||
|
Var
|
||||||
|
Reg : TRegistry;
|
||||||
|
aType,Ext : string;
|
||||||
|
L : TStringList;
|
||||||
|
I : Integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
L:=Nil;
|
||||||
|
Reg := TRegistry.Create;
|
||||||
|
try
|
||||||
|
L:=TStringList.Create;
|
||||||
|
Reg.RootKey := HKEY_CLASSES_ROOT;
|
||||||
|
if Reg.OpenKeyReadOnly('') then
|
||||||
|
begin
|
||||||
|
Reg.GetKeyNames(L);
|
||||||
|
Reg.CloseKey;
|
||||||
|
For I:=0 to L.Count-1 do
|
||||||
|
begin
|
||||||
|
Ext:=L[i];
|
||||||
|
if (Ext<>'') and (Ext[1]='.') and Reg.OpenKeyReadOnly(Ext) then
|
||||||
|
begin
|
||||||
|
aType:= Reg.ReadString('Content Type');
|
||||||
|
Reg.CloseKey;
|
||||||
|
if aType<>'' then
|
||||||
|
AddType(aType,Ext);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
Reg.CloseKey;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
L.Free;
|
||||||
|
Reg.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
{$ENDIF WINDOWS}
|
||||||
|
|
||||||
procedure TFPMimeTypes.LoadFromStream(const Stream: TStream);
|
procedure TFPMimeTypes.LoadFromStream(const Stream: TStream);
|
||||||
|
|
||||||
Var
|
Var
|
||||||
@ -293,6 +386,7 @@ begin
|
|||||||
AList.Clear;
|
AList.Clear;
|
||||||
For I:=0 to FTypes.Count-1 do
|
For I:=0 to FTypes.Count-1 do
|
||||||
Alist.Add(FTypes.NameOfIndex(i));
|
Alist.Add(FTypes.NameOfIndex(i));
|
||||||
|
Result:=AList.Count;
|
||||||
finally
|
finally
|
||||||
AList.EndUpdate;
|
AList.EndUpdate;
|
||||||
end;
|
end;
|
||||||
@ -308,6 +402,7 @@ begin
|
|||||||
AList.Clear;
|
AList.Clear;
|
||||||
For I:=0 to FExtensions.Count-1 do
|
For I:=0 to FExtensions.Count-1 do
|
||||||
Alist.Add(FExtensions.NameOfIndex(i));
|
Alist.Add(FExtensions.NameOfIndex(i));
|
||||||
|
Result:=AList.Count;
|
||||||
finally
|
finally
|
||||||
AList.EndUpdate;
|
AList.EndUpdate;
|
||||||
end;
|
end;
|
||||||
@ -334,6 +429,9 @@ begin
|
|||||||
If (E<>'') then
|
If (E<>'') then
|
||||||
begin
|
begin
|
||||||
E:=E+';';
|
E:=E+';';
|
||||||
|
if (Fextensions<>'') then
|
||||||
|
If Fextensions[Length(FExtensions)]<>';' then
|
||||||
|
FExtensions:=FExtensions+';';
|
||||||
If (Copy(Fextensions,1,Length(E))<>E) and (Pos(E,FExtensions)=0) then
|
If (Copy(Fextensions,1,Length(E))<>E) and (Pos(E,FExtensions)=0) then
|
||||||
FExtensions:=Extensions+E;
|
FExtensions:=Extensions+E;
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user