1f633814fa
Instead of handling compression for individual file/attribute data we do now compress the whole heap where they are stored. This significantly improves compression ratios. We still divide the uncompressed data into 64 KiB chunks and use a chunk offset array for the compressed chunks to allow for quick random access without too much overhead. The tradeoff is a limited possible compression ratio -- i.e. we won't be as good as tar.gz (though surprisingly with my test archives we did better than zip). The other package file sections (package attributes and TOC) are no longer compressed individually. Their uncompressed data are simply pushed onto the heap where the usual compression strategy applies. To simplify things the repository format has been changed in the same manner although it doesn't otherwise use the heap, since it only stores meta data. Due to the data compression having been exposed in public and private API, this change touches a lot of package kit using code, including packagefs and the boot loader packagefs support. The latter two haven't been tested yet. Moreover packagefs needs a new kind of cache so we avoid re-reading the same heap chunk for two different data items it contains.
175 lines
4.6 KiB
C++
175 lines
4.6 KiB
C++
/*
|
|
* Copyright 2009-2013, Haiku, Inc.
|
|
* Distributed under the terms of the MIT License.
|
|
*/
|
|
#ifndef _PACKAGE__HPKG__HPKG_DEFS_H_
|
|
#define _PACKAGE__HPKG__HPKG_DEFS_H_
|
|
|
|
|
|
#include <SupportDefs.h>
|
|
|
|
|
|
namespace BPackageKit {
|
|
|
|
namespace BHPKG {
|
|
|
|
|
|
// magic & version of package and repository files
|
|
enum {
|
|
B_HPKG_MAGIC = 'hpkg',
|
|
B_HPKG_VERSION = 2,
|
|
//
|
|
B_HPKG_REPO_MAGIC = 'hpkr',
|
|
B_HPKG_REPO_VERSION = 2
|
|
};
|
|
|
|
|
|
// package attribute IDs
|
|
enum BHPKGPackageSectionID {
|
|
B_HPKG_SECTION_HEADER = 0,
|
|
B_HPKG_SECTION_HEAP = 1,
|
|
B_HPKG_SECTION_PACKAGE_TOC = 2,
|
|
B_HPKG_SECTION_PACKAGE_ATTRIBUTES = 3,
|
|
B_HPKG_SECTION_REPOSITORY_INFO = 4,
|
|
//
|
|
B_HPKG_SECTION_ENUM_COUNT
|
|
};
|
|
|
|
|
|
// attribute types
|
|
enum {
|
|
// types
|
|
B_HPKG_ATTRIBUTE_TYPE_INVALID = 0,
|
|
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_ENUM_COUNT
|
|
};
|
|
|
|
|
|
// attribute encodings
|
|
enum {
|
|
// signed/unsigned int encodings
|
|
B_HPKG_ATTRIBUTE_ENCODING_INT_8_BIT = 0,
|
|
B_HPKG_ATTRIBUTE_ENCODING_INT_16_BIT = 1,
|
|
B_HPKG_ATTRIBUTE_ENCODING_INT_32_BIT = 2,
|
|
B_HPKG_ATTRIBUTE_ENCODING_INT_64_BIT = 3,
|
|
|
|
// string encodings
|
|
B_HPKG_ATTRIBUTE_ENCODING_STRING_INLINE = 0,
|
|
// null-terminated string
|
|
B_HPKG_ATTRIBUTE_ENCODING_STRING_TABLE = 1,
|
|
// unsigned LEB128 index into string table
|
|
|
|
// raw data encodings
|
|
B_HPKG_ATTRIBUTE_ENCODING_RAW_INLINE = 0,
|
|
// unsigned LEB128 size, raw bytes
|
|
B_HPKG_ATTRIBUTE_ENCODING_RAW_HEAP = 1
|
|
// unsigned LEB128 size, unsigned LEB128 offset into the heap
|
|
};
|
|
|
|
|
|
// maximum number of bytes of data to be encoded inline; more will be allocated
|
|
// on the heap
|
|
enum {
|
|
B_HPKG_MAX_INLINE_DATA_SIZE = 8
|
|
};
|
|
|
|
|
|
// name of file containing package information (in package's root folder)
|
|
extern const char* const B_HPKG_PACKAGE_INFO_FILE_NAME;
|
|
|
|
|
|
// package attribute IDs
|
|
enum BHPKGAttributeID {
|
|
B_HPKG_ATTRIBUTE_ID_DIRECTORY_ENTRY = 0,
|
|
B_HPKG_ATTRIBUTE_ID_FILE_TYPE = 1,
|
|
B_HPKG_ATTRIBUTE_ID_FILE_PERMISSIONS = 2,
|
|
B_HPKG_ATTRIBUTE_ID_FILE_USER = 3,
|
|
B_HPKG_ATTRIBUTE_ID_FILE_GROUP = 4,
|
|
B_HPKG_ATTRIBUTE_ID_FILE_ATIME = 5,
|
|
B_HPKG_ATTRIBUTE_ID_FILE_MTIME = 6,
|
|
B_HPKG_ATTRIBUTE_ID_FILE_CRTIME = 7,
|
|
B_HPKG_ATTRIBUTE_ID_FILE_ATIME_NANOS = 8,
|
|
B_HPKG_ATTRIBUTE_ID_FILE_MTIME_NANOS = 9,
|
|
B_HPKG_ATTRIBUTE_ID_FILE_CRTIM_NANOS = 10,
|
|
B_HPKG_ATTRIBUTE_ID_FILE_ATTRIBUTE = 11,
|
|
B_HPKG_ATTRIBUTE_ID_FILE_ATTRIBUTE_TYPE = 12,
|
|
B_HPKG_ATTRIBUTE_ID_DATA = 13,
|
|
B_HPKG_ATTRIBUTE_ID_SYMLINK_PATH = 14,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_NAME = 15,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_SUMMARY = 16,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_DESCRIPTION = 17,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_VENDOR = 18,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_PACKAGER = 19,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_FLAGS = 20,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_ARCHITECTURE = 21,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_VERSION_MAJOR = 22,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_VERSION_MINOR = 23,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_VERSION_MICRO = 24,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_VERSION_REVISION = 25,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_COPYRIGHT = 26,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_LICENSE = 27,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_PROVIDES = 28,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_REQUIRES = 29,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_SUPPLEMENTS = 30,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_CONFLICTS = 31,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_FRESHENS = 32,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_REPLACES = 33,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_RESOLVABLE_OPERATOR = 34,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_CHECKSUM = 35,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_VERSION_PRE_RELEASE = 36,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_PROVIDES_COMPATIBLE = 37,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_URL = 38,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_SOURCE_URL = 39,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_INSTALL_PATH = 40,
|
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_BASE_PACKAGE = 41,
|
|
//
|
|
B_HPKG_ATTRIBUTE_ID_ENUM_COUNT,
|
|
};
|
|
|
|
|
|
// compression types
|
|
enum {
|
|
B_HPKG_COMPRESSION_NONE = 0,
|
|
B_HPKG_COMPRESSION_ZLIB = 1
|
|
};
|
|
|
|
|
|
// file types (B_HPKG_ATTRIBUTE_ID_FILE_TYPE)
|
|
enum {
|
|
B_HPKG_FILE_TYPE_FILE = 0,
|
|
B_HPKG_FILE_TYPE_DIRECTORY = 1,
|
|
B_HPKG_FILE_TYPE_SYMLINK = 2
|
|
};
|
|
|
|
|
|
// default values
|
|
enum {
|
|
B_HPKG_DEFAULT_FILE_TYPE = B_HPKG_FILE_TYPE_FILE,
|
|
B_HPKG_DEFAULT_FILE_PERMISSIONS = 0644,
|
|
B_HPKG_DEFAULT_DIRECTORY_PERMISSIONS = 0755,
|
|
B_HPKG_DEFAULT_SYMLINK_PERMISSIONS = 0777
|
|
};
|
|
|
|
|
|
// Writer Init() flags
|
|
enum {
|
|
B_HPKG_WRITER_UPDATE_PACKAGE = 0x01,
|
|
// update the package (don't truncate)
|
|
B_HPKG_WRITER_FORCE_ADD = 0x02,
|
|
// when updating a pre-existing entry, don't fail, but replace the
|
|
// entry, if possible (directories will be merged, but won't replace a
|
|
// non-directory)
|
|
};
|
|
|
|
|
|
} // namespace BHPKG
|
|
|
|
} // namespace BPackageKit
|
|
|
|
|
|
#endif // _PACKAGE__HPKG__HPKG_DEFS_H_
|