ADD: Simple exif-wdx plugin

This commit is contained in:
Alexander Koblov 2017-04-02 08:41:06 +00:00
commit e796b5a02c
3 changed files with 322 additions and 84 deletions

159
src/uexifwdx.pas Normal file
View file

@ -0,0 +1,159 @@
{
Double Commander
-------------------------------------------------------------------------
Simple exif-wdx plugin.
Copyright (C) 2016-2017 Alexander Koblov (alexx2000@mail.ru)
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
}
unit uExifWdx;
{$mode delphi}
interface
uses
Classes, SysUtils, WdxPlugin, uWDXModule, uExifReader;
type
{ TExifWdx }
TExifWdx = class(TEmbeddedWDX)
private
FFileName: String;
FExif: TExifReader;
procedure GetData(const FileName: String);
protected
function GetAName: String; override;
function GetADetectStr: String; override;
public
//---------------------
constructor Create; override;
destructor Destroy; override;
//------------------------------------------------------
procedure CallContentGetSupportedField; override;
procedure CallContentSetDefaultParams; override;
procedure CallContentStopGetValue(FileName: String); override;
//---------------------
function CallContentGetDefaultSortOrder(FieldIndex: Integer): Boolean; override;
function CallContentGetDetectString: String; override;
function CallContentGetValueV(FileName: String; FieldIndex, UnitIndex: Integer; flags: Integer): Variant; overload; override;
function CallContentGetValue(FileName: String; FieldIndex, UnitIndex: Integer; flags: Integer): String; overload; override;
function CallContentGetSupportedFieldFlags(FieldIndex: Integer): Integer; override;
//------------------------------------------------------
end;
implementation
{ TExifWdx }
procedure TExifWdx.GetData(const FileName: String);
begin
if (FFileName <> FileName) then
begin
FFileName:= FileName;
FExif.LoadFromFile(FileName);
end;
end;
function TExifWdx.GetAName: String;
begin
Result:= '< Exif >';
end;
function TExifWdx.GetADetectStr: String;
begin
Result:= CallContentGetDetectString;
end;
constructor TExifWdx.Create;
begin
inherited Create;
FExif:= TExifReader.Create;
end;
destructor TExifWdx.Destroy;
begin
FExif.Free;
inherited Destroy;
end;
procedure TExifWdx.CallContentGetSupportedField;
begin
AddField(rsMake, ft_string);
AddField(rsModel, ft_string);
AddField(rsImageWidth, ft_numeric_32);
AddField(rsImageHeight, ft_numeric_32);
AddField(rsOrientation, ft_numeric_32);
AddField(rsDateTimeOriginal, ft_string);
end;
procedure TExifWdx.CallContentSetDefaultParams;
begin
end;
procedure TExifWdx.CallContentStopGetValue(FileName: String);
begin
end;
function TExifWdx.CallContentGetDefaultSortOrder(FieldIndex: Integer): Boolean;
begin
Result:= False;
end;
function TExifWdx.CallContentGetDetectString: String;
begin
Result:= '(EXT="JPG") | (EXT="JPEG")';
end;
function TExifWdx.CallContentGetValueV(FileName: String; FieldIndex,
UnitIndex: Integer; flags: Integer): Variant;
begin
GetData(FileName);
case FieldIndex of
0: Result:= FExif.Make;
1: Result:= FExif.Model;
2: Result:= FExif.ImageWidth;
3: Result:= FExif.ImageHeight;
4: Result:= FExif.Orientation;
5: Result:= FExif.DateTimeOriginal;
end;
end;
function TExifWdx.CallContentGetValue(FileName: String; FieldIndex,
UnitIndex: Integer; flags: Integer): String;
begin
GetData(FileName);
case FieldIndex of
0: Result:= FExif.Make;
1: Result:= FExif.Model;
2: Result:= IntToStr(FExif.ImageWidth);
3: Result:= IntToStr(FExif.ImageHeight);
4: Result:= IntToStr(FExif.Orientation);
5: Result:= FExif.DateTimeOriginal;
end;
end;
function TExifWdx.CallContentGetSupportedFieldFlags(FieldIndex: Integer): Integer;
begin
Result:= 0;
end;
end.

View file

