diff --git a/components/onlinepackagemanager/opkman_const.pas b/components/onlinepackagemanager/opkman_const.pas index 4adcb40d1f..d8d26849a4 100644 --- a/components/onlinepackagemanager/opkman_const.pas +++ b/components/onlinepackagemanager/opkman_const.pas @@ -207,6 +207,7 @@ resourcestring 'Please note: in order for the changes to take effect you must rebuid the IDE.'; rsMainFrm_rsUninstall_Nothing = 'None of the checked packages are installed. Nothing to uninstall.'; rsMainFrm_rsUninstall_Error = 'Cannot uninstall package "%s"!'; + rsMainFrm_rsDestDirError = 'Cannot create directory "%s". Operation aborted.'; //progress form rsProgressFrm_Caption0 = 'Downloading packages'; diff --git a/components/onlinepackagemanager/opkman_mainfrm.pas b/components/onlinepackagemanager/opkman_mainfrm.pas index 2f3c969e2d..81c9499e17 100644 --- a/components/onlinepackagemanager/opkman_mainfrm.pas +++ b/components/onlinepackagemanager/opkman_mainfrm.pas @@ -162,6 +162,7 @@ type procedure StartUpdates; procedure StopUpdates; procedure Rebuild; + function CheckDstDir(const ADstDir: String): Boolean; public procedure ShowOptions(const AActivePageIndex: Integer = 0); end; @@ -269,8 +270,27 @@ begin MessageDlgEx(rsMainFrm_rsNoPackageToDownload, mtInformation, [mbOk], Self) end; +function TMainFrm.CheckDstDir(const ADstDir: String): Boolean; +begin + Result := True; + if not DirectoryExists(ADstDir) then + begin + if not ForceDirectories(ADstDir) then + begin + MessageDlgEx(Format(rsMainFrm_rsDestDirError, [ADstDir]), mtError, [mbOk], Self); + Result := False; + end; + end; +end; + + function TMainFrm.Download(const ADstDir: String; var ADoExtract: Boolean): TModalResult; begin + if not CheckDstDir(ADstDir) then + begin + Result := mrCancel; + Exit; + end; ADoExtract := False; ProgressFrm := TProgressFrm.Create(MainFrm); try @@ -290,6 +310,11 @@ end; function TMainFrm.Extract(const ASrcDir, ADstDir: String; var ADoOpen: Boolean; const AIsUpdate: Boolean = False): TModalResult; begin + if not CheckDstDir(ADstDir) then + begin + Result := mrCancel; + Exit; + end; ProgressFrm := TProgressFrm.Create(MainFrm); try PackageUnzipper := TPackageUnzipper.Create; @@ -330,6 +355,11 @@ end; function TMainFrm.UpdateP(const ADstDir: String; var ADoExtract: Boolean): TModalResult; begin + if not CheckDstDir(ADstDir) then + begin + Result := mrCancel; + Exit; + end; ADoExtract := False; ProgressFrm := TProgressFrm.Create(MainFrm); try diff --git a/components/onlinepackagemanager/opkman_optionsfrm.pas b/components/onlinepackagemanager/opkman_optionsfrm.pas index 41a679e385..16a41aff40 100644 --- a/components/onlinepackagemanager/opkman_optionsfrm.pas +++ b/components/onlinepackagemanager/opkman_optionsfrm.pas @@ -199,6 +199,12 @@ begin Options.LocalRepositoryPackages := AppendPathDelim(edLocalRepositoryPackages.Text); Options.LocalRepositoryArchive := AppendPathDelim(edLocalRepositoryArchive.Text); Options.LocalRepositoryUpdate := AppendPathDelim(edLocalRepositoryUpdate.Text); + if not DirectoryExists(Options.LocalRepositoryPackages) then + ForceDirectories(Options.LocalRepositoryPackages); + if not DirectoryExists(Options.LocalRepositoryArchive) then + ForceDirectories(Options.LocalRepositoryArchive); + if not DirectoryExists(Options.LocalRepositoryUpdate) then + ForceDirectories(Options.LocalRepositoryUpdate); Options.UserProfile := cbSelectProfile.ItemIndex; for I := 0 to lbExcludeFiles.Items.Count - 1 do