⛏️ index : haiku.git

/*
 * Copyright 2011, Haiku, Inc.
 * Distributed under the terms of the MIT License.
 */
#ifndef _PACKAGE__PACKAGE_INFO_H_
#define _PACKAGE__PACKAGE_INFO_H_


#include <Archivable.h>
#include <ObjectList.h>
#include <String.h>
#include <StringList.h>

#include <package/GlobalWritableFileInfo.h>
#include <package/PackageArchitecture.h>
#include <package/PackageFlags.h>
#include <package/PackageInfoAttributes.h>
#include <package/PackageResolvable.h>
#include <package/PackageResolvableExpression.h>
#include <package/PackageVersion.h>
#include <package/User.h>
#include <package/UserSettingsFileInfo.h>


class BEntry;
class BFile;


namespace BPackageKit {


/*
 * Keeps a list of package info elements (e.g. name, version, vendor, ...) which
 * will be converted to package attributes when creating a package. Usually,
 * these elements have been parsed from a ".PackageInfo" file.
 * Alternatively, they can be read from an existing package file.
 */
class BPackageInfo : public BArchivable {
public:
			struct ParseErrorListener {
				virtual	~ParseErrorListener();
				virtual void OnError(const BString& msg, int line, int col) = 0;
			};

public:
								BPackageInfo();
								BPackageInfo(BMessage* archive,
									status_t* _error = NULL);
	virtual						~BPackageInfo();

			status_t			ReadFromConfigFile(
									const BEntry& packageInfoEntry,
									ParseErrorListener* listener = NULL);
			status_t			ReadFromConfigFile(
									BFile& packageInfoFile,
									ParseErrorListener* listener = NULL);
			status_t			ReadFromConfigString(
									const BString& packageInfoString,
									ParseErrorListener* listener = NULL);
			status_t			ReadFromPackageFile(const char* path);
			status_t			ReadFromPackageFile(int fd);

			status_t			InitCheck() const;

			const BString&		Name() const;
			const BString&		Summary() const;
			const BString&		Description() const;
			const BString&		Vendor() const;
			const BString&		Packager() const;
			const BString&		BasePackage() const;
			const BString&		Checksum() const;
			const BString&		InstallPath() const;
			BString				FileName() const;
									// the explicitly set file name, if any, or
									// CanonicalFileName() otherwise

			uint32				Flags() const;

			BPackageArchitecture	Architecture() const;
			const char*			ArchitectureName() const;
									// NULL, if invalid

			const BPackageVersion&	Version() const;

			const BStringList&	CopyrightList() const;
			const BStringList&	LicenseList() const;
			const BStringList&	URLList() const;
			const BStringList&	SourceURLList() const;

			const BObjectList<BGlobalWritableFileInfo, true>&
									GlobalWritableFileInfos() const;
			const BObjectList<BUserSettingsFileInfo, true>&
									UserSettingsFileInfos() const;

			const BObjectList<BUser, true>& Users() const;
			const BStringList&	Groups() const;

			const BStringList&	PostInstallScripts() const;
			const BStringList&	PreUninstallScripts() const;

			const BObjectList<BPackageResolvable, true>&	ProvidesList() const;
			const BObjectList<BPackageResolvableExpression, true>&
								RequiresList() const;
			const BObjectList<BPackageResolvableExpression, true>&
								SupplementsList() const;
			const BObjectList<BPackageResolvableExpression, true>&
								ConflictsList() const;
			const BObjectList<BPackageResolvableExpression, true>&
								FreshensList() const;
			const BStringList&	ReplacesList() const;

			BString				CanonicalFileName() const;

			bool				Matches(const BPackageResolvableExpression&
									expression) const;

			void				SetName(const BString& name);
			void				SetSummary(const BString& summary);
			void				SetDescription(const BString& description);
			void				SetVendor(const BString& vendor);
			void				SetPackager(const BString& packager);
			void				SetBasePackage(const BString& basePackage);
			void				SetChecksum(const BString& checksum);
			void				SetInstallPath(const BString& installPath);
			void				SetFileName(const BString& fileName);

			void				SetFlags(uint32 flags);

			void				SetArchitecture(
									BPackageArchitecture architecture);

			void				SetVersion(const BPackageVersion& version);

			void				ClearCopyrightList();
			status_t			AddCopyright(const BString& copyright);

			void				ClearLicenseList();
			status_t			AddLicense(const BString& license);

			void				ClearURLList();
			status_t			AddURL(const BString& url);

			void				ClearSourceURLList();
			status_t			AddSourceURL(const BString& url);

			void				ClearGlobalWritableFileInfos();
			status_t			AddGlobalWritableFileInfo(
									const BGlobalWritableFileInfo& info);

			void				ClearUserSettingsFileInfos();
			status_t			AddUserSettingsFileInfo(
									const BUserSettingsFileInfo& info);

			void				ClearUsers();
			status_t			AddUser(const BUser& user);

			void				ClearGroups();
			status_t			AddGroup(const BString& group);

			void				ClearPostInstallScripts();
			status_t			AddPostInstallScript(const BString& path);

