Skip to content

Commit

Permalink
resolve dependencies for Installation and implemented Dialog in Setup…
Browse files Browse the repository at this point in the history
…Dialog to show them
  • Loading branch information
Memnarch committed Oct 16, 2016
1 parent d9c5312 commit 90d3d11
Show file tree
Hide file tree
Showing 16 changed files with 542 additions and 58 deletions.
33 changes: 33 additions & 0 deletions DN.Setup.Dependency.Intf.pas
@@ -0,0 +1,33 @@
unit DN.Setup.Dependency.Intf;

interface

uses
DN.Package.Intf,
DN.Package.Version.Intf;

type
TDependencyAction = (daNone, daInstall, daUpdate, daUninstall);

IDNSetupDependency = interface
['{F81A8627-D0AE-45CF-BADC-CB933EA5665D}']
function GetAction: TDependencyAction;
function GetInstalledVersion: IDNPackageVersion;
function GetPackage: IDNPackage;
function GetVersion: IDNPackageVersion;
procedure SetInstalledVersion(const Value: IDNPackageVersion);
procedure SetPackage(const Value: IDNPackage);
procedure SetVersion(const Value: IDNPackageVersion);
procedure SetAction(const Value: TDependencyAction);
function GetID: TGUID;
procedure SetID(const Value: TGUID);
property ID: TGUID read GetID write SetID;
property Package: IDNPackage read GetPackage write SetPackage;
property Action: TDependencyAction read GetAction write SetAction;
property Version: IDNPackageVersion read GetVersion write SetVersion;
property InstalledVersion: IDNPackageVersion read GetInstalledVersion write SetInstalledVersion;
end;

implementation

end.
18 changes: 18 additions & 0 deletions DN.Setup.Dependency.Resolver.Intf.pas
@@ -0,0 +1,18 @@
unit DN.Setup.Dependency.Resolver.Intf;

interface

uses
DN.Package.Intf,
DN.Package.Version.Intf,
DN.Setup.Dependency.Intf;

type
IDNSetupDependencyResolver = interface
['{EFCBFDA4-6A78-43EE-B481-05D56DC4590B}']
function Resolver(const APackage: IDNPackage; const AVersion: IDNPackageVersion): TArray<IDNSetupDependency>;
end;

implementation

end.
143 changes: 143 additions & 0 deletions DN.Setup.Dependency.Resolver.pas
@@ -0,0 +1,143 @@
unit DN.Setup.Dependency.Resolver;

interface

uses
SysUtils,
DN.Package.Intf,
DN.Package.Version.Intf,
DN.Setup.Dependency.Intf,
DN.Setup.Dependency.Resolver.Intf,
DN.Package.Finder.Intf,
DN.Version;

type
TDNSetupDependencyResolver = class(TInterfacedObject, IDNSetupDependencyResolver)
private
FInstalledFinderFactory: TFunc<IDNPackageFinder>;
FOnlineFinderFactory: TFunc<IDNPackageFinder>;
FInstalledFinder: IDNPackageFinder;
FOnlineFinder: IDNPackageFinder;
function InstalledFinder: IDNPackageFinder;
function OnlineFinder: IDNPackageFinder;
function TryFindAvailable(const AID: string; ARequiredVersion: TDNVersion; out APackage: IDNPackage): Boolean;
function TryFindInstalled(const AID: string; out APackage: IDNPackage): Boolean;
function TryFindVersion(const APackage: IDNPackage; const ARequiredVersion: TDNVersion; out AVersion: IDNPackageVersion): Boolean;
procedure EvaluateAction(const ADependency: IDNSetupDependency);
public
constructor Create(const AInstalledFinderFactory, AOnlineFinderFactory: TFunc<IDNPackageFinder>);
function Resolver(const APackage: IDNPackage; const AVersion: IDNPackageVersion): TArray<IDNSetupDependency>;
end;

implementation

uses
DN.Setup.Dependency,
DN.Package.Dependency.Intf,
Generics.Collections;

{ TDNSetupDependencyResolver }

constructor TDNSetupDependencyResolver.Create(const AInstalledFinderFactory,
AOnlineFinderFactory: TFunc<IDNPackageFinder>);
begin
inherited Create();
FInstalledFinderFactory := AInstalledFinderFactory;
FOnlineFinderFactory := AOnlineFinderFactory;
end;

procedure TDNSetupDependencyResolver.EvaluateAction(
const ADependency: IDNSetupDependency);
begin
if Assigned(ADependency) and Assigned(ADependency.Version) then
begin
if Assigned(ADependency.InstalledVersion) then
begin
if ADependency.InstalledVersion.Value < ADependency.Version.Value then
ADependency.Action := daUpdate;
end
else
ADependency.Action := daInstall;
end;
end;

