MiKTeX 23.10-next
A scalable TeX distribution
Loading...
Searching...
No Matches
PackageManagerImpl.h
Go to the documentation of this file.
1
14#pragma once
15
16#include <map>
17#include <string>
18
19#include <miktex/Core/AutoResource>
20#include <miktex/Core/Fndb>
21#include <miktex/Core/LockFile>
22#include <miktex/Core/MD5>
23
24#include <miktex/PackageManager/PackageManager>
25
26#include "internal.h"
27
28#include "PackageDataStore.h"
29#include "PackageRepositoryDataStore.h"
30#include "WebSession.h"
31
32#define MPM_LOCK_BEGIN(packageManager) \
33 { \
34 packageManager->Lock(std::chrono::seconds(10)); \
35 MIKTEX_AUTO(packageManager->Unlock());
36
37#define MPM_LOCK_END() \
38 }
39
40MPM_INTERNAL_BEGIN_NAMESPACE;
41
42typedef std::map<std::string, MiKTeX::Core::MD5, MiKTeX::Core::less_icase_dos> FileDigestTable;
43
45 public std::enable_shared_from_this<PackageManagerImpl>,
48 public IProgressNotify_
49{
50
51public:
52
53 MIKTEXTHISCALL ~PackageManagerImpl() override;
54
55 std::unique_ptr<class PackageInstaller> MIKTEXTHISCALL CreateInstaller(const MiKTeX::Packages::PackageInstaller::InitInfo& initInfo) override;
56 std::unique_ptr<MiKTeX::Packages::PackageInstaller> MIKTEXTHISCALL CreateInstaller() override;
57 std::unique_ptr<class MiKTeX::Packages::PackageIterator> MIKTEXTHISCALL CreateIterator() override;
58
59 void MIKTEXTHISCALL CreateMpmFndb() override
60 {
61 if (!packageDataStore.LoadedAllPackageManifests())
62 {
63 MPM_LOCK_BEGIN(this)
64 {
65 packageDataStore.Load();
66 }
67 MPM_LOCK_END();
68 }
69 return CreateMpmFndbNoLock();
70 }
71
72 void MIKTEXTHISCALL CreateMpmFndbNoLock();
73 MiKTeX::Packages::PackageInfo MIKTEXTHISCALL GetPackageInfo(const std::string& packageId) override;
74 void MIKTEXTHISCALL LoadDatabase(const MiKTeX::Util::PathName& path, bool isArchive) override;
75 void MIKTEXTHISCALL UnloadDatabase() override;
76
78 {
79 return repositories.GetRepositoryReleaseState();
80 }
81
82 void MIKTEXTHISCALL SetRepositoryReleaseState(MiKTeX::Packages::RepositoryReleaseState repositoryReleaseState) override
83 {
84 repositories.SetRepositoryReleaseState(repositoryReleaseState);
85 }
86
87 void MIKTEXTHISCALL DownloadRepositoryList() override
88 {
89 repositories.Download();
90 }
91
92 std::vector<MiKTeX::Packages::RepositoryInfo> MIKTEXTHISCALL GetRepositories() override
93 {
94 return repositories.GetRepositories();
95 }
96
97 std::string MIKTEXTHISCALL PickRepositoryUrl() override
98 {
99 return repositories.PickRepositoryUrl();
100 }
101
102 bool MIKTEXTHISCALL TryGetPackageInfo(const std::string& packageId, MiKTeX::Packages::PackageInfo& packageInfo) override;
103
104private:
105
106 bool MIKTEXTHISCALL ReadDirectory(const MiKTeX::Util::PathName& path, std::vector<std::string>& subDirNames, std::vector<std::string>& fileNames, std::vector<std::string>& fileNameInfos) override;
107 bool MIKTEXTHISCALL OnProgress(unsigned level, const MiKTeX::Util::PathName& directory) override;
108
109public:
110
111 void OnProgress() override;
112
113 bool MIKTEXTHISCALL TryGetRepositoryInfo(const std::string& url, MiKTeX::Packages::RepositoryInfo& repositoryInfo) override
114 {
115 return repositories.TryGetRepositoryInfo(url, repositoryInfo);
116 }
117
118 MiKTeX::Packages::RepositoryInfo MIKTEXTHISCALL CheckPackageRepository(const std::string& url) override
119 {
120 return repositories.CheckPackageRepository(url);
121 }
122
123 MiKTeX::Packages::RepositoryInfo MIKTEXTHISCALL VerifyPackageRepository(const std::string& url) override
124 {
125 return repositories.VerifyPackageRepository(url);
126 }
127
128 bool MIKTEXTHISCALL TryVerifyInstalledPackage(const std::string& packageId) override
129 {
130 if (!packageDataStore.LoadedAllPackageManifests())
131 {
132 MPM_LOCK_BEGIN(this)
133 {
134 packageDataStore.Load();
135 }
136 MPM_LOCK_END();
137 }
138 return TryVerifyInstalledPackageNoLock(packageId);
139 }
140
141 bool MIKTEXTHISCALL TryVerifyInstalledPackageNoLock(const std::string& packageId);
142
143 std::string MIKTEXTHISCALL GetContainerPath(const std::string& packageId, bool useDisplayNames) override
144 {
145 if (!packageDataStore.LoadedAllPackageManifests())
146 {
147 MPM_LOCK_BEGIN(this)
148 {
149 packageDataStore.Load();
150 }
151 MPM_LOCK_END();
152 }
153 return GetContainerPathNoLock(packageId, useDisplayNames);
154 }
155
156 std::string MIKTEXTHISCALL GetContainerPathNoLock(const std::string& packageId, bool useDisplayNames);
157 InstallationSummary MIKTEXTHISCALL GetInstallationSummary(bool userScope) override;
159 void Lock(std::chrono::milliseconds timeout);
160 void Unlock();
161 void ClearAll();
162
163private:
164
165 bool TryGetFileDigest(const MiKTeX::Util::PathName& prefix, const std::string& fileName, bool& haveDigest, MiKTeX::Core::MD5& digest);
166 bool TryCollectFileDigests(const MiKTeX::Util::PathName& prefix, const std::vector<std::string>& files, FileDigestTable& fileDigests);
167 void Dispose();
168
169 std::unique_ptr<MiKTeX::Core::LockFile> lockFile;
170 std::string remoteServiceBaseUrl;
171 std::unique_ptr<MiKTeX::Trace::TraceStream> trace_error;
172 std::unique_ptr<MiKTeX::Trace::TraceStream> trace_mpm;
173 std::unique_ptr<MiKTeX::Trace::TraceStream> trace_stopwatch;
174 std::shared_ptr<MiKTeX::Core::Session> session = MIKTEX_SESSION();
175 std::shared_ptr<WebSession> webSession = WebSession::Create(this);
176
177public:
178
179 WebSession* GetWebSession() const
180 {
181 return webSession.get();
182 }
183
184private:
185
186 PackageDataStore packageDataStore;
187
188public:
189
190 PackageDataStore* GetPackageDataStore()
191 {
192 return &packageDataStore;
193 }
194
195private:
196
197 PackageRepositoryDataStore repositories;
198
199public:
200
201 static std::string proxyUser;
202 static std::string proxyPassword;
203#if defined(MIKTEX_WINDOWS) && USE_LOCAL_SERVER
204 static bool localServer;
205#endif
206};
207
208MPM_INTERNAL_END_NAMESPACE;
Package data store.
Instances of this struct represent MD5 values.
Definition: MD5.h:46
The package manager interface.
Definition: PackageManager.h:77
Definition: PackageManagerImpl.h:49
bool TryGetRepositoryInfo(const std::string &url, MiKTeX::Packages::RepositoryInfo &repositoryInfo) override
Definition: PackageManagerImpl.h:113
void DownloadRepositoryList() override
Downloads the repositiry list from the server.
Definition: PackageManagerImpl.h:87
std::unique_ptr< class PackageInstaller > CreateInstaller(const MiKTeX::Packages::PackageInstaller::InitInfo &initInfo) override
MiKTeX::Packages::RepositoryReleaseState GetRepositoryReleaseState() override
Definition: PackageManagerImpl.h:77
void SetRepositoryReleaseState(MiKTeX::Packages::RepositoryReleaseState repositoryReleaseState) override
Definition: PackageManagerImpl.h:82
bool TryVerifyInstalledPackage(const std::string &packageId) override
Verifies an installed package.
Definition: PackageManagerImpl.h:128
MiKTeX::Packages::RepositoryInfo CheckPackageRepository(const std::string &url) override
Definition: PackageManagerImpl.h:118
std::vector< MiKTeX::Packages::RepositoryInfo > GetRepositories() override
Definition: PackageManagerImpl.h:92
std::string GetContainerPath(const std::string &packageId, bool useDisplayNames) override
Definition: PackageManagerImpl.h:143
MiKTeX::Packages::RepositoryInfo VerifyPackageRepository(const std::string &url) override
Definition: PackageManagerImpl.h:123
void CreateMpmFndb() override
Recreates the file name database of the package manager.
Definition: PackageManagerImpl.h:59
std::string PickRepositoryUrl() override
Definition: PackageManagerImpl.h:97
Definition: WebSession.h:40
Instances of this class can be used to store path names.
Definition: PathName.h:73
RepositoryReleaseState
Repository release state.
Definition: RepositoryInfo.h:174
Installation summary.
Definition: PackageManager.h:64
Package record.
Definition: PackageInfo.h:34
Initialization options.
Definition: PackageInstaller.h:373
Initialization options.
Definition: PackageManager.h:194
Package repository info struct.
Definition: RepositoryInfo.h:204