22#include <miktex/Core/Cfg>
23#include <miktex/Core/Session>
24#include <miktex/Core/TemporaryFile>
25#include <miktex/Extractor/Extractor>
26#include <miktex/Trace/Trace>
29#include "RepositoryManifest.h"
31#if defined(MIKTEX_WINDOWS)
32#include <miktex/Core/win/COMInitializer>
35#if defined(MIKTEX_WINDOWS) && USE_LOCAL_SERVER
36#include "COM/com-internal.h"
39MPM_INTERNAL_BEGIN_NAMESPACE;
42#if defined(MIKTEX_WINDOWS) && USE_LOCAL_SERVER
43 public MiKTeXPackageManagerLib::IPackageInstallerCallback,
54 PackageInstallerImpl(std::shared_ptr<MiKTeX::Packages::D6AAD62216146D44B580E92711724B78::PackageManagerImpl> manager,
const InitInfo& initInfo);
57 void MIKTEXTHISCALL Dispose()
override;
58 void MIKTEXTHISCALL Download()
override;
59 void MIKTEXTHISCALL DownloadAsync()
override;
60 void MIKTEXTHISCALL FindUpdatesAsync()
override;
61 void MIKTEXTHISCALL FindUpgradesAsync(
PackageLevel packageLevel)
override;
62 void MIKTEXTHISCALL InstallRemove(
Role role)
override;
63 void MIKTEXTHISCALL InstallRemoveAsync(
Role role)
override;
64 void MIKTEXTHISCALL OnBeginFileExtraction(
const std::string& fileName, std::size_t uncompressedSize)
override;
65 void MIKTEXTHISCALL OnEndFileExtraction(
const std::string& fileName, std::size_t uncompressedSize)
override;
66 bool MIKTEXTHISCALL OnError(
const std::string& message)
override;
67 bool MIKTEXTHISCALL OnProcessOutput(
const void* pOutput, std::size_t n)
override;
68 void OnProgress()
override;
69 void MIKTEXTHISCALL RegisterComponents(
bool doRegister)
override;
71 void MIKTEXTHISCALL UpdateDbAsync()
override;
72 void MIKTEXTHISCALL WaitForCompletion()
override;
74#if defined(MIKTEX_WINDOWS) && USE_LOCAL_SERVER
75 STDMETHOD_(ULONG, AddRef)();
76 HRESULT __stdcall OnProgress(LONG nf, VARIANT_BOOL* pDoContinue)
override;
77 HRESULT __stdcall OnRetryableError(BSTR message, VARIANT_BOOL* pDoContinue)
override;
78 STDMETHOD(QueryInterface)(REFIID riid, LPVOID* ppvObj);
79 STDMETHOD_(ULONG, Release)();
80 HRESULT __stdcall ReportLine(BSTR line)
override;
85 MPM_LOCK_BEGIN(this->packageManager)
95 FindUpgradesNoLock(packageLevel);
100 std::lock_guard<std::mutex> lockGuard(progressIndicatorMutex);
101 if (progressInfo.numErrors > 0)
103 throw threadMiKTeXException;
120 if (!workerThread.joinable())
124 return !progressInfo.ready;
129 this->downloadDirectory = directory;
132 void MIKTEXTHISCALL
SetFileList(
const std::vector<std::string>& tbi)
override
134 SetFileLists(tbi, std::vector<std::string>());
137 void MIKTEXTHISCALL
SetFileLists(
const std::vector<std::string>& tbi,
const std::vector<std::string>& tbr)
override
139 this->toBeInstalled = tbi;
140 this->toBeRemoved = tbr;
145 taskPackageLevel = packageLevel;
150 repositoryType = PackageRepositoryDataStore::DetermineRepositoryType(repository);
151 this->repository = repository;
156 MPM_LOCK_BEGIN(this->packageManager)
158 UpdateDbNoLock(options);
168 ERROR_CORRUPTED_PACKAGE,
169 ERROR_MISSING_PACKAGE,
171 ERROR_SOURCE_FILE_NOT_FOUND,
174 void CalculateExpenditure(
bool downloadOnly =
false);
175 bool CheckArchiveFile(
const std::string& packageId,
const MiKTeX::Util::PathName& archiveFileName,
bool mustBeOk);
176 void CheckDependencies(std::set<std::string>& packages,
const std::string& packageId,
bool force,
int level);
177 void CleanUpUserDatabase();
182 void DownloadPackage(
const std::string& packageId);
183 void DownloadThread();
184 void ExtractFiles(
const MiKTeX::Util::PathName& archiveFileName, MiKTeX::Extractor::ArchiveFileType archiveFileType);
185 std::string FatalError(ErrorCode error);
186 void FindUpdatesNoLock();
187 void FindUpdatesThread();
189 void FindUpgradesThread();
190 void InstallPackage(
const std::string& packageId,
MiKTeX::Core::Cfg& packageManifests);
192 void InstallRemoveThread();
193 void InstallRepositoryManifest(
bool fromCache);
194 void LoadRepositoryManifest(
bool download);
195 std::string MakeUrl(
const std::string& relPath);
197 void NeedRepository();
199 bool MIKTEXTHISCALL ReadDirectory(
const MiKTeX::Util::PathName& path, std::vector<std::string>& subDirNames, std::vector<std::string>& fileNames, std::vector<std::string>& fileNameInfos)
override;
200 void RegisterComponents(
bool doRegister,
const std::vector<std::string>& packages);
201 void RemoveFiles(
const std::vector<std::string>& toBeRemoved,
bool silently =
false);
202 void RemovePackage(
const std::string& packageId,
MiKTeX::Core::Cfg& packageManifests);
203 void ReportLine(
const std::string& s);
204 void RunOneMiKTeXUtility(
const std::vector<std::string>& arguments);
205 void StartWorkerThread(
void (PackageInstallerImpl::* method)());
207 void UpdateDbThread();
208 void UpdateFndb(
const std::unordered_set<MiKTeX::Util::PathName>& installedFiles,
const std::unordered_set<MiKTeX::Util::PathName>& removedFiles,
const std::string& packageId);
210#if defined(MIKTEX_WINDOWS)
214#if defined(MIKTEX_WINDOWS) && USE_LOCAL_SERVER
215 bool UseLocalServer();
216 void ConnectToServer();
219 bool AbortOrRetry(
const std::string& message)
226 if (callback !=
nullptr && !callback->
OnProgress(nf))
228 trace_mpm->WriteLine(TRACE_FACILITY, T_(
"client wants to cancel"));
229 trace_mpm->WriteLine(TRACE_FACILITY, T_(
"throwing OperationCancelledException"));
230 throw MiKTeX::Core::OperationCancelledException();
234 void RegisterComponents(
bool doRegister,
const std::vector<std::string>& packages,
const std::vector<std::string>& packages2)
236 RegisterComponents(doRegister, packages);
237 RegisterComponents(doRegister, packages2);
243 bool enablePostProcessing =
true;
244 std::unordered_set<MiKTeX::Util::PathName> installedFiles;
245 PackageDataStore* packageDataStore =
nullptr;
246 std::shared_ptr<PackageManagerImpl> packageManager;
247 std::mutex progressIndicatorMutex;
248 ProgressInfo progressInfo;
249 std::unordered_set<MiKTeX::Util::PathName> removedFiles;
250 std::string repository;
251 RepositoryManifest repositoryManifest;
254 std::shared_ptr<MiKTeX::Core::Session> session;
256 MiKTeX::Core::MiKTeXException threadMiKTeXException;
258 std::vector<std::string> toBeInstalled;
259 std::vector<std::string> toBeRemoved;
260 std::mutex thisMutex;
261 std::unique_ptr<MiKTeX::Trace::TraceStream> trace_error;
262 std::unique_ptr<MiKTeX::Trace::TraceStream> trace_mpm;
263 std::unique_ptr<MiKTeX::Trace::TraceStream> trace_stopwatch;
264 std::vector<UpdateInfo> updates;
266 std::vector<UpgradeInfo> upgrades;
267 std::thread workerThread;
269#if defined(MIKTEX_WINDOWS) && USE_LOCAL_SERVER
271 public MiKTeX::Core::COMInitializer
273 ATL::CComPtr<MiKTeXPackageManagerLib::IPackageInstaller> pInstaller;
274 ATL::CComQIPtr<MiKTeXPackageManagerLib::IPackageManager> pManager;
276 std::unique_ptr<LocalServer> localServer;
280MPM_INTERNAL_END_NAMESPACE;
PackageManager implementation.
INI container.
Definition: Cfg.h:60
Run process callback interface.
Definition: Process.h:47
Callback interface.
Definition: PackageInstaller.h:79
virtual bool OnRetryableError(const std::string &message)=0
virtual bool OnProgress(Notification nf)=0
Definition: PackageInstaller.h:103
Role
Installation role.
Definition: PackageInstaller.h:214
Definition: WebSession.h:34
Definition: PackageInstallerImpl.h:50
void UpdateDb(UpdateDbOptionSet options) override
Synchronizes the package database.
Definition: PackageInstallerImpl.h:154
void FindUpdates() override
Checks for updates.
Definition: PackageInstallerImpl.h:83
std::vector< UpgradeInfo > GetUpgrades() override
Definition: PackageInstallerImpl.h:113
void SetPackageLevel(PackageLevel packageLevel) override
Definition: PackageInstallerImpl.h:143
void SetRepository(const std::string &repository) override
Definition: PackageInstallerImpl.h:148
ProgressInfo GetProgressInfo() override
Definition: PackageInstallerImpl.h:98
void FindUpgrades(PackageLevel packageLevel) override
Definition: PackageInstallerImpl.h:92
void SetFileList(const std::vector< std::string > &tbi) override
Definition: PackageInstallerImpl.h:132
std::vector< UpdateInfo > GetUpdates() override
Definition: PackageInstallerImpl.h:108
void SetDownloadDirectory(const MiKTeX::Util::PathName &directory) override
Definition: PackageInstallerImpl.h:127
void SetFileLists(const std::vector< std::string > &tbi, const std::vector< std::string > &tbr) override
Definition: PackageInstallerImpl.h:137
bool IsRunning() const override
Definition: PackageInstallerImpl.h:118
Definition: OptionSet.h:37
Instances of this class can be used to store path names.
Definition: PathName.h:73
Notification
Installer notifications.
Definition: PackageInstaller.h:53
PackageLevel
Package level.
Definition: RepositoryInfo.h:40
RepositoryReleaseState
Repository release state.
Definition: RepositoryInfo.h:174
RepositoryType
Repository type.
Definition: RepositoryInfo.h:78
Initialization options.
Definition: PackageInstaller.h:373
Progress information.
Definition: PackageInstaller.h:254