function TDNSetupDependencyResolver.InstalledFinder: IDNPackageFinder;
begin
if not Assigned(FInstalledFinder) then
FInstalledFinder := FInstalledFinderFactory();
Result := FInstalledFinder;
end;

function TDNSetupDependencyResolver.OnlineFinder: IDNPackageFinder;
begin
if not Assigned(FOnlineFinder) then
FOnlineFinder := FOnlineFinderFactory();
Result := FOnlineFinder;
end;

function TDNSetupDependencyResolver.Resolver(const APackage: IDNPackage;
const AVersion: IDNPackageVersion): TArray<IDNSetupDependency>;
var
LDependency: IDNSetupDependency;
LPackageDependency: IDNPackageDependency;
LResult: TList<IDNSetupDependency>;
LPackage: IDNPackage;
LVersion: IDNPackageVersion;
begin
LResult := TList<IDNSetupDependency>.Create();
for LPackageDependency in AVersion.Dependencies do
begin
LDependency := TDNSetupDependency.Create();
LDependency.ID := LPackageDependency.ID;
if TryFindAvailable(LPackageDependency.ID.ToString, LPackageDependency.Version, LPackage) then
begin
LDependency.Package := LPackage;
if TryFindVersion(LPackage, LPackageDependency.Version, LVersion) then
LDependency.Version := LVersion;
end;
if TryFindInstalled(LPackageDependency.ID.ToString, LPackage) then
begin
if not Assigned(LDependency.Package) then
LDependency.Package := LPackage;
LDependency.InstalledVersion := LPackage.Versions.First;
end;
EvaluateAction(LDependency);
LResult.Add(LDependency);
end;
Result := LResult.ToArray();
end;

function TDNSetupDependencyResolver.TryFindAvailable(const AID: string;
ARequiredVersion: TDNVersion;
out APackage: IDNPackage): Boolean;
var
LVersion: IDNPackageVersion;
begin
Result := InstalledFinder.TryFind(AID, APackage);
if not (Result and TryFindVersion(APackage, ARequiredVersion, LVersion)) then
Result := OnlineFinder.TryFind(AID, APackage);
end;

function TDNSetupDependencyResolver.TryFindInstalled(const AID: string;
out APackage: IDNPackage): Boolean;
begin
Result := InstalledFinder.TryFind(AID, APackage);
end;

function TDNSetupDependencyResolver.TryFindVersion(const APackage: IDNPackage;
const ARequiredVersion: TDNVersion; out AVersion: IDNPackageVersion): Boolean;
var
LVersion: IDNPackageVersion;
begin
for LVersion in APackage.Versions do
begin
if LVersion.Value = ARequiredVersion then
begin
AVersion := LVersion;
Exit(True);
end;
end;
Result := False;
end;

end.
91 changes: 91 additions & 0 deletions DN.Setup.Dependency.pas
@@ -0,0 +1,91 @@
unit DN.Setup.Dependency;

interface

uses
DN.Package.Intf,
DN.Package.Version.Intf,
DN.Setup.Dependency.Intf;

type
TDNSetupDependency = class(TInterfacedObject, IDNSetupDependency)
private
FAction: TDependencyAction;
FInstalledVersion: IDNPackageVersion;
FVersion: IDNPackageVersion;
FPackage: IDNPackage;
FID: TGUID;
function GetAction: TDependencyAction;
function GetInstalledVersion: IDNPackageVersion;
function GetPackage: IDNPackage;
function GetVersion: IDNPackageVersion;
procedure SetInstalledVersion(const Value: IDNPackageVersion);
procedure SetPackage(const Value: IDNPackage);
procedure SetVersion(const Value: IDNPackageVersion);
procedure SetAction(const Value: TDependencyAction);
function GetID: TGUID;
procedure SetID(const Value: TGUID);
public
property ID: TGUID read GetID write SetID;
property Package: IDNPackage read GetPackage write SetPackage;
property Action: TDependencyAction read GetAction write SetAction;
property Version: IDNPackageVersion read GetVersion write SetVersion;
property InstalledVersion: IDNPackageVersion read GetInstalledVersion write SetInstalledVersion;
end;

implementation

{ TDNSetupDependency }

function TDNSetupDependency.GetAction: TDependencyAction;
begin
Result := FAction;
end;

function TDNSetupDependency.GetID: TGUID;
begin
Result := FID;
end;

function TDNSetupDependency.GetInstalledVersion: IDNPackageVersion;
begin
Result := FInstalledVersion;
end;

