📄 jvprogramversioncheck.pas
字号:
{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: JvProgramVersionCheck.PAS, released on 2004-12-16.
The Initial Developer of the Original Code is Jens Fudickar [jens dott fudickar att oratool dott com]
All Rights Reserved.
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.sourceforge.net
Known Issues:
-----------------------------------------------------------------------------}
// $Id: JvProgramVersionCheck.pas,v 1.8 2005/02/17 10:20:45 marquardt Exp $
unit JvProgramVersionCheck;
{$I jvcl.inc}
interface
uses
{$IFDEF UNITVERSIONING}
JclUnitVersioning,
{$ENDIF UNITVERSIONING}
Classes,
{$IFDEF USE_3RDPARTY_INDY}
idhttp, idftp,
{$ENDIF USE_3RDPARTY_INDY}
{$IFDEF USE_3RDPARTY_ICS}
HttpProt, FtpCli,
{$ENDIF USE_3RDPARTY_ICS}
JvPropertyStore, JvAppStorage, JvAppIniStorage, JvComponent,
JvParameterList, JvThread, JvUrlListGrabber, JvUrlGrabbers, JvThreadDialog;
type
{ Type of release of a Program Version }
TJvProgramReleaseType = (prtProduction, prtBeta, prtAlpha);
TJvRemoteVersionOperation = (rvoIgnore, rvoCopy, rvoCopyInstall);
{ List class to collect and sort version infos }
TJvProgramVersionsStringList = class(TStringList)
public
procedure Sort; override;
end;
{ Class to collect all informations about a program version
These informations will be stored in the ini-file on the remote site}
TJvProgramVersionInfo = class(TJvCustomPropertyStore)
private
FDownloadPasswordRequired: Boolean;
FVersionDescription: TStringList;
FProgramSize: Integer;
FProgramVersion: string;
FProgramLocationPath: string;
FProgramLocationFileName: string;
FProgramReleaseType: TJvProgramReleaseType;
FProgramReleaseDate: TDateTime;
function GetVersionDescription: TStrings;
procedure SetVersionDescription(Value: TStrings);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Clear; override;
{ Combination of ProgramVersion and ReleaseType }
function ProgramVersionReleaseType: string;
function ProgramSizeString: string;
function ProgramVersionInfo: string;
published
property DownloadPasswordRequired: Boolean read FDownloadPasswordRequired write
FDownloadPasswordRequired default False;
{ Path where the installer of the version could be found. This could be
a absolute path or a relative path to the location of the version list file }
property ProgramLocationPath: string read FProgramLocationPath write FProgramLocationPath;
{ File name of the installer file }
property ProgramLocationFileName: string
read FProgramLocationFileName write FProgramLocationFileName;
{ Program version in the format <main>.<sub>.<release>.<build>
This property is compared with the fileversion properties of the current
application. }
property ProgramVersion: string read FProgramVersion write FProgramVersion;
{ This is a description field which could be shown in the update dialog via
the version info button }
property VersionDescription: TStrings read GetVersionDescription write SetVersionDescription;
{ Release type of the version.
In the update dialog there are only the highest version numbers for each type
visible. The type must be higher then AllowedReleaseType property of the
TJvProgramVersionCheck component }
property ProgramReleaseType: TJvProgramReleaseType read FProgramReleaseType write FProgramReleaseType;
{ Size of the installer in bytes }
property ProgramSize: Integer read FProgramSize write FProgramSize;
{ Date of Release }
property ProgramReleaseDate: TDateTime read FProgramReleaseDate write FProgramReleaseDate;
end;
TJvProgramVersionInfoReleaseArray = array [TJvProgramReleaseType] of TJvProgramVersionInfo;
{ List of all Program version stored in a remote file via TJvAppStorage }
TJvProgramVersionHistory = class(TJvCustomPropertyListStore)
private
FCurrentProductionVersion: string;
FCurrentBetaVersion: string;
FCurrentAlphaVersion: string;
FCurrentProgramVersion: TJvProgramVersionInfoReleaseArray;
protected
function CreateObject: TObject; override;
function CreateItemList: TStringList; override;
function GetProgramVersion(Index: Integer): TJvProgramVersionInfo;
function GetCurrentProgramVersion(Index: TJvProgramReleaseType): TJvProgramVersionInfo;
function SearchCurrentProgramVersion(AProgramReleaseType: TJvProgramReleaseType): TJvProgramVersionInfo;
function GetCurrentProductionProgramVersion: string;
function GetCurrentBetaProgramVersion: string;
function GetCurrentAlphaProgramVersion: string;
property ProgramVersion[Index: Integer]: TJvProgramVersionInfo read GetProgramVersion;
public
constructor Create(AOwner: TComponent); override;
procedure LoadData; override;
procedure RecalculateCurrentProgramVersions;
function AllowedCurrentProgramVersion(AAllowedReleaseType: TJvProgramReleaseType): TJvProgramVersionInfo;
function GetVersionsDescription(const AFromVersion, AToVersion: string): string;
property CurrentProgramVersion[Index: TJvProgramReleaseType]: TJvProgramVersionInfo read GetCurrentProgramVersion;
published
property CurrentProductionProgramVersion: string
read GetCurrentProductionProgramVersion write FCurrentProductionVersion;
property CurrentBetaProgramVersion: string read GetCurrentBetaProgramVersion write FCurrentBetaVersion;
property CurrentAlphaProgramVersion: string read GetCurrentAlphaProgramVersion write FCurrentAlphaVersion;
end;
{ Base class for all location
A Location is the class which defines where the remote files could be found and
manages all communications to these files. }
TJvCustomProgramVersionLocation = class(TJvCustomPropertyStore)
private
FDownloadError: string;
FDownloadStatus: string;
FDownloadThreaded: Boolean;
protected
procedure SetDownloadStatus(Value: string);
function LoadFileFromRemoteInt(const ARemotePath, ARemoteFileName, ALocalPath, ALocalFileName: string;
ABaseThread: TJvBaseThread): string; virtual;
property DownloadStatus: string read FDownloadStatus write FDownloadStatus;
property DownloadError: string read FDownloadError write FDownloadError;
property DownloadThreaded: Boolean read FDownloadThreaded write FDownloadThreaded default False;
public
constructor Create(AOwner: TComponent); override;
function LoadFileFromRemote(const ARemotePath, ARemoteFileName, ALocalPath, ALocalFileName: string;
ABaseThread: TJvBaseThread): string; virtual;
function LoadInstallerFileFromRemote(const ARemotePath, ARemoteFileName, ALocalPath, ALocalFileName: string;
ABaseThread: TJvBaseThread): string; virtual;
function LoadVersionInfoFromRemote(const ALocalDirectory, ALocalVersionInfoFileName: string;
ABaseThread: TJvBaseThread): string; virtual;
end;
{ Base class for all file based Locations like Network, FTP and HTTP }
TJvCustomProgramVersionFileBasedLocation = class(TJvCustomProgramVersionLocation)
private
FVersionInfoLocationPathList: TStringList;
FVersionInfoFileName: string;
FValidLocationPath: string;
function GetVersionInfoLocationPathList: TStrings;
procedure SetVersionInfoLocationPathList(Value: TStrings);
{ If the location has a list of possible pathes, this property contains
the path where the last valid download has happend}
property ValidLocationPath: string read FValidLocationPath;
{ List of locations-path where the remote files could be found
The application loops throuh all path from the top }
property VersionInfoLocationPathList: TStrings read GetVersionInfoLocationPathList
write SetVersionInfoLocationPathList;
{ Name of the VersionInfofile at the remote location }
property VersionInfoFileName: string read FVersionInfoFileName write FVersionInfoFileName;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function LoadVersionInfoFromRemote(const ALocalDirectory,
ALocalVersionInfoFileName: string; ABaseThread: TJvBaseThread): string; override;
function LoadInstallerFileFromRemote(const ARemotePath, ARemoteFileName,
ALocalPath, ALocalFileName: string; ABaseThread: TJvBaseThread): string; override;
end;
{ Location Class for Local Network Location }
TJvProgramVersionNetworkLocation = class(TJvCustomProgramVersionFileBasedLocation)
protected
function LoadFileFromRemoteInt(const ARemotePath, ARemoteFileName, ALocalPath, ALocalFileName: string;
ABaseThread: TJvBaseThread): string; override;
published
property VersionInfoLocationPathList;
property VersionInfoFileName;
end;
{ Class for Proxy Settings for FTP and HTTP locations }
TJvProgramVersionProxySettings = class(TPersistent)
private
FServer: string;
FPort: Integer;
FUserName: string;
FPassword: string;
public
constructor Create;
published
property Server: string read FServer write FServer;
property Port: Integer read FPort write FPort default 80;
property UserName: string read FUserName write FUserName;
property Password: string read FPassword write FPassword;
end;
{ Base class for all Internet locations }
TJvCustomProgramVersionInternetLocation = class(TJvCustomProgramVersionFileBasedLocation)
private
FProxySettings: TJvProgramVersionProxySettings;
FPasswordRequired: Boolean;
FUserName: string;
FPassword: string;
FPort: Integer;
protected
property ProxySettings: TJvProgramVersionProxySettings read FProxySettings;
property UserName: string read FUserName write FUserName;
property Password: string read FPassword write FPassword;
property PasswordRequired: Boolean read FPasswordRequired write FPasswordRequired default False;
property Port: Integer read FPort write FPort default 80;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
TJvProgramVersionHTTPLocation = class;
TJvLoadFileFromRemoteHTTPEvent = function(AProgramVersionLocation: TJvProgramVersionHTTPLocation;
const ARemotePath, ARemoteFileName, ALocalPath, ALocalFileName: string): string of object;
{ Simple HTTP location class with no http logic.
The logic must be implemented manually in the OnLoadFileFromRemote event }
TJvProgramVersionHTTPLocation = class(TJvCustomProgramVersionInternetLocation)
private
FOnLoadFileFromRemote: TJvLoadFileFromRemoteHTTPEvent;
protected
function LoadFileFromRemoteInt(const ARemotePath, ARemoteFileName, ALocalPath, ALocalFileName: string;
ABaseThread: TJvBaseThread): string; override;
published
property OnLoadFileFromRemote: TJvLoadFileFromRemoteHTTPEvent
read FOnLoadFileFromRemote write FOnLoadFileFromRemote;
property ProxySettings;
property UserName;
property Password;
property PasswordRequired;
property Port;
property VersionInfoLocationPathList;
property VersionInfoFileName;
end;
{$IFDEF USE_3RDPARTY_INDY}
TJvProgramVersionHTTPLocationIndy = class(TJvProgramVersionHTTPLocation)
private
FIdHttp: TIdHttp;
protected
function LoadFileFromRemoteInt(const ARemotePath, ARemoteFileName, ALocalPath, ALocalFileName: string;
ABaseThread: TJvBaseThread): string; override;
function LoadFileFromRemoteIndy(const ARemotePath, ARemoteFileName, ALocalPath, ALocalFileName: string;
ABaseThread: TJvBaseThread): string;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property ProxySettings;
property UserName;
property Password;
property PasswordRequired;
property Port;
property VersionInfoLocationPathList;
property VersionInfoFileName;
end;
{$ENDIF USE_3RDPARTY_INDY}
{$IFDEF USE_3RDPARTY_ICS}
TJvProgramVersionHTTPLocationICS = class(TJvProgramVersionHTTPLocation)
private
FHttpCli: THttpCli;
protected
function LoadFileFromRemoteInt(const ARemotePath, ARemoteFileName, ALocalPath, ALocalFileName: string;
ABaseThread: TJvBaseThread): string; override;
function LoadFileFromRemoteIcs(const ARemotePath, ARemoteFileName, ALocalPath, ALocalFileName: string;
ABaseThread: TJvBaseThread): string;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property ProxySettings;
property UserName;
property Password;
property PasswordRequired;
property Port;
property VersionInfoLocationPathList;
property VersionInfoFileName;
end;
{$ENDIF USE_3RDPARTY_ICS}
TJvProgramVersionFTPLocation = class;
TJvLoadFileFromRemoteFTPEvent = function(AProgramVersionLocation: TJvProgramVersionFTPLocation;
const ARemotePath, ARemoteFileName, ALocalPath, ALocalFileName: string): string of object;
{ Simple FTP location class with no http logic.
The logic must be implemented manually in the OnLoadFileFromRemote event }
TJvProgramVersionFTPLocation = class(TJvCustomProgramVersionInternetLocation)
private
FOnLoadFileFromRemote: TJvLoadFileFromRemoteFTPEvent;
protected
function LoadFileFromRemoteInt(const ARemotePath, ARemoteFileName, ALocalPath, ALocalFileName: string;
ABaseThread: TJvBaseThread): string; override;
published
property OnLoadFileFromRemote: TJvLoadFileFromRemoteFTPEvent
read FOnLoadFileFromRemote write FOnLoadFileFromRemote;
property ProxySettings;
end;
{$IFDEF USE_3RDPARTY_INDY}
TJvProgramVersionFTPLocationIndy = class(TJvProgramVersionFTPLocation)
private
FIdFtp: TIdFtp;
protected
function LoadFileFromRemoteInt(const ARemotePath, ARemoteFileName, ALocalPath, ALocalFileName: string;
ABaseThread: TJvBaseThread): string; override;
function LoadFileFromRemoteIndy(const ARemotePath, ARemoteFileName, ALocalPath, ALocalFileName: string;
ABaseThread: TJvBaseThread): string;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property ProxySettings;
property UserName;
property Password;
property PasswordRequired;
property Port;
property VersionInfoLocationPathList;
property VersionInfoFileName;
end;
{$ENDIF USE_3RDPARTY_INDY}
{$IFDEF USE_3RDPARTY_ICS}
TJvProgramVersionFTPLocationICS = class(TJvProgramVersionFTPLocation)
private
FFtpClient: TFtpClient;
protected
function LoadFileFromRemoteInt(const ARemotePath, ARemoteFileName, ALocalPath, ALocalFileName: string;
ABaseThread: TJvBaseThread): string; override;
function LoadFileFromRemoteIcs(const ARemotePath, ARemoteFileName, ALocalPath, ALocalFileName: string;
ABaseThread: TJvBaseThread): string;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -