xref: /haiku/headers/private/package/manager/PackageManager.h (revision d64b771b96050fca8ff1859daa5ec44ff3493af7)
1 /*
2  * Copyright 2013-2014, Haiku, Inc. All Rights Reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Ingo Weinhold <ingo_weinhold@gmx.de>
7  *		Rene Gollent <rene@gollent.com>
8  */
9 #ifndef _PACKAGE__MANAGER__PRIVATE__PACKAGE_MANAGER_H_
10 #define _PACKAGE__MANAGER__PRIVATE__PACKAGE_MANAGER_H_
11 
12 
13 #include <map>
14 #include <string>
15 
16 #include <Directory.h>
17 #include <ObjectList.h>
18 #include <package/Context.h>
19 #include <package/PackageDefs.h>
20 #include <package/PackageRoster.h>
21 #include <package/RepositoryConfig.h>
22 #include <package/solver/Solver.h>
23 #include <package/solver/SolverRepository.h>
24 
25 #include <package/ActivationTransaction.h>
26 #include <package/DaemonClient.h>
27 #include <package/Job.h>
28 
29 
30 namespace BPackageKit {
31 
32 
33 class BCommitTransactionResult;
34 
35 
36 namespace BManager {
37 
38 namespace BPrivate {
39 
40 
41 using BPackageKit::BPrivate::BActivationTransaction;
42 using BPackageKit::BPrivate::BDaemonClient;
43 
44 
45 class BPackageManager : protected BJobStateListener {
46 public:
47 			class RemoteRepository;
48 			class LocalRepository;
49 			class MiscLocalRepository;
50 			class InstalledRepository;
51 			class Transaction;
52 			class InstallationInterface;
53 			class ClientInstallationInterface;
54 			class UserInteractionHandler;
55 
56 			typedef BObjectList<RemoteRepository> RemoteRepositoryList;
57 			typedef BObjectList<InstalledRepository> InstalledRepositoryList;
58 			typedef BObjectList<BSolverPackage> PackageList;
59 			typedef BObjectList<Transaction> TransactionList;
60 
61 			enum {
62 				B_ADD_INSTALLED_REPOSITORIES	= 0x01,
63 				B_ADD_REMOTE_REPOSITORIES		= 0x02,
64 				B_REFRESH_REPOSITORIES			= 0x04,
65 			};
66 
67 public:
68 								BPackageManager(
69 									BPackageInstallationLocation location,
70 									InstallationInterface*
71 										installationInterface,
72 									UserInteractionHandler*
73 										userInteractionHandler);
74 	virtual						~BPackageManager();
75 
76 			void				Init(uint32 flags);
77 
78 			BSolver*			Solver() const
79 									{ return fSolver; }
80 
81 			const InstalledRepository* SystemRepository() const
82 									{ return fSystemRepository; }
83 			const InstalledRepository* HomeRepository() const
84 									{ return fHomeRepository; }
85 			const InstalledRepositoryList& InstalledRepositories() const
86 									{ return fInstalledRepositories; }
87 			const RemoteRepositoryList& OtherRepositories() const
88 									{ return fOtherRepositories; }
89 
90 			void				Install(const char* const* packages,
91 									int packageCount);
92 			void				Install(const BSolverPackageSpecifierList&
93 									packages);
94 			void				Uninstall(const char* const* packages,
95 									int packageCount);
96 			void				Uninstall(const BSolverPackageSpecifierList&
97 									packages);
98 			void				Update(const char* const* packages,
99 									int packageCount);
100 			void				Update(const BSolverPackageSpecifierList&
101 									packages);
102 			void				FullSync();
103 
104 			void				VerifyInstallation();
105 
106 
107 	virtual	status_t			DownloadPackage(const BString& fileURL,
108 									const BEntry& targetEntry,
109 									const BString& checksum);
110 	virtual	status_t			RefreshRepository(
111 									const BRepositoryConfig& repoConfig);
112 
113 protected:
114 			InstalledRepository& InstallationRepository();
115 
116 protected:
117 			// BJobStateListener
118 	virtual	void				JobStarted(BJob* job);
119 	virtual	void				JobProgress(BJob* job);
120 	virtual	void				JobSucceeded(BJob* job);
121 
122 private:
123 			void				_HandleProblems();
124 			void				_AnalyzeResult();
125 			void				_ConfirmChanges(bool fromMostSpecific = false);
126 			void				_ApplyPackageChanges(
127 									bool fromMostSpecific = false);
128 			void				_PreparePackageChanges(
129 									InstalledRepository&
130 										installationRepository);
131 			void				_CommitPackageChanges(Transaction& transaction);
132 
133 			void				_ClonePackageFile(
134 									LocalRepository* repository,
135 									BSolverPackage* package,
136 							 		const BEntry& entry);
137 			int32				_FindBasePackage(const PackageList& packages,
138 									const BPackageInfo& info);
139 
140 			void				_AddInstalledRepository(
141 									InstalledRepository* repository);
142 			void				_AddRemoteRepository(BPackageRoster& roster,
143 									const char* name, bool refresh);
144 			status_t			_GetRepositoryCache(BPackageRoster& roster,
145 									const BRepositoryConfig& config,
146 									bool refresh, BRepositoryCache& _cache);
147 
148 			void				_AddPackageSpecifiers(
149 									const char* const* searchStrings,
150 									int searchStringCount,
151 									BSolverPackageSpecifierList& specifierList);
152 			bool				_IsLocalPackage(const char* fileName);
153 			BSolverPackage*		_AddLocalPackage(const char* fileName);
154 
155 			bool				_NextSpecificInstallationLocation();
156 
157 protected:
158 			BPackageInstallationLocation fLocation;
159 			BSolver*			fSolver;
160 			InstalledRepository* fSystemRepository;
161 			InstalledRepository* fHomeRepository;
162 			InstalledRepositoryList fInstalledRepositories;
163 			RemoteRepositoryList fOtherRepositories;
164 			MiscLocalRepository* fLocalRepository;
165 			TransactionList		fTransactions;
166 
167 			// must be set by the derived class
168 			InstallationInterface* fInstallationInterface;
169 			UserInteractionHandler* fUserInteractionHandler;
170 };
171 
172 
173 class BPackageManager::RemoteRepository : public BSolverRepository {
174 public:
175 								RemoteRepository(
176 									const BRepositoryConfig& config);
177 
178 			const BRepositoryConfig& Config() const;
179 
180 private:
181 			BRepositoryConfig	fConfig;
182 };
183 
184 
185 class BPackageManager::LocalRepository : public BSolverRepository {
186 public:
187 								LocalRepository();
188 								LocalRepository(const BString& name);
189 
190 	virtual	void				GetPackagePath(BSolverPackage* package,
191 									BPath& _path) = 0;
192 };
193 
194 
195 class BPackageManager::MiscLocalRepository : public LocalRepository {
196 public:
197 								MiscLocalRepository();
198 
199 			BSolverPackage*		AddLocalPackage(const char* fileName);
200 
201 	virtual	void				GetPackagePath(BSolverPackage* package,
202 									BPath& _path);
203 
204 private:
205 			typedef std::map<BSolverPackage*, std::string> PackagePathMap;
206 private:
207 			PackagePathMap		fPackagePaths;
208 };
209 
210 
211 class BPackageManager::InstalledRepository : public LocalRepository {
212 public:
213 			typedef BObjectList<BSolverPackage> PackageList;
214 
215 public:
216 								InstalledRepository(const char* name,
217 									BPackageInstallationLocation location,
218 									int32 priority);
219 
220 			BPackageInstallationLocation Location() const
221 									{ return fLocation; }
222 			const char*			InitialName() const
223 									{ return fInitialName; }
224 			int32				InitialPriority() const
225 									{ return fInitialPriority; }
226 
227 	virtual	void				GetPackagePath(BSolverPackage* package,
228 									BPath& _path);
229 
230 			void				DisablePackage(BSolverPackage* package);
231 									// throws, if already disabled
232 			bool				EnablePackage(BSolverPackage* package);
233 									// returns whether it was disabled
234 
235 			PackageList&		PackagesToActivate()
236 									{ return fPackagesToActivate; }
237 			PackageList&		PackagesToDeactivate()
238 									{ return fPackagesToDeactivate; }
239 
240 			bool				HasChanges() const;
241 			void				ApplyChanges();
242 
243 private:
244 			PackageList			fDisabledPackages;
245 			PackageList			fPackagesToActivate;
246 			PackageList			fPackagesToDeactivate;
247 			const char*			fInitialName;
248 			BPackageInstallationLocation fLocation;
249 			int32				fInitialPriority;
250 };
251 
252 
253 class BPackageManager::Transaction {
254 public:
255 								Transaction(InstalledRepository& repository);
256 								~Transaction();
257 
258 			InstalledRepository& Repository()
259 									{ return fRepository; }
260 			BActivationTransaction& ActivationTransaction()
261 									{ return fTransaction; }
262 			BDirectory&			TransactionDirectory()
263 									{ return fTransactionDirectory; }
264 
265 private:
266 			InstalledRepository& fRepository;
267 			BActivationTransaction fTransaction;
268 			BDirectory			fTransactionDirectory;
269 };
270 
271 
272 class BPackageManager::InstallationInterface {
273 public:
274 	virtual						~InstallationInterface();
275 
276 	virtual	void				InitInstalledRepository(
277 									InstalledRepository& repository) = 0;
278 	virtual	void				ResultComputed(InstalledRepository& repository);
279 
280 	virtual	status_t			PrepareTransaction(Transaction& transaction)
281 									= 0;
282 	virtual	status_t			CommitTransaction(Transaction& transaction,
283 									BCommitTransactionResult& _result) = 0;
284 };
285 
286 
287 class BPackageManager::ClientInstallationInterface
288 	: public InstallationInterface {
289 public:
290 								ClientInstallationInterface();
291 	virtual						~ClientInstallationInterface();
292 
293 	virtual	void				InitInstalledRepository(
294 									InstalledRepository& repository);
295 
296 	virtual	status_t			PrepareTransaction(Transaction& transaction);
297 	virtual	status_t			CommitTransaction(Transaction& transaction,
298 									BCommitTransactionResult& _result);
299 
300 private:
301 			BDaemonClient		fDaemonClient;
302 };
303 
304 
305 class BPackageManager::UserInteractionHandler {
306 public:
307 	virtual						~UserInteractionHandler();
308 
309 	virtual	void				HandleProblems();
310 	virtual	void				ConfirmChanges(bool fromMostSpecific);
311 
312 	virtual	void				Warn(status_t error, const char* format, ...);
313 
314 	virtual	void				ProgressPackageDownloadStarted(
315 									const char* packageName);
316 	virtual	void				ProgressPackageDownloadActive(
317 									const char* packageName,
318 									float completionPercentage);
319 	virtual	void				ProgressPackageDownloadComplete(
320 									const char* packageName);
321 	virtual	void				ProgressPackageChecksumStarted(
322 									const char* title);
323 	virtual	void				ProgressPackageChecksumComplete(
324 									const char* title);
325 
326 	virtual	void				ProgressStartApplyingChanges(
327 									InstalledRepository& repository);
328 	virtual	void				ProgressTransactionCommitted(
329 									InstalledRepository& repository,
330 									const BCommitTransactionResult& result);
331 	virtual	void				ProgressApplyingChangesDone(
332 									InstalledRepository& repository);
333 };
334 
335 
336 }	// namespace BPrivate
337 
338 }	// namespace BManager
339 
340 }	// namespace BPackageKit
341 
342 
343 #endif	// _PACKAGE__MANAGER__PRIVATE__PACKAGE_MANAGER_H_
344