diff --git a/components/onlinepackagemanager/fpcmod/opkman_zip.pas b/components/onlinepackagemanager/fpcmod/opkman_zip.pas index f7bc1a6eb9..9feef08fa6 100644 --- a/components/onlinepackagemanager/fpcmod/opkman_zip.pas +++ b/components/onlinepackagemanager/fpcmod/opkman_zip.pas @@ -543,7 +543,7 @@ Type Procedure UnZipAllFiles(AFileName : String); Procedure Clear; Procedure Examine; - Function GetZipSize(var IsDirZipped: Boolean): Int64; + Function GetZipSize(var IsDirZipped: Boolean; var ABaseDir: String): Int64; Public Property BufferSize : LongWord Read FBufSize Write SetBufSize; Property OnOpenInputStream: TCustomInputStreamEvent read FOnOpenInputStream write FOnOpenInputStream; @@ -2643,12 +2643,11 @@ begin end; end; -function TUnZipper.GetZipSize(var IsDirZipped: Boolean): Int64; +function TUnZipper.GetZipSize(var IsDirZipped: Boolean; var ABaseDir: String): Int64; var I: Integer; Item: TFullZipFileEntry; AllFiles: Boolean; - BasePath: String; P: Integer; begin AllFiles := (FFiles.Count = 0); @@ -2656,14 +2655,13 @@ begin try ReadZipDirectory; Result := 0; - BasePath := ''; if FEntries.Count > 0 then begin P := Pos('/', TZipFileEntry(FEntries.Items[0]).ArchiveFileName); if P = 0 then P := Pos('\', TZipFileEntry(FEntries.Items[0]).ArchiveFileName); if P <> 0 then - BasePath := Copy(TZipFileEntry(FEntries.Items[0]).ArchiveFileName, 1, P); + ABaseDir := Copy(TZipFileEntry(FEntries.Items[0]).ArchiveFileName, 1, P); end; for i:=0 to FEntries.Count-1 do begin @@ -2672,10 +2670,14 @@ begin begin Result := Result + TZipFileEntry(Item).Size; if IsDirZipped then - if Pos(BasePath, Item.ArchiveFileName) = 0 then + if Pos(ABaseDir, Item.ArchiveFileName) = 0 then IsDirZipped := False; end; end; + if not IsDirZipped then + ABaseDir := '' + else + ABaseDir := Copy(ABaseDir, 1, Length(ABaseDir) - 1); finally CloseInput; end; diff --git a/components/onlinepackagemanager/opkman_const.pas b/components/onlinepackagemanager/opkman_const.pas index 6e5c7b957f..aca51a02f6 100644 --- a/components/onlinepackagemanager/opkman_const.pas +++ b/components/onlinepackagemanager/opkman_const.pas @@ -45,11 +45,12 @@ const cRestrictedDirectoryDef = 'lib,backup'; cHelpPage = 'http://wiki.freepascal.org/Online_Package_Manager'; {$ifdef win64} - OpenSSLURL = 'http://packages.lazarus-ide.org/openssl-1.0.2j-x64_86-win64.zip'; + cOpenSSLURL = 'http://packages.lazarus-ide.org/openssl-1.0.2j-x64_86-win64.zip'; {$endif} {$ifdef win32} - OpenSSLURL = 'http://packages.lazarus-ide.org/openssl-1.0.2j-i386-win32.zip'; + cOpenSSLURL = 'http://packages.lazarus-ide.org/openssl-1.0.2j-i386-win32.zip'; {$endif} + cExtractDir = 'ExtractDir'; resourcestring //package manager diff --git a/components/onlinepackagemanager/opkman_createjsonforupdates.pas b/components/onlinepackagemanager/opkman_createjsonforupdates.pas index 71023a057c..ebf130c05c 100644 --- a/components/onlinepackagemanager/opkman_createjsonforupdates.pas +++ b/components/onlinepackagemanager/opkman_createjsonforupdates.pas @@ -170,7 +170,10 @@ begin Exit; end; - SD.FileName := 'update_' + FPackage.DisplayName; + if FPackage.DisplayName <> '' then + SD.FileName := 'update_' + FPackage.DisplayName + else + SD.FileName := 'update_' + FPackage.Name; if SD.Execute then begin UpdatePackage := TUpdatePackage.Create; diff --git a/components/onlinepackagemanager/opkman_mainfrm.pas b/components/onlinepackagemanager/opkman_mainfrm.pas index 4f50b04406..3b891dc8c1 100644 --- a/components/onlinepackagemanager/opkman_mainfrm.pas +++ b/components/onlinepackagemanager/opkman_mainfrm.pas @@ -196,10 +196,10 @@ end; procedure TMainFrm.GetPackageList; begin + Updates.PauseUpdate; Caption := rsLazarusPackageManager; VisualTree.VST.Clear; - if SerializablePackages.Count > 0 then - SerializablePackages.Clear; + VisualTree.VST.Invalidate; EnableDisableControls(False); SetupMessage(rsMainFrm_rsMessageDownload); PackageDownloader.DownloadJSON(10000); @@ -314,13 +314,14 @@ begin Exit; end; VisualTree.PopulateTree; - Updates.StartUpdate; EnableDisableControls(True); SetupMessage; mJSON.Text := AJSON; cbAll.Checked := False; Caption := rsLazarusPackageManager + ' ' + Format(rsPackagesFound, [ IntToStr(SerializablePackages.Count)]); + if Assigned(Updates) then + Updates.StartUpdate; end; etConfig: begin @@ -542,9 +543,6 @@ end; procedure TMainFrm.tbRefreshClick(Sender: TObject); begin - Updates.PauseUpdate; - VisualTree.VST.Clear; - VisualTree.VST.Invalidate; GetPackageList; end; diff --git a/components/onlinepackagemanager/opkman_packagelistfrm.pas b/components/onlinepackagemanager/opkman_packagelistfrm.pas index 131a03682c..625048f787 100644 --- a/components/onlinepackagemanager/opkman_packagelistfrm.pas +++ b/components/onlinepackagemanager/opkman_packagelistfrm.pas @@ -156,7 +156,10 @@ begin begin Node := FVST.AddChild(nil); Data := FVST.GetNodeData(Node); - Data^.FName := SerializablePackages.Items[I].DisplayName; + if SerializablePackages.Items[I].DisplayName <> '' then + Data^.FName := SerializablePackages.Items[I].DisplayName + else + Data^.FName := SerializablePackages.Items[I].Name; Data^.FImageIndex := 0; end; end @@ -172,7 +175,10 @@ begin Inc(InvCnt); Node := FVST.AddChild(nil); Data := FVST.GetNodeData(Node); - Data^.FName := SerializablePackages.Items[I].DisplayName; + if SerializablePackages.Items[I].DisplayName <> '' then + Data^.FName := SerializablePackages.Items[I].DisplayName + else + Data^.FName := SerializablePackages.Items[I].Name; Data^.FImageIndex := 0; SerializablePackages.Items[I].ChangePackageStates(ctAdd, psError); end; diff --git a/components/onlinepackagemanager/opkman_serializablepackages.pas b/components/onlinepackagemanager/opkman_serializablepackages.pas index 0b969bea05..007b312835 100644 --- a/components/onlinepackagemanager/opkman_serializablepackages.pas +++ b/components/onlinepackagemanager/opkman_serializablepackages.pas @@ -32,7 +32,7 @@ interface uses Classes, SysUtils, FileUtil, Variants, fpjson, jsonparser, md5, contnrs, - PackageIntf, Laz2_XMLCfg; + PackageIntf, Laz2_XMLCfg, LazFileUtils; type @@ -206,6 +206,7 @@ type FSVNURL: String; FUpdateSize: Int64; FIsDirZipped: Boolean; + FZippedBaseDir: String; FPackageFiles: TCollection; function GetDownloadable: Boolean; function GetExtractable: Boolean; @@ -221,6 +222,7 @@ type property IsExtractable: Boolean read GetExtractable; property UpdateSize: Int64 read FUpdateSize write FUpdateSize; property IsDirZipped: Boolean read FIsDirZipped write FIsDirZipped; + property ZippedBaseDir: String read FZippedBaseDir write FZippedBaseDir; property DownloadZipURL: String read FDownloadZipURL write FDownloadZipURL; property HasUpdate: Boolean read FHasUpdate write FHasUpdate; property DisableInOPM: Boolean read FDisableInOPM write FDisableInOPM; @@ -941,7 +943,13 @@ var Package: TPackage; begin Clear; - Result := True; + if Trim(JSON) = '' then + begin + Result := False; + Exit; + end + else + Result := True; Parser := TJSONParser.Create(JSON); try Data := Parser.Parse; @@ -1021,7 +1029,7 @@ var FileName: String; begin FileName := Options.LocalRepositoryArchive + APackage.RepositoryFileName; - Result := (FileExists(FileName)) and + Result := (FileExistsUTF8(FileName)) and (MD5Print(MD5File(FileName)) = APackage.RepositoryFileHash) and (FileUtil.FileSize(FileName) = APackage.RepositoryFileSize); end; @@ -1036,7 +1044,7 @@ begin begin PackageFile := TPackageFile(APackage.FPackageFiles.Items[I]); PackageFile.FPackageAbsolutePath := Options.LocalRepositoryPackages + APackage.PackageBaseDir + PackageFile.FPackageRelativePath + PackageFile.Name; - if not FileExists(PackageFile.FPackageAbsolutePath) then + if not FileExistsUTF8(PackageFile.FPackageAbsolutePath) then begin Result := False; Break; @@ -1124,11 +1132,14 @@ function TSerializablePackages.IsPackageInstalled(const APackageFile: TPackageFi begin APackageFile.InstalledFileName := Package.Filename; APackageFile.InstalledFileVersion := IntToStr(Package.Version.Major) + '.' + - IntToStr(Package.Version.Minor) + '.' + - IntToStr(Package.Version.Release) + '.' + - IntToStr(Package.Version.Build); - APackageFile.InstalledFileDescription := GetPackageDescription(Package.Filename); - APackageFile.InstalledFileLincese := GetPackageLicense(Package.Filename); + IntToStr(Package.Version.Minor) + '.' + + IntToStr(Package.Version.Release) + '.' + + IntToStr(Package.Version.Build); + if FileExistsUTF8(APackageFile.InstalledFileName) then + begin + APackageFile.InstalledFileDescription := GetPackageDescription(Package.Filename); + APackageFile.InstalledFileLincese := GetPackageLicense(Package.Filename); + end; Result := True; Break; end; @@ -1144,14 +1155,16 @@ begin begin FileName := StringReplace(APackageFile.Name, '.lpk', '.opkman', [rfIgnoreCase]); Result := (psExtracted in APackageFile.PackageStates) and - FileExists(Options.LocalRepositoryPackages + APackageBaseDir + APackageFile.PackageRelativePath + FileName); + FileExistsUTF8(Options.LocalRepositoryPackages + APackageBaseDir + APackageFile.PackageRelativePath + FileName); if Result then begin APackageFile.InstalledFileName := Options.LocalRepositoryPackages + APackageBaseDir + APackageFile.FPackageRelativePath + APackageFile.Name; - APackageFile.InstalledFileVersion := GetPackageVersion(APackageFile.InstalledFileName); - APackageFile.InstalledFileDescription := GetPackageDescription(APackageFile.InstalledFileName); - APackageFile.InstalledFileLincese := GetPackageLicense(APackageFile.InstalledFileName); - Result := True; + if FileExistsUTF8(APackageFile.InstalledFileName) then + begin + APackageFile.InstalledFileVersion := GetPackageVersion(APackageFile.InstalledFileName); + APackageFile.InstalledFileDescription := GetPackageDescription(APackageFile.InstalledFileName); + APackageFile.InstalledFileLincese := GetPackageLicense(APackageFile.InstalledFileName); + end; end else Result := CheckIDEPackages @@ -1360,7 +1373,7 @@ begin (PackageFile.PackageType in [ptRunTime, ptRunTimeOnly]) then begin FileName := StringReplace(PackageFile.Name, '.lpk', '.opkman', [rfIgnoreCase]); - FileCreate(Options.LocalRepositoryPackages + Items[I].PackageBaseDir + PackageFile.PackageRelativePath + FileName); + FileCreateUTF8(Options.LocalRepositoryPackages + Items[I].PackageBaseDir + PackageFile.PackageRelativePath + FileName); end; end; end; diff --git a/components/onlinepackagemanager/opkman_updates.pas b/components/onlinepackagemanager/opkman_updates.pas index a42860674b..a30176a845 100644 --- a/components/onlinepackagemanager/opkman_updates.pas +++ b/components/onlinepackagemanager/opkman_updates.pas @@ -235,6 +235,9 @@ var PackageFile: TPackageFile; HasUpdate: Boolean; begin + if (not Assigned(SerializablePackages)) or (SerializablePackages.Count = 0) then + Exit; + FVersion := FXML.GetValue('Version/Value', 0); PackageCount := FXML.GetValue('Count/Value', 0); for I := 0 to PackageCount - 1 do @@ -281,7 +284,7 @@ var Package: TPackage; PackageFile: TPackageFile; begin - if SerializablePackages.Count = 0 then + if (not Assigned(SerializablePackages)) or (SerializablePackages.Count = 0) then Exit; FXML.Clear; FXML.SetDeleteValue('Version/Value', OpkVersion, 0); @@ -369,9 +372,9 @@ begin FileExistsUTF8(ExtractFilePath(ParamStr(0)) + 'ssleay32.dll'); if not FOpenSSLAvaialable then begin - ZipFile := ExtractFilePath(ParamStr(0)) + ExtractFileName(OpenSSLURL); + ZipFile := ExtractFilePath(ParamStr(0)) + ExtractFileName(cOpenSSLURL); try - FHTTPClient.Get(OpenSSLURL, ZipFile); + FHTTPClient.Get(cOpenSSLURL, ZipFile); except end; if FileExistsUTF8(ZipFile) then @@ -450,7 +453,7 @@ begin CheckForOpenSSL; while not Terminated do begin - if (FNeedToUpdate) and (not FBusyUpdating) and (not FPaused) and (FOpenSSLAvaialable) then + if Assigned(SerializablePackages) and (FNeedToUpdate) and (not FBusyUpdating) and (not FPaused) and (FOpenSSLAvaialable) then begin FBusyUpdating := True; try diff --git a/components/onlinepackagemanager/opkman_zipper.pas b/components/onlinepackagemanager/opkman_zipper.pas index 3f30edd160..85ffbcf9e6 100644 --- a/components/onlinepackagemanager/opkman_zipper.pas +++ b/components/onlinepackagemanager/opkman_zipper.pas @@ -165,6 +165,11 @@ begin FUnZipper.Examine; FUnZipper.UnZipAllFiles; SerializablePackages.Items[I].ChangePackageStates(ctAdd, psExtracted); + if (SerializablePackages.Items[I].IsDirZipped ) and (SerializablePackages.Items[I].PackageBaseDir <> SerializablePackages.Items[I].ZippedBaseDir) then + begin + CopyDirTree(FUnZipper.OutputPath + SerializablePackages.Items[I].ZippedBaseDir, DelDir, [cffOverwriteFile]); + DeleteDirectory(FUnZipper.OutputPath + SerializablePackages.Items[I].ZippedBaseDir, False); + end; Synchronize(@DoOnZipProgress); FTotPos := FTotPos + FCurSize; except @@ -226,6 +231,7 @@ procedure TPackageUnzipper.StartUnZip(const ASrcDir, ADstDir: String; var I: Integer; IsDirZipped: Boolean; + BaseDir: String; begin if FStarted then Exit; @@ -243,8 +249,12 @@ begin FUnZipper.FileName := FSrcDir + SerializablePackages.Items[I].RepositoryFileName; FUnZipper.Examine; IsDirZipped := True; - FTotSize := FTotSize + FUnZipper.GetZipSize(IsDirZipped); + BaseDir := ''; + FTotSize := FTotSize + FUnZipper.GetZipSize(IsDirZipped, BaseDir); SerializablePackages.Items[I].IsDirZipped := IsDirZipped; + if BaseDir <> '' then + BaseDir := AppendPathDelim(BaseDir); + SerializablePackages.Items[I].ZippedBaseDir := BaseDir; Inc(FTotCnt); except on E: Exception do