xref: /haiku/src/kits/package/RepositoryInfo.cpp (revision 6ec69f4426d9d171c683124d62cfbd7762a37f27)
1 /*
2  * Copyright 2011-2018, Haiku, Inc. All Rights Reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Oliver Tappe <zooey@hirschkaefer.de>
7  *		Andrew Lindesay <apl@lindesay.co.nz>
8  */
9 
10 
11 #include <package/RepositoryInfo.h>
12 
13 #include <stdlib.h>
14 
15 #include <new>
16 
17 #include <driver_settings.h>
18 #include <File.h>
19 #include <Message.h>
20 
21 #include <AutoDeleter.h>
22 #include <package/PackageInfo.h>
23 
24 
25 namespace BPackageKit {
26 
27 
28 const uint8 BRepositoryInfo::kDefaultPriority	= 50;
29 
30 const char* const BRepositoryInfo::kNameField			= "name";
31 const char* const BRepositoryInfo::kURLField			= "url";
32 const char* const BRepositoryInfo::kBaseURLField		= "baseUrl";
33 const char* const BRepositoryInfo::kVendorField			= "vendor";
34 const char* const BRepositoryInfo::kSummaryField		= "summary";
35 const char* const BRepositoryInfo::kPriorityField		= "priority";
36 const char* const BRepositoryInfo::kArchitectureField	= "architecture";
37 const char* const BRepositoryInfo::kLicenseNameField	= "licenseName";
38 const char* const BRepositoryInfo::kLicenseTextField	= "licenseText";
39 
40 
41 BRepositoryInfo::BRepositoryInfo()
42 	:
43 	fInitStatus(B_NO_INIT),
44 	fPriority(kDefaultPriority),
45 	fArchitecture(B_PACKAGE_ARCHITECTURE_ENUM_COUNT)
46 {
47 }
48 
49 
50 BRepositoryInfo::BRepositoryInfo(BMessage* data)
51 	:
52 	inherited(data),
53 	fLicenseTexts(5)
54 {
55 	fInitStatus = _SetTo(data);
56 }
57 
58 
59 BRepositoryInfo::BRepositoryInfo(const BEntry& entry)
60 {
61 	fInitStatus = _SetTo(entry);
62 }
63 
64 
65 BRepositoryInfo::~BRepositoryInfo()
66 {
67 }
68 
69 
70 /*static*/ BRepositoryInfo*
71 BRepositoryInfo::Instantiate(BMessage* data)
72 {
73 	if (validate_instantiation(data, "BPackageKit::BRepositoryInfo"))
74 		return new (std::nothrow) BRepositoryInfo(data);
75 
76 	return NULL;
77 }
78 
79 
80 status_t
81 BRepositoryInfo::Archive(BMessage* data, bool deep) const
82 {
83 	status_t result = inherited::Archive(data, deep);
84 	if (result != B_OK)
85 		return result;
86 
87 	if (!fBaseURL.IsEmpty()) {
88 		if ((result = data->AddString(kBaseURLField, fBaseURL)) != B_OK)
89 			return result;
90 	}
91 
92 	if ((result = data->AddString(kNameField, fName)) != B_OK)
93 		return result;
94 	if ((result = data->AddString(kURLField, fURL)) != B_OK)
95 		return result;
96 	if ((result = data->AddString(kVendorField, fVendor)) != B_OK)
97 		return result;
98 	result = data->AddString(kSummaryField, fSummary);
99 	if (result != B_OK)
100 		return result;
101 	if ((result = data->AddUInt8(kPriorityField, fPriority)) != B_OK)
102 		return result;
103 	if ((result = data->AddUInt8(kArchitectureField, fArchitecture)) != B_OK)
104 		return result;
105 	for (int i = 0; i < fLicenseNames.CountStrings(); ++i) {
106 		result = data->AddString(kLicenseNameField, fLicenseNames.StringAt(i));
107 		if (result != B_OK)
108 			return result;
109 	}
110 	for (int i = 0; i < fLicenseTexts.CountStrings(); ++i) {
111 		result = data->AddString(kLicenseTextField, fLicenseTexts.StringAt(i));
112 		if (result != B_OK)
113 			return result;
114 	}
115 
116 	return B_OK;
117 }
118 
119 
120 status_t
121 BRepositoryInfo::InitCheck() const
122 {
123 	return fInitStatus;
124 }
125 
126 
127 status_t
128 BRepositoryInfo::SetTo(const BMessage* data)
129 {
130 	return fInitStatus = _SetTo(data);
131 }
132 
133 
134 status_t
135 BRepositoryInfo::SetTo(const BEntry& entry)
136 {
137 	return fInitStatus = _SetTo(entry);
138 }
139 
140 
141 const BString&
142 BRepositoryInfo::Name() const
143 {
144 	return fName;
145 }
146 
147 
148 const BString&
149 BRepositoryInfo::BaseURL() const
150 {
151 	return fBaseURL;
152 }
153 
154 
155 const BString&
156 BRepositoryInfo::URL() const
157 {
158 	return fURL;
159 }
160 
161 
162 const BString&
163 BRepositoryInfo::Vendor() const
164 {
165 	return fVendor;
166 }
167 
168 
169 const BString&
170 BRepositoryInfo::Summary() const
171 {
172 	return fSummary;
173 }
174 
175 
176 uint8
177 BRepositoryInfo::Priority() const
178 {
179 	return fPriority;
180 }
181 
182 
183 BPackageArchitecture
184 BRepositoryInfo::Architecture() const
185 {
186 	return fArchitecture;
187 }
188 
189 
190 const BStringList&
191 BRepositoryInfo::LicenseNames() const
192 {
193 	return fLicenseNames;
194 }
195 
196 
197 const BStringList&
198 BRepositoryInfo::LicenseTexts() const
199 {
200 	return fLicenseTexts;
201 }
202 
203 
204 void
205 BRepositoryInfo::SetName(const BString& name)
206 {
207 	fName = name;
208 }
209 
210 
211 void
212 BRepositoryInfo::SetURL(const BString& url)
213 {
214 	fURL = url;
215 }
216 
217 
218 void
219 BRepositoryInfo::SetBaseURL(const BString& url)
220 {
221 	fBaseURL = url;
222 }
223 
224 
225 void
226 BRepositoryInfo::SetVendor(const BString& vendor)
227 {
228 	fVendor = vendor;
229 }
230 
231 
232 void
233 BRepositoryInfo::SetSummary(const BString& summary)
234 {
235 	fSummary = summary;
236 }
237 
238 
239 void
240 BRepositoryInfo::SetPriority(uint8 priority)
241 {
242 	fPriority = priority;
243 }
244 
245 
246 void
247 BRepositoryInfo::SetArchitecture(BPackageArchitecture architecture)
248 {
249 	fArchitecture = architecture;
250 }
251 
252 
253 status_t
254 BRepositoryInfo::AddLicense(const BString& licenseName,
255 	const BString& licenseText)
256 {
257 	if (!fLicenseNames.Add(licenseName) || !fLicenseTexts.Add(licenseText))
258 		return B_NO_MEMORY;
259 
260 	return B_OK;
261 }
262 
263 
264 void
265 BRepositoryInfo::ClearLicenses()
266 {
267 	fLicenseNames.MakeEmpty();
268 	fLicenseTexts.MakeEmpty();
269 }
270 
271 
272 status_t
273 BRepositoryInfo::_SetTo(const BMessage* data)
274 {
275 	if (data == NULL)
276 		return B_BAD_VALUE;
277 
278 	data->FindString(kBaseURLField, &fBaseURL);
279 		// optional value for historical reasons
280 
281 	status_t result;
282 	if ((result = data->FindString(kNameField, &fName)) != B_OK)
283 		return result;
284 	if ((result = data->FindString(kURLField, &fURL)) != B_OK)
285 		return result;
286 	if ((result = data->FindString(kVendorField, &fVendor)) != B_OK)
287 		return result;
288 	if ((result = data->FindString(kSummaryField, &fSummary)) != B_OK)
289 		return result;
290 	if ((result = data->FindUInt8(kPriorityField, &fPriority)) != B_OK)
291 		return result;
292 	result = data->FindUInt8(kArchitectureField, (uint8*)&fArchitecture);
293 	if (result != B_OK)
294 		return result;
295 	if (fArchitecture == B_PACKAGE_ARCHITECTURE_ANY)
296 		return B_BAD_DATA;
297 
298 	const char* licenseName;
299 	const char* licenseText;
300 	for (int i = 0;
301 		data->FindString(kLicenseNameField, i, &licenseName) == B_OK
302 			&& data->FindString(kLicenseTextField, i, &licenseText) == B_OK;
303 		++i) {
304 		if (!fLicenseNames.Add(licenseName) || !fLicenseTexts.Add(licenseText))
305 			return B_NO_MEMORY;
306 	}
307 
308 	return B_OK;
309 }
310 
311 
312 status_t
313 BRepositoryInfo::_SetTo(const BEntry& entry)
314 {
315 	BFile file(&entry, B_READ_ONLY);
316 	status_t result = file.InitCheck();
317 	if (result != B_OK)
318 		return result;
319 
320 	off_t size;
321 	if ((result = file.GetSize(&size)) != B_OK)
322 		return result;
323 
324 	BString configString;
325 	char* buffer = configString.LockBuffer(size);
326 	if (buffer == NULL)
327 		return B_NO_MEMORY;
328 
329 	if ((result = file.Read(buffer, size)) < size) {
330 		configString.UnlockBuffer(0);
331 		return (result >= 0) ? B_IO_ERROR : result;
332 	}
333 
334 	buffer[size] = '\0';
335 	configString.UnlockBuffer(size);
336 
337 	void* settingsHandle = parse_driver_settings_string(configString.String());
338 	if (settingsHandle == NULL)
339 		return B_BAD_DATA;
340 	CObjectDeleter<void, status_t> settingsHandleDeleter(settingsHandle,
341 		&unload_driver_settings);
342 
343 	const char* name = get_driver_parameter(settingsHandle, "name", NULL, NULL);
344 	const char* url = get_driver_parameter(settingsHandle, "url", NULL, NULL);
345 	const char* baseUrl = get_driver_parameter(settingsHandle, "baseurl", NULL, NULL);
346 	const char* vendor
347 		= get_driver_parameter(settingsHandle, "vendor", NULL, NULL);
348 	const char* summary
349 		= get_driver_parameter(settingsHandle, "summary", NULL, NULL);
350 	const char* priorityString
351 		= get_driver_parameter(settingsHandle, "priority", NULL, NULL);
352 	const char* architectureString
353 		= get_driver_parameter(settingsHandle, "architecture", NULL, NULL);
354 
355 	if (name == NULL || *name == '\0' || url == NULL || *url == '\0'
356 		|| vendor == NULL || *vendor == '\0'
357 		|| summary == NULL || *summary == '\0'
358 		|| priorityString == NULL || *priorityString == '\0'
359 		|| architectureString == NULL || *architectureString == '\0') {
360 		return B_BAD_DATA;
361 	}
362 
363 	BPackageArchitecture architecture;
364 	if (BPackageInfo::GetArchitectureByName(architectureString, architecture)
365 			!= B_OK || architecture == B_PACKAGE_ARCHITECTURE_ANY) {
366 		return B_BAD_DATA;
367 	}
368 
369 	fName = name;
370 	fBaseURL = baseUrl;
371 	fURL = url;
372 	fVendor = vendor;
373 	fSummary = summary;
374 	fPriority = atoi(priorityString);
375 	fArchitecture = architecture;
376 
377 	return B_OK;
378 }
379 
380 
381 }	// namespace BPackageKit
382