xref: /haiku/src/kits/package/solver/SolverRepository.cpp (revision 372a66634410cf0450e426716c14ad42d40c0da4)
1 /*
2  * Copyright 2013, 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  */
8 
9 
10 #include <package/solver/SolverRepository.h>
11 
12 #include <package/PackageDefs.h>
13 #include <package/PackageRoster.h>
14 #include <package/RepositoryCache.h>
15 #include <package/RepositoryConfig.h>
16 #include <package/solver/SolverPackage.h>
17 
18 
19 static const int32 kInitialPackageListSize = 40;
20 
21 
22 namespace BPackageKit {
23 
24 
25 BSolverRepository::BSolverRepository()
26 	:
27 	fName(),
28 	fPriority(0),
29 	fIsInstalled(false),
30 	fPackages(kInitialPackageListSize, true),
31 	fChangeCount(0)
32 {
33 }
34 
35 
36 BSolverRepository::BSolverRepository(const BString& name)
37 	:
38 	fName(),
39 	fPriority(0),
40 	fIsInstalled(false),
41 	fPackages(kInitialPackageListSize, true),
42 	fChangeCount(0)
43 {
44 	SetTo(name);
45 }
46 
47 
48 BSolverRepository::BSolverRepository(BPackageInstallationLocation location)
49 	:
50 	fName(),
51 	fPriority(0),
52 	fIsInstalled(false),
53 	fPackages(kInitialPackageListSize, true),
54 	fChangeCount(0)
55 {
56 	SetTo(location);
57 }
58 
59 
60 BSolverRepository::BSolverRepository(BAllInstallationLocations)
61 	:
62 	fName(),
63 	fPriority(0),
64 	fIsInstalled(false),
65 	fPackages(kInitialPackageListSize, true),
66 	fChangeCount(0)
67 {
68 	SetTo(B_ALL_INSTALLATION_LOCATIONS);
69 }
70 
71 
72 BSolverRepository::BSolverRepository(const BRepositoryConfig& config)
73 	:
74 	fName(),
75 	fPriority(0),
76 	fIsInstalled(false),
77 	fPackages(kInitialPackageListSize, true),
78 	fChangeCount(0)
79 {
80 	SetTo(config);
81 }
82 
83 
84 BSolverRepository::~BSolverRepository()
85 {
86 }
87 
88 
89 status_t
90 BSolverRepository::SetTo(const BString& name)
91 {
92 	Unset();
93 
94 	fName = name;
95 	return fName.IsEmpty() ? B_BAD_VALUE : B_OK;
96 }
97 
98 
99 status_t
100 BSolverRepository::SetTo(BPackageInstallationLocation location)
101 {
102 	Unset();
103 
104 	fName = "Installed";
105 
106 	status_t error = AddPackages(location);
107 	if (error != B_OK) {
108 		Unset();
109 		return error;
110 	}
111 
112 	fIsInstalled = true;
113 	return B_OK;
114 }
115 
116 
117 status_t
118 BSolverRepository::SetTo(BAllInstallationLocations)
119 {
120 	status_t error = SetTo(B_PACKAGE_INSTALLATION_LOCATION_SYSTEM);
121 	if (error != B_OK)
122 		return error;
123 
124 	error = AddPackages(B_PACKAGE_INSTALLATION_LOCATION_COMMON);
125 	if (error != B_OK) {
126 		Unset();
127 		return error;
128 	}
129 
130 	error = AddPackages(B_PACKAGE_INSTALLATION_LOCATION_HOME);
131 	if (error != B_OK) {
132 		Unset();
133 		return error;
134 	}
135 
136 	return B_OK;
137 }
138 
139 
140 status_t
141 BSolverRepository::SetTo(const BRepositoryConfig& config)
142 {
143 	Unset();
144 
145 	if (config.InitCheck() != B_OK)
146 		return B_BAD_VALUE;
147 
148 	fName = config.Name();
149 	fPriority = config.Priority();
150 
151 	BPackageRoster roster;
152 	BRepositoryCache cache;
153 	status_t error = roster.GetRepositoryCache(config.Name(), &cache);
154 	if (error != B_OK) {
155 		Unset();
156 		return error;
157 	}
158 
159 	BRepositoryCache::Iterator it = cache.GetIterator();
160 	while (const BPackageInfo* packageInfo = it.Next()) {
161 		error = AddPackage(*packageInfo);
162 		if (error != B_OK) {
163 			Unset();
164 			return error;
165 		}
166 	}
167 
168 	return B_OK;
169 }
170 
171 
172 status_t
173 BSolverRepository::SetTo(const BRepositoryCache& cache)
174 {
175 	Unset();
176 
177 	const BRepositoryInfo& info = cache.Info();
178 	if (info.InitCheck() != B_OK)
179 		return B_BAD_VALUE;
180 
181 	fName = info.Name();
182 	fPriority = info.Priority();
183 
184 	BRepositoryCache::Iterator it = cache.GetIterator();
185 	while (const BPackageInfo* packageInfo = it.Next()) {
186 		status_t error = AddPackage(*packageInfo);
187 		if (error != B_OK) {
188 			Unset();
189 			return error;
190 		}
191 	}
192 
193 	return B_OK;
194 }
195 
196 
197 void
198 BSolverRepository::Unset()
199 {
200 	fName = BString();
201 	fPriority = 0;
202 	fIsInstalled = false;
203 	fPackages.MakeEmpty();
204 	fChangeCount++;
205 }
206 
207 
208 status_t
209 BSolverRepository::InitCheck()
210 {
211 	return fName.IsEmpty() ? B_NO_INIT : B_OK;
212 }
213 
214 
215 bool
216 BSolverRepository::IsInstalled() const
217 {
218 	return fIsInstalled;
219 }
220 
221 
222 void
223 BSolverRepository::SetInstalled(bool isInstalled)
224 {
225 	fIsInstalled = isInstalled;
226 	fChangeCount++;
227 }
228 
229 
230 BString
231 BSolverRepository::Name() const
232 {
233 	return fName;
234 }
235 
236 
237 int32
238 BSolverRepository::Priority() const
239 {
240 	return fPriority;
241 }
242 
243 
244 void
245 BSolverRepository::SetPriority(int32 priority)
246 {
247 	fPriority = priority;
248 	fChangeCount++;
249 }
250 
251 
252 bool
253 BSolverRepository::IsEmpty() const
254 {
255 	return fPackages.IsEmpty();
256 }
257 
258 
259 int32
260 BSolverRepository::CountPackages() const
261 {
262 	return fPackages.CountItems();
263 }
264 
265 
266 BSolverPackage*
267 BSolverRepository::PackageAt(int32 index) const
268 {
269 	return fPackages.ItemAt(index);
270 }
271 
272 
273 status_t
274 BSolverRepository::AddPackage(const BPackageInfo& info,
275 	BSolverPackage** _package)
276 {
277 	BSolverPackage* package = new(std::nothrow) BSolverPackage(this, info);
278 	if (package == NULL || !fPackages.AddItem(package)) {
279 		delete package;
280 		return B_NO_MEMORY;
281 	}
282 
283 	fChangeCount++;
284 
285 	if (_package != NULL)
286 		*_package = package;
287 
288 	return B_OK;
289 }
290 
291 
292 status_t
293 BSolverRepository::AddPackages(BPackageInstallationLocation location)
294 {
295 	BPackageRoster roster;
296 	BPackageInfoSet packageInfos;
297 	status_t error = roster.GetActivePackages(location, packageInfos);
298 	if (error != B_OK)
299 		return error;
300 
301 	BRepositoryCache::Iterator it = packageInfos.GetIterator();
302 	while (const BPackageInfo* packageInfo = it.Next()) {
303 		error = AddPackage(*packageInfo);
304 		if (error != B_OK)
305 			return error;
306 	}
307 
308 	return B_OK;
309 }
310 
311 
312 bool
313 BSolverRepository::RemovePackage(BSolverPackage* package)
314 {
315 	if (!fPackages.RemoveItem(package, false))
316 		return false;
317 
318 	fChangeCount++;
319 	return true;
320 }
321 
322 
323 bool
324 BSolverRepository::DeletePackage(BSolverPackage* package)
325 {
326 	if (!RemovePackage(package))
327 		return false;
328 
329 	delete package;
330 	return true;
331 }
332 
333 
334 uint64
335 BSolverRepository::ChangeCount() const
336 {
337 	return fChangeCount;
338 }
339 
340 
341 }	// namespace BPackageKit
342