			void				ClearPreUninstallScripts();
			status_t			AddPreUninstallScript(const BString& path);

			void				ClearProvidesList();
			status_t			AddProvides(const BPackageResolvable& provides);

			void				ClearRequiresList();
			status_t			AddRequires(
									const BPackageResolvableExpression& expr);

			void				ClearSupplementsList();
			status_t			AddSupplements(
									const BPackageResolvableExpression& expr);

			void				ClearConflictsList();
			status_t			AddConflicts(
									const BPackageResolvableExpression& expr);

			void				ClearFreshensList();
			status_t			AddFreshens(
									const BPackageResolvableExpression& expr);

			void				ClearReplacesList();
			status_t			AddReplaces(const BString& replaces);

			void				Clear();

	virtual	status_t 			Archive(BMessage* archive,
									bool deep = true) const;
	static 	BArchivable*		Instantiate(BMessage* archive);

			status_t			GetConfigString(BString& _string) const;
			BString				ToString() const;

public:
	static	status_t			GetArchitectureByName(const BString& name,
									BPackageArchitecture& _architecture);

	static	status_t			ParseVersionString(const BString& string,
									bool revisionIsOptional,
									BPackageVersion& _version,
									ParseErrorListener* listener = NULL);
	static	status_t			ParseResolvableString(
									const BString& string,
									BPackageResolvable& _expression,
									ParseErrorListener* listener = NULL);
	static	status_t			ParseResolvableExpressionString(
									const BString& string,
									BPackageResolvableExpression& _expression,
									ParseErrorListener* listener = NULL);

public:
	static	const char*	const	kElementNames[];
	static	const char*	const	kArchitectureNames[];
	static	const char* const	kWritableFileUpdateTypes[];

private:
			class Parser;
			friend class Parser;
			struct StringBuilder;
			struct FieldName;
			struct PackageFileLocation;

			typedef BObjectList<BPackageResolvable, true> ResolvableList;
			typedef BObjectList<BPackageResolvableExpression, true>
				ResolvableExpressionList;

			typedef BObjectList<BGlobalWritableFileInfo, true>
				GlobalWritableFileInfoList;
			typedef BObjectList<BUserSettingsFileInfo, true>
				UserSettingsFileInfoList;

			typedef BObjectList<BUser, true> UserList;

private:
			status_t			_ReadFromPackageFile(
									const PackageFileLocation& fileLocation);

	static	status_t			_AddVersion(BMessage* archive,
									const char* field,
									const BPackageVersion& version);
	static	status_t			_AddResolvables(BMessage* archive,
									const char* field,
									const ResolvableList& resolvables);
	static	status_t			_AddResolvableExpressions(BMessage* archive,
									const char* field,
									const ResolvableExpressionList&
										expressions);
	static	status_t			_AddGlobalWritableFileInfos(BMessage* archive,
									const char* field,
									const GlobalWritableFileInfoList&
										infos);
	static	status_t			_AddUserSettingsFileInfos(BMessage* archive,
									const char* field,
									const UserSettingsFileInfoList&
										infos);
	static	status_t			_AddUsers(BMessage* archive, const char* field,
									const UserList& users);

	static	status_t			_ExtractVersion(BMessage* archive,
									const char* field, int32 index,
									BPackageVersion& _version);
	static	status_t			_ExtractStringList(BMessage* archive,
									const char* field, BStringList& _list);
	static	status_t			_ExtractResolvables(BMessage* archive,
									const char* field,
									ResolvableList& _resolvables);
	static	status_t			_ExtractResolvableExpressions(BMessage* archive,
									const char* field,
									ResolvableExpressionList& _expressions);
	static	status_t			_ExtractGlobalWritableFileInfos(
									BMessage* archive, const char* field,
									GlobalWritableFileInfoList& _infos);
	static	status_t			_ExtractUserSettingsFileInfos(
									BMessage* archive, const char* field,
									UserSettingsFileInfoList& _infos);
	static	status_t			_ExtractUsers(BMessage* archive,
									const char* field, UserList& _users);

private:
			BString				fName;
			BString				fSummary;
			BString				fDescription;
			BString				fVendor;
			BString				fPackager;
			BString				fBasePackage;

			uint32				fFlags;

			BPackageArchitecture fArchitecture;

			BPackageVersion		fVersion;

			BStringList			fCopyrightList;
			BStringList			fLicenseList;
			BStringList			fURLList;
			BStringList			fSourceURLList;

			GlobalWritableFileInfoList fGlobalWritableFileInfos;
			UserSettingsFileInfoList fUserSettingsFileInfos;

			UserList			fUsers;
			BStringList			fGroups;

			BStringList			fPostInstallScripts;
			BStringList			fPreUninstallScripts;

			ResolvableList		fProvidesList;

			ResolvableExpressionList fRequiresList;
			ResolvableExpressionList fSupplementsList;
			ResolvableExpressionList fConflictsList;
			ResolvableExpressionList fFreshensList;

			BStringList			fReplacesList;

			BString				fChecksum;
			BString				fInstallPath;
			BString				fFileName;
};


}	// namespace BPackageKit


#endif	// _PACKAGE__PACKAGE_INFO_H_