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:
Oliver Tappe
2011-02-04 17:43:07 +00:00
parent 531d191219
commit 6f0278cdc9
17 changed files with 910 additions and 76 deletions
+24
View File
@@ -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_
+2 -38
View File
@@ -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_
+4 -14
View File
@@ -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_
+31 -1
View File
@@ -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);
+3 -1
View File
@@ -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,
};