1
0
mirror of synced 2024-11-24 11:43:09 +01:00

Merge pull request #2 from wiphi/dev-remove-dependencies

Dev remove dependencies
This commit is contained in:
Mark van Renswoude 2021-03-19 20:07:08 +01:00 committed by GitHub
commit d86bfbb276
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 2214 additions and 53 deletions

6
.gitmodules vendored
View File

@ -1,6 +0,0 @@
[submodule "vendor/x2utils"]
path = vendor/x2utils
url = https://github.com/MvRens/x2utils.git
[submodule "vendor/x2log"]
path = vendor/x2log
url = https://github.com/MvRens/x2log.git

View File

@ -63,15 +63,12 @@ object MainForm: TMainForm
Top = 68 Top = 68
Width = 416 Width = 416
Height = 93 Height = 93
ActivePage = spFolder ActivePage = spFile
Anchors = [akLeft, akTop, akRight] Anchors = [akLeft, akTop, akRight]
Style = tsButtons Style = tsButtons
TabOrder = 2 TabOrder = 2
object spFile: TTabSheet object spFile: TTabSheet
TabVisible = False TabVisible = False
DesignSize = (
408
83)
object lblFile: TLabel object lblFile: TLabel
Left = 4 Left = 4
Top = 7 Top = 7
@ -79,15 +76,21 @@ object MainForm: TMainForm
Height = 13 Height = 13
Caption = 'Output file:' Caption = 'Output file:'
end end
object feFile: TJvFilenameEdit object feFile: TEdit
Left = 89 Left = 65
Top = 3 Top = 4
Width = 316 Width = 269
Height = 21 Height = 21
DialogOptions = [ofHideReadOnly, ofCreatePrompt]
Anchors = [akLeft, akTop, akRight]
TabOrder = 0 TabOrder = 0
Text = '' end
object ButtonOutputFileBrowseButton: TButton
Left = 340
Top = 4
Width = 65
Height = 21
Caption = 'Browse'
TabOrder = 1
OnClick = ButtonOutputFileBrowseButtonClick
end end
end end
object spFolder: TTabSheet object spFolder: TTabSheet
@ -201,15 +204,21 @@ object MainForm: TMainForm
TabOrder = 1 TabOrder = 1
OnClick = btnHintsClick OnClick = btnHintsClick
end end
object feSchema: TJvFilenameEdit object feSchema: TEdit
Left = 104 Left = 72
Top = 8 Top = 8
Width = 316 Width = 289
Height = 21 Height = 21
OnAfterDialog = feSchemaAfterDialog
DialogOptions = [ofHideReadOnly, ofFileMustExist]
TabOrder = 4 TabOrder = 4
Text = '' end
object SchmeFileBrowseButton: TButton
Left = 367
Top = 8
Width = 65
Height = 21
Caption = 'Browse'
TabOrder = 5
OnClick = SchmeFileBrowseButtonClick
end end
object dlgSchema: TOpenDialog object dlgSchema: TOpenDialog
Filter = 'W3C XML Schema files (*.xsd)|*.xsd|All files (*.*)|*.*' Filter = 'W3C XML Schema files (*.xsd)|*.xsd|All files (*.*)|*.*'

View File

