[haiku-commits] r34018 - in haiku/trunk: headers/private headers/private/haiku_package src/bin src/bin/package

  • From: ingo_weinhold@xxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Fri, 13 Nov 2009 14:45:49 +0100 (CET)

Author: bonefish
Date: 2009-11-13 14:45:49 +0100 (Fri, 13 Nov 2009)
New Revision: 34018
Changeset: http://dev.haiku-os.org/changeset/34018/haiku

Added:
   haiku/trunk/headers/private/haiku_package/
   haiku/trunk/headers/private/haiku_package/haiku_package.h
   haiku/trunk/src/bin/package/
   haiku/trunk/src/bin/package/DataReader.cpp
   haiku/trunk/src/bin/package/DataReader.h
   haiku/trunk/src/bin/package/FDCloser.h
   haiku/trunk/src/bin/package/Jamfile
   haiku/trunk/src/bin/package/PackageAttributeValue.h
   haiku/trunk/src/bin/package/PackageData.cpp
   haiku/trunk/src/bin/package/PackageData.h
   haiku/trunk/src/bin/package/PackageDataReader.cpp
   haiku/trunk/src/bin/package/PackageDataReader.h
   haiku/trunk/src/bin/package/PackageEntry.cpp
   haiku/trunk/src/bin/package/PackageEntry.h
   haiku/trunk/src/bin/package/PackageEntryAttribute.cpp
   haiku/trunk/src/bin/package/PackageEntryAttribute.h
   haiku/trunk/src/bin/package/PackageReader.cpp
   haiku/trunk/src/bin/package/PackageReader.h
   haiku/trunk/src/bin/package/PackageWriter.cpp
   haiku/trunk/src/bin/package/PackageWriter.h
   haiku/trunk/src/bin/package/Stacker.h
   haiku/trunk/src/bin/package/Strings.cpp
   haiku/trunk/src/bin/package/Strings.h
   haiku/trunk/src/bin/package/command_create.cpp
   haiku/trunk/src/bin/package/command_dump.cpp
   haiku/trunk/src/bin/package/command_extract.cpp
   haiku/trunk/src/bin/package/command_list.cpp
   haiku/trunk/src/bin/package/package.cpp
   haiku/trunk/src/bin/package/package.h
Modified:
   haiku/trunk/src/bin/Jamfile
