Author: zooey Date: 2011-02-01 23:01:44 +0100 (Tue, 01 Feb 2011) New Revision: 40348 Changeset: http://dev.haiku-os.org/changeset/40348 Modified: haiku/trunk/headers/private/package/hpkg/PackageWriterImpl.h haiku/trunk/headers/private/package/hpkg/haiku_package.h haiku/trunk/src/kits/package/hpkg/PackageWriterImpl.cpp Log: * implemented writing of package attributes to hpkg file Modified: haiku/trunk/headers/private/package/hpkg/PackageWriterImpl.h =================================================================== --- haiku/trunk/headers/private/package/hpkg/PackageWriterImpl.h 2011-02-01 22:01:17 UTC (rev 40347) +++ haiku/trunk/headers/private/package/hpkg/PackageWriterImpl.h 2011-02-01 22:01:44 UTC (rev 40348) @@ -16,7 +16,6 @@ namespace BPackageKit { - namespace BHPKG { @@ -81,6 +80,9 @@ void _WriteUnsignedLEB128(uint64 value); inline void _WriteString(const char* string); + void _WritePackageVersion( + const BPackageVersion& version); + template<typename Type> inline void _Write(const Type& value); Modified: haiku/trunk/headers/private/package/hpkg/haiku_package.h =================================================================== --- haiku/trunk/headers/private/package/hpkg/haiku_package.h 2011-02-01 22:01:17 UTC (rev 40347) +++ haiku/trunk/headers/private/package/hpkg/haiku_package.h 2011-02-01 22:01:44 UTC (rev 40348) @@ -51,13 +51,26 @@ // attribute tag arithmetics #define B_HPKG_ATTRIBUTE_TAG_COMPOSE(index, encoding, hasChildren) \ - (((uint64(index) << 3) | uint64(encoding) << 1 \ + (((uint64(index) << 3) | uint64(encoding) << 1 \ | ((hasChildren) ? 1 : 0)) + 1) #define B_HPKG_ATTRIBUTE_TAG_INDEX(tag) (uint64((tag) - 1) >> 3) #define B_HPKG_ATTRIBUTE_TAG_ENCODING(tag) ((uint64((tag) - 1) >> 1) & 0x3) #define B_HPKG_ATTRIBUTE_TAG_HAS_CHILDREN(tag) ((uint64((tag) - 1) & 0x1) != 0) +// package attribute tag arithmetics +#define B_HPKG_PACKAGE_ATTRIBUTE_TAG_COMPOSE(id, type, encoding, hasChildren) \ + (((uint16(encoding) << 9) | (((hasChildren) ? 1 : 0) << 8) \ + | (uint16(type) << 5) | (uint16(id))) + 1) +#define B_HPKG_PACKAGE_ATTRIBUTE_TAG_ENCODING(tag) \ + ((uint16((tag) - 1) >> 9) & 0x3) +#define B_HPKG_PACKAGE_ATTRIBUTE_TAG_HAS_CHILDREN(tag) \ + (((uint16((tag) - 1) >> 8) & 0x1) != 0) +#define B_HPKG_PACKAGE_ATTRIBUTE_TAG_TYPE(tag) \ + ((uint16((tag) - 1) >> 5) & 0x7) +#define B_HPKG_PACKAGE_ATTRIBUTE_TAG_ID(tag) \ + (uint16((tag) - 1) & 0x1f) + // standard attribute names #define B_HPKG_ATTRIBUTE_NAME_DIRECTORY_ENTRY "dir:entry" // path/entry name (string) @@ -115,6 +128,31 @@ }; +// package attribute IDs +enum { + B_HPKG_PACKAGE_ATTRIBUTE_NAME = 0, + B_HPKG_PACKAGE_ATTRIBUTE_SUMMARY, + B_HPKG_PACKAGE_ATTRIBUTE_DESCRIPTION, + B_HPKG_PACKAGE_ATTRIBUTE_VENDOR, + B_HPKG_PACKAGE_ATTRIBUTE_PACKAGER, + B_HPKG_PACKAGE_ATTRIBUTE_ARCHITECTURE, + B_HPKG_PACKAGE_ATTRIBUTE_VERSION_MAJOR, + B_HPKG_PACKAGE_ATTRIBUTE_VERSION_MINOR, + B_HPKG_PACKAGE_ATTRIBUTE_VERSION_MICRO, + B_HPKG_PACKAGE_ATTRIBUTE_VERSION_RELEASE, + B_HPKG_PACKAGE_ATTRIBUTE_COPYRIGHT, + B_HPKG_PACKAGE_ATTRIBUTE_LICENSE, + B_HPKG_PACKAGE_ATTRIBUTE_PROVIDES, + B_HPKG_PACKAGE_ATTRIBUTE_PROVIDES_TYPE, + B_HPKG_PACKAGE_ATTRIBUTE_REQUIRES, + B_HPKG_PACKAGE_ATTRIBUTE_SUPPLEMENTS, + B_HPKG_PACKAGE_ATTRIBUTE_CONFLICTS, + B_HPKG_PACKAGE_ATTRIBUTE_FRESHENS, + B_HPKG_PACKAGE_ATTRIBUTE_REPLACES, + B_HPKG_PACKAGE_ATTRIBUTE_RESOLVABLE_OPERATOR, +}; + + } // namespace BPrivate } // namespace BHPKG Modified: haiku/trunk/src/kits/package/hpkg/PackageWriterImpl.cpp =================================================================== --- haiku/trunk/src/kits/package/hpkg/PackageWriterImpl.cpp 2011-02-01 22:01:17 UTC (rev 40347) +++ haiku/trunk/src/kits/package/hpkg/PackageWriterImpl.cpp 2011-02-01 22:01:44 UTC (rev 40348) @@ -1011,8 +1011,98 @@ FDDataWriter realWriter(fFD, startOffset, fListener); fDataWriter = &realWriter; + // name + _WriteUnsignedLEB128(B_HPKG_PACKAGE_ATTRIBUTE_TAG_COMPOSE( + B_HPKG_PACKAGE_ATTRIBUTE_NAME, B_HPKG_ATTRIBUTE_TYPE_STRING, + B_HPKG_ATTRIBUTE_ENCODING_STRING_INLINE, 0)); + _WriteString(fPackageInfo.Name().String()); + + // summary + _WriteUnsignedLEB128(B_HPKG_PACKAGE_ATTRIBUTE_TAG_COMPOSE( + B_HPKG_PACKAGE_ATTRIBUTE_SUMMARY, B_HPKG_ATTRIBUTE_TYPE_STRING, + B_HPKG_ATTRIBUTE_ENCODING_STRING_INLINE, 0)); + _WriteString(fPackageInfo.Summary().String()); + + // description + _WriteUnsignedLEB128(B_HPKG_PACKAGE_ATTRIBUTE_TAG_COMPOSE( + B_HPKG_PACKAGE_ATTRIBUTE_DESCRIPTION, B_HPKG_ATTRIBUTE_TYPE_STRING, + B_HPKG_ATTRIBUTE_ENCODING_STRING_INLINE, 0)); + _WriteString(fPackageInfo.Description().String()); + + // vendor + _WriteUnsignedLEB128(B_HPKG_PACKAGE_ATTRIBUTE_TAG_COMPOSE( + B_HPKG_PACKAGE_ATTRIBUTE_VENDOR, B_HPKG_ATTRIBUTE_TYPE_STRING, + B_HPKG_ATTRIBUTE_ENCODING_STRING_INLINE, 0)); + _WriteString(fPackageInfo.Vendor().String()); + + // packager + _WriteUnsignedLEB128(B_HPKG_PACKAGE_ATTRIBUTE_TAG_COMPOSE( + B_HPKG_PACKAGE_ATTRIBUTE_PACKAGER, B_HPKG_ATTRIBUTE_TYPE_STRING, + B_HPKG_ATTRIBUTE_ENCODING_STRING_INLINE, 0)); + _WriteString(fPackageInfo.Packager().String()); + + // architecture + _WriteUnsignedLEB128(B_HPKG_PACKAGE_ATTRIBUTE_TAG_COMPOSE( + B_HPKG_PACKAGE_ATTRIBUTE_ARCHITECTURE, B_HPKG_ATTRIBUTE_TYPE_UINT, + B_HPKG_ATTRIBUTE_ENCODING_INT_8_BIT, 0)); + _Write<uint8>(fPackageInfo.Architecture()); + + // version + _WritePackageVersion(fPackageInfo.Version()); + + // copyright list + const BObjectList<BString>& copyrightList = fPackageInfo.CopyrightList(); + for (int i = 0; i < copyrightList.CountItems(); ++i) { + _WriteUnsignedLEB128(B_HPKG_PACKAGE_ATTRIBUTE_TAG_COMPOSE( + B_HPKG_PACKAGE_ATTRIBUTE_COPYRIGHT, B_HPKG_ATTRIBUTE_TYPE_STRING, + B_HPKG_ATTRIBUTE_ENCODING_STRING_INLINE, 0)); + _WriteString(copyrightList.ItemAt(i)->String()); + } + + // license list + const BObjectList<BString>& licenseList = fPackageInfo.LicenseList(); + for (int i = 0; i < licenseList.CountItems(); ++i) { + _WriteUnsignedLEB128(B_HPKG_PACKAGE_ATTRIBUTE_TAG_COMPOSE( + B_HPKG_PACKAGE_ATTRIBUTE_LICENSE, B_HPKG_ATTRIBUTE_TYPE_STRING, + B_HPKG_ATTRIBUTE_ENCODING_STRING_INLINE, 0)); + _WriteString(licenseList.ItemAt(i)->String()); + } + + const BObjectList<BPackageResolvable>& providesList + = fPackageInfo.ProvidesList(); + for (int i = 0; i < providesList.CountItems(); ++i) { + BPackageResolvable* resolvable = providesList.ItemAt(i); + bool hasVersion = resolvable->Version().InitCheck() == B_OK; + _WriteUnsignedLEB128(B_HPKG_PACKAGE_ATTRIBUTE_TAG_COMPOSE( + B_HPKG_PACKAGE_ATTRIBUTE_PROVIDES_TYPE, B_HPKG_ATTRIBUTE_TYPE_UINT, + B_HPKG_ATTRIBUTE_ENCODING_INT_8_BIT, hasVersion ? 1 : 0)); + _Write<uint8>(fPackageInfo.Architecture()); + _WriteUnsignedLEB128(B_HPKG_PACKAGE_ATTRIBUTE_TAG_COMPOSE( + B_HPKG_PACKAGE_ATTRIBUTE_PROVIDES, B_HPKG_ATTRIBUTE_TYPE_STRING, + B_HPKG_ATTRIBUTE_ENCODING_STRING_INLINE, 1)); + _WriteString(resolvable->AsString().String()); + if (hasVersion) { + _WritePackageVersion(resolvable->Version()); + _Write<uint8>(0); + } + } + + const BObjectList<BPackageResolvableExpression>& requiresList + = fPackageInfo.RequiresList(); + for (int i = 0; i < requiresList.CountItems(); ++i) { + BPackageResolvableExpression* resolvableExpr = requiresList.ItemAt(i); + bool hasVersion = resolvableExpr->Version().InitCheck() == B_OK; + _WriteUnsignedLEB128(B_HPKG_PACKAGE_ATTRIBUTE_TAG_COMPOSE( + B_HPKG_PACKAGE_ATTRIBUTE_REQUIRES, B_HPKG_ATTRIBUTE_TYPE_STRING, + B_HPKG_ATTRIBUTE_ENCODING_STRING_INLINE, hasVersion)); + _WriteString(resolvableExpr->AsString().String()); + if (hasVersion) { + _WritePackageVersion(resolvableExpr->Version()); + _Write<uint8>(0); + } + } + _Write<uint8>(0); - // TODO: Write them for real! fHeapEnd = realWriter.Offset(); fDataWriter = NULL; @@ -1032,6 +1122,28 @@ void +PackageWriterImpl::_WritePackageVersion(const BPackageVersion& version) +{ + _WriteUnsignedLEB128(B_HPKG_PACKAGE_ATTRIBUTE_TAG_COMPOSE( + B_HPKG_PACKAGE_ATTRIBUTE_VERSION_MAJOR, B_HPKG_ATTRIBUTE_TYPE_STRING, + B_HPKG_ATTRIBUTE_ENCODING_STRING_INLINE, 0)); + _WriteString(version.Major()); + _WriteUnsignedLEB128(B_HPKG_PACKAGE_ATTRIBUTE_TAG_COMPOSE( + B_HPKG_PACKAGE_ATTRIBUTE_VERSION_MINOR, B_HPKG_ATTRIBUTE_TYPE_STRING, + B_HPKG_ATTRIBUTE_ENCODING_STRING_INLINE, 0)); + _WriteString(version.Minor()); + _WriteUnsignedLEB128(B_HPKG_PACKAGE_ATTRIBUTE_TAG_COMPOSE( + B_HPKG_PACKAGE_ATTRIBUTE_VERSION_MICRO, B_HPKG_ATTRIBUTE_TYPE_STRING, + B_HPKG_ATTRIBUTE_ENCODING_STRING_INLINE, 0)); + _WriteString(version.Micro()); + _WriteUnsignedLEB128(B_HPKG_PACKAGE_ATTRIBUTE_TAG_COMPOSE( + B_HPKG_PACKAGE_ATTRIBUTE_VERSION_RELEASE, B_HPKG_ATTRIBUTE_TYPE_UINT, + B_HPKG_ATTRIBUTE_ENCODING_INT_8_BIT, 0)); + _Write<uint8>(version.Release()); +} + + +void PackageWriterImpl::_WriteAttributeValue(const AttributeValue& value, uint8 encoding) {