/* * Copyright 2011, Haiku, Inc. * Distributed under the terms of the MIT License. */ #ifndef _PACKAGE__PACKAGE_INFO_H_ #define _PACKAGE__PACKAGE_INFO_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include 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& GlobalWritableFileInfos() const; const BObjectList& UserSettingsFileInfos() const; const BObjectList& Users() const; const BStringList& Groups() const; const BStringList& PostInstallScripts() const; const BStringList& PreUninstallScripts() const; const BObjectList& ProvidesList() const; const BObjectList& RequiresList() const; const BObjectList& SupplementsList() const; const BObjectList& ConflictsList() const; const BObjectList& 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 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 ResolvableList; typedef BObjectList ResolvableExpressionList; typedef BObjectList GlobalWritableFileInfoList; typedef BObjectList UserSettingsFileInfoList; typedef BObjectList 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; BObjectList fGlobalWritableFileInfos; BObjectList 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_