Explorar el Código

Quick.Config refactorized

Unknown hace 6 años
padre
commit
6a91ce2714
Se han modificado 3 ficheros con 96 adiciones y 78 borrados
  1. 22 39
      Quick.Config.Base.pas
  2. 35 19
      Quick.Config.Json.pas
  3. 39 20
      Quick.Config.Registry.pas

+ 22 - 39
Quick.Config.Base.pas

@@ -1,13 +1,13 @@
 { ***************************************************************************
 
-  Copyright (c) 2015-2018 Kike Pérez
+  Copyright (c) 2015-2019 Kike Pérez
 
-  Unit        : Quick.Config
-  Description : Load/Save config from/to JSON file
+  Unit        : Quick.Config.Base
+  Description : Quick Config Base classes
   Author      : Kike Pérez
   Version     : 1.5
   Created     : 26/01/2017
-  Modified    : 10/12/2018
+  Modified    : 21/01/2019
 
   This file is part of QuickLib: https://github.com/exilon/QuickLib
 
@@ -52,8 +52,6 @@ uses
 
 type
 
-  TDateTimeZone = (tzLocal, tzUTC);
-
   TAppConfig = class;
 
   IAppConfigProvider = interface
@@ -64,7 +62,7 @@ type
 
   TSerializeProperty = (spPublic, spPublished);
 
-  TAppConfigProviderBase = class(TInterfacedObject,IAppConfigProvider)
+  TAppConfigProvider = class(TInterfacedObject,IAppConfigProvider)
   private
     fCreateIfNotExists : Boolean;
     fSerializeLevel : TSerializeProperty;
@@ -84,62 +82,41 @@ type
   private
     {$IFDEF FPC}
     fOnApplyConfig : TApplyConfigEvent;
-    fDateTimeZone: TDateTimeZone;
     fJsonIndent: Boolean;
     fLastSaved : TDateTime;
     {$ELSE}
     {$IF CompilerVersion < 32.0}[JSONMarshalledAttribute(False)]{$ENDIF}
     fOnApplyConfig : TApplyConfigEvent;
     {$IF CompilerVersion < 32.0}[JSONMarshalledAttribute(False)]{$ENDIF}
-    fDateTimeZone: TDateTimeZone;
-    {$IF CompilerVersion < 32.0}[JSONMarshalledAttribute(False)]{$ENDIF}
     fJsonIndent: Boolean;
     {$IF CompilerVersion < 32.0}[JSONMarshalledAttribute(False)]{$ENDIF}
     fLastSaved : TDateTime;
     {$ENDIF}
   protected
-    function GetProvider : IAppConfigProvider; virtual; abstract;
+    fProvider : TAppConfigProvider;
   public
-    constructor Create; virtual;
+    constructor Create(aConfigProvider : TAppConfigProvider); virtual;
+    destructor Destroy; override;
     {$IFDEF DELPHIRX102_UP}[JsonIgnoreAttribute]{$ENDIF}
     property OnApplyConfig : TApplyConfigEvent read fOnApplyConfig write fOnApplyConfig;
     {$IFDEF DELPHIRX102_UP}[JsonIgnoreAttribute]{$ENDIF}
-    property DateTimeZone : TDateTimeZone read fDateTimeZone write fDateTimeZone;
-    {$IFDEF DELPHIRX102_UP}[JsonIgnoreAttribute]{$ENDIF}
     property JsonIndent : Boolean read fJsonIndent write fJsonIndent;
     {$IFDEF DELPHIRX102_UP}[JsonIgnoreAttribute]{$ENDIF}
     property LastSaved : TDateTime read fLastSaved write fLastSaved;
     procedure Apply;
     procedure DefaultValues; virtual;
-    procedure Load;
-    procedure Save;
+    procedure Load; virtual;
+    procedure Save; virtual;
     function ToJSON : string;
     procedure FromJSON(const json : string);
   end;
 
-  {Usage: create a descend class from TAppConfig and add published properties to be loaded/saved
-
-  TMyConfig = class(TAppConfig)
-  private
-    fName : string;
-    fSurname : string;
-    fStatus : Integer;
-  published
-    property Name : string read fName write fName;
-    property SurName : string read fSurname write fSurname;
-    property Status : Integer read fStatus write fStatus;
-  end;
-
-  AppConfigProvider := TAppConfigJsonProvider<TMyConfig>.Create(MyConfig);
-  MyConfig.Name := 'John';
-  }
-
 implementation
 
 
 { TAppConfigProviderBase }
 
-constructor TAppConfigProviderBase.Create;
+constructor TAppConfigProvider.Create;
 begin
   fCreateIfNotExists := True;
   fSerializeLevel := spPublished;
@@ -147,9 +124,9 @@ end;
 
 { TAppConfig }
 
-constructor TAppConfig.Create;
+constructor TAppConfig.Create(aConfigProvider : TAppConfigProvider);
 begin
-  fDateTimeZone := TDateTimeZone.tzLocal;
+  fProvider := aConfigProvider;
   fJsonIndent := True;
   fLastSaved := 0;
 end;
@@ -165,6 +142,12 @@ begin
 end;
 
 
+destructor TAppConfig.Destroy;
+begin
+  if Assigned(fProvider) then fProvider.Free;
+  inherited;
+end;
+
 function TAppConfig.ToJSON : string;
 var
   Serializer : TJsonSerializer;
@@ -189,7 +172,7 @@ begin
   try
     serializer := TJsonSerializer.Create(slPublishedProperty);
     try
-      {$IF NOT DEFINED(FPC) AND DEFINED(ANDROID)}
+      {$IF NOT DEFINED(FPC) AND DEFINED(NEXTGEN)}
       serializer.JsonToObject(Self,json);
       {$ELSE}
       Self := TAppConfig(serializer.JsonToObject(Self,json));
@@ -204,12 +187,12 @@ end;
 
 procedure TAppConfig.Load;
 begin
-  GetProvider.Load(Self);
+  fProvider.Load(Self);
 end;
 
 procedure TAppConfig.Save;
 begin
-  GetProvider.Save(Self);
+  fProvider.Save(Self);
 end;
 
 end.

+ 35 - 19
Quick.Config.Json.pas

@@ -1,13 +1,13 @@
 { ***************************************************************************
 
-  Copyright (c) 2015-2018 Kike Pérez
+  Copyright (c) 2015-2019 Kike Pérez
 
-  Unit        : Quick.Config.Provider.Json
+  Unit        : Quick.Config.Json
   Description : Save config to JSON file
   Author      : Kike Pérez
-  Version     : 1.4
+  Version     : 1.5
   Created     : 21/10/2017
-  Modified    : 10/12/2018
+  Modified    : 17/01/2019
 
   This file is part of QuickLib: https://github.com/exilon/QuickLib
 
@@ -53,33 +53,52 @@ uses
 
 type
 
-  TAppConfigJsonProvider = class(TAppConfigProviderBase)
+  TAppConfigJsonProvider = class(TAppConfigProvider)
   private
     fFilename : string;
     procedure Load(cConfig : TAppConfig); override;
     procedure Save(cConfig : TAppConfig); override;
   public
-    constructor Create; override;
+    constructor Create(const aFilename : string = ''); virtual;
     property Filename : string read fFilename write fFilename;
   end;
 
   TAppConfigJson = class(TAppConfig)
   private
-    fProvider : TAppConfigJsonProvider;
-    function GetProvider : IAppConfigProvider; override;
+    function GetProvider : TAppConfigJsonProvider;
   public
-    constructor Create; override;
+    constructor Create(const aFileName : string = ''); overload; virtual;
     destructor Destroy; override;
-    property Provider : TAppConfigJsonProvider read fProvider write fProvider;
+    property Provider : TAppConfigJsonProvider read GetProvider;
   end;
 
+  {Usage: create a descend class from TAppConfigJson and add published properties to be loaded/saved
+
+  TMyConfig = class(TAppConfigJson)
+  private
+    fName : string;
+    fSurname : string;
+    fStatus : Integer;
+  published
+    property Name : string read fName write fName;
+    property SurName : string read fSurname write fSurname;
+    property Status : Integer read fStatus write fStatus;
+  end;
+
+  MyConfig := TMyConfig.Create;
+  MyConfig.Provider.FileName := '.\MyAppName.json';
+  MyConfig.Name := 'John';
+  MyConfig.Save;
+  }
+
 
 implementation
 
-constructor TAppConfigJsonProvider.Create;
+constructor TAppConfigJsonProvider.Create(const aFilename : string = '');
 begin
   inherited Create;
-  fFilename := TPath.ChangeExtension(ParamStr(0),'json');
+  if aFilename = '' then fFilename := TPath.ChangeExtension(ParamStr(0),'json')
+    else fFilename := aFilename;
 end;
 
 procedure TAppConfigJsonProvider.Load(cConfig : TAppConfig);
@@ -150,22 +169,19 @@ end;
 
 { TAppConfigJson }
 
-constructor TAppConfigJson.Create;
+constructor TAppConfigJson.Create(const aFileName : string = '');
 begin
-  inherited;
-  fProvider := TAppConfigJsonProvider.Create;
+  inherited Create(TAppConfigJsonProvider.Create(aFileName));
 end;
 
-
 destructor TAppConfigJson.Destroy;
 begin
-  if Assigned(fProvider) then fProvider.Free;
   inherited;
 end;
 
-function TAppConfigJson.GetProvider: IAppConfigProvider;
+function TAppConfigJson.GetProvider: TAppConfigJsonProvider;
 begin
-  Result := fProvider;
+  Result := TAppConfigJsonProvider(fProvider);
 end;
 
 end.

+ 39 - 20
Quick.Config.Registry.pas

@@ -1,13 +1,13 @@
 { ***************************************************************************
 
-  Copyright (c) 2015-2018 Kike Pérez
+  Copyright (c) 2015-2019 Kike Pérez
 
-  Unit        : Quick.Config.Provider.Registry
+  Unit        : Quick.Config.Registry
   Description : Save config to Windows Registry
   Author      : Kike Pérez
-  Version     : 1.2
+  Version     : 1.5
   Created     : 21/10/2017
-  Modified    : 12/09/2018
+  Modified    : 17/01/2019
 
   This file is part of QuickLib: https://github.com/exilon/QuickLib
 
@@ -58,7 +58,7 @@ uses
 
 type
 
-  TAppConfigRegistryProvider = class(TAppConfigProviderBase)
+  TAppConfigRegistryProvider = class(TAppConfigProvider)
   private
     fRootKey : HKEY;
     fMainKey : string;
@@ -79,7 +79,7 @@ type
     procedure Load(cConfig : TAppConfig); override;
     procedure Save(cConfig : TAppConfig); override;
   public
-    constructor Create; override;
+    constructor Create(aHRoot : HKEY = HKEY_CURRENT_USER; const aMainKey : string = ''); virtual;
     destructor Destroy; override;
     property HRoot : HKEY read fRootKey write fRootKey;
     property MainKey : string read fMainKey write fMainKey;
@@ -89,25 +89,45 @@ type
 
   TAppConfigRegistry = class(TAppConfig)
   private
-    fProvider : TAppConfigRegistryProvider;
-    function GetProvider : IAppConfigProvider; override;
+    function GetProvider : TAppConfigRegistryProvider;
   public
-    constructor Create; override;
+    constructor Create(aHRoot : HKEY = HKEY_CURRENT_USER; const aMainKey : string = '');
     destructor Destroy; override;
-    property Provider : TAppConfigRegistryProvider read fProvider write fProvider;
+    property Provider : TAppConfigRegistryProvider read GetProvider;
   end;
 
+  {Usage: create a descend class from TAppConfigRegistry and add published properties to be loaded/saved
+
+  TMyConfig = class(TAppConfigRegistry)
+  private
+    fName : string;
+    fSurname : string;
+    fStatus : Integer;
+  published
+    property Name : string read fName write fName;
+    property SurName : string read fSurname write fSurname;
+    property Status : Integer read fStatus write fStatus;
+  end;
+
+  MyConfig := TMyConfig.Create;
+  MyConfig.Provider.MainKey := 'MyAppName';
+  MyConfig.Name := 'John';
+  MyConfig.Save;
+  }
+
 
 implementation
 
 
 { TAppConfigRegistryProvider }
 
-constructor TAppConfigRegistryProvider.Create;
+constructor TAppConfigRegistryProvider.Create(aHRoot : HKEY = HKEY_CURRENT_USER; const aMainKey : string = '');
 begin
   inherited Create;
-  fRootKey := HKEY_CURRENT_USER;
-  fMainKey := '_AppConfig';
+  if aHRoot <> HKEY_CURRENT_USER then fRootKey := aHRoot
+    else fRootKey := HKEY_CURRENT_USER;
+  if aMainKey <> '' then fMainKey := aMainKey
+    else fMainKey := '_AppConfig';
   fRegConfig := TRegistry.Create(KEY_READ or KEY_WRITE);
 end;
 
@@ -126,7 +146,8 @@ begin
   fRegConfig.RootKey := fRootKey;
   if not fRegConfig.KeyExists('\Software\' + fMainKey) then
   begin
-    if not CreateIfNotExists then raise EAppConfig.Create('Not exists MainKey in registry!');
+    if not CreateIfNotExists then raise EAppConfig.Create('Not exists MainKey in registry!')
+      else TAppConfigRegistry(cConfig).DefaultValues;
     Save(cConfig);
   end;
   RegistryToJson(json);
@@ -541,21 +562,19 @@ end;
 
 { TAppConfigRegistry }
 
-constructor TAppConfigRegistry.Create;
+constructor TAppConfigRegistry.Create(aHRoot : HKEY = HKEY_CURRENT_USER; const aMainKey : string = '');
 begin
-  inherited;
-  fProvider := TAppConfigRegistryProvider.Create;
+  inherited Create(TAppConfigRegistryProvider.Create(aHRoot,aMainKey));
 end;
 
 destructor TAppConfigRegistry.Destroy;
 begin
-  if Assigned(fProvider) then fProvider.Free;
   inherited;
 end;
 
-function TAppConfigRegistry.GetProvider: IAppConfigProvider;
+function TAppConfigRegistry.GetProvider: TAppConfigRegistryProvider;
 begin
-  Result := fProvider;
+  Result := TAppConfigRegistryProvider(fProvider);
 end;
 
 end.