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:
balazs 2018-12-03 13:54:14 +00:00
parent c48f6d7a4b
commit 0c07ac1983
5 changed files with 201 additions and 138 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;