function TDNSetupDependency.GetPackage: IDNPackage;
begin
Result := FPackage;
end;

function TDNSetupDependency.GetVersion: IDNPackageVersion;
begin
Result := FVersion;
end;

procedure TDNSetupDependency.SetAction(const Value: TDependencyAction);
begin
FAction := Value;
end;

procedure TDNSetupDependency.SetID(const Value: TGUID);
begin
FID := Value;
end;

procedure TDNSetupDependency.SetInstalledVersion(
const Value: IDNPackageVersion);
begin
FInstalledVersion := Value;
end;

procedure TDNSetupDependency.SetPackage(const Value: IDNPackage);
begin
FPackage := Value;
end;

procedure TDNSetupDependency.SetVersion(const Value: IDNPackageVersion);
begin
FVersion := Value;
end;

end.
Binary file added Icons/Dependencies.ico
Binary file not shown.
File renamed without changes.
Binary file modified Icons/Dependency.ico
Binary file not shown.
9 changes: 8 additions & 1 deletion Packages/DelphiXE6/Delphinus.dpk
Expand Up @@ -134,7 +134,14 @@ contains
DN.Package.Dependency.Intf in '..\..\DN.Package.Dependency.Intf.pas',
DN.Package.Dependency in '..\..\DN.Package.Dependency.pas',
DN.Package.DirectoryLoader.Intf in '..\..\DN.Package.DirectoryLoader.Intf.pas',
DN.Package.DirectoryLoader in '..\..\DN.Package.DirectoryLoader.pas';
DN.Package.DirectoryLoader in '..\..\DN.Package.DirectoryLoader.pas',
Delphinus.DependencyDialog in '..\Delphinus.DependencyDialog.pas' {DependencyDialog},
DN.Setup.Dependency in '..\..\DN.Setup.Dependency.pas',
DN.Setup.Dependency.Intf in '..\..\DN.Setup.Dependency.Intf.pas',
DN.Setup.Dependency.Resolver.Intf in '..\..\DN.Setup.Dependency.Resolver.Intf.pas',
DN.Setup.Dependency.Resolver in '..\..\DN.Setup.Dependency.Resolver.pas',
DN.Package.Finder.Intf in '..\..\DN.Package.Finder.Intf.pas',
DN.Package.Finder in '..\..\DN.Package.Finder.pas';

end.

Expand Down
10 changes: 10 additions & 0 deletions Packages/DelphiXE6/Delphinus.dproj
Expand Up @@ -213,6 +213,16 @@
<DCCReference Include="..\..\DN.Package.Dependency.pas"/>
<DCCReference Include="..\..\DN.Package.DirectoryLoader.Intf.pas"/>
<DCCReference Include="..\..\DN.Package.DirectoryLoader.pas"/>
<DCCReference Include="..\Delphinus.DependencyDialog.pas">
<Form>DependencyDialog</Form>
<FormType>dfm</FormType>
</DCCReference>
<DCCReference Include="..\..\DN.Setup.Dependency.pas"/>
<DCCReference Include="..\..\DN.Setup.Dependency.Intf.pas"/>
<DCCReference Include="..\..\DN.Setup.Dependency.Resolver.Intf.pas"/>
<DCCReference Include="..\..\DN.Setup.Dependency.Resolver.pas"/>
<DCCReference Include="..\..\DN.Package.Finder.Intf.pas"/>
<DCCReference Include="..\..\DN.Package.Finder.pas"/>
<RcCompile Include="..\DelphinusImages.rc">
<Form>DelphinusImages.res</Form>
</RcCompile>
Expand Down
55 changes: 55 additions & 0 deletions Packages/Delphinus.DependencyDialog.dfm
@@ -0,0 +1,55 @@
object DependencyDialog: TDependencyDialog
Left = 0
Top = 0
BorderIcons = [biSystemMenu]
Caption = 'Dependencies'
ClientHeight = 194
ClientWidth = 338
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
Position = poScreenCenter
OnShow = FormShow
PixelsPerInch = 96
TextHeight = 13
object lvDependencies: TListView
Left = 0
Top = 0
Width = 338
Height = 194
Align = alClient
Columns = <
item
AutoSize = True
Caption = 'Name'
MinWidth = 100
end
item
Caption = 'Required'
Width = 60
end
item
Caption = 'Installed'
Width = 60
end
item
Caption = 'Action'
Width = 60
end>
RowSelect = True
SmallImages = ilIcons
TabOrder = 0
ViewStyle = vsReport
end
object ilIcons: TImageList
ColorDepth = cd32Bit
Height = 24
Width = 24
Left = 160
Top = 104
end
end

0 comments on commit 90d3d11

Please sign in to comment.