1/*
2 * Copyright 2009-2013, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef PACKAGE_INFO_PRINTER_H
6#define PACKAGE_INFO_PRINTER_H
7
8
9#include <stdio.h>
10
11#include <package/hpkg/PackageInfoAttributeValue.h>
12#include <package/PackageInfo.h>
13
14
15using namespace BPackageKit;
16using BPackageKit::BHPKG::BGlobalWritableFileInfoData;
17using BPackageKit::BHPKG::BPackageInfoAttributeValue;
18using BPackageKit::BHPKG::BUserData;
19using BPackageKit::BHPKG::BUserSettingsFileInfoData;
20
21
22class PackageInfoPrinter {
23public:
24	void PrintPackageInfo(const BPackageInfo& info)
25	{
26		PrintName(info.Name());
27		PrintSummary(info.Summary());
28		PrintDescription(info.Description());
29		PrintVendor(info.Vendor());
30		PrintPackager(info.Packager());
31
32		if (!info.BasePackage().IsEmpty())
33			PrintBasePackage(info.BasePackage());
34
35		PrintFlags(info.Flags());
36		PrintArchitecture((uint32)info.Architecture());
37		PrintVersion(info.Version());
38
39		int32 count = info.CopyrightList().CountStrings();
40		for (int32 i = 0; i < count; i++)
41			PrintCopyright(info.CopyrightList().StringAt(i));
42
43		count = info.LicenseList().CountStrings();
44		for (int32 i = 0; i < count; i++)
45			PrintLicense(info.LicenseList().StringAt(i));
46
47		count = info.URLList().CountStrings();
48		for (int32 i = 0; i < count; i++)
49			PrintUrl(info.URLList().StringAt(i));
50
51		count = info.SourceURLList().CountStrings();
52		for (int32 i = 0; i < count; i++)
53			PrintSourceUrl(info.SourceURLList().StringAt(i));
54
55		count = info.ProvidesList().CountItems();
56		for (int32 i = 0; i < count; i++)
57			PrintProvides(*info.ProvidesList().ItemAt(i));
58
59		count = info.RequiresList().CountItems();
60		for (int32 i = 0; i < count; i++)
61			PrintRequires(*info.RequiresList().ItemAt(i));
62
63		count = info.SupplementsList().CountItems();
64		for (int32 i = 0; i < count; i++)
65			PrintSupplements(*info.SupplementsList().ItemAt(i));
66
67		count = info.ConflictsList().CountItems();
68		for (int32 i = 0; i < count; i++)
69			PrintConflicts(*info.ConflictsList().ItemAt(i));
70
71		count = info.FreshensList().CountItems();
72		for (int32 i = 0; i < count; i++)
73			PrintFreshens(*info.FreshensList().ItemAt(i));
74
75		count = info.ReplacesList().CountStrings();
76		for (int32 i = 0; i < count; i++)
77			PrintReplaces(info.ReplacesList().StringAt(i));
78
79		count = info.GlobalWritableFileInfos().CountItems();
80		for (int32 i = 0; i < count; i++)
81			PrintGlobalWritableFile(*info.GlobalWritableFileInfos().ItemAt(i));
82
83		count = info.UserSettingsFileInfos().CountItems();
84		for (int32 i = 0; i < count; i++)
85			PrintUserSettingsFile(*info.UserSettingsFileInfos().ItemAt(i));
86
87		count = info.Users().CountItems();
88		for (int32 i = 0; i < count; i++)
89			PrintUser(*info.Users().ItemAt(i));
90
91		count = info.Groups().CountStrings();
92		for (int32 i = 0; i < count; i++)
93			PrintGroup(info.Groups().StringAt(i));
94
95		count = info.PostInstallScripts().CountStrings();
96		for (int32 i = 0; i < count; i++)
97			PrintPostInstallScript(info.PostInstallScripts().StringAt(i));
98
99		count = info.PreUninstallScripts().CountStrings();
100		for (int32 i = 0; i < count; i++)
101			PrintPreUninstallScript(info.PreUninstallScripts().StringAt(i));
102
103		if (!info.InstallPath().IsEmpty())
104			PrintInstallPath(info.InstallPath());
105	}
106
107	bool PrintAttribute(const BPackageInfoAttributeValue& value)
108	{
109		switch (value.attributeID) {
110			case B_PACKAGE_INFO_NAME:
111				PrintName(value.string);
112				break;
113
114			case B_PACKAGE_INFO_SUMMARY:
115				PrintSummary(value.string);
116				break;
117
118			case B_PACKAGE_INFO_DESCRIPTION:
119				PrintDescription(value.string);
120				break;
121
122			case B_PACKAGE_INFO_VENDOR:
123				PrintVendor(value.string);
124				break;
125
126			case B_PACKAGE_INFO_PACKAGER:
127				PrintPackager(value.string);
128				break;
129
130			case B_PACKAGE_INFO_BASE_PACKAGE:
131				PrintBasePackage(value.string);
132				break;
133
134			case B_PACKAGE_INFO_FLAGS:
135				PrintFlags(value.unsignedInt);
136				break;
137
138			case B_PACKAGE_INFO_ARCHITECTURE:
139				PrintArchitecture(value.unsignedInt);
140				break;
141
142			case B_PACKAGE_INFO_VERSION:
143				PrintVersion(value.version);
144				break;
145
146			case B_PACKAGE_INFO_COPYRIGHTS:
147				PrintCopyright(value.string);
148				break;
149
150			case B_PACKAGE_INFO_LICENSES:
151				PrintLicense(value.string);
152				break;
153
154			case B_PACKAGE_INFO_URLS:
155				PrintUrl(value.string);
156				break;
157
158			case B_PACKAGE_INFO_SOURCE_URLS:
159				PrintSourceUrl(value.string);
160				break;
161
162			case B_PACKAGE_INFO_PROVIDES:
163				PrintProvides(value.resolvable);
164				break;
165
166			case B_PACKAGE_INFO_REQUIRES:
167				PrintRequires(value.resolvableExpression);
168				break;
169
170			case B_PACKAGE_INFO_SUPPLEMENTS:
171				PrintSupplements(value.resolvableExpression);
172				break;
173
174			case B_PACKAGE_INFO_CONFLICTS:
175				PrintConflicts(value.resolvableExpression);
176				break;
177
178			case B_PACKAGE_INFO_FRESHENS:
179				PrintFreshens(value.resolvableExpression);
180				break;
181
182			case B_PACKAGE_INFO_REPLACES:
183				PrintReplaces(value.string);
184				break;
185
186			case B_PACKAGE_INFO_GLOBAL_WRITABLE_FILES:
187				PrintGlobalWritableFile(value.globalWritableFileInfo);
188				break;
189
190			case B_PACKAGE_INFO_USER_SETTINGS_FILES:
191				PrintUserSettingsFile(value.userSettingsFileInfo);
192				break;
193
194			case B_PACKAGE_INFO_USERS:
195				PrintUser(value.user);
196				break;
197
198			case B_PACKAGE_INFO_GROUPS:
199				PrintGroup(value.string);
200				break;
201
202			case B_PACKAGE_INFO_POST_INSTALL_SCRIPTS:
203				PrintPostInstallScript(value.string);
204				break;
205
206			case B_PACKAGE_INFO_PRE_UNINSTALL_SCRIPTS:
207				PrintPreUninstallScript(value.string);
208				break;
209
210			case B_PACKAGE_INFO_INSTALL_PATH:
211				PrintInstallPath(value.string);
212				break;
213
214			case B_PACKAGE_INFO_CHECKSUM:
215				PrintChecksum(value.string);
216				break;
217
218			default:
219				printf("\tunknown or future attribute: "
220					"BPackageInfoAttributeID #%d\n", value.attributeID);
221				return true;
222		}
223
224		return true;
225	}
226
227	void PrintName(const char* name) const
228	{
229		printf("\tname: %s\n", name);
230	}
231
232	void PrintSummary(const char* summary) const
233	{
234		printf("\tsummary: %s\n", summary);
235	}
236
237	void PrintDescription(const char* description) const
238	{
239		printf("\tdescription: %s\n", description);
240	}
241
242	void PrintVendor(const char* vendor) const
243	{
244		printf("\tvendor: %s\n", vendor);
245	}
246
247	void PrintPackager(const char* packager) const
248	{
249		printf("\tpackager: %s\n", packager);
250	}
251
252	void PrintBasePackage(const char* basePackage) const
253	{
254		printf("\tbase package: %s\n", basePackage);
255	}
256
257	void PrintFlags(uint32 flags) const
258	{
259		if (flags == 0)
260			return;
261
262		printf("\tflags:\n");
263		if ((flags & B_PACKAGE_FLAG_APPROVE_LICENSE) != 0)
264			printf("\t\tapprove_license\n");
265		if ((flags & B_PACKAGE_FLAG_SYSTEM_PACKAGE) != 0)
266			printf("\t\tsystem_package\n");
267	}
268
269	void PrintArchitecture(uint32 architecture) const
270	{
271		printf("\tarchitecture: %s\n",
272			architecture < B_PACKAGE_ARCHITECTURE_ENUM_COUNT
273				? BPackageInfo::kArchitectureNames[architecture]
274				: "<invalid>");
275	}
276
277	void PrintVersion(const BPackageVersion& version) const
278	{
279		printf("\tversion: %s\n", version.ToString().String());
280	}
281
282	void PrintCopyright(const char* copyright) const
283	{
284		printf("\tcopyright: %s\n", copyright);
285	}
286
287	void PrintLicense(const char* license) const
288	{
289		printf("\tlicense: %s\n", license);
290	}
291
292	void PrintUrl(const char* url) const
293	{
294		printf("\tURL: %s\n", url);
295	}
296
297	void PrintSourceUrl(const char* sourceUrl) const
298	{
299		printf("\tsource URL: %s\n", sourceUrl);
300	}
301
302	void PrintProvides(const BPackageResolvable& provides) const
303	{
304		printf("\tprovides: %s", provides.Name().String());
305		if (provides.Version().InitCheck() == B_OK)
306			printf(" = %s", provides.Version().ToString().String());
307
308		if (provides.CompatibleVersion().InitCheck() == B_OK) {
309			printf(" (compatible >= %s)",
310				provides.CompatibleVersion().ToString().String());
311		}
312		printf("\n");
313	}
314
315	void PrintRequires(const BPackageResolvableExpression& require) const
316	{
317		_PrintResolvableExpression("requires", require);
318	}
319
320	void PrintSupplements(const BPackageResolvableExpression& supplements)
321		const
322	{
323		_PrintResolvableExpression("supplements", supplements);
324	}
325
326	void PrintConflicts(const BPackageResolvableExpression& conflicts) const
327	{
328		_PrintResolvableExpression("conflicts", conflicts);
329	}
330
331	void PrintFreshens(const BPackageResolvableExpression& freshens) const
332	{
333		_PrintResolvableExpression("freshens", freshens);
334	}
335
336	void PrintReplaces(const char* replaces) const
337	{
338		printf("\treplaces: %s\n", replaces);
339	}
340
341	void PrintGlobalWritableFile(const BGlobalWritableFileInfo& info) const
342	{
343		printf("\tglobal writable file: %s", info.Path().String());
344		if (info.IsDirectory())
345			printf( " directory");
346		if (info.UpdateType() < B_WRITABLE_FILE_UPDATE_TYPE_ENUM_COUNT) {
347			printf(" %s\n",
348				BPackageInfo::kWritableFileUpdateTypes[info.UpdateType()]);
349		} else
350			printf("\n");
351	}
352
353	void PrintUserSettingsFile(const BUserSettingsFileInfo& info) const
354	{
355		printf("\tuser settings file: %s", info.Path().String());
356		if (info.IsDirectory())
357			printf( " directory\n");
358		else if (!info.TemplatePath().IsEmpty())
359			printf(" template %s\n", info.TemplatePath().String());
360		else
361			printf("\n");
362	}
363
364	void PrintUser(const BUser& user) const
365	{
366		printf("\tuser: %s\n", user.Name().String());
367		if (!user.RealName().IsEmpty())
368			printf("\t\treal name: %s\n", user.RealName().String());
369		if (!user.Home().IsEmpty())
370			printf("\t\thome:      %s\n", user.Home().String());
371		if (!user.Shell().IsEmpty())
372			printf("\t\tshell:     %s\n", user.Shell().String());
373
374		int32 groupCount = user.Groups().CountStrings();
375		for (int32 i = 0; i < groupCount; i++)
376			printf("\t\tgroup:     %s\n", user.Groups().StringAt(i).String());
377	}
378
379	void PrintGroup(const char* group) const
380	{
381		printf("\tgroup: %s\n", group);
382	}
383
384	void PrintPostInstallScript(const char* script) const
385	{
386		printf("\tpost-install script: %s\n", script);
387	}
388
389	void PrintPreUninstallScript(const char* script) const
390	{
391		printf("\tpre-uninstall script: %s\n", script);
392	}
393
394	void PrintInstallPath(const char* path) const
395	{
396		printf("\tinstall path: %s\n", path);
397	}
398
399	void PrintChecksum(const char* checksum) const
400	{
401		printf("\tchecksum: %s\n", checksum);
402	}
403
404private:
405	void _PrintResolvableExpression(const char* fieldName,
406		const BPackageResolvableExpression& expression) const
407	{
408		printf("\t%s: %s\n", fieldName, expression.ToString().String());
409	}
410};
411
412
413#endif	// PACKAGE_INFO_PRINTER_H
414