mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-03 18:01:29 +02:00
Opkman: In order to prevent memory leaks, the update of serializable packages are protected with critical sections.
git-svn-id: trunk@59719 -
This commit is contained in:
parent
c48f6d7a4b
commit
0c07ac1983
@ -116,6 +116,7 @@ var
|
|||||||
LocalRepositoryUpdatesFile: String;
|
LocalRepositoryUpdatesFile: String;
|
||||||
PackageAction: TPackageAction;
|
PackageAction: TPackageAction;
|
||||||
InstallPackageList: TObjectList;
|
InstallPackageList: TObjectList;
|
||||||
|
CriticalSection: TRTLCriticalSection;
|
||||||
|
|
||||||
function MessageDlgEx(const AMsg: String; ADlgType: TMsgDlgType; AButtons:
|
function MessageDlgEx(const AMsg: String; ADlgType: TMsgDlgType; AButtons:
|
||||||
TMsgDlgButtons; AParent: TForm): TModalResult;
|
TMsgDlgButtons; AParent: TForm): TModalResult;
|
||||||
|
@ -80,6 +80,7 @@ uses opkman_common, opkman_options, opkman_const, opkman_progressfrm, opkman_zip
|
|||||||
|
|
||||||
constructor TOPMInterfaceEx.Create;
|
constructor TOPMInterfaceEx.Create;
|
||||||
begin
|
begin
|
||||||
|
InitCriticalSection(CriticalSection);
|
||||||
Application.AddOnExceptionHandler(@DoHandleException);
|
Application.AddOnExceptionHandler(@DoHandleException);
|
||||||
FPackageLinks := TObjectList.Create(False);
|
FPackageLinks := TObjectList.Create(False);
|
||||||
FPackagesToDownload := TObjectList.Create(False);
|
FPackagesToDownload := TObjectList.Create(False);
|
||||||
@ -107,23 +108,25 @@ begin
|
|||||||
SerializablePackages.Free;
|
SerializablePackages.Free;
|
||||||
Options.Free;
|
Options.Free;
|
||||||
InstallPackageList.Free;
|
InstallPackageList.Free;
|
||||||
|
DoneCriticalsection(CriticalSection);
|
||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TOPMInterfaceEx.DoOnIDEClose(Sender: TObject);
|
procedure TOPMInterfaceEx.DoOnIDEClose(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
|
if Assigned(PackageDownloader) then
|
||||||
|
if PackageDownloader.DownloadingJSON then
|
||||||
|
PackageDownloader.Cancel;
|
||||||
if Assigned(Updates) then
|
if Assigned(Updates) then
|
||||||
begin
|
begin
|
||||||
Updates.StopUpdate;
|
Updates.StopUpdate;
|
||||||
Updates.Terminate;
|
Updates.Terminate;
|
||||||
Sleep(100);
|
Updates.WaitFor;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure TOPMInterfaceEx.DoOnTimer(Sender: TObject);
|
procedure TOPMInterfaceEx.DoOnTimer(Sender: TObject);
|
||||||
var
|
|
||||||
FileName: String;
|
|
||||||
begin
|
begin
|
||||||
if Assigned(LazarusIDE) and Assigned(PackageEditingInterface) and (not LazarusIDE.IDEIsClosing) then
|
if Assigned(LazarusIDE) and Assigned(PackageEditingInterface) and (not LazarusIDE.IDEIsClosing) then
|
||||||
begin
|
begin
|
||||||
@ -141,11 +144,12 @@ begin
|
|||||||
if (not LazarusIDE.IDEIsClosing) then
|
if (not LazarusIDE.IDEIsClosing) then
|
||||||
begin
|
begin
|
||||||
if Options.CheckForUpdates <> 5 then
|
if Options.CheckForUpdates <> 5 then
|
||||||
|
begin
|
||||||
PackageDownloader.DownloadJSON(Options.ConTimeOut*1000, True);
|
PackageDownloader.DownloadJSON(Options.ConTimeOut*1000, True);
|
||||||
LazarusIDE.AddHandlerOnIDEClose(@DoOnIDEClose);
|
LazarusIDE.AddHandlerOnIDEClose(@DoOnIDEClose);
|
||||||
FileName := Format(LocalRepositoryUpdatesFile, [MD5Print(MD5String(Options.RemoteRepository[Options.ActiveRepositoryIndex]))]);
|
Updates := TUpdates.Create;
|
||||||
Updates := TUpdates.Create(FileName);
|
Updates.StartUpdate;
|
||||||
Updates.StartUpdate;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
@ -38,7 +38,7 @@ uses
|
|||||||
// IdeIntf
|
// IdeIntf
|
||||||
IDECommands, PackageIntf,
|
IDECommands, PackageIntf,
|
||||||
// OpkMan
|
// OpkMan
|
||||||
opkman_downloader, opkman_installer, opkman_updates,
|
opkman_downloader, opkman_installer,
|
||||||
opkman_serializablepackages, opkman_visualtree, opkman_const, opkman_common,
|
opkman_serializablepackages, opkman_visualtree, opkman_const, opkman_common,
|
||||||
opkman_progressfrm, opkman_zipper, opkman_packagelistfrm, opkman_options,
|
opkman_progressfrm, opkman_zipper, opkman_packagelistfrm, opkman_options,
|
||||||
opkman_optionsfrm, opkman_createrepositorypackagefrm, opkman_maindm,
|
opkman_optionsfrm, opkman_createrepositorypackagefrm, opkman_maindm,
|
||||||
@ -389,8 +389,6 @@ begin
|
|||||||
Exit;
|
Exit;
|
||||||
end;
|
end;
|
||||||
VisualTree.PopulateTree;
|
VisualTree.PopulateTree;
|
||||||
if Assigned (Updates) then
|
|
||||||
Updates.StartUpdate(True);
|
|
||||||
VisualTree.UpdatePackageUStatus;
|
VisualTree.UpdatePackageUStatus;
|
||||||
EnableDisableControls(True);
|
EnableDisableControls(True);
|
||||||
SetupMessage;
|
SetupMessage;
|
||||||
|
@ -31,7 +31,7 @@ unit opkman_serializablepackages;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Classes, SysUtils, Variants, contnrs, dateutils, fpjson, jsonparser,
|
Classes, SysUtils, Variants, contnrs, dateutils, fpjson, jsonparser, md5,
|
||||||
// LazUtils
|
// LazUtils
|
||||||
FileUtil, Laz2_XMLCfg, LazFileUtils,
|
FileUtil, Laz2_XMLCfg, LazFileUtils,
|
||||||
// IdeIntf
|
// IdeIntf
|
||||||
@ -237,6 +237,7 @@ type
|
|||||||
FLastError: String;
|
FLastError: String;
|
||||||
FOnProcessJSON: TNotifyEvent;
|
FOnProcessJSON: TNotifyEvent;
|
||||||
FOnUpdatePackageLinks: TNotifyEvent;
|
FOnUpdatePackageLinks: TNotifyEvent;
|
||||||
|
FUpdates: String;
|
||||||
function GetCount: Integer;
|
function GetCount: Integer;
|
||||||
function GetDownloadCount: Integer;
|
function GetDownloadCount: Integer;
|
||||||
function GetExtractCount: Integer;
|
function GetExtractCount: Integer;
|
||||||
@ -255,6 +256,8 @@ type
|
|||||||
function GetPackageVersion(const APath: String): String;
|
function GetPackageVersion(const APath: String): String;
|
||||||
function GetPackageDescription(const APath: String): String;
|
function GetPackageDescription(const APath: String): String;
|
||||||
function GetPackageLicense(const APath: String): String;
|
function GetPackageLicense(const APath: String): String;
|
||||||
|
procedure LoadUpdateInfo;
|
||||||
|
procedure SaveUpdateInfo;
|
||||||
public
|
public
|
||||||
constructor Create;
|
constructor Create;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
@ -590,10 +593,13 @@ end;
|
|||||||
constructor TSerializablePackages.Create;
|
constructor TSerializablePackages.Create;
|
||||||
begin
|
begin
|
||||||
FMetaPackages := TCollection.Create(TMetaPackage);
|
FMetaPackages := TCollection.Create(TMetaPackage);
|
||||||
|
FUpdates := Format(LocalRepositoryUpdatesFile, [MD5Print(MD5String(Options.RemoteRepository[Options.ActiveRepositoryIndex]))]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
destructor TSerializablePackages.Destroy;
|
destructor TSerializablePackages.Destroy;
|
||||||
begin
|
begin
|
||||||
|
if Count > 0 then
|
||||||
|
SaveUpdateInfo;
|
||||||
Clear;
|
Clear;
|
||||||
FMetaPackages.Free;
|
FMetaPackages.Free;
|
||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
@ -968,8 +974,11 @@ begin
|
|||||||
Parser.Free;
|
Parser.Free;
|
||||||
end;
|
end;
|
||||||
if Result then
|
if Result then
|
||||||
|
begin
|
||||||
|
LoadUpdateInfo;
|
||||||
if Assigned(FOnUpdatePackageLinks) then
|
if Assigned(FOnUpdatePackageLinks) then
|
||||||
FOnUpdatePackageLinks(Self);
|
FOnUpdatePackageLinks(Self);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSerializablePackages.LazarusPackagesToJSON(AMetaPackage: TMetaPackage;
|
function TSerializablePackages.LazarusPackagesToJSON(AMetaPackage: TMetaPackage;
|
||||||
@ -1115,6 +1124,97 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TSerializablePackages.LoadUpdateInfo;
|
||||||
|
var
|
||||||
|
PackageCount: Integer;
|
||||||
|
LazarusPkgCount: Integer;
|
||||||
|
I, J: Integer;
|
||||||
|
Path, SubPath: String;
|
||||||
|
PackageName: String;
|
||||||
|
LazarusPkgName: String;
|
||||||
|
MetaPkg: TMetaPackage;
|
||||||
|
LazarusPkg: TLazarusPackage;
|
||||||
|
HasUpdate: Boolean;
|
||||||
|
FXML: TXMLConfig;
|
||||||
|
begin
|
||||||
|
if not FileExists(FUpdates) then
|
||||||
|
Exit;
|
||||||
|
FXML := TXMLConfig.Create(FUpdates);
|
||||||
|
try
|
||||||
|
PackageCount := FXML.GetValue('Count/Value', 0);
|
||||||
|
for I := 0 to PackageCount - 1 do
|
||||||
|
begin
|
||||||
|
Path := 'Package' + IntToStr(I) + '/';
|
||||||
|
PackageName := FXML.GetValue(Path + 'Name', '');
|
||||||
|
MetaPkg := FindMetaPackage(PackageName, fpbPackageName);
|
||||||
|
if MetaPkg <> nil then
|
||||||
|
begin
|
||||||
|
HasUpdate := False;
|
||||||
|
MetaPkg.DownloadZipURL := FXML.GetValue(Path + 'DownloadZipURL', '');
|
||||||
|
MetaPkg.DisableInOPM := FXML.GetValue(Path + 'DisableInOPM', False);
|
||||||
|
MetaPkg.Rating := FXML.GetValue(Path + 'Rating', 0);
|
||||||
|
LazarusPkgCount := FXML.GetValue(Path + 'Count', 0);
|
||||||
|
for J := 0 to LazarusPkgCount - 1 do
|
||||||
|
begin
|
||||||
|
SubPath := Path + 'PackageFile' + IntToStr(J) + '/';
|
||||||
|
LazarusPkgName := FXML.GetValue(SubPath + 'Name', '');
|
||||||
|
LazarusPkg := MetaPkg.FindLazarusPackage(LazarusPkgName);
|
||||||
|
if LazarusPkg <> nil then
|
||||||
|
begin
|
||||||
|
LazarusPkg.UpdateVersion := FXML.GetValue(SubPath + 'UpdateVersion', '');
|
||||||
|
LazarusPkg.ForceNotify := FXML.GetValue(SubPath + 'ForceNotify', False);
|
||||||
|
LazarusPkg.InternalVersion := FXML.GetValue(SubPath + 'InternalVersion', 0);;
|
||||||
|
LazarusPkg.InternalVersionOld := FXML.GetValue(SubPath + 'InternalVersionOld', 0);
|
||||||
|
LazarusPkg.RefreshHasUpdate;
|
||||||
|
if not HasUpdate then
|
||||||
|
HasUpdate := (LazarusPkg.HasUpdate) and (LazarusPkg.InstalledFileVersion < LazarusPkg.UpdateVersion);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
MetaPkg.HasUpdate := HasUpdate;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
FXML.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TSerializablePackages.SaveUpdateInfo;
|
||||||
|
var
|
||||||
|
I, J: Integer;
|
||||||
|
Path, SubPath: String;
|
||||||
|
MetaPkg: TMetaPackage;
|
||||||
|
LazarusPkg: TLazarusPackage;
|
||||||
|
FXML: TXMLConfig;
|
||||||
|
begin
|
||||||
|
FXML := TXMLConfig.CreateClean(FUpdates);
|
||||||
|
try
|
||||||
|
FXML.SetDeleteValue('Version/Value', OpkVersion, 0);
|
||||||
|
FXML.SetDeleteValue('Count/Value', Count, 0);
|
||||||
|
for I := 0 to Count - 1 do
|
||||||
|
begin
|
||||||
|
MetaPkg := Items[I];
|
||||||
|
Path := 'Package' + IntToStr(I) + '/';
|
||||||
|
FXML.SetDeleteValue(Path + 'Name', MetaPkg.Name, '');
|
||||||
|
FXML.SetDeleteValue(Path + 'DownloadZipURL', MetaPkg.DownloadZipURL, '');
|
||||||
|
FXML.SetDeleteValue(Path + 'DisableInOPM', MetaPkg.DisableInOPM, False);
|
||||||
|
FXML.SetDeleteValue(Path + 'Rating', MetaPkg.Rating, 0);
|
||||||
|
FXML.SetDeleteValue(Path + 'Count', Items[I].LazarusPackages.Count, 0);
|
||||||
|
for J := 0 to Items[I].LazarusPackages.Count - 1 do
|
||||||
|
begin
|
||||||
|
SubPath := Path + 'PackageFile' + IntToStr(J) + '/';
|
||||||
|
LazarusPkg := TLazarusPackage(Items[I].LazarusPackages.Items[J]);
|
||||||
|
FXML.SetDeleteValue(SubPath + 'Name', LazarusPkg.Name, '');
|
||||||
|
FXML.SetDeleteValue(SubPath + 'UpdateVersion', LazarusPkg.UpdateVersion, '');
|
||||||
|
FXML.SetDeleteValue(SubPath + 'ForceNotify', LazarusPkg.ForceNotify, False);
|
||||||
|
FXML.SetDeleteValue(SubPath + 'InternalVersion', LazarusPkg.InternalVersion, 0);
|
||||||
|
FXML.SetDeleteValue(SubPath + 'InternalVersionOld', LazarusPkg.InternalVersionOld, 0);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
FXML.Flush;
|
||||||
|
finally
|
||||||
|
FXML.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
function TSerializablePackages.IsPackageInstalled(const ALazarusPkg: TLazarusPackage;
|
function TSerializablePackages.IsPackageInstalled(const ALazarusPkg: TLazarusPackage;
|
||||||
const APackageBaseDir: String): Boolean;
|
const APackageBaseDir: String): Boolean;
|
||||||
|
@ -32,7 +32,7 @@ interface
|
|||||||
uses
|
uses
|
||||||
Classes, SysUtils, fpjson, fpjsonrtti, jsonparser, dateutils,
|
Classes, SysUtils, fpjson, fpjsonrtti, jsonparser, dateutils,
|
||||||
// LazUtils
|
// LazUtils
|
||||||
Laz2_XMLCfg, LazIDEIntf,
|
LazIDEIntf,
|
||||||
// OpkMan
|
// OpkMan
|
||||||
opkman_serializablepackages, opkman_options, opkman_common, opkman_visualtree,
|
opkman_serializablepackages, opkman_options, opkman_common, opkman_visualtree,
|
||||||
{$IFDEF MSWINDOWS}
|
{$IFDEF MSWINDOWS}
|
||||||
@ -101,31 +101,29 @@ type
|
|||||||
{ TUpdates }
|
{ TUpdates }
|
||||||
TUpdates = class(TThread)
|
TUpdates = class(TThread)
|
||||||
private
|
private
|
||||||
|
FSP_Temp: TSerializablePackages;
|
||||||
FHTTPClient: TFPHTTPClient;
|
FHTTPClient: TFPHTTPClient;
|
||||||
FUpdatePackage: TUpdatePackage;
|
FUpdatePackage: TUpdatePackage;
|
||||||
FVersion: Integer;
|
|
||||||
FNeedToBreak: Boolean;
|
FNeedToBreak: Boolean;
|
||||||
FBusyUpdating: Boolean;
|
FBusyUpdating: Boolean;
|
||||||
FBusySaving: Boolean;
|
|
||||||
FOpenSSLAvailable: Boolean;
|
FOpenSSLAvailable: Boolean;
|
||||||
FTime: QWORD;
|
FTime: QWORD;
|
||||||
FInterval: Cardinal;
|
FInterval: Cardinal;
|
||||||
FFileName: String;
|
|
||||||
FStarted: Boolean;
|
FStarted: Boolean;
|
||||||
function GetUpdateInfo(const AURL: String; var AJSON: TJSONStringType): Boolean;
|
function GetUpdateInfo(const AURL: String; var AJSON: TJSONStringType): Boolean;
|
||||||
procedure Load;
|
|
||||||
procedure Save;
|
|
||||||
procedure AssignPackageData(AMetaPackage: TMetaPackage);
|
procedure AssignPackageData(AMetaPackage: TMetaPackage);
|
||||||
procedure ResetPackageData(AMetaPackage: TMetaPackage);
|
procedure ResetPackageData(AMetaPackage: TMetaPackage);
|
||||||
procedure CheckForOpenSSL;
|
procedure CheckForOpenSSL;
|
||||||
procedure CheckForUpdates;
|
procedure CheckForUpdates;
|
||||||
|
procedure GetSerializablePackages;
|
||||||
|
procedure SetSerializablePackages;
|
||||||
function IsTimeToUpdate: Boolean;
|
function IsTimeToUpdate: Boolean;
|
||||||
protected
|
protected
|
||||||
procedure Execute; override;
|
procedure Execute; override;
|
||||||
public
|
public
|
||||||
constructor Create(const AFileName: String);
|
constructor Create;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
procedure StartUpdate(const AOnlyInit: Boolean = False);
|
procedure StartUpdate;
|
||||||
procedure StopUpdate;
|
procedure StopUpdate;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -247,11 +245,11 @@ end;
|
|||||||
|
|
||||||
{ TUpdates }
|
{ TUpdates }
|
||||||
|
|
||||||
constructor TUpdates.Create(const AFileName: String);
|
constructor TUpdates.Create;
|
||||||
begin
|
begin
|
||||||
inherited Create(True);
|
inherited Create(True);
|
||||||
|
FSP_Temp := TSerializablePackages.Create;
|
||||||
FreeOnTerminate := True;
|
FreeOnTerminate := True;
|
||||||
FFileName := AFileName;
|
|
||||||
FHTTPClient := TFPHTTPClient.Create(nil);
|
FHTTPClient := TFPHTTPClient.Create(nil);
|
||||||
{$IFDEF FPC311}
|
{$IFDEF FPC311}
|
||||||
FHTTPClient.IOTimeout := Options.ConTimeOut*1000;
|
FHTTPClient.IOTimeout := Options.ConTimeOut*1000;
|
||||||
@ -270,107 +268,12 @@ destructor TUpdates.Destroy;
|
|||||||
begin
|
begin
|
||||||
FHTTPClient.Free;
|
FHTTPClient.Free;
|
||||||
FUpdatePackage.Free;
|
FUpdatePackage.Free;
|
||||||
|
FSP_Temp.Clear;
|
||||||
|
FSP_Temp.Free;
|
||||||
Updates := nil;
|
Updates := nil;
|
||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TUpdates.Load;
|
|
||||||
var
|
|
||||||
PackageCount: Integer;
|
|
||||||
LazarusPkgCount: Integer;
|
|
||||||
I, J: Integer;
|
|
||||||
Path, SubPath: String;
|
|
||||||
PackageName: String;
|
|
||||||
LazarusPkgName: String;
|
|
||||||
MetaPkg: TMetaPackage;
|
|
||||||
LazarusPkg: TLazarusPackage;
|
|
||||||
HasUpdate: Boolean;
|
|
||||||
FXML: TXMLConfig;
|
|
||||||
begin
|
|
||||||
if (not Assigned(SerializablePackages)) or (SerializablePackages.Count = 0) then
|
|
||||||
Exit;
|
|
||||||
FXML := TXMLConfig.Create(FFileName);
|
|
||||||
try
|
|
||||||
FVersion := FXML.GetValue('Version/Value', 0);
|
|
||||||
PackageCount := FXML.GetValue('Count/Value', 0);
|
|
||||||
for I := 0 to PackageCount - 1 do
|
|
||||||
begin
|
|
||||||
Path := 'Package' + IntToStr(I) + '/';
|
|
||||||
PackageName := FXML.GetValue(Path + 'Name', '');
|
|
||||||
MetaPkg := SerializablePackages.FindMetaPackage(PackageName, fpbPackageName);
|
|
||||||
if MetaPkg <> nil then
|
|
||||||
begin
|
|
||||||
HasUpdate := False;
|
|
||||||
MetaPkg.DownloadZipURL := FXML.GetValue(Path + 'DownloadZipURL', '');
|
|
||||||
MetaPkg.DisableInOPM := FXML.GetValue(Path + 'DisableInOPM', False);
|
|
||||||
MetaPkg.Rating := FXML.GetValue(Path + 'Rating', 0);
|
|
||||||
LazarusPkgCount := FXML.GetValue(Path + 'Count', 0);
|
|
||||||
for J := 0 to LazarusPkgCount - 1 do
|
|
||||||
begin
|
|
||||||
SubPath := Path + 'PackageFile' + IntToStr(J) + '/';
|
|
||||||
LazarusPkgName := FXML.GetValue(SubPath + 'Name', '');
|
|
||||||
LazarusPkg := MetaPkg.FindLazarusPackage(LazarusPkgName);
|
|
||||||
if LazarusPkg <> nil then
|
|
||||||
begin
|
|
||||||
LazarusPkg.UpdateVersion := FXML.GetValue(SubPath + 'UpdateVersion', '');
|
|
||||||
LazarusPkg.ForceNotify := FXML.GetValue(SubPath + 'ForceNotify', False);
|
|
||||||
LazarusPkg.InternalVersion := FXML.GetValue(SubPath + 'InternalVersion', 0);;
|
|
||||||
LazarusPkg.InternalVersionOld := FXML.GetValue(SubPath + 'InternalVersionOld', 0);
|
|
||||||
LazarusPkg.RefreshHasUpdate;
|
|
||||||
if not HasUpdate then
|
|
||||||
HasUpdate := (LazarusPkg.HasUpdate) and (LazarusPkg.InstalledFileVersion < LazarusPkg.UpdateVersion);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
MetaPkg.HasUpdate := HasUpdate;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
finally
|
|
||||||
FXML.Free;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TUpdates.Save;
|
|
||||||
var
|
|
||||||
I, J: Integer;
|
|
||||||
Path, SubPath: String;
|
|
||||||
MetaPkg: TMetaPackage;
|
|
||||||
LazarusPkg: TLazarusPackage;
|
|
||||||
FXML: TXMLConfig;
|
|
||||||
begin
|
|
||||||
if (not Assigned(SerializablePackages)) or (SerializablePackages.Count = 0) or (FBusySaving) then
|
|
||||||
Exit;
|
|
||||||
FBusySaving := True;
|
|
||||||
FXML := TXMLConfig.CreateClean(FFileName);
|
|
||||||
try
|
|
||||||
FXML.SetDeleteValue('Version/Value', OpkVersion, 0);
|
|
||||||
FXML.SetDeleteValue('Count/Value', SerializablePackages.Count, 0);
|
|
||||||
for I := 0 to SerializablePackages.Count - 1 do
|
|
||||||
begin
|
|
||||||
MetaPkg := SerializablePackages.Items[I];
|
|
||||||
Path := 'Package' + IntToStr(I) + '/';
|
|
||||||
FXML.SetDeleteValue(Path + 'Name', MetaPkg.Name, '');
|
|
||||||
FXML.SetDeleteValue(Path + 'DownloadZipURL', MetaPkg.DownloadZipURL, '');
|
|
||||||
FXML.SetDeleteValue(Path + 'DisableInOPM', MetaPkg.DisableInOPM, False);
|
|
||||||
FXML.SetDeleteValue(Path + 'Rating', MetaPkg.Rating, 0);
|
|
||||||
FXML.SetDeleteValue(Path + 'Count', SerializablePackages.Items[I].LazarusPackages.Count, 0);
|
|
||||||
for J := 0 to SerializablePackages.Items[I].LazarusPackages.Count - 1 do
|
|
||||||
begin
|
|
||||||
SubPath := Path + 'PackageFile' + IntToStr(J) + '/';
|
|
||||||
LazarusPkg := TLazarusPackage(SerializablePackages.Items[I].LazarusPackages.Items[J]);
|
|
||||||
FXML.SetDeleteValue(SubPath + 'Name', LazarusPkg.Name, '');
|
|
||||||
FXML.SetDeleteValue(SubPath + 'UpdateVersion', LazarusPkg.UpdateVersion, '');
|
|
||||||
FXML.SetDeleteValue(SubPath + 'ForceNotify', LazarusPkg.ForceNotify, False);
|
|
||||||
FXML.SetDeleteValue(SubPath + 'InternalVersion', LazarusPkg.InternalVersion, 0);
|
|
||||||
FXML.SetDeleteValue(SubPath + 'InternalVersionOld', LazarusPkg.InternalVersionOld, 0);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
FXML.Flush;
|
|
||||||
finally
|
|
||||||
FXML.Free;
|
|
||||||
FBusySaving := False;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TUpdates.AssignPackageData(AMetaPackage: TMetaPackage);
|
procedure TUpdates.AssignPackageData(AMetaPackage: TMetaPackage);
|
||||||
var
|
var
|
||||||
I: Integer;
|
I: Integer;
|
||||||
@ -378,8 +281,6 @@ var
|
|||||||
LazarusPkg: TLazarusPackage;
|
LazarusPkg: TLazarusPackage;
|
||||||
UpdLazPkgs: TUpdateLazPackages;
|
UpdLazPkgs: TUpdateLazPackages;
|
||||||
begin
|
begin
|
||||||
if FBusySaving then
|
|
||||||
Exit;
|
|
||||||
HasUpdate := False;
|
HasUpdate := False;
|
||||||
AMetaPackage.DownloadZipURL := FUpdatePackage.FUpdatePackageData.DownloadZipURL;
|
AMetaPackage.DownloadZipURL := FUpdatePackage.FUpdatePackageData.DownloadZipURL;
|
||||||
AMetaPackage.DisableInOPM := FUpdatePackage.FUpdatePackageData.DisableInOPM;
|
AMetaPackage.DisableInOPM := FUpdatePackage.FUpdatePackageData.DisableInOPM;
|
||||||
@ -405,8 +306,6 @@ var
|
|||||||
I: Integer;
|
I: Integer;
|
||||||
LazarusPkg: TLazarusPackage;
|
LazarusPkg: TLazarusPackage;
|
||||||
begin
|
begin
|
||||||
if FBusySaving then
|
|
||||||
Exit;
|
|
||||||
AMetaPackage.DownloadZipURL := '';
|
AMetaPackage.DownloadZipURL := '';
|
||||||
AMetaPackage.DisableInOPM := False;
|
AMetaPackage.DisableInOPM := False;
|
||||||
AMetaPackage.HasUpdate := False;
|
AMetaPackage.HasUpdate := False;
|
||||||
@ -467,10 +366,9 @@ end;
|
|||||||
|
|
||||||
function TUpdates.IsTimeToUpdate: Boolean;
|
function TUpdates.IsTimeToUpdate: Boolean;
|
||||||
begin
|
begin
|
||||||
Result := Assigned(SerializablePackages) and (FOpenSSLAvailable) and
|
Result := (FOpenSSLAvailable) and (not FBusyUpdating) and (not FNeedToBreak);
|
||||||
(not FBusyUpdating) and (not FNeedToBreak);
|
|
||||||
case Options.CheckForUpdates of
|
case Options.CheckForUpdates of
|
||||||
0: Result := MinutesBetween(Now, Options.LastUpdate) >= 15;
|
0: Result := MinutesBetween(Now, Options.LastUpdate) >= 5;
|
||||||
1: Result := HoursBetween(Now, Options.LastUpdate) >= 1;
|
1: Result := HoursBetween(Now, Options.LastUpdate) >= 1;
|
||||||
2: Result := DaysBetween(Now, Options.LastUpdate) >= 1;
|
2: Result := DaysBetween(Now, Options.LastUpdate) >= 1;
|
||||||
3: Result := WeeksBetween(Now, Options.LastUpdate) >= 1;
|
3: Result := WeeksBetween(Now, Options.LastUpdate) >= 1;
|
||||||
@ -523,32 +421,96 @@ var
|
|||||||
I: Integer;
|
I: Integer;
|
||||||
JSON: TJSONStringType;
|
JSON: TJSONStringType;
|
||||||
begin
|
begin
|
||||||
|
if FSP_Temp.Count = 0 then
|
||||||
|
Exit;
|
||||||
|
|
||||||
FBusyUpdating := True;
|
FBusyUpdating := True;
|
||||||
try
|
try
|
||||||
Options.LastUpdate := Now;
|
Options.LastUpdate := Now;
|
||||||
Options.Changed := True;
|
Options.Changed := True;
|
||||||
for I := 0 to SerializablePackages.Count - 1 do
|
for I := 0 to FSP_Temp.Count - 1 do
|
||||||
begin
|
begin
|
||||||
if FNeedToBreak then
|
if FNeedToBreak then
|
||||||
Break;
|
Break;
|
||||||
JSON := '';
|
JSON := '';
|
||||||
if (Assigned(LazarusIDE) and LazarusIDE.IDEIsClosing) then
|
if (Assigned(LazarusIDE) and LazarusIDE.IDEIsClosing) then
|
||||||
Break;
|
Break;
|
||||||
if GetUpdateInfo(Trim(SerializablePackages.Items[I].DownloadURL), JSON) then
|
if GetUpdateInfo(Trim(FSP_Temp.Items[I].DownloadURL), JSON) then
|
||||||
begin
|
begin
|
||||||
if FUpdatePackage.LoadFromJSON(JSON) then
|
if FUpdatePackage.LoadFromJSON(JSON) then
|
||||||
AssignPackageData(SerializablePackages.Items[I])
|
AssignPackageData(FSP_Temp.Items[I])
|
||||||
else
|
else
|
||||||
ResetPackageData(SerializablePackages.Items[I]);
|
ResetPackageData(FSP_Temp.Items[I]);
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
ResetPackageData(SerializablePackages.Items[I]);
|
ResetPackageData(FSP_Temp.Items[I]);
|
||||||
end;
|
end;
|
||||||
finally
|
finally
|
||||||
FBusyUpdating := False;
|
FBusyUpdating := False;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TUpdates.GetSerializablePackages;
|
||||||
|
var
|
||||||
|
JSON: TJSONStringType;
|
||||||
|
begin
|
||||||
|
if (FNeedToBreak) or (SerializablePackages.Count = 0) then
|
||||||
|
Exit;
|
||||||
|
|
||||||
|
EnterCriticalSection(CriticalSection);
|
||||||
|
try
|
||||||
|
FSP_Temp.Clear;
|
||||||
|
try
|
||||||
|
JSON := '';
|
||||||
|
SerializablePackages.PackagesToJSON(JSON);
|
||||||
|
FSP_Temp.JSONToPackages(JSON);
|
||||||
|
except
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
LeaveCriticalSection(CriticalSection);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TUpdates.SetSerializablePackages;
|
||||||
|
var
|
||||||
|
I, J: Integer;
|
||||||
|
MetaPackage: TMetaPackage;
|
||||||
|
HasUpdate: Boolean;
|
||||||
|
LazarusPackage: TLazarusPackage;
|
||||||
|
begin
|
||||||
|
if (FNeedToBreak) or (SerializablePackages.Count = 0) or (FSP_Temp.Count = 0) then
|
||||||
|
Exit;
|
||||||
|
EnterCriticalSection(CriticalSection);
|
||||||
|
try
|
||||||
|
for I := 0 to FSP_Temp.Count - 1 do
|
||||||
|
begin
|
||||||
|
MetaPackage := SerializablePackages.FindMetaPackage(FSP_Temp.Items[I].Name, fpbPackageName);
|
||||||
|
if MetaPackage <> nil then
|
||||||
|
begin
|
||||||
|
MetaPackage.DownloadZipURL := FSP_Temp.Items[I].DownloadZipURL;
|
||||||
|
MetaPackage.DisableInOPM := FSP_Temp.Items[I].DisableInOPM;
|
||||||
|
HasUpdate := False;
|
||||||
|
for J := 0 to FSP_Temp.Items[I].LazarusPackages.Count - 1 do
|
||||||
|
begin
|
||||||
|
LazarusPackage := MetaPackage.FindLazarusPackage(TLazarusPackage(FSP_Temp.Items[I].LazarusPackages.Items[J]).Name);
|
||||||
|
if LazarusPackage <> nil then
|
||||||
|
begin
|
||||||
|
LazarusPackage.UpdateVersion := TLazarusPackage(FSP_Temp.Items[I].LazarusPackages.Items[J]).UpdateVersion;
|
||||||
|
LazarusPackage.ForceNotify := TLazarusPackage(FSP_Temp.Items[I].LazarusPackages.Items[J]).ForceNotify;
|
||||||
|
LazarusPackage.InternalVersion := TLazarusPackage(FSP_Temp.Items[I].LazarusPackages.Items[J]).InternalVersion;
|
||||||
|
LazarusPackage.RefreshHasUpdate;
|
||||||
|
if not HasUpdate then
|
||||||
|
HasUpdate := (LazarusPackage.HasUpdate) and (LazarusPackage.InstalledFileVersion < LazarusPackage.UpdateVersion);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
MetaPackage.HasUpdate := HasUpdate;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
LeaveCriticalSection(CriticalSection);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TUpdates.Execute;
|
procedure TUpdates.Execute;
|
||||||
begin
|
begin
|
||||||
while not Terminated do
|
while not Terminated do
|
||||||
@ -561,19 +523,18 @@ begin
|
|||||||
FTime := GetTickCount64;
|
FTime := GetTickCount64;
|
||||||
if (IsTimeToUpdate) then
|
if (IsTimeToUpdate) then
|
||||||
begin
|
begin
|
||||||
CheckForUpdates;
|
GetSerializablePackages;
|
||||||
if (not FNeedToBreak) and Assigned(VisualTree) then
|
CheckForUpdates;
|
||||||
Synchronize(@VisualTree.UpdatePackageUStatus)
|
SetSerializablePackages;
|
||||||
|
if (not FNeedToBreak) and Assigned(VisualTree) then
|
||||||
|
Synchronize(@VisualTree.UpdatePackageUStatus);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TUpdates.StartUpdate(const AOnlyInit: Boolean = False);
|
procedure TUpdates.StartUpdate;
|
||||||
begin
|
begin
|
||||||
Load;
|
|
||||||
if AOnlyInit then
|
|
||||||
Exit;
|
|
||||||
FStarted := True;
|
FStarted := True;
|
||||||
CheckForOpenSSL;
|
CheckForOpenSSL;
|
||||||
FTime := GetTickCount64;
|
FTime := GetTickCount64;
|
||||||
@ -584,7 +545,6 @@ end;
|
|||||||
procedure TUpdates.StopUpdate;
|
procedure TUpdates.StopUpdate;
|
||||||
begin
|
begin
|
||||||
FStarted := False;
|
FStarted := False;
|
||||||
Save;
|
|
||||||
FHTTPClient.Terminate;
|
FHTTPClient.Terminate;
|
||||||
FNeedToBreak := True;
|
FNeedToBreak := True;
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user