1/*
2 * Copyright 2011, Haiku, Inc.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _PACKAGE__PACKAGE_INFO_H_
6#define _PACKAGE__PACKAGE_INFO_H_
7
8
9#include <Archivable.h>
10#include <ObjectList.h>
11#include <String.h>
12#include <StringList.h>
13
14#include <package/GlobalWritableFileInfo.h>
15#include <package/PackageArchitecture.h>
16#include <package/PackageFlags.h>
17#include <package/PackageInfoAttributes.h>
18#include <package/PackageResolvable.h>
19#include <package/PackageResolvableExpression.h>
20#include <package/PackageVersion.h>
21#include <package/User.h>
22#include <package/UserSettingsFileInfo.h>
23
24
25class BEntry;
26class BFile;
27
28
29namespace BPackageKit {
30
31
32/*
33 * Keeps a list of package info elements (e.g. name, version, vendor, ...) which
34 * will be converted to package attributes when creating a package. Usually,
35 * these elements have been parsed from a ".PackageInfo" file.
36 * Alternatively, they can be read from an existing package file.
37 */
38class BPackageInfo : public BArchivable {
39public:
40			struct ParseErrorListener {
41				virtual	~ParseErrorListener();
42				virtual void OnError(const BString& msg, int line, int col) = 0;
43			};
44
45public:
46								BPackageInfo();
47								BPackageInfo(BMessage* archive,
48									status_t* _error = NULL);
49	virtual						~BPackageInfo();
50
51			status_t			ReadFromConfigFile(
52									const BEntry& packageInfoEntry,
53									ParseErrorListener* listener = NULL);
54			status_t			ReadFromConfigFile(
55									BFile& packageInfoFile,
56									ParseErrorListener* listener = NULL);
57			status_t			ReadFromConfigString(
58									const BString& packageInfoString,
59									ParseErrorListener* listener = NULL);
60			status_t			ReadFromPackageFile(const char* path);
61			status_t			ReadFromPackageFile(int fd);
62
63			status_t			InitCheck() const;
64
65			const BString&		Name() const;
66			const BString&		Summary() const;
67			const BString&		Description() const;
68			const BString&		Vendor() const;
69			const BString&		Packager() const;
70			const BString&		BasePackage() const;
71			const BString&		Checksum() const;
72			const BString&		InstallPath() const;
73			BString				FileName() const;
74									// the explicitly set file name, if any, or
75									// CanonicalFileName() otherwise
76
77			uint32				Flags() const;
78
79			BPackageArchitecture	Architecture() const;
80			const char*			ArchitectureName() const;
81									// NULL, if invalid
82
83			const BPackageVersion&	Version() const;
84
85			const BStringList&	CopyrightList() const;
86			const BStringList&	LicenseList() const;
87			const BStringList&	URLList() const;
88			const BStringList&	SourceURLList() const;
89
90			const BObjectList<BGlobalWritableFileInfo>&
91									GlobalWritableFileInfos() const;
92			const BObjectList<BUserSettingsFileInfo>&
93									UserSettingsFileInfos() const;
94
95			const BObjectList<BUser>& Users() const;
96			const BStringList&	Groups() const;
97
98			const BStringList&	PostInstallScripts() const;
99
100			const BObjectList<BPackageResolvable>&	ProvidesList() const;
101			const BObjectList<BPackageResolvableExpression>&
102								RequiresList() const;
103			const BObjectList<BPackageResolvableExpression>&
104								SupplementsList() const;
105			const BObjectList<BPackageResolvableExpression>&
106								ConflictsList() const;
107			const BObjectList<BPackageResolvableExpression>&
108								FreshensList() const;
109			const BStringList&	ReplacesList() const;
110
111			BString				CanonicalFileName() const;
112
113			bool				Matches(const BPackageResolvableExpression&
114									expression) const;
115
116			void				SetName(const BString& name);
117			void				SetSummary(const BString& summary);
118			void				SetDescription(const BString& description);
119			void				SetVendor(const BString& vendor);
120			void				SetPackager(const BString& packager);
121			void				SetBasePackage(const BString& basePackage);
122			void				SetChecksum(const BString& checksum);
123			void				SetInstallPath(const BString& installPath);
124			void				SetFileName(const BString& fileName);
125
126			void				SetFlags(uint32 flags);
127
128			void				SetArchitecture(
129									BPackageArchitecture architecture);
130
131			void				SetVersion(const BPackageVersion& version);
132
133			void				ClearCopyrightList();
134			status_t			AddCopyright(const BString& copyright);
135
136			void				ClearLicenseList();
137			status_t			AddLicense(const BString& license);
138
139			void				ClearURLList();
140			status_t			AddURL(const BString& url);
141
142			void				ClearSourceURLList();
143			status_t			AddSourceURL(const BString& url);
144
145			void				ClearGlobalWritableFileInfos();
146			status_t			AddGlobalWritableFileInfo(
147									const BGlobalWritableFileInfo& info);
148
149			void				ClearUserSettingsFileInfos();
150			status_t			AddUserSettingsFileInfo(
151									const BUserSettingsFileInfo& info);
152
153			void				ClearUsers();
154			status_t			AddUser(const BUser& user);
155
156			void				ClearGroups();
157			status_t			AddGroup(const BString& group);
158
159			void				ClearPostInstallScripts();
160			status_t			AddPostInstallScript(const BString& path);
161
162			void				ClearProvidesList();
163			status_t			AddProvides(const BPackageResolvable& provides);
164
165			void				ClearRequiresList();
166			status_t			AddRequires(
167									const BPackageResolvableExpression& expr);
168
169			void				ClearSupplementsList();
170			status_t			AddSupplements(
171									const BPackageResolvableExpression& expr);
172
173			void				ClearConflictsList();
174			status_t			AddConflicts(
175									const BPackageResolvableExpression& expr);
176
177			void				ClearFreshensList();
178			status_t			AddFreshens(
179									const BPackageResolvableExpression& expr);
180
181			void				ClearReplacesList();
182			status_t			AddReplaces(const BString& replaces);
183
184			void				Clear();
185
186	virtual	status_t 			Archive(BMessage* archive,
187									bool deep = true) const;
188	static 	BArchivable*		Instantiate(BMessage* archive);
189
190			status_t			GetConfigString(BString& _string) const;
191			BString				ToString() const;
192
193public:
194	static	status_t			GetArchitectureByName(const BString& name,
195									BPackageArchitecture& _architecture);
196
197	static	status_t			ParseVersionString(const BString& string,
198									bool revisionIsOptional,
199									BPackageVersion& _version,
200									ParseErrorListener* listener = NULL);
201	static	status_t			ParseResolvableExpressionString(
202									const BString& string,
203									BPackageResolvableExpression& _expression,
204									ParseErrorListener* listener = NULL);
205
206public:
207	static	const char*	const	kElementNames[];
208	static	const char*	const	kArchitectureNames[];
209	static	const char* const	kWritableFileUpdateTypes[];
210
211private:
212			class Parser;
213			friend class Parser;
214			struct StringBuilder;
215			struct FieldName;
216			struct PackageFileLocation;
217
218			typedef BObjectList<BPackageResolvable> ResolvableList;
219			typedef BObjectList<BPackageResolvableExpression>
220				ResolvableExpressionList;
221
222			typedef BObjectList<BGlobalWritableFileInfo>
223				GlobalWritableFileInfoList;
224			typedef BObjectList<BUserSettingsFileInfo>
225				UserSettingsFileInfoList;
226
227			typedef BObjectList<BUser> UserList;
228
229private:
230			status_t			_ReadFromPackageFile(
231									const PackageFileLocation& fileLocation);
232
233	static	status_t			_AddVersion(BMessage* archive,
234									const char* field,
235									const BPackageVersion& version);
236	static	status_t			_AddResolvables(BMessage* archive,
237									const char* field,
238									const ResolvableList& resolvables);
239	static	status_t			_AddResolvableExpressions(BMessage* archive,
240									const char* field,
241									const ResolvableExpressionList&
242										expressions);
243	static	status_t			_AddGlobalWritableFileInfos(BMessage* archive,
244									const char* field,
245									const GlobalWritableFileInfoList&
246										infos);
247	static	status_t			_AddUserSettingsFileInfos(BMessage* archive,
248									const char* field,
249									const UserSettingsFileInfoList&
250										infos);
251	static	status_t			_AddUsers(BMessage* archive, const char* field,
252									const UserList& users);
253
254	static	status_t			_ExtractVersion(BMessage* archive,
255									const char* field, int32 index,
256									BPackageVersion& _version);
257	static	status_t			_ExtractStringList(BMessage* archive,
258									const char* field, BStringList& _list);
259	static	status_t			_ExtractResolvables(BMessage* archive,
260									const char* field,
261									ResolvableList& _resolvables);
262	static	status_t			_ExtractResolvableExpressions(BMessage* archive,
263									const char* field,
264									ResolvableExpressionList& _expressions);
265	static	status_t			_ExtractGlobalWritableFileInfos(
266									BMessage* archive, const char* field,
267									GlobalWritableFileInfoList& _infos);
268	static	status_t			_ExtractUserSettingsFileInfos(
269									BMessage* archive, const char* field,
270									UserSettingsFileInfoList& _infos);
271	static	status_t			_ExtractUsers(BMessage* archive,
272									const char* field, UserList& _users);
273
274private:
275			BString				fName;
276			BString				fSummary;
277			BString				fDescription;
278			BString				fVendor;
279			BString				fPackager;
280			BString				fBasePackage;
281
282			uint32				fFlags;
283
284			BPackageArchitecture fArchitecture;
285
286			BPackageVersion		fVersion;
287
288			BStringList			fCopyrightList;
289			BStringList			fLicenseList;
290			BStringList			fURLList;
291			BStringList			fSourceURLList;
292
293			BObjectList<BGlobalWritableFileInfo> fGlobalWritableFileInfos;
294			BObjectList<BUserSettingsFileInfo> fUserSettingsFileInfos;
295
296			UserList			fUsers;
297			BStringList			fGroups;
298
299			BStringList			fPostInstallScripts;
300
301			ResolvableList		fProvidesList;
302
303			ResolvableExpressionList fRequiresList;
304			ResolvableExpressionList fSupplementsList;
305			ResolvableExpressionList fConflictsList;
306			ResolvableExpressionList fFreshensList;
307
308			BStringList			fReplacesList;
309
310			BString				fChecksum;
311			BString				fInstallPath;
312			BString				fFileName;
313};
314
315
316}	// namespace BPackageKit
317
318
319#endif	// _PACKAGE__PACKAGE_INFO_H_
320