Log:
Implemented a tool ("package") that implements creation and extraction of
packages of the newly invented Haiku Package format
(http://dev.haiku-os.org/wiki/PackageFormat). It basically works, but it's
still work in progress (e.g. compression is not implemented yet), as is the
format itself.


Added: haiku/trunk/headers/private/haiku_package/haiku_package.h
===================================================================
--- haiku/trunk/headers/private/haiku_package/haiku_package.h                   
        (rev 0)
+++ haiku/trunk/headers/private/haiku_package/haiku_package.h   2009-11-13 
13:45:49 UTC (rev 34018)
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef _HAIKU_PACKAGE_H
+#define _HAIKU_PACKAGE_H
+
+
+#include <SupportDefs.h>
+
+
+// header
+struct hpkg_header {
+       uint32  magic;                                                  // 
"hpkg"
+       uint16  header_size;
+       uint16  version;
+       uint64  total_size;
+
+       // package attributes section
+       uint32  attributes_compression;
+       uint32  attributes_length_compressed;
+       uint32  attributes_length_uncompressed;
+
+       // TOC section
+       uint32  toc_compression;
+       uint64  toc_length_compressed;
+       uint64  toc_length_uncompressed;
+
+       uint64  toc_attribute_types_length;
+       uint64  toc_attribute_types_count;
+       uint64  toc_strings_length;
+       uint64  toc_strings_count;
+};
+
+
+// magic, version
+enum {
+       B_HPKG_MAGIC    = 'hpkg',
+       B_HPKG_VERSION  = 1
+};
+
+
+// compression types
+enum {
+       B_HPKG_COMPRESSION_NONE = 0,
+       B_HPKG_COMPRESSION_ZLIB = 1
+};
+
+
+// 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
+};
+
+
+// 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
+};
+
+
+// attribute tag arithmetics
+#define B_HPKG_ATTRIBUTE_TAG_COMPOSE(index, encoding, hasChildren)     \
+       (((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)
+
+
+// standard attribute names
+#define B_HPKG_ATTRIBUTE_NAME_DIRECTORY_ENTRY          "dir:entry"
+       // path/entry name (string)
+#define B_HPKG_ATTRIBUTE_NAME_FILE_TYPE                                
"file:type"
+       // file type (uint)
+#define B_HPKG_ATTRIBUTE_NAME_FILE_PERMISSIONS         "file:permissions"
+       // file permissions (uint)
+#define B_HPKG_ATTRIBUTE_NAME_FILE_USER                                
"file:user"
+       // file user (string)
+#define B_HPKG_ATTRIBUTE_NAME_FILE_GROUP                       "file:group"
+       // file group (string)
+#define B_HPKG_ATTRIBUTE_NAME_FILE_ATIME                       "file:atime"
+       // file access time in seconds (uint)
+#define B_HPKG_ATTRIBUTE_NAME_FILE_MTIME                       "file:mtime"
+       // file modification time in seconds (uint)
+#define B_HPKG_ATTRIBUTE_NAME_FILE_CRTIME                      "file:crtime"
+       // file creation time in seconds (uint)
+#define B_HPKG_ATTRIBUTE_NAME_FILE_ATIME_NANOS         "file:atime:nanos"
+       // file access time nanoseconds fraction (uint)
+#define B_HPKG_ATTRIBUTE_NAME_FILE_MTIME_NANOS         "file:mtime:nanos"
+       // file modification time nanoseconds fraction (uint)
+#define B_HPKG_ATTRIBUTE_NAME_FILE_CRTIM_NANOS         "file:crtime:nanos"
+       // file creation time nanoseconds fraction (uint)
+#define B_HPKG_ATTRIBUTE_NAME_FILE_ATTRIBUTE           "file:attribute"
+       // file attribute (string)
+#define B_HPKG_ATTRIBUTE_NAME_FILE_ATTRIBUTE_TYPE      "file:attribute:type"
+       // file attribute type (uint)
+#define B_HPKG_ATTRIBUTE_NAME_DATA                                     "data"
+       // (file/attribute) data (raw)
+#define B_HPKG_ATTRIBUTE_NAME_DATA_COMPRESSION         "data:compression"
+       // (file/attribute) data compression (uint, default: none)
+#define B_HPKG_ATTRIBUTE_NAME_DATA_SIZE                                
"data:size"
+       // (file/attribute) uncompressed data size (uint)
+#define B_HPKG_ATTRIBUTE_NAME_DATA_CHUNK_SIZE          "data:chunk_size"
+       // the size of compressed (file/attribute) data chunks (uint)
+#define B_HPKG_ATTRIBUTE_NAME_SYMLINK_PATH                     "symlink:path"
+       // symlink path (string)
+
+
+// file types (B_HPKG_ATTRIBUTE_NAME_FILE_TYPE)
+enum {
+       B_HPKG_FILE_TYPE_FILE           = 0,
+       B_HPKG_FILE_TYPE_DIRECTORY      = 1,
+       B_HPKG_FILE_TYPE_SYMLINK        = 2
+};
+
+
+// maximum number of bytes of data to be encoded inline; more will be allocated
+// on the heap
+#define B_HPKG_MAX_INLINE_DATA_SIZE    8
+
+
+// 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,
+       B_HPKG_DEFAULT_DATA_COMPRESSION                 = 
B_HPKG_COMPRESSION_NONE,
+       B_HPKG_DEFAULT_DATA_CHUNK_SIZE_ZLIB             = 64 * 1024
+};
+
+
+#endif // _HAIKU_PACKAGE_H

Modified: haiku/trunk/src/bin/Jamfile
===================================================================
--- haiku/trunk/src/bin/Jamfile 2009-11-13 00:16:21 UTC (rev 34017)
+++ haiku/trunk/src/bin/Jamfile 2009-11-13 13:45:49 UTC (rev 34018)
@@ -218,6 +218,7 @@
 SubInclude HAIKU_TOP src bin mkdos ;
 SubInclude HAIKU_TOP src bin mkfs ;
 SubInclude HAIKU_TOP src bin multiuser ;
+SubInclude HAIKU_TOP src bin package ;
 SubInclude HAIKU_TOP src bin patch ;
 SubInclude HAIKU_TOP src bin pc ;
 SubInclude HAIKU_TOP src bin pcmcia-cs ;

Added: haiku/trunk/src/bin/package/DataReader.cpp
===================================================================
--- haiku/trunk/src/bin/package/DataReader.cpp                          (rev 0)
+++ haiku/trunk/src/bin/package/DataReader.cpp  2009-11-13 13:45:49 UTC (rev 
34018)
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx
+ * Distributed under the terms of the MIT License.
+ */
+
+
+#include "DataReader.h"
+
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+
+
+// #pragma mark - DataReader
+
+
+DataReader::~DataReader()
+{
+}
+
+
+// #pragma mark - FDDataReader
+
+
+FDDataReader::FDDataReader(int fd)
+       :
+       fFD(fd)
+{
+}
+
+
+status_t
+FDDataReader::ReadData(off_t offset, void* buffer, size_t size)
+{
+       ssize_t bytesRead = pread(fFD, buffer, size, offset);
+       if (bytesRead < 0)
+               return errno;
+       return (size_t)bytesRead == size ? B_OK : B_ERROR;
+}
+
+
+// #pragma mark - BufferDataReader
+
+
+BufferDataReader::BufferDataReader(const void* data, size_t size)
+       :
+       fData(data),
+       fSize(size)
+{
+}
+
+
+status_t
+BufferDataReader::ReadData(off_t offset, void* buffer, size_t size)
+{
+       if (size == 0)
+               return B_OK;
+
+       if (offset < 0)
+               return B_BAD_VALUE;
+
+       if (size > fSize || offset > fSize - size)
+               return B_ERROR;
+
+       memcpy(buffer, (const uint8*)fData + offset, size);
+       return B_OK;
+}

Added: haiku/trunk/src/bin/package/DataReader.h
===================================================================
--- haiku/trunk/src/bin/package/DataReader.h                            (rev 0)
+++ haiku/trunk/src/bin/package/DataReader.h    2009-11-13 13:45:49 UTC (rev 
34018)
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef DATA_READER_H
+#define DATA_READER_H
+
+
+#include <SupportDefs.h>
+
+
+class DataReader {
+public:
+       virtual                                         ~DataReader();
+
+       virtual status_t                        ReadData(off_t offset, void* 
buffer,
+                                                                       size_t 
size) = 0;
+};
+
+
+class FDDataReader : public DataReader {
+public:
+                                                               
FDDataReader(int fd);
+
+       virtual status_t                        ReadData(off_t offset, void* 
buffer,
+                                                                       size_t 
size);
+
+private:
+                       int                                     fFD;
+};
+
+
+class BufferDataReader : public DataReader {
+public:
+                                                               
BufferDataReader(const void* data, size_t size);
+
+       virtual status_t                        ReadData(off_t offset, void* 
buffer,
+                                                                       size_t 
size);
+
+private:
+                       const void*                     fData;
+                       size_t                          fSize;
+};
+
+
+#endif // DATA_READER_H

Added: haiku/trunk/src/bin/package/FDCloser.h
===================================================================
--- haiku/trunk/src/bin/package/FDCloser.h                              (rev 0)
+++ haiku/trunk/src/bin/package/FDCloser.h      2009-11-13 13:45:49 UTC (rev 
34018)
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef FD_CLOSER_H
+#define FD_CLOSER_H
+
+
+struct FDCloser {
+       FDCloser(int fd)
+               :
+               fFD(fd)
+       {
+       }
+
+       ~FDCloser()
+       {
+               if (fFD >= 0)
+                       close(fFD);
+       }
+
+private:
+       int     fFD;
+};
+
+
+#endif // FD_CLOSER_H

Added: haiku/trunk/src/bin/package/Jamfile
===================================================================
--- haiku/trunk/src/bin/package/Jamfile                         (rev 0)
+++ haiku/trunk/src/bin/package/Jamfile 2009-11-13 13:45:49 UTC (rev 34018)
@@ -0,0 +1,25 @@
+SubDir HAIKU_TOP src bin package ;
+
+UsePrivateHeaders kernel shared ;
+UsePrivateHeaders haiku_package ;
+
+DEFINES += B_ENABLE_INCOMPLETE_POSIX_AT_SUPPORT ;
+       # TODO: Remove when it is complete!
+
+BinCommand package :
+       command_create.cpp
+       command_dump.cpp
+       command_extract.cpp
+       command_list.cpp
+       DataReader.cpp
+       package.cpp
+       PackageData.cpp
+       PackageDataReader.cpp
+       PackageEntry.cpp
+       PackageEntryAttribute.cpp
+       PackageReader.cpp
+       PackageWriter.cpp
+       Strings.cpp
+       :
+       $(TARGET_LIBSUPC++)
+;

Added: haiku/trunk/src/bin/package/PackageAttributeValue.h
===================================================================
--- haiku/trunk/src/bin/package/PackageAttributeValue.h                         
(rev 0)
+++ haiku/trunk/src/bin/package/PackageAttributeValue.h 2009-11-13 13:45:49 UTC 
(rev 34018)
@@ -0,0 +1,147 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef PACKAGE_ATTRIBUTE_VALUE_H
+#define PACKAGE_ATTRIBUTE_VALUE_H
+
+
+#include <string.h>
+
+#include <haiku_package.h>
+
+
+struct PackageAttributeValue {
+                       union {
+                               int64                   signedInt;
+                               uint64                  unsignedInt;
+                               const char*             string;
+                               struct {
+                                       uint64          size;
+                                       union {
+                                               uint64  offset;
+                                               uint8   
raw[B_HPKG_MAX_INLINE_DATA_SIZE];
+                                       };
+                               } data;
+                       };
+                       uint8                           type;
+                       uint8                           encoding;
+
+public:
+       inline                                          PackageAttributeValue();
+
+       inline  void                            SetTo(int8 value);
+       inline  void                            SetTo(uint8 value);
+       inline  void                            SetTo(int16 value);
+       inline  void                            SetTo(uint16 value);
+       inline  void                            SetTo(int32 value);
+       inline  void                            SetTo(uint32 value);
+       inline  void                            SetTo(int64 value);
+       inline  void                            SetTo(uint64 value);
+       inline  void                            SetTo(const char* value);
+       inline  void                            SetToData(uint64 size, uint64 
offset);
+       inline  void                            SetToData(uint64 size, const 
void* rawData);
+};
+
+
+PackageAttributeValue::PackageAttributeValue()
+       :
+       type(B_HPKG_ATTRIBUTE_TYPE_INVALID)
+{
+}
+
+
+void
+PackageAttributeValue::SetTo(int8 value)
+{
+       signedInt = value;
+       type = B_HPKG_ATTRIBUTE_TYPE_INT;
+}
+
+
+void
+PackageAttributeValue::SetTo(uint8 value)
+{
+       unsignedInt = value;
+       type = B_HPKG_ATTRIBUTE_TYPE_UINT;
+}
+
+
+void
+PackageAttributeValue::SetTo(int16 value)
+{
+       signedInt = value;
+       type = B_HPKG_ATTRIBUTE_TYPE_INT;
+}
+
+
+void
+PackageAttributeValue::SetTo(uint16 value)
+{
+       unsignedInt = value;
+       type = B_HPKG_ATTRIBUTE_TYPE_UINT;
+}
+
+
+void
+PackageAttributeValue::SetTo(int32 value)
+{
+       signedInt = value;
+       type = B_HPKG_ATTRIBUTE_TYPE_INT;
+}
+
+
+void
+PackageAttributeValue::SetTo(uint32 value)
+{
+       unsignedInt = value;
+       type = B_HPKG_ATTRIBUTE_TYPE_UINT;
+}
+
+
+void
+PackageAttributeValue::SetTo(int64 value)
+{
+       signedInt = value;
+       type = B_HPKG_ATTRIBUTE_TYPE_INT;
+}
+
+
+void
+PackageAttributeValue::SetTo(uint64 value)
+{
+       unsignedInt = value;
+       type = B_HPKG_ATTRIBUTE_TYPE_UINT;
+}
+
+
+void
+PackageAttributeValue::SetTo(const char* value)
+{
+       string = value;
+       type = B_HPKG_ATTRIBUTE_TYPE_STRING;
+}
+
+
+void
+PackageAttributeValue::SetToData(uint64 size, uint64 offset)
+{
+       data.size = size;
+       data.offset = offset;
+       type = B_HPKG_ATTRIBUTE_TYPE_RAW;
+       encoding = B_HPKG_ATTRIBUTE_ENCODING_RAW_HEAP;
+}
+
+
+void
+PackageAttributeValue::SetToData(uint64 size, const void* rawData)
+{
+       data.size = size;
+       if (size > 0)
+               memcpy(data.raw, rawData, size);
+       type = B_HPKG_ATTRIBUTE_TYPE_RAW;
+       encoding = B_HPKG_ATTRIBUTE_ENCODING_RAW_INLINE;
+}
+
+
+#endif // PACKAGE_ATTRIBUTE_VALUE_H

Added: haiku/trunk/src/bin/package/PackageData.cpp
===================================================================
--- haiku/trunk/src/bin/package/PackageData.cpp                         (rev 0)
+++ haiku/trunk/src/bin/package/PackageData.cpp 2009-11-13 13:45:49 UTC (rev 
34018)
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx
+ * Distributed under the terms of the MIT License.
+ */
+
+
+#include "PackageData.h"
+
+#include <string.h>
+
+
+PackageData::PackageData()
+       :
+       fCompressedSize(0),
+       fUncompressedSize(0),
+       fCompression(B_HPKG_COMPRESSION_NONE),
+       fEncodedInline(true)
+{
+}
+
+
+void
+PackageData::SetData(uint64 size, uint64 offset)
+{
+       fUncompressedSize = fCompressedSize = size;
+       fOffset = offset;
+       fEncodedInline = false;
+}
+
+
+void
+PackageData::SetData(uint8 size, const void* data)
+{
+       fUncompressedSize = fCompressedSize = size;
+       if (size > 0)
+               memcpy(fInlineData, data, size);
+       fEncodedInline = true;
+}

Added: haiku/trunk/src/bin/package/PackageData.h
===================================================================
--- haiku/trunk/src/bin/package/PackageData.h                           (rev 0)
+++ haiku/trunk/src/bin/package/PackageData.h   2009-11-13 13:45:49 UTC (rev 
34018)
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef PACKAGE_DATA_H
+#define PACKAGE_DATA_H
+
+
+#include <haiku_package.h>
+
+
+class PackageData {
+public:
+                                                               PackageData();
+
+                       uint64                          CompressedSize() const
+                                                                       { 
return fCompressedSize; }
+                       uint64                          UncompressedSize() const
+                                                                       { 
return fUncompressedSize; }
+                       uint64                          Offset() const          
        { return fOffset; }
+                       uint32                          Compression() const     
        { return fCompression; }
+
+                       bool                            IsEncodedInline() const
+                                                                       { 
return fEncodedInline; }
+                       const uint8*            InlineData() const              
{ return fInlineData; }
+
+                       void                            SetData(uint64 size, 
uint64 offset);
+                       void                            SetData(uint8 size, 
const void* data);
+
+                       void                            SetCompression(uint32 
compression)
+                                                                       { 
fCompression = compression; }
+                       void                            
SetUncompressedSize(uint64 size)
+                                                                       { 
fUncompressedSize = size; }
+
+private:
+                       uint64                          fCompressedSize;
+                       uint64                          fUncompressedSize;
+                       union {
+                               uint64                  fOffset;
+                               uint8                   
fInlineData[B_HPKG_MAX_INLINE_DATA_SIZE];
+                       };
+                       uint32                          fCompression;
+                       bool                            fEncodedInline;
+};
+
+
+#endif // PACKAGE_DATA_H

Added: haiku/trunk/src/bin/package/PackageDataReader.cpp
===================================================================
--- haiku/trunk/src/bin/package/PackageDataReader.cpp                           
(rev 0)
+++ haiku/trunk/src/bin/package/PackageDataReader.cpp   2009-11-13 13:45:49 UTC 
(rev 34018)
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx
+ * Distributed under the terms of the MIT License.
+ */
+
+
+#include "PackageDataReader.h"
+
+#include <new>
+
+#include <haiku_package.h>
+
+#include "PackageData.h"
+
+
+// #pragma mark - PackageDataReader
+
+
+PackageDataReader::PackageDataReader(DataReader* dataReader)
+       :
+       fDataReader(dataReader)
+{
+}
+
+
+PackageDataReader::~PackageDataReader()
+{
+}
+
+
+// #pragma mark - UncompressedPackageDataReader
+
+
+class UncompressedPackageDataReader : public PackageDataReader {
+public:
+       UncompressedPackageDataReader(DataReader* dataReader)
+               :
+               PackageDataReader(dataReader)
+       {
+       }
+
+       status_t Init(const PackageData& data)
+       {
+               fOffset = data.Offset();
+               fSize = data.UncompressedSize();
+               return B_OK;
+       }
+
+       virtual uint64 Size() const
+       {
+               return fSize;
+       }
+
+       virtual size_t BlockSize() const
+       {
+               // TODO: Some other value?
+               return 64 * 1024;
+       }
+
+       virtual status_t ReadData(off_t offset, void* buffer, size_t size)
+       {
+               if (size == 0)
+                       return B_OK;
+
+               if (offset < 0)
+                       return B_BAD_VALUE;
+
+               if ((uint64)offset > fSize || size > fSize - offset)
+                       return B_ERROR;
+
+               return fDataReader->ReadData(fOffset + offset, buffer, size);
+       }
+
+private:
+       uint64  fOffset;
+       uint64  fSize;
+};
+
+
+// #pragma mark - PackageDataReaderFactory
+
+
+/*static*/ status_t
+PackageDataReaderFactory::CreatePackageDataReader(DataReader* dataReader,
+       const PackageData& data, PackageDataReader*& _reader)
+{
+       PackageDataReader* reader;
+
+       switch (data.Compression()) {
+               case B_HPKG_COMPRESSION_NONE:
+                       reader = new(std::nothrow) 
UncompressedPackageDataReader(
+                               dataReader);
+                       break;
+               case B_HPKG_COMPRESSION_ZLIB:
+                       // TODO:...
+                       return B_UNSUPPORTED;;
+               default:
+                       return B_BAD_VALUE;
+       }
+
+       if (reader == NULL)
+               return B_NO_MEMORY;
+
+       status_t error = reader->Init(data);
+       if (error != B_OK) {
+               delete reader;
+               return error;
+       }
+
+       _reader = reader;
+       return B_OK;
+}

Added: haiku/trunk/src/bin/package/PackageDataReader.h
===================================================================
--- haiku/trunk/src/bin/package/PackageDataReader.h                             
(rev 0)
+++ haiku/trunk/src/bin/package/PackageDataReader.h     2009-11-13 13:45:49 UTC 
(rev 34018)
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef PACKAGE_DATA_READER_H
+#define PACKAGE_DATA_READER_H
+
+
+#include "DataReader.h"
+
+
+class PackageData;
+
+
+class PackageDataReader : public DataReader {
+public:
+                                                               
PackageDataReader(DataReader* dataReader);
+       virtual                                         ~PackageDataReader();
+
+       virtual status_t                        Init(const PackageData& data) = 
0;
+
+       virtual uint64                          Size() const = 0;
+       virtual size_t                          BlockSize() const = 0;
+
+protected:
+                       DataReader*                     fDataReader;
+};
+
+
+class PackageDataReaderFactory {
+public:
+       static  status_t                        
CreatePackageDataReader(DataReader* dataReader,
+                                                                       const 
PackageData& data,
+                                                                       
PackageDataReader*& _reader);
+};
+
+
+#endif // PACKAGE_DATA_READER_H

Added: haiku/trunk/src/bin/package/PackageEntry.cpp
===================================================================
--- haiku/trunk/src/bin/package/PackageEntry.cpp                                
(rev 0)
+++ haiku/trunk/src/bin/package/PackageEntry.cpp        2009-11-13 13:45:49 UTC 
(rev 34018)
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx
+ * Distributed under the terms of the MIT License.
+ */
+
+
+#include "PackageEntry.h"
+
+
+PackageEntry::PackageEntry(PackageEntry* parent, const char* name)
+       :
+       fParent(parent),
+       fName(name),
+       fUserToken(NULL),
+       fMode(S_IFREG | S_IRUSR | S_IRGRP | S_IROTH),
+       fSymlinkPath(NULL)
+{
+       fAccessTime.tv_sec = 0;
+       fAccessTime.tv_nsec = 0;
+       fModifiedTime.tv_sec = 0;
+       fModifiedTime.tv_nsec = 0;
+       fCreationTime.tv_sec = 0;
+       fCreationTime.tv_nsec = 0;
+}

Added: haiku/trunk/src/bin/package/PackageEntry.h
===================================================================
--- haiku/trunk/src/bin/package/PackageEntry.h                          (rev 0)
+++ haiku/trunk/src/bin/package/PackageEntry.h  2009-11-13 13:45:49 UTC (rev 
34018)
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef PACKAGE_ENTRY_H
+#define PACKAGE_ENTRY_H
+
+
+#include <sys/stat.h>
+
+#include "PackageData.h"
+
+
+class PackageEntry {
+public:
+                                                               
PackageEntry(PackageEntry* parent,
+                                                                       const 
char* name);
+
+                       const PackageEntry*     Parent() const          { 
return fParent; }
+                       const char*                     Name() const            
{ return fName; }
+                       void*                           UserToken() const       
{ return fUserToken; }
+
+                       mode_t                          Mode() const            
{ return fMode; }
+
+                       const timespec&         AccessTime() const
+                                                                       { 
return fAccessTime; }
+                       const timespec&         ModifiedTime() const
+                                                                       { 
return fModifiedTime; }
+                       const timespec&         CreationTime() const
+                                                                       { 
return fCreationTime; }
+
+                       PackageData&            Data()  { return fData; }
+
+                       const char*                     SymlinkPath() const     
{ return fSymlinkPath; }
+
+                       void                            SetUserToken(void* 
token)
+                                                                       { 
fUserToken = token; }
+
+                       void                            SetType(uint32 type);
+                       void                            SetPermissions(uint32 
permissions);
+
+                       void                            SetAccessTime(uint32 
seconds)
+                                                                       { 
fAccessTime.tv_sec = seconds; }
+                       void                            
SetAccessTimeNanos(uint32 nanos)
+                                                                       { 
fAccessTime.tv_nsec = nanos; }
+                       void                            SetModifiedTime(uint32 
seconds)
+                                                                       { 
fModifiedTime.tv_sec = seconds; }
+                       void                            
SetModifiedTimeNanos(uint32 nanos)
+                                                                       { 
fModifiedTime.tv_nsec = nanos; }
+                       void                            SetCreationTime(uint32 
seconds)
+                                                                       { 
fCreationTime.tv_sec = seconds; }
+                       void                            
SetCreationTimeNanos(uint32 nanos)
+                                                                       { 
fCreationTime.tv_nsec = nanos; }
+
+                       void                            SetSymlinkPath(const 
char* path)
+                                                                       { 
fSymlinkPath = path; }
+private:
+                       PackageEntry*           fParent;
+                       const char*                     fName;
+                       void*                           fUserToken;
+                       mode_t                          fMode;
+                       timespec                        fAccessTime;
+                       timespec                        fModifiedTime;
+                       timespec                        fCreationTime;
+                       PackageData                     fData;
+                       const char*                     fSymlinkPath;
+};
+
+
+inline void
+PackageEntry::SetType(uint32 type)
+{
+       fMode = (fMode & ~(uint32)S_IFMT) | (type & S_IFMT);
+}
+
+
+inline void
+PackageEntry::SetPermissions(uint32 permissions)
+{
+       fMode = (fMode & ~(uint32)ALLPERMS) | (permissions & ALLPERMS);
+}
+
+
+#endif // PACKAGE_ENTRY_H

Added: haiku/trunk/src/bin/package/PackageEntryAttribute.cpp
===================================================================
--- haiku/trunk/src/bin/package/PackageEntryAttribute.cpp                       
        (rev 0)
+++ haiku/trunk/src/bin/package/PackageEntryAttribute.cpp       2009-11-13 
13:45:49 UTC (rev 34018)
@@ -0,0 +1,15 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx
+ * Distributed under the terms of the MIT License.
+ */
+
+
+#include "PackageEntryAttribute.h"
+
+
+PackageEntryAttribute::PackageEntryAttribute(const char* name)
+       :
+       fName(name),
+       fType(0)
+{
+}

Added: haiku/trunk/src/bin/package/PackageEntryAttribute.h
===================================================================
--- haiku/trunk/src/bin/package/PackageEntryAttribute.h                         
(rev 0)
+++ haiku/trunk/src/bin/package/PackageEntryAttribute.h 2009-11-13 13:45:49 UTC 
(rev 34018)
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef PACKAGE_ENTRY_ATTRIBUTE_H
+#define PACKAGE_ENTRY_ATTRIBUTE_H
+
+
+#include "PackageData.h"
+
+
+class PackageEntryAttribute {
+public:
+                                                               
PackageEntryAttribute(const char* name);
+
+                       const char*                     Name() const            
        { return fName; }
+                       uint32                          Type() const            
        { return fType; }
+
+                       PackageData&            Data()  { return fData; }
+
+                       void                            SetType(uint32 type)    
{ fType = type; }
+
+private:
+                       const char*                     fName;
+                       uint32                          fType;
+                       PackageData                     fData;
+};
+
+
+#endif // PACKAGE_ENTRY_ATTRIBUTE_H

Added: haiku/trunk/src/bin/package/PackageReader.cpp
===================================================================
--- haiku/trunk/src/bin/package/PackageReader.cpp                               
(rev 0)
+++ haiku/trunk/src/bin/package/PackageReader.cpp       2009-11-13 13:45:49 UTC 
(rev 34018)
@@ -0,0 +1,1276 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx
+ * Distributed under the terms of the MIT License.
+ */
+
+
+#include "PackageReader.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include <new>
+
+#include <ByteOrder.h>
+
+#include <haiku_package.h>
+
+#include "PackageData.h"
+#include "PackageEntry.h"
+#include "PackageEntryAttribute.h"
+
+
+// maximum TOC size, we support reading
+static const size_t kMaxTOCSize                        = 64 * 1024 * 1024;
+
+
+enum {
+       ATTRIBUTE_INDEX_DIRECTORY_ENTRY = 0,
+       ATTRIBUTE_INDEX_FILE_TYPE,
+       ATTRIBUTE_INDEX_FILE_PERMISSIONS,
+       ATTRIBUTE_INDEX_FILE_USER,
+       ATTRIBUTE_INDEX_FILE_GROUP,
+       ATTRIBUTE_INDEX_FILE_ATIME,
+       ATTRIBUTE_INDEX_FILE_MTIME,
+       ATTRIBUTE_INDEX_FILE_CRTIME,
+       ATTRIBUTE_INDEX_FILE_ATIME_NANOS,
+       ATTRIBUTE_INDEX_FILE_MTIME_NANOS,
+       ATTRIBUTE_INDEX_FILE_CRTIM_NANOS,

[... truncated: 3819 lines follow ...]

Other related posts:

  • » [haiku-commits] r34018 - in haiku/trunk: headers/private headers/private/haiku_package src/bin src/bin/package - ingo_weinhold