@ -14,7 +14,7 @@ uses
XMLDOM, XMLDOM,
XMLIntf, XMLIntf,
DataBindingHintsXML, DataBindingHintsXML,
XMLDataBindingGenerator, JvExMask, JvToolEdit XMLDataBindingGenerator
{ {
cxButtonEdit, cxButtonEdit,
cxContainer, cxContainer,
@ -51,9 +51,11 @@ type
edtFolderPrefix: TEdit; edtFolderPrefix: TEdit;
edtFolderPostfix: TEdit; edtFolderPostfix: TEdit;
deFolder: TEdit; deFolder: TEdit;
feSchema: TJvFilenameEdit;
deFolderPropertiesButton: TButton; deFolderPropertiesButton: TButton;
feFile: TJvFilenameEdit; feSchema: TEdit;
SchmeFileBrowseButton: TButton;
feFile: TEdit;
ButtonOutputFileBrowseButton: TButton;
procedure btnCloseClick(Sender: TObject); procedure btnCloseClick(Sender: TObject);
procedure btnGenerateClick(Sender: TObject); procedure btnGenerateClick(Sender: TObject);
@ -64,8 +66,8 @@ type
procedure feSchemaPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); procedure feSchemaPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer);
procedure feSchemaPropertiesChange(Sender: TObject); procedure feSchemaPropertiesChange(Sender: TObject);
procedure btnHintsClick(Sender: TObject); procedure btnHintsClick(Sender: TObject);
procedure feSchemaAfterDialog(Sender: TObject; var AName: string; procedure SchmeFileBrowseButtonClick(Sender: TObject);
var AAction: Boolean); procedure ButtonOutputFileBrowseButtonClick(Sender: TObject);
private private
function CheckValidSchemaFile: Boolean; function CheckValidSchemaFile: Boolean;
function CheckReadOnly(const AFileName: String): Boolean; function CheckReadOnly(const AFileName: String): Boolean;
@ -176,11 +178,11 @@ begin
if rbFile.Checked then if rbFile.Checked then
begin begin
if not CheckReadOnly(feFile.FileName) then if not CheckReadOnly(feFile.Text) then
Exit; Exit;
generator.OutputType := otSingle; generator.OutputType := otSingle;
generator.OutputPath := feFile.FileName; generator.OutputPath := feFile.Text;
end else if rbFolder.Checked then end else if rbFolder.Checked then
begin begin
generator.OutputType := otMultiple; generator.OutputType := otMultiple;
@ -190,9 +192,9 @@ begin
generator.HasChecksEmpty := cbHasChecksEmpty.Checked; generator.HasChecksEmpty := cbHasChecksEmpty.Checked;
generator.HasGenerateGetOptionalOrDefault := cbGenerateGetOptionalOrDefault.Checked; generator.HasGenerateGetOptionalOrDefault := cbGenerateGetOptionalOrDefault.Checked;
generator.OnGetFileName := GetFileName; generator.OnGetFileName := GetFileName;
generator.Execute(feSchema.Filename); generator.Execute(feSchema.Text);
SaveSettings(feSchema.FileName); SaveSettings(feSchema.Text);
ShowMessage('The data binding has been generated.'); ShowMessage('The data binding has been generated.');
finally finally
@ -235,12 +237,6 @@ begin
end; end;
procedure TMainForm.feSchemaAfterDialog(Sender: TObject; var AName: string;
var AAction: Boolean);
begin
feFile.FileName := ChangeFileExt(AName, '.pas');
end;
procedure TMainForm.feSchemaPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); procedure TMainForm.feSchemaPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer);
begin begin
if dlgSchema.Execute then if dlgSchema.Execute then
@ -337,9 +333,17 @@ begin
end; end;
procedure TMainForm.SchmeFileBrowseButtonClick(Sender: TObject);
begin
if dlgSchema.Execute then
begin
feSchema.Text := dlgSchema.FileName;
end;
end;
function TMainForm.CheckValidSchemaFile: Boolean; function TMainForm.CheckValidSchemaFile: Boolean;
begin begin
Result := FileExists(feSchema.FileName); Result := FileExists(feSchema.Text);
if not Result then if not Result then
begin begin
@ -392,6 +396,14 @@ begin
end; end;
procedure TMainForm.ButtonOutputFileBrowseButtonClick(Sender: TObject);
begin
if dlgOutputFile.Execute then
begin
feFile.Text := dlgOutputFile.FileName;
end;
end;
{ THintsDelphiXMLDataBindingGenerator } { THintsDelphiXMLDataBindingGenerator }
procedure THintsDelphiXMLDataBindingGenerator.GenerateDataBinding; procedure THintsDelphiXMLDataBindingGenerator.GenerateDataBinding;
begin begin

