Implemented reading of package info attributes from hpkg file
* added kernel-compatible datatypes for reading package info attribute values (PackageInfoAttributeValue.h) - these will be used at a later stage by the package-fs to transport those attributes to userland when asked to do so (by ioctl) * implemented parsing of package info attributes in PackageReaderImpl * added support for compressed package attribute section to PackageReaderImpl * completed the writing of package info attributes in PackageWriterImpl and fixed a couple of bugs exposed by parsing * adjusted 'package list' to show the package info attributes as they are found git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40354 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* Copyright 2011, Haiku, Inc.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
#ifndef _PACKAGE__PACKAGE_ARCHITECTURE_H_
|
||||
#define _PACKAGE__PACKAGE_ARCHITECTURE_H_
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
|
||||
enum BPackageArchitecture {
|
||||
B_PACKAGE_ARCHITECTURE_ANY = 0,
|
||||
B_PACKAGE_ARCHITECTURE_X86,
|
||||
B_PACKAGE_ARCHITECTURE_X86_GCC2,
|
||||
//
|
||||
B_PACKAGE_ARCHITECTURE_ENUM_COUNT,
|
||||
};
|
||||
|
||||
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // _PACKAGE__PACKAGE_ARCHITECTURE_H_
|
||||
@@ -9,6 +9,8 @@
|
||||
#include <ObjectList.h>
|
||||
#include <String.h>
|
||||
|
||||
#include <package/PackageArchitecture.h>
|
||||
#include <package/PackageInfoAttributes.h>
|
||||
#include <package/PackageResolvable.h>
|
||||
#include <package/PackageResolvableExpression.h>
|
||||
#include <package/PackageVersion.h>
|
||||
@@ -20,44 +22,6 @@ class BEntry;
|
||||
namespace BPackageKit {
|
||||
|
||||
|
||||
enum BPackageInfoIndex {
|
||||
B_PACKAGE_INFO_NAME = 0,
|
||||
B_PACKAGE_INFO_SUMMARY, // single line
|
||||
B_PACKAGE_INFO_DESCRIPTION, // multiple lines possible
|
||||
B_PACKAGE_INFO_VENDOR, // e.g. "Haiku Project"
|
||||
B_PACKAGE_INFO_PACKAGER, // e-mail address preferred
|
||||
B_PACKAGE_INFO_ARCHITECTURE,
|
||||
B_PACKAGE_INFO_VERSION, // <major>[.<minor>[.<micro>]]
|
||||
B_PACKAGE_INFO_COPYRIGHTS, // list
|
||||
B_PACKAGE_INFO_LICENSES, // list
|
||||
B_PACKAGE_INFO_PROVIDES, // list of resolvables this package provides,
|
||||
// each optionally giving a version
|
||||
B_PACKAGE_INFO_REQUIRES, // list of resolvables required by this package,
|
||||
// each optionally specifying a version relation
|
||||
// (e.g. libssl.so >= 0.9.8)
|
||||
B_PACKAGE_INFO_SUPPLEMENTS, // list of resolvables that are supplemented
|
||||
// by this package, i.e. this package marks
|
||||
// itself as an extension to other packages
|
||||
B_PACKAGE_INFO_CONFLICTS, // list of resolvables that inhibit installation
|
||||
// of this package
|
||||
B_PACKAGE_INFO_REPLACES, // list of resolvables that this package
|
||||
// will replace (upon update)
|
||||
B_PACKAGE_INFO_FRESHENS, // list of resolvables that this package
|
||||
// contains a patch for
|
||||
//
|
||||
B_PACKAGE_INFO_ENUM_COUNT,
|
||||
};
|
||||
|
||||
|
||||
enum BPackageArchitecture {
|
||||
B_PACKAGE_ARCHITECTURE_ANY = 0,
|
||||
B_PACKAGE_ARCHITECTURE_X86,
|
||||
B_PACKAGE_ARCHITECTURE_X86_GCC2,
|
||||
//
|
||||
B_PACKAGE_ARCHITECTURE_ENUM_COUNT,
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Keeps a list of package info elements (e.g. name, version, vendor, ...) which
|
||||
* will be converted to package attributes when creating a package. Usually,
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright 2011, Haiku, Inc.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
#ifndef _PACKAGE__PACKAGE_INFO_ATTRIBUTES_H_
|
||||
#define _PACKAGE__PACKAGE_INFO_ATTRIBUTES_H_
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
|
||||
enum BPackageInfoAttributeIndex {
|
||||
B_PACKAGE_INFO_NAME = 0,
|
||||
B_PACKAGE_INFO_SUMMARY, // single line
|
||||
B_PACKAGE_INFO_DESCRIPTION, // multiple lines possible
|
||||
B_PACKAGE_INFO_VENDOR, // e.g. "Haiku Project"
|
||||
B_PACKAGE_INFO_PACKAGER, // e-mail address preferred
|
||||
B_PACKAGE_INFO_ARCHITECTURE,
|
||||
B_PACKAGE_INFO_VERSION, // <major>[.<minor>[.<micro>]]
|
||||
B_PACKAGE_INFO_COPYRIGHTS, // list
|
||||
B_PACKAGE_INFO_LICENSES, // list
|
||||
B_PACKAGE_INFO_PROVIDES, // list of resolvables this package provides,
|
||||
// each optionally giving a version
|
||||
B_PACKAGE_INFO_REQUIRES, // list of resolvables required by this package,
|
||||
// each optionally specifying a version relation
|
||||
// (e.g. libssl.so >= 0.9.8)
|
||||
B_PACKAGE_INFO_SUPPLEMENTS, // list of resolvables that are supplemented
|
||||
// by this package, i.e. this package marks
|
||||
// itself as an extension to other packages
|
||||
B_PACKAGE_INFO_CONFLICTS, // list of resolvables that inhibit installation
|
||||
// of this package
|
||||
B_PACKAGE_INFO_FRESHENS, // list of resolvables that this package
|
||||
// contains a patch for
|
||||
B_PACKAGE_INFO_REPLACES, // list of resolvables that this package
|
||||
// will replace (upon update)
|
||||
//
|
||||
B_PACKAGE_INFO_ENUM_COUNT,
|
||||
};
|
||||
|
||||
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // _PACKAGE__PACKAGE_INFO_ATTRIBUTES_H_
|
||||
@@ -2,29 +2,19 @@
|
||||
* Copyright 2011, Haiku, Inc.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
#ifndef _PACKAGE__PACKAGE_RESOLVALBE_H_
|
||||
#define _PACKAGE__PACKAGE_RESOLVALBE_H_
|
||||
#ifndef _PACKAGE__PACKAGE_RESOLVABLE_H_
|
||||
#define _PACKAGE__PACKAGE_RESOLVABLE_H_
|
||||
|
||||
|
||||
#include <String.h>
|
||||
|
||||
#include <package/PackageResolvableType.h>
|
||||
#include <package/PackageVersion.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
|
||||
enum BPackageResolvableType {
|
||||
B_PACKAGE_RESOLVABLE_TYPE_DEFAULT = 0,
|
||||
B_PACKAGE_RESOLVABLE_TYPE_LIBRARY,
|
||||
B_PACKAGE_RESOLVABLE_TYPE_COMMAND,
|
||||
B_PACKAGE_RESOLVABLE_TYPE_APPLICATION,
|
||||
B_PACKAGE_RESOLVABLE_TYPE_ADD_ON,
|
||||
//
|
||||
B_PACKAGE_RESOLVABLE_TYPE_ENUM_COUNT,
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Defines a resolvable (something other packages can depend upon).
|
||||
* Each resolvable is defined as a name (with an optional type prefix)
|
||||
@@ -83,4 +73,4 @@ private:
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // _PACKAGE__PACKAGE_RESOLVALBE_H_
|
||||
#endif // _PACKAGE__PACKAGE_RESOLVABLE_H_
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* Copyright 2011, Haiku, Inc.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
#ifndef _PACKAGE__PACKAGE_RESOLVABLE_OPERATOR_H_
|
||||
#define _PACKAGE__PACKAGE_RESOLVABLE_OPERATOR_H_
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
|
||||
enum BPackageResolvableOperator {
|
||||
B_PACKAGE_RESOLVABLE_OP_LESS,
|
||||
B_PACKAGE_RESOLVABLE_OP_LESS_EQUAL,
|
||||
B_PACKAGE_RESOLVABLE_OP_EQUAL,
|
||||
B_PACKAGE_RESOLVABLE_OP_NOT_EQUAL,
|
||||
B_PACKAGE_RESOLVABLE_OP_GREATER_EQUAL,
|
||||
B_PACKAGE_RESOLVABLE_OP_GREATER,
|
||||
//
|
||||
B_PACKAGE_RESOLVABLE_OP_ENUM_COUNT
|
||||
};
|
||||
|
||||
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // _PACKAGE__PACKAGE_RESOLVABLE_OPERATOR_H_
|
||||
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Copyright 2011, Haiku, Inc.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
#ifndef _PACKAGE__PACKAGE_RESOLVABLE_TYPE_H_
|
||||
#define _PACKAGE__PACKAGE_RESOLVABLE_TYPE_H_
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
|
||||
enum BPackageResolvableType {
|
||||
B_PACKAGE_RESOLVABLE_TYPE_DEFAULT = 0,
|
||||
B_PACKAGE_RESOLVABLE_TYPE_LIBRARY,
|
||||
B_PACKAGE_RESOLVABLE_TYPE_COMMAND,
|
||||
B_PACKAGE_RESOLVABLE_TYPE_APPLICATION,
|
||||
B_PACKAGE_RESOLVABLE_TYPE_ADD_ON,
|
||||
//
|
||||
B_PACKAGE_RESOLVABLE_TYPE_ENUM_COUNT,
|
||||
};
|
||||
|
||||
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // _PACKAGE__PACKAGE_RESOLVABLE_TYPE_H_
|
||||
@@ -28,7 +28,9 @@ enum {
|
||||
B_HPKG_ATTRIBUTE_TYPE_INT = 1,
|
||||
B_HPKG_ATTRIBUTE_TYPE_UINT = 2,
|
||||
B_HPKG_ATTRIBUTE_TYPE_STRING = 3,
|
||||
B_HPKG_ATTRIBUTE_TYPE_RAW = 4
|
||||
B_HPKG_ATTRIBUTE_TYPE_RAW = 4,
|
||||
//
|
||||
B_HPKG_ATTRIBUTE_TYPE_ENUM_COUNT
|
||||
};
|
||||
|
||||
|
||||
@@ -63,6 +65,34 @@ enum {
|
||||
#define B_HPKG_PACKAGE_INFO_FILE_NAME ".PackageInfo"
|
||||
|
||||
|
||||
// package attribute IDs
|
||||
enum BPackageAttributeID {
|
||||
B_PACKAGE_ATTRIBUTE_NAME = 0,
|
||||
B_PACKAGE_ATTRIBUTE_SUMMARY,
|
||||
B_PACKAGE_ATTRIBUTE_DESCRIPTION,
|
||||
B_PACKAGE_ATTRIBUTE_VENDOR,
|
||||
B_PACKAGE_ATTRIBUTE_PACKAGER,
|
||||
B_PACKAGE_ATTRIBUTE_ARCHITECTURE,
|
||||
B_PACKAGE_ATTRIBUTE_VERSION_MAJOR,
|
||||
B_PACKAGE_ATTRIBUTE_VERSION_MINOR,
|
||||
B_PACKAGE_ATTRIBUTE_VERSION_MICRO,
|
||||
B_PACKAGE_ATTRIBUTE_VERSION_RELEASE,
|
||||
B_PACKAGE_ATTRIBUTE_COPYRIGHT,
|
||||
B_PACKAGE_ATTRIBUTE_LICENSE,
|
||||
B_PACKAGE_ATTRIBUTE_PROVIDES,
|
||||
B_PACKAGE_ATTRIBUTE_PROVIDES_TYPE,
|
||||
B_PACKAGE_ATTRIBUTE_REQUIRES,
|
||||
B_PACKAGE_ATTRIBUTE_SUPPLEMENTS,
|
||||
B_PACKAGE_ATTRIBUTE_CONFLICTS,
|
||||
B_PACKAGE_ATTRIBUTE_FRESHENS,
|
||||
B_PACKAGE_ATTRIBUTE_REPLACES,
|
||||
B_PACKAGE_ATTRIBUTE_RESOLVABLE_OPERATOR,
|
||||
//
|
||||
B_PACKAGE_ATTRIBUTE_ENUM_COUNT,
|
||||
};
|
||||
|
||||
|
||||
// TODO: make this accessible via a function
|
||||
// default values
|
||||
enum {
|
||||
B_HPKG_DEFAULT_DATA_CHUNK_SIZE_ZLIB = 64 * 1024
|
||||
|
||||
@@ -17,6 +17,7 @@ namespace BHPKG {
|
||||
class BPackageAttributeValue;
|
||||
class BPackageEntry;
|
||||
class BPackageEntryAttribute;
|
||||
class BPackageInfoAttributeValue;
|
||||
|
||||
|
||||
class BLowLevelPackageContentHandler {
|
||||
@@ -43,6 +44,10 @@ public:
|
||||
BPackageEntryAttribute* attribute) = 0;
|
||||
virtual status_t HandleEntryDone(BPackageEntry* entry) = 0;
|
||||
|
||||
virtual status_t HandlePackageAttribute(
|
||||
const BPackageInfoAttributeValue& value
|
||||
) = 0;
|
||||
|
||||
virtual void HandleErrorOccurred() = 0;
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
* Copyright 2009,2011, Haiku, Inc.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
#ifndef _PACKAGE__HPKG__PACKAGE_INFO_ATTRIBUTE_VALUE_H_
|
||||
#define _PACKAGE__HPKG__PACKAGE_INFO_ATTRIBUTE_VALUE_H_
|
||||
|
||||
|
||||
#include <SupportDefs.h>
|
||||
|
||||
#include <package/PackageArchitecture.h>
|
||||
#include <package/PackageInfoAttributes.h>
|
||||
#include <package/PackageResolvableOperator.h>
|
||||
#include <package/PackageResolvableType.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHPKG {
|
||||
|
||||
|
||||
struct BPackageVersionData {
|
||||
const char* major;
|
||||
const char* minor;
|
||||
const char* micro;
|
||||
uint8 release;
|
||||
};
|
||||
|
||||
|
||||
struct BPackageResolvableData {
|
||||
BPackageResolvableType type;
|
||||
const char* name;
|
||||
bool haveVersion;
|
||||
BPackageVersionData version;
|
||||
};
|
||||
|
||||
|
||||
struct BPackageResolvableExpressionData {
|
||||
const char* name;
|
||||
bool haveOpAndVersion;
|
||||
BPackageResolvableOperator op;
|
||||
BPackageVersionData version;
|
||||
};
|
||||
|
||||
|
||||
struct BPackageInfoAttributeValue {
|
||||
union {
|
||||
uint64 unsignedInt;
|
||||
const char* string;
|
||||
BPackageVersionData version;
|
||||
BPackageResolvableData resolvable;
|
||||
BPackageResolvableExpressionData resolvableExpression;
|
||||
};
|
||||
uint8 attributeIndex;
|
||||
|
||||
public:
|
||||
inline BPackageInfoAttributeValue();
|
||||
|
||||
inline void SetTo(BPackageInfoAttributeIndex index,
|
||||
uint8 value);
|
||||
inline void SetTo(BPackageInfoAttributeIndex index,
|
||||
const char* value);
|
||||
};
|
||||
|
||||
|
||||
BPackageInfoAttributeValue::BPackageInfoAttributeValue()
|
||||
:
|
||||
attributeIndex(B_PACKAGE_INFO_ENUM_COUNT)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BPackageInfoAttributeValue::SetTo(BPackageInfoAttributeIndex index, uint8 value)
|
||||
{
|
||||
attributeIndex = index;
|
||||
unsignedInt = value;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BPackageInfoAttributeValue::SetTo(BPackageInfoAttributeIndex index,
|
||||
const char* value)
|
||||
{
|
||||
attributeIndex = index;
|
||||
string = value;
|
||||
}
|
||||
|
||||
|
||||
} // namespace BHPKG
|
||||
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // _PACKAGE__HPKG__PACKAGE_ATTRIBUTE_VALUE_H_
|
||||
@@ -12,6 +12,7 @@
|
||||
|
||||
#include <package/hpkg/PackageAttributeValue.h>
|
||||
#include <package/hpkg/PackageContentHandler.h>
|
||||
#include <package/hpkg/PackageInfoAttributeValue.h>
|
||||
#include <package/hpkg/PackageReader.h>
|
||||
|
||||
|
||||
@@ -74,6 +75,25 @@ private:
|
||||
status_t _ParseAttributeTree(
|
||||
AttributeHandlerContext* context);
|
||||
|
||||
status_t _ParsePackageAttributes(
|
||||
AttributeHandlerContext* context);
|
||||
status_t _ParsePackageVersion(
|
||||
BPackageVersionData& _version,
|
||||
const char* major = NULL);
|
||||
status_t _ParsePackageProvides(
|
||||
BPackageResolvableData& _resolvable,
|
||||
BPackageResolvableType providesType);
|
||||
status_t _ParsePackageResolvableExpression(
|
||||
BPackageResolvableExpressionData&
|
||||
_resolvableExpression,
|
||||
const char* resolvableName,
|
||||
bool hasChildren);
|
||||
|
||||
status_t _ReadPackageAttribute(uint8& _id,
|
||||
AttributeValue& _value,
|
||||
bool* _hasChildren = NULL,
|
||||
uint64* _tag = NULL);
|
||||
|
||||
status_t _ReadAttributeValue(uint8 type, uint8 encoding,
|
||||
AttributeValue& _value);
|
||||
|
||||
@@ -88,6 +108,9 @@ private:
|
||||
const void*& _buffer);
|
||||
status_t _ReadTOCBuffer(void* buffer, size_t size);
|
||||
|
||||
status_t _ReadPackageAttributesBuffer(void* buffer,
|
||||
size_t size);
|
||||
|
||||
status_t _ReadBuffer(off_t offset, void* buffer,
|
||||
size_t size);
|
||||
status_t _ReadCompressedBuffer(off_t offset,
|
||||
@@ -103,7 +126,7 @@ private:
|
||||
inline AttributeHandler* _PopAttributeHandler();
|
||||
|
||||
private:
|
||||
BErrorOutput* fErrorOutput;
|
||||
BErrorOutput* fErrorOutput;
|
||||
int fFD;
|
||||
bool fOwnsFD;
|
||||
|
||||
@@ -120,6 +143,8 @@ private:
|
||||
uint64 fTOCStringsLength;
|
||||
uint64 fTOCStringsCount;
|
||||
|
||||
bool fInPackageAttributes;
|
||||
|
||||
uint32 fPackageAttributesCompression;
|
||||
uint32 fPackageAttributesCompressedLength;
|
||||
uint32 fPackageAttributesUncompressedLength;
|
||||
@@ -127,6 +152,10 @@ private:
|
||||
|
||||
uint8* fTOCSection;
|
||||
uint64 fCurrentTOCOffset;
|
||||
|
||||
uint8* fPackageAttributesSection;
|
||||
uint64 fCurrentPackageAttributesOffset;
|
||||
|
||||
AttributeTypeReference* fAttributeTypes;
|
||||
char** fStrings;
|
||||
|
||||
@@ -141,7 +170,9 @@ template<typename Type>
|
||||
status_t
|
||||
PackageReaderImpl::_Read(Type& _value)
|
||||
{
|
||||
return _ReadTOCBuffer(&_value, sizeof(Type));
|
||||
return fInPackageAttributes
|
||||
? _ReadPackageAttributesBuffer(&_value, sizeof(Type))
|
||||
: _ReadTOCBuffer(&_value, sizeof(Type));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -82,6 +82,10 @@ private:
|
||||
|
||||
void _WritePackageVersion(
|
||||
const BPackageVersion& version);
|
||||
void _WritePackageResolvableExpressionList(
|
||||
const BObjectList<
|
||||
BPackageResolvableExpression>& list,
|
||||
uint8 id);
|
||||
|
||||
template<typename Type>
|
||||
inline void _Write(const Type& value);
|
||||
|
||||
@@ -129,7 +129,7 @@ enum {
|
||||
|
||||
|
||||
// package attribute IDs
|
||||
enum {
|
||||
enum BHPKGPackageAttributeID {
|
||||
B_HPKG_PACKAGE_ATTRIBUTE_NAME = 0,
|
||||
B_HPKG_PACKAGE_ATTRIBUTE_SUMMARY,
|
||||
B_HPKG_PACKAGE_ATTRIBUTE_DESCRIPTION,
|
||||
@@ -150,6 +150,8 @@ enum {
|
||||
B_HPKG_PACKAGE_ATTRIBUTE_FRESHENS,
|
||||
B_HPKG_PACKAGE_ATTRIBUTE_REPLACES,
|
||||
B_HPKG_PACKAGE_ATTRIBUTE_RESOLVABLE_OPERATOR,
|
||||
//
|
||||
B_HPKG_PACKAGE_ATTRIBUTE_ENUM_COUNT,
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user