@ -595,7 +595,7 @@ var
implementation
uses
LCLProc, LCLType, Dialogs, Laz2_XMLRead, LazUTF8,
LCLProc, LCLType, Dialogs, Laz2_XMLRead, LazUTF8, uExifWdx,
uGlobsPaths, uLng, uShowMsg, uFileProcs, uOSUtils, uFindFiles,
uDCUtils, fMultiRename, uFile, uDCVersion, uDebug, uFileFunctions,
uDefaultPlugins, Lua, uKeyboard, DCOSUtils, DCStrUtils, uPixMapManager
@ -2682,6 +2682,7 @@ begin
gWFXPlugins.Load(gConfig, Node);
gWLXPlugins.Load(gConfig, Node);
end;
gWDXPlugins.Add(TExifWdx.Create);
{ Load content plugins used in search templates }
LoadContentPlugins;

View file

@ -84,9 +84,9 @@ type
//---------------------
function CallContentGetDefaultSortOrder(FieldIndex: Integer): Boolean; virtual; abstract;
function CallContentGetDetectString: String; virtual; abstract;
function CallContentGetValueV(FileName: String; FieldName: String; UnitName: String; flags: Integer): Variant; overload; virtual; abstract;
function CallContentGetValueV(FileName: String; FieldName: String; UnitName: String; flags: Integer): Variant; overload; virtual;
function CallContentGetValueV(FileName: String; FieldIndex, UnitIndex: Integer; flags: Integer): Variant; overload; virtual; abstract;
function CallContentGetValue(FileName: String; FieldName: String; UnitName: String; flags: Integer): String; overload; virtual; abstract;
function CallContentGetValue(FileName: String; FieldName: String; UnitName: String; flags: Integer): String; overload; virtual;
function CallContentGetValue(FileName: String; FieldIndex, UnitIndex: Integer; flags: Integer): String; overload; virtual; abstract;
function CallContentGetValue(FileName: String; FieldIndex: Integer; var UnitIndex: Integer): String; overload; virtual; abstract;
function CallContentGetSupportedFieldFlags(FieldIndex: Integer): Integer; virtual; abstract;
@ -158,9 +158,7 @@ type
//---------------------
function CallContentGetDefaultSortOrder(FieldIndex: Integer): Boolean; override;
function CallContentGetDetectString: String; override;
function CallContentGetValueV(FileName: String; FieldName: String; UnitName: String; flags: Integer): Variant; overload; override;
function CallContentGetValueV(FileName: String; FieldIndex, UnitIndex: Integer; flags: Integer): Variant; overload; override;
function CallContentGetValue(FileName: String; FieldName: String; UnitName: String; flags: Integer): String; overload; override;
function CallContentGetValue(FileName: String; FieldIndex, UnitIndex: Integer; flags: Integer): String; overload; override;
function CallContentGetValue(FileName: String; FieldIndex: Integer; var UnitIndex: Integer): String; overload; override;
function CallContentGetSupportedFieldFlags(FieldIndex: Integer): Integer; override;
@ -218,9 +216,7 @@ type
//---------------------
function CallContentGetDefaultSortOrder(FieldIndex: Integer): Boolean; override;
function CallContentGetDetectString: String; override;
function CallContentGetValueV(FileName: String; FieldName: String; UnitName: String; flags: Integer): Variant; overload; override;
function CallContentGetValueV(FileName: String; FieldIndex, UnitIndex: Integer; flags: Integer): Variant; overload; override;
function CallContentGetValue(FileName: String; FieldName: String; UnitName: String; flags: Integer): String; overload; override;
function CallContentGetValue(FileName: String; FieldIndex, UnitIndex: Integer; flags: Integer): String; overload; override;
function CallContentGetValue(FileName: String; FieldIndex: Integer; var UnitIndex: Integer): String; overload; override;
function CallContentGetSupportedFieldFlags(FieldIndex: Integer): Integer; override;
@ -233,6 +229,35 @@ type
end;
{ TEmbeddedWDX }
TEmbeddedWDX = class(TWDXModule)
private
FFieldsList: TStringList;
FParser: TParserControl;
protected
function GetAName: String; override;
function GetAFileName: String; override;
function GetADetectStr: String; override;
procedure SetAName(AValue: String); override;
procedure SetAFileName(AValue: String); override;
procedure SetADetectStr(const AValue: String); override;
protected
procedure AddField(const AName: String; AType: Integer);
public
//---------------------
constructor Create; override;
destructor Destroy; override;
//---------------------
function LoadModule: Boolean; override;
procedure UnloadModule; override;
function IsLoaded: Boolean; override;
//---------------------
function FieldList: TStringList; override;
function GetFieldIndex(FieldName: String): Integer; override;
function FileParamVSDetectStr(const aFile: TFile): Boolean; override;
//------------------------------------------------------
end;
{ TWDXModuleList }
@ -409,10 +434,13 @@ begin
For i := 0 to Flist.Count - 1 do
begin
SubNode := AConfig.AddNode(ANode, 'WdxPlugin');
AConfig.AddValue(SubNode, 'Name', TWDXModule(Flist.Objects[I]).Name);
AConfig.AddValue(SubNode, 'Path', SetCmdDirAsEnvVar(TWDXModule(Flist.Objects[I]).FileName));
AConfig.AddValue(SubNode, 'DetectString', TWDXModule(Flist.Objects[I]).DetectStr);
if not (Flist.Objects[I] is TEmbeddedWDX) then
begin
SubNode := AConfig.AddNode(ANode, 'WdxPlugin');
AConfig.AddValue(SubNode, 'Name', TWDXModule(Flist.Objects[I]).Name);
AConfig.AddValue(SubNode, 'Path', SetCmdDirAsEnvVar(TWDXModule(Flist.Objects[I]).FileName));
AConfig.AddValue(SubNode, 'DetectString', TWDXModule(Flist.Objects[I]).DetectStr);
end;
end;
end;
@ -502,11 +530,7 @@ end;
function TWDXModuleList.GetWdxModule(Index: Integer): TWDXModule;
begin
if (Flist.Objects[Index] is TPluginWDX) then
Result := TPluginWDX(Flist.Objects[Index])
else
if (Flist.Objects[Index] is TLuaWdx) then
Result := TLuaWdx(Flist.Objects[Index]);
Result := TWDXModule(Flist.Objects[Index]);
end;
function TWDXModuleList.GetWdxModule(AName: String): TWDXModule;
@ -515,12 +539,7 @@ var
begin
tmp := Flist.IndexOf(upcase(AName));
if tmp < 0 then Exit(nil);
if (Flist.Objects[tmp] is TPluginWDX) then
Result := TPluginWDX(Flist.Objects[tmp])
else
if (Flist.Objects[tmp] is TLuaWdx) then
Result := TLuaWdx(Flist.Objects[tmp]);
Result := TWDXModule(Flist.Objects[tmp])
end;
{ TPluginWDX }
@ -738,22 +757,6 @@ begin
end;
end;
function TPluginWDX.CallContentGetValueV(FileName: String; FieldName: String;
UnitName: String; flags: Integer): Variant;
var
FieldIndex,
UnitIndex: Integer;
begin
FieldIndex := GetFieldIndex(FieldName);
if FieldIndex <> -1 then
begin
UnitIndex := TWdxField(FieldList.Objects[FieldIndex]).GetUnitIndex(UnitName);
Result := CallContentGetValuev(FileName, FieldIndex, UnitIndex, flags);
end
else
Result := Unassigned;
end;
function TPluginWDX.CallContentGetValueV(FileName: String; FieldIndex,
UnitIndex: Integer; flags: Integer): Variant;
var
@ -796,21 +799,6 @@ begin
end;
end;
function TPluginWDX.CallContentGetValue(FileName: String; FieldName: String; UnitName: String; flags: Integer): String;
var
FieldIndex,
UnitIndex: Integer;
begin
FieldIndex := GetFieldIndex(FieldName);
if FieldIndex <> -1 then
begin
UnitIndex := TWdxField(FieldList.Objects[FieldIndex]).GetUnitIndex(UnitName);
Result := CallContentGetValue(FileName, FieldIndex, UnitIndex, flags);
end
else
Result := EmptyStr;
end;
function TPluginWDX.CallContentGetValue(FileName: String; FieldIndex, UnitIndex: Integer; flags: Integer): String;
var
Rez: Integer;
@ -1152,22 +1140,6 @@ begin
lua_pop(L, 1);
end;
function TLuaWdx.CallContentGetValueV(FileName: String; FieldName: String;
UnitName: String; flags: Integer): Variant;
var
FieldIndex,
UnitIndex: Integer;
begin
FieldIndex := GetFieldIndex(FieldName);
if FieldIndex <> -1 then
begin
UnitIndex := TWdxField(FieldList.Objects[FieldIndex]).GetUnitIndex(UnitName);
Result := CallContentGetValueV(FileName, FieldIndex, UnitIndex, flags);
end
else
Result := Unassigned;
end;
function TLuaWdx.CallContentGetValueV(FileName: String; FieldIndex,
UnitIndex: Integer; flags: Integer): Variant;
begin
@ -1210,21 +1182,6 @@ begin
end;
end;
function TLuaWdx.CallContentGetValue(FileName: String; FieldName: String; UnitName: String; flags: Integer): String;
var
FieldIndex,
UnitIndex: Integer;
begin
FieldIndex := GetFieldIndex(FieldName);
if FieldIndex <> -1 then
begin
UnitIndex := TWdxField(FieldList.Objects[FieldIndex]).GetUnitIndex(UnitName);
Result := CallContentGetValue(FileName, FieldIndex, UnitIndex, flags);
end
else
Result := EmptyStr;
end;
function TLuaWdx.CallContentGetValue(FileName: String; FieldIndex, UnitIndex: Integer; flags: Integer): String;
begin
EnterCriticalSection(FMutex);
@ -1313,6 +1270,95 @@ begin
end;
{ TEmbeddedWDX }
function TEmbeddedWDX.GetAName: String;
begin
end;
function TEmbeddedWDX.GetAFileName: String;
begin
end;
function TEmbeddedWDX.GetADetectStr: String;
begin
end;
procedure TEmbeddedWDX.SetAName(AValue: String);
begin
end;
procedure TEmbeddedWDX.SetAFileName(AValue: String);
begin
end;
procedure TEmbeddedWDX.SetADetectStr(const AValue: String);
begin
end;
procedure TEmbeddedWDX.AddField(const AName: String; AType: Integer);
var
I: Integer;
begin
I := FFieldsList.AddObject(AName, TWdxField.Create);
with TWdxField(FFieldsList.Objects[I]) do
begin
FName := AName;
FType := AType;
end;
end;
constructor TEmbeddedWDX.Create;
begin
inherited Create;
FParser:= TParserControl.Create;
FFieldsList:= TStringList.Create;
CallContentGetSupportedField;
end;
destructor TEmbeddedWDX.Destroy;
begin
FParser.Free;
FFieldsList.Free;
inherited Destroy;
end;
function TEmbeddedWDX.LoadModule: Boolean;
begin
Result:= True;
end;
procedure TEmbeddedWDX.UnloadModule;
begin
end;
function TEmbeddedWDX.IsLoaded: Boolean;
begin
Result:= True;
end;
function TEmbeddedWDX.FieldList: TStringList;
begin
Result:= FFieldsList;
end;
function TEmbeddedWDX.GetFieldIndex(FieldName: String): Integer;
begin
Result := FFieldsList.IndexOf(FieldName);
end;
function TEmbeddedWDX.FileParamVSDetectStr(const aFile: TFile): Boolean;
begin
FParser.DetectStr := Self.DetectStr;
Result := FParser.TestFileResult(aFile);
end;
{ TWDXModule }
@ -1349,6 +1395,38 @@ begin
end;
end;
function TWDXModule.CallContentGetValueV(FileName: String; FieldName: String;
UnitName: String; flags: Integer): Variant;
var
FieldIndex,
UnitIndex: Integer;
begin
FieldIndex := GetFieldIndex(FieldName);
if FieldIndex <> -1 then
begin
UnitIndex := TWdxField(FieldList.Objects[FieldIndex]).GetUnitIndex(UnitName);
Result := CallContentGetValueV(FileName, FieldIndex, UnitIndex, flags);
end
else
Result := Unassigned;
end;
function TWDXModule.CallContentGetValue(FileName: String; FieldName: String;
UnitName: String; flags: Integer): String;
var
FieldIndex,
UnitIndex: Integer;
begin
FieldIndex := GetFieldIndex(FieldName);
if FieldIndex <> -1 then
begin
UnitIndex := TWdxField(FieldList.Objects[FieldIndex]).GetUnitIndex(UnitName);
Result := CallContentGetValue(FileName, FieldIndex, UnitIndex, flags);
end
else
Result := EmptyStr;
end;
{ TWdxField }
function TWdxField.GetUnitIndex(UnitName: String): Integer;