41class PackageInstallerImpl :
42#if defined(MIKTEX_WINDOWS) && USE_LOCAL_SERVER
43 public MiKTeXPackageManagerLib::IPackageInstallerCallback,
48 public MiKTeX::Archive::IExtractCallback,
54 PackageInstallerImpl(std::shared_ptr<MiKTeX::Packages::D6AAD62216146D44B580E92711724B78::PackageManagerImpl> manager,
const InitInfo& initInfo);
55 MIKTEXTHISCALL ~PackageInstallerImpl()
override;
57 void MIKTEXTHISCALL
Dispose()
override;
58 void MIKTEXTHISCALL
Download()
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;
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
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;
154 void MIKTEXTHISCALL
UpdateDb(UpdateDbOptionSet options)
override
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::Archive::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)());
206 void UpdateDbNoLock(UpdateDbOptionSet options);
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);
240 MiKTeX::Packages::PackageInstallerCallback* callback =
nullptr;
242 MiKTeX::Util::PathName downloadDirectory;
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;