AppHelper.pas
上传用户:yj_qiu
上传日期:2022-08-08
资源大小:23636k
文件大小:4k
源码类别:

游戏引擎

开发平台:

Delphi

  1. (*
  2.  @Abstract(Applications Helper Unit)
  3.  (C) 2006 George "Mirage" Bakhtadze.
  4.  The source code may be used under either MPL 1.1 or LGPL 2.1 license. See included license.txt file <br>
  5.  Unit contains advanced GUI controls
  6. *)
  7. {$Include GDefines.inc}
  8. unit AppHelper;
  9. interface
  10. uses
  11.   TextFile,
  12.   {$IFDEF SHAREWARE} RS2, {$ENDIF}
  13.   BaseMsg, Basics, Props, AppsInit;
  14. const
  15.   // Extension of configuration file
  16.   IniFileExtension = '.ini';
  17.   // A name of property in config representing license name
  18.   LicenseNameProp = 'License name';
  19.   // A name of property in config representing license code
  20.   LicenseCodeProp = 'License code';
  21. type
  22.   // Application actions. Usally actions are bond to input events specified by <b>ActivateBinding</b> and <b>DeactivateBinding</b>
  23.   TAction = record
  24.     Name, ActivateBinding, DeactivateBinding: string;
  25.     Message: CMessage;
  26.     Active: Boolean;
  27.   end;
  28.   { @Abstract(Base application class)
  29.   }
  30.   TApp = class
  31.   private
  32.     FStarter: TAppStarter;
  33.     FConfig: TNiceFileConfig;
  34.     function IsActionActive(const AName: string): Boolean;
  35.   protected
  36.     // Array of registered actions
  37.     FActions: array of TAction;
  38.     // Returns action index in array by its name or -1 if not found
  39.     function GetActionIndex(const AName: string): Integer;
  40.     // Active status of action by action name
  41.     property Action[const Name: string]: Boolean read IsActionActive;
  42.   public
  43.     // Config to store license information
  44.     KeyCfg: TProperties;
  45.     {$IFDEF SHAREWARE}
  46.     // A number which determines a random chain used to generate license keys
  47.     RandomChain: Cardinal;
  48.     {$ENDIF}
  49.     // Create an application with the specified name using the specified starter
  50.     constructor Create(const AProgramName: string; AStarter: TAppStarter); virtual;
  51.     // Destroy the application
  52.     destructor Destroy; override;
  53.     // Returns <b>True</b> if a trial restrictions should be applied to the application
  54.     function IsTrial: Boolean; virtual;
  55.     {$IFDEF SHAREWARE}
  56.     // Extracts a license name and code from a string by signatures
  57.     function ExtractLicense(s: string; out Name, Code: string): Boolean;
  58.     {$ENDIF}
  59.     // Application starter
  60.     property Starter: TAppStarter read FStarter;
  61.     // Application configuration 
  62.     property Config: TNiceFileConfig read FConfig;
  63.   end;
  64. implementation
  65. uses SysUtils;
  66. { TApp }
  67. // Private
  68. function TApp.GetActionIndex(const AName: string): Integer;
  69. begin
  70.   for Result := 0 to High(FActions) do if FActions[Result].Name = AName then Exit;
  71.   Result := -1;
  72. end;
  73. function TApp.IsActionActive(const AName: string): Boolean;
  74. var Index: Integer;
  75. begin
  76.   Result := False;
  77.   Index := GetActionIndex(AName);
  78.   if (Index = -1) or (FActions[Index].DeactivateBinding = '') then begin
  79.     Log.Log(ClassName + '.IsActive: Action "' + AName + '" not found or does not have activation semantics', lkWarning);
  80.     Exit;
  81.   end;
  82.   Result := FActions[Index].Active;
  83. end;
  84. constructor TApp.Create(const AProgramName: string; AStarter: TAppStarter);
  85. begin
  86.   FStarter := AStarter;
  87.   FConfig  := TNiceFileConfig.Create(IncludeTrailingPathDelimiter(Starter.ProgramWorkDir) + AStarter.ProgramExeName + IniFileExtension);
  88. end;
  89. {$IFDEF SHAREWARE}
  90. function TApp.ExtractLicense(s: string; out Name, Code: string): Boolean;
  91. var i: Integer; 
  92. begin
  93.   Result := False;
  94.   s := UpperCase(s);
  95.   for i := 0 to TotalLicCodeSignatures-1 do begin
  96.     {$IFNDEF PORTALBUILD}
  97.     Name := ExtractStr(s, UpperCase(NameSigs[i]));
  98.     if Name = '' then Continue;
  99.     {$ENDIF}
  100.     Code := ExtractStr(s, UpperCase(KeySigs[i]));
  101.     if Code <> '' then Break;
  102.   end;
  103.   Result := Code <> '';
  104. end;
  105. {$ENDIF}
  106. destructor TApp.Destroy;
  107. begin
  108.   FreeAndNil(FConfig);
  109.   Starter.Terminate;
  110. end;
  111. function TApp.IsTrial: Boolean;
  112. begin
  113.   {$IFDEF SHAREWARE}
  114.   Result := not RS2.VC(KeyCfg[LicenseNameProp], KeyCfg[LicenseCodeProp], RandomChain);
  115.   {$ELSE}
  116.   Result := False;
  117.   {$ENDIF}
  118. end;
  119. end.