View File

@ -15,9 +15,6 @@
- Influence the generator by using a Hints file - Influence the generator by using a Hints file
## Dependencies ## Dependencies
- JEDI Component Library (jcl /jvcl) * Works up from Delphi XE2
- x2utils (https://github.com/MvRens/x2utils.git) (git submodule)
- x2log (https://github.com/MvRens/x2log.git) (git submodule)
Documentation is available on [ReadTheDocs](https://x2xmldatabinding.readthedocs.io/). Documentation is available on [ReadTheDocs](https://x2xmldatabinding.readthedocs.io/).

View File

@ -84,9 +84,7 @@ uses
StrUtils, StrUtils,
SysUtils, SysUtils,
X2UtNamedFormat, X2UtNamedFormat;
X2Log.Global;
const const
VariantText = 'Variant'; VariantText = 'Variant';
@ -937,8 +935,6 @@ var
member: TDelphiXMLMember; member: TDelphiXMLMember;
begin begin
TX2GlobalLog.Verbose('WriteSchemaInterfaceProperties: ' + AItem.Name);
if ASection = dxsForward then if ASection = dxsForward then
Exit; Exit;
@ -1812,7 +1808,8 @@ begin
if OutputType = otMultiple then if OutputType = otMultiple then
begin begin
path := IncludeTrailingPathDelimiter(Result); path := IncludeTrailingPathDelimiter(Result);
fileName := ASchemaName + '.pas'; fileName := ASchemaName.Replace('-', '_');
fileName := fileName + '.pas';
if Assigned(FOnGetFileName) then if Assigned(FOnGetFileName) then
FOnGetFileName(Self, ASchemaName, path, fileName); FOnGetFileName(Self, ASchemaName, path, fileName);

248
Units/X2UtNamedFormat.pas Normal file
View File

@ -0,0 +1,248 @@
{
:: X2UtNamedFormat implements Format-style functionality using named
:: instead of indexed parameters.
::
:: Last changed: $Date$
:: Revision: $Rev$
:: Author: $Author$
}
unit X2UtNamedFormat;
interface
uses
Classes,
SysUtils;
type
TNamedFormatStringList = class(TStringList)
public
procedure AddLn();
function Format(AParams: array of const): String;
end;
{
AFormat uses the same format strings as SysUtils.Format, where each
format specifier may use a named instead of a numeric index, surrounded by
<>, eg:
%<Value1>:s %<Value2>:.2d
AParams contains alternating the parameter name and it's value.
Note: NamedFormat works by mapping names to indices and passing the result
to SysUtils.Format. Unnamed or existing indexed specifiers will therefore
be affected by named specifiers! It is strongly recommended to name all
specifiers.
}
function NamedFormat(const AFormat: String; AParams: array of const; AFormatSettings: TFormatSettings): String; overload;
function NamedFormat(const AFormat: String; AParams: array of const): String; overload;
implementation
uses
Windows;
type
TProtectedMemoryStream = class(TMemoryStream);
const
SpecifierChar = '%';
SpecifierNameStart = '<';
SpecifierNameEnd = '>';
ValidNameChars = ['A'..'Z', 'a'..'z', '0'..'9', '_'];
procedure StreamWriteChar(const AStream: TStream; const AValue: Char);
begin
AStream.WriteBuffer(AValue, SizeOf(Char));
end;
procedure StreamWriteString(const AStream: TStream; const AValue: String);
begin
AStream.WriteBuffer(PChar(AValue)^, Length(AValue) * SizeOf(Char));
end;
function FindNameEnd(const APosition: PChar; const AEnd: PChar): PChar;
var
position: PChar;
begin
Result := nil;
position := APosition;
while position < AEnd do
begin
if position^ = SpecifierNameEnd then
begin
Result := position;
break;
end;
if not CharInSet(position^, ValidNameChars) then
break;
Inc(position);
end;
end;
function NamedFormat(const AFormat: String; AParams: array of const): String; overload;
var
formatSettings: TFormatSettings;
begin
formatSettings := TFormatSettings.Create;
Result := NamedFormat(AFormat, AParams, formatSettings);
end;
function NamedFormat(const AFormat: string; AParams: array of const; AFormatSettings: TFormatSettings): String;
var
currentPos: PChar;
formatEnd: PChar;
formatStream: TMemoryStream;
formatString: String;
name: String;
nameEnd: PChar;
nameStart: PChar;
param: TVarRec;
paramIndex: Integer;
paramNames: TStringList;
paramValues: array of TVarRec;
specifierIndex: Integer;
errorMsg: String;
begin
if Length(AParams) mod 2 = 1 then
raise Exception.Create('AParams must contains a multiple of 2 number of items');
currentPos := PChar(AFormat);
SetLength(paramValues, 0);
formatEnd := currentPos;
Inc(formatEnd, Length(AFormat));
paramNames := TStringList.Create();
try
paramNames.CaseSensitive := False;
formatStream := TMemoryStream.Create();
try
{ Most likely scenario; the names are longer than the replacement
indexes. }
TProtectedMemoryStream(formatStream).Capacity := Length(AFormat) * SizeOf(Char);
while currentPos < formatEnd do
begin
{ Search for % }
if currentPos^ = SpecifierChar then
begin
StreamWriteChar(formatStream, currentPos^);
Inc(currentPos);
{ Check if this is indeed a named specifier }
if (currentPos < formatEnd) and (currentPos^ = SpecifierNameStart) then
begin
Inc(currentPos);
nameStart := currentPos;
nameEnd := FindNameEnd(currentPos, formatEnd);
if Assigned(nameEnd) then
begin
SetString(name, nameStart, nameEnd - nameStart);
specifierIndex := paramNames.IndexOf(name);
if specifierIndex = -1 then
specifierIndex := paramNames.Add(name);
StreamWriteString(formatStream, IntToStr(specifierIndex));
currentPos := nameEnd;
end;
end else
StreamWriteChar(formatStream, currentPos^);
end else
StreamWriteChar(formatStream, currentPos^);
Inc(currentPos);
end;
SetString(formatString, PChar(formatStream.Memory), formatStream.Size div SizeOf(Char));
finally
FreeAndNil(formatStream);
end;
SetLength(paramValues, paramNames.Count);
paramIndex := 0;
while paramIndex < High(AParams) do
begin
param := AParams[paramIndex];
case param.VType of
vtChar: name := string(param.VChar);
vtString: name := string(param.VString^);
vtPChar: name := string(param.VPChar);
vtAnsiString: name := string(PChar(param.VAnsiString));
vtWideChar: name := string(param.VWideChar);
vtWideString: name := string(WideString(param.VWideString));
vtUnicodeString: name := string(UnicodeString(param.VUnicodeString));
else
raise Exception.CreateFmt('Parameter name at index %d is not a string value',
[paramIndex div 2]);
end;
Inc(paramIndex);
specifierIndex := paramNames.IndexOf(name);
if specifierIndex > -1 then
paramValues[specifierIndex] := AParams[paramIndex];
Inc(paramIndex);
end;
try
Result := Format(formatString, paramValues, AFormatSettings);
except
on E:EConvertError do
begin
errorMsg := E.Message;
{ Translate specifiers in error messages back to names }
for paramIndex := 0 to Pred(paramNames.Count) do
errorMsg := StringReplace(errorMsg, SpecifierChar + IntToStr(paramIndex) + ':',
SpecifierChar + SpecifierNameStart +
paramNames[paramIndex] + SpecifierNameEnd + ':',
[rfReplaceAll]);
raise EConvertError.Create(errorMsg);
end;
end;
finally
FreeAndNil(paramNames);
end;
end;
{ TNamedFormatStringList }
procedure TNamedFormatStringList.AddLn;
begin
Add('');
end;
function TNamedFormatStringList.Format(AParams: array of const): String;
begin
Result := NamedFormat(Text, AParams);
end;
end.

145
Units/X2UtTempFile.pas Normal file
View File

@ -0,0 +1,145 @@
{: Provides temporary file functions.
Last changed: $Date$
Revision: $Rev$
Author: $Author$
}
unit X2UtTempFile;
interface
function GetAppDataPath(): String;
function GetTempFile(const APrefix: String): String; overload;
function GetTempFile(const APath, AFileName, AExtension: String): String; overload;
function GetTempFile(const APath, AFileName: String): String; overload;
function GetTempAppDataFile(const ASubPath, AFileName, AExtension: String): String; overload;
function GetTempAppDataFile(const ASubPath, AFileName: String): String; overload;
function IsValidFileChar(const AChar: Char): Boolean;
function CheckValidFileName(var AFileName: String; const AReplacement: Char = #0): Boolean;
implementation
uses
ShlObj,
SysUtils,
Windows;
function GetAppDataPath(): String;
var
path: array[0..MAX_PATH] of Char;
begin
FillChar(path, SizeOf(path), #0);
if not SHGetSpecialFolderPath(0, @path, CSIDL_APPDATA, True) then
begin
FillChar(path, SizeOf(path), #0);
GetTempPath(SizeOf(path), @path);
end;
Result := path;
if Length(Result) > 0 then
Result := IncludeTrailingPathDelimiter(Result);
end;
function GetTempFile(const APrefix: String): String; overload;
var
tempPath: array[0..MAX_PATH] of Char;
tempFile: array[0..MAX_PATH] of Char;
begin
FillChar(tempPath, SizeOf(tempPath), #0);
FillChar(tempFile, SizeOf(tempFile), #0);
Windows.GetTempPath(SizeOf(tempPath), @tempPath);
Windows.GetTempFileName(@tempPath, PChar(APrefix), 0, @tempFile);
Result := String(tempFile);
end;
function GetTempFile(const APath, AFileName, AExtension: String): String; overload;
var
iCounter: Integer;
sBase: String;
sExtension: String;
begin
iCounter := 0;
sBase := IncludeTrailingPathDelimiter(APath);
if not ForceDirectories(sBase) then
begin
Result := '';
exit;
end;
sExtension := AExtension;
if (Length(sExtension) > 0) and (AnsiPos('.', sExtension) = 0) then
sExtension := '.' + sExtension;
sBase := sBase + AFileName;
Result := sBase + sExtension;
while FileExists(Result) do
begin
Inc(iCounter);
Result := Format('%s(%d)%s', [sBase, iCounter, sExtension]);
end;
end;
function GetTempFile(const APath, AFileName: String): String; overload;
var
sExt: String;
begin
sExt := ExtractFileExt(AFileName);
Result := GetTempFile(APath, Copy(AFileName, 1, Length(AFileName) - Length(sExt)),
sExt);
end;
function GetTempAppDataFile(const ASubPath, AFileName, AExtension: String): String; overload;
begin
Result := GetTempFile(GetAppDataPath + ASubPath, AFileName, AExtension);
end;
function GetTempAppDataFile(const ASubPath, AFileName: String): String; overload;
var
sExt: String;
begin
sExt := ExtractFileExt(AFileName);
Result := GetTempAppDataFile(ASubPath, Copy(AFileName, 1,
Length(AFileName) - Length(sExt)),
sExt);
end;
function IsValidFileChar(const AChar: Char): Boolean;
begin
Result := not CharInSet(AChar, ['\', '/', ':', '*', '?', '"', '<', '>', '|']);
end;
function CheckValidFileName(var AFileName: String; const AReplacement: Char): Boolean;
var
iPos: Integer;
begin
Result := True;
for iPos := Length(AFileName) downto 1 do
if not IsValidFileChar(AFileName[iPos]) then
begin
Result := False;
if AReplacement = #0 then
Delete(AFileName, iPos, 1)
else
AFileName[iPos] := AReplacement;
end;
end;
end.

View File

@ -489,6 +489,7 @@ function TXMLDataBindingGenerator.LoadSchema(const AStream: TStream; const ASche
begin begin
location := ADocRefs[refIndex].SchemaLocation; location := ADocRefs[refIndex].SchemaLocation;
schemaName := ChangeFileExt(ExtractFileName(location), ''); schemaName := ChangeFileExt(ExtractFileName(location), '');
schemaName := schemaName.Replace('./', ''); // fix explizit current dir
refSchema := FindSchema(schemaName); refSchema := FindSchema(schemaName);
if not Assigned(refSchema) then if not Assigned(refSchema) then

File diff suppressed because it is too large Load Diff

View File

@ -11,7 +11,10 @@ uses
DelphiXMLDataBindingResources in 'Units\DelphiXMLDataBindingResources.pas', DelphiXMLDataBindingResources in 'Units\DelphiXMLDataBindingResources.pas',
DataBindingSettingsXML in 'Units\DataBindingSettingsXML.pas', DataBindingSettingsXML in 'Units\DataBindingSettingsXML.pas',
DataBindingHintsXML in 'Units\DataBindingHintsXML.pas', DataBindingHintsXML in 'Units\DataBindingHintsXML.pas',
MSXML2_TLB in 'Units\MSXML2_TLB.pas'; MSXML2_TLB in 'Units\MSXML2_TLB.pas',
XMLDataBindingUtils in 'Units\XMLDataBindingUtils.pas',
X2UtNamedFormat in 'Units\X2UtNamedFormat.pas',
X2UtTempFile in 'Units\X2UtTempFile.pas';
{$R *.res} {$R *.res}

View File

@ -52,7 +52,6 @@
<VerInfo_Locale>1043</VerInfo_Locale> <VerInfo_Locale>1043</VerInfo_Locale>
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File> <Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
<SanitizedProjectName>X2XMLDataBinding</SanitizedProjectName> <SanitizedProjectName>X2XMLDataBinding</SanitizedProjectName>
<DCC_UnitSearchPath>vendor\x2utils;vendor\x2log;$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''"> <PropertyGroup Condition="'$(Base_Win32)'!=''">
<DCC_Namespace>Data.Win;Datasnap.Win;Web.Win;Soap.Win;Bde;$(DCC_Namespace)</DCC_Namespace> <DCC_Namespace>Data.Win;Datasnap.Win;Web.Win;Soap.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
@ -142,6 +141,429 @@
<Platform value="Win32">True</Platform> <Platform value="Win32">True</Platform>
<Platform value="Win64">True</Platform> <Platform value="Win64">True</Platform>
</Platforms> </Platforms>
<Deployment Version="3">
<DeployFile LocalName="bin\X2XMLDataBinding.exe" Configuration="Build" Class="ProjectOutput">
<Platform Name="Win32">
<RemoteName>X2XMLDataBinding.exe</RemoteName>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployClass Name="AdditionalDebugSymbols">
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidClassesDexFile">
<Platform Name="Android">
<RemoteDir>classes</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidGDBServer">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidLibnativeArmeabiFile">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidLibnativeMipsFile">
<Platform Name="Android">
<RemoteDir>library\lib\mips</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidServiceOutput">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidSplashImageDef">
<Platform Name="Android">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidSplashStyles">
<Platform Name="Android">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_DefaultAppIcon">
<Platform Name="Android">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon144">
<Platform Name="Android">
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon36">
<Platform Name="Android">
<RemoteDir>res\drawable-ldpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon48">
<Platform Name="Android">
<RemoteDir>res\drawable-mdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon72">
<Platform Name="Android">
<RemoteDir>res\drawable-hdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon96">
<Platform Name="Android">
<RemoteDir>res\drawable-xhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage426">
<Platform Name="Android">
<RemoteDir>res\drawable-small</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage470">
<Platform Name="Android">
<RemoteDir>res\drawable-normal</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage640">
<Platform Name="Android">
<RemoteDir>res\drawable-large</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage960">
<Platform Name="Android">
<RemoteDir>res\drawable-xlarge</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="DebugSymbols">
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="DependencyFramework">
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.framework</Extensions>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="DependencyModule">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
<Extensions>.dll;.bpl</Extensions>
</Platform>
</DeployClass>
<DeployClass Required="true" Name="DependencyPackage">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
<Extensions>.bpl</Extensions>
</Platform>
</DeployClass>
<DeployClass Name="File">
<Platform Name="Android">
<Operation>0</Operation>
</Platform>
<Platform Name="iOSDevice32">
<Operation>0</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>0</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>0</Operation>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\Resources\StartUp\</RemoteDir>
<Operation>0</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch1024">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch1536">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch2048">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch768">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch320">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch640">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch640x1136">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectAndroidManifest">
<Platform Name="Android">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSDeviceDebug">
<Platform Name="iOSDevice32">
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSDeviceResourceRules">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSEntitlements">
<Platform Name="iOSDevice32">
<RemoteDir>..\</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<RemoteDir>..\</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSInfoPList">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSResource">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectOSXEntitlements">
<Platform Name="OSX32">
<RemoteDir>..\</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectOSXInfoPList">
<Platform Name="OSX32">
<RemoteDir>Contents</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectOSXResource">
<Platform Name="OSX32">
<RemoteDir>Contents\Resources</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Required="true" Name="ProjectOutput">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
<Platform Name="Linux64">
<Operation>1</Operation>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectUWPManifest">
<Platform Name="Win32">
<Operation>1</Operation>
</Platform>
<Platform Name="Win64">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="UWP_DelphiLogo150">
<Platform Name="Win32">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win64">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="UWP_DelphiLogo44">
<Platform Name="Win32">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win64">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<ProjectRoot Platform="iOSDevice64" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="iOSDevice32" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="Linux64" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="OSX32" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="Android" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="iOSSimulator" Name="$(PROJECTNAME).app"/>
</Deployment>
</BorlandProject> </BorlandProject>
<ProjectFileVersion>12</ProjectFileVersion> <ProjectFileVersion>12</ProjectFileVersion>
</ProjectExtensions> </ProjectExtensions>
@ -160,6 +582,9 @@
<DCCReference Include="Units\DataBindingSettingsXML.pas"/> <DCCReference Include="Units\DataBindingSettingsXML.pas"/>
<DCCReference Include="Units\DataBindingHintsXML.pas"/> <DCCReference Include="Units\DataBindingHintsXML.pas"/>
<DCCReference Include="Units\MSXML2_TLB.pas"/> <DCCReference Include="Units\MSXML2_TLB.pas"/>
<DCCReference Include="Units\XMLDataBindingUtils.pas"/>
<DCCReference Include="Units\X2UtNamedFormat.pas"/>
<DCCReference Include="Units\X2UtTempFile.pas"/>
<BuildConfiguration Include="Build"> <BuildConfiguration Include="Build">
<Key>Cfg_2</Key> <Key>Cfg_2</Key>
<CfgParent>Base</CfgParent> <CfgParent>Base</CfgParent>
@ -170,4 +595,5 @@
</ItemGroup> </ItemGroup>
<Import Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')" Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj"/> <Import Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')" Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj"/>
<Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/> <Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/>
<Import Project="$(MSBuildProjectName).deployproj" Condition="Exists('$(MSBuildProjectName).deployproj')"/>
</Project> </Project>

1
vendor/x2log vendored

@ -1 +0,0 @@
Subproject commit 8b17a99c33453d0cf6c94d26af735beb3bb8666c

1
vendor/x2utils vendored

@ -1 +0,0 @@
Subproject commit 1e7a0873558140b506c01af5c50c73cfe940466e