[haiku-commits] r34055 - haiku/trunk/src/bin/package

  • From: ingo_weinhold@xxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 15 Nov 2009 09:41:57 +0100 (CET)

Author: bonefish
Date: 2009-11-15 09:41:57 +0100 (Sun, 15 Nov 2009)
New Revision: 34055
Changeset: http://dev.haiku-os.org/changeset/34055/haiku

Modified:
   haiku/trunk/src/bin/package/PackageWriter.cpp
   haiku/trunk/src/bin/package/PackageWriter.h
Log:
* Got rid of the *Data classes. The *DataReader classes do the same.
* Implemented writing of short data inline in the TOC.


Modified: haiku/trunk/src/bin/package/PackageWriter.cpp
===================================================================
--- haiku/trunk/src/bin/package/PackageWriter.cpp       2009-11-15 08:40:35 UTC 
(rev 34054)
+++ haiku/trunk/src/bin/package/PackageWriter.cpp       2009-11-15 08:41:57 UTC 
(rev 34055)
@@ -25,6 +25,7 @@
 
 #include <haiku_package.h>
 
+#include "DataReader.h"
 #include "FDCloser.h"
 #include "Stacker.h"
 #include "ZlibCompressor.h"
@@ -34,58 +35,6 @@
 static const size_t kZlibCompressionSizeThreshold = 64;
 
 
-// #pragma mark - Data interface
-
-
-struct Data {
-       virtual ~Data()
-       {
-       }
-
-       virtual ssize_t Read(void* buffer, size_t size, off_t offset) = 0;
-};
-
-
-struct FileData : public Data {
-       FileData(int fd)
-               :
-               fFD(fd)
-       {
-       }
-
-       virtual ssize_t Read(void* buffer, size_t size, off_t offset)
-       {
-               ssize_t bytesRead = pread(fFD, buffer, size, offset);
-               return bytesRead < 0 ? errno : bytesRead;
-       }
-
-private:
-       int     fFD;
-};
-
-
-struct AttributeData : public Data {
-       AttributeData(int fd, const char* attribute, uint32 type)
-               :
-               fFD(fd),
-               fAttribute(attribute)
-       {
-       }
-
-       virtual ssize_t Read(void* buffer, size_t size, off_t offset)
-       {
-               ssize_t bytesRead = fs_read_attr(fFD, fAttribute, fType, 
offset, buffer,
-                       size);
-               return bytesRead < 0 ? errno : bytesRead;
-       }
-
-private:
-       int                     fFD;
-       const char*     fAttribute;
-       uint32          fType;
-};
-
-
 // #pragma mark - Attributes
 
 
@@ -981,8 +930,8 @@
        if (S_ISREG(st.st_mode)) {
                // regular file -- add data
                if (st.st_size > 0) {
-                       FileData data(fd);
-                       status_t error = _AddData(data, st.st_size);
+                       FDDataReader dataReader(fd);
+                       status_t error = _AddData(dataReader, st.st_size);
                        if (error != B_OK)
                                throw status_t(error);
                }
@@ -1025,8 +974,8 @@
                                (uint32)attrInfo.type);
 
                        // add data
-                       AttributeData data(fd, entry->d_name, attrInfo.type);
-                       status_t error = _AddData(data, attrInfo.size);
+                       AttributeDataReader dataReader(fd, entry->d_name, 
attrInfo.type);
+                       status_t error = _AddData(dataReader, attrInfo.size);
                        if (error != B_OK)
                                throw status_t(error);
                }
@@ -1105,6 +1054,16 @@
 }
 
 
+PackageWriter::Attribute*
+PackageWriter::_AddDataAttribute(const char* attributeName, uint64 dataSize,
+       const uint8* data)
+{
+       AttributeValue attributeValue;
+       attributeValue.SetToData(dataSize, data);
+       return _AddAttribute(attributeName, attributeValue);
+}
+
+
 CachedString*
 PackageWriter::_GetCachedString(const char* value)
 {
@@ -1147,19 +1106,34 @@
 
 
 status_t
-PackageWriter::_AddData(Data& data, off_t size)
+PackageWriter::_AddData(DataReader& dataReader, off_t size)
 {
+       // add short data inline
+       if (size <= B_HPKG_MAX_INLINE_DATA_SIZE) {
+               uint8 buffer[B_HPKG_MAX_INLINE_DATA_SIZE];
+               status_t error = dataReader.ReadData(0, buffer, size);
+               if (error != B_OK) {
+                       fprintf(stderr, "Error: Failed to read data: %s\n",
+                               strerror(error));
+                       return error;
+               }
+
+               _AddDataAttribute(B_HPKG_ATTRIBUTE_NAME_DATA, size, buffer);
+               return B_OK;
+       }
+
+       // longer data -- try to compress
        uint64 dataOffset = fHeapEnd;
 
        uint64 compression = B_HPKG_COMPRESSION_NONE;
        uint64 compressedSize;
 
-       status_t error = _WriteZlibCompressedData(data, size, dataOffset,
+       status_t error = _WriteZlibCompressedData(dataReader, size, dataOffset,
                compressedSize);
        if (error == B_OK) {
                compression = B_HPKG_COMPRESSION_ZLIB;
        } else {
-               error = _WriteUncompressedData(data, size, dataOffset);
+               error = _WriteUncompressedData(dataReader, size, dataOffset);
                compressedSize = size;
        }
        if (error != B_OK)
@@ -1176,17 +1150,15 @@
        if (compression != B_HPKG_COMPRESSION_NONE) {
                _AddAttribute(B_HPKG_ATTRIBUTE_NAME_DATA_COMPRESSION, 
compression);
                _AddAttribute(B_HPKG_ATTRIBUTE_NAME_DATA_SIZE, (uint64)size);
-               // uncompressed size
+                       // uncompressed size
        }
 
-       // TODO: Support inline data!
-
        return B_OK;
 }
 
 
 status_t
-PackageWriter::_WriteUncompressedData(Data& data, off_t size,
+PackageWriter::_WriteUncompressedData(DataReader& dataReader, off_t size,
        uint64 writeOffset)
 {
        // copy the data to the heap
@@ -1195,32 +1167,28 @@
        while (remainingSize > 0) {
                // read data
                size_t toCopy = std::min(remainingSize, (off_t)fDataBufferSize);
-               ssize_t bytesRead = data.Read(fDataBuffer, toCopy, readOffset);
-               if (bytesRead < 0) {
+               status_t error = dataReader.ReadData(readOffset, fDataBuffer, 
toCopy);
+               if (error != B_OK) {
                        fprintf(stderr, "Error: Failed to read data: %s\n",
-                               strerror(errno));
-                       return errno;
+                               strerror(error));
+                       return error;
                }
-               if ((size_t)bytesRead != toCopy) {
-                       fprintf(stderr, "Error: Failed to read all data\n");
-                       return B_ERROR;
-               }
 
                // write to heap
-               ssize_t bytesWritten = pwrite(fFD, fDataBuffer, bytesRead, 
writeOffset);
+               ssize_t bytesWritten = pwrite(fFD, fDataBuffer, toCopy, 
writeOffset);
                if (bytesWritten < 0) {
                        fprintf(stderr, "Error: Failed to write data: %s\n",
                                strerror(errno));
                        return errno;
                }
-               if (bytesWritten != bytesRead) {
+               if ((size_t)bytesWritten != toCopy) {
                        fprintf(stderr, "Error: Failed to write all data\n");
                        return B_ERROR;
                }
 
-               remainingSize -= bytesRead;
-               readOffset += bytesRead;
-               writeOffset += bytesRead;
+               remainingSize -= toCopy;
+               readOffset += toCopy;
+               writeOffset += toCopy;
        }
 
        return B_OK;
@@ -1228,7 +1196,7 @@
 
 
 status_t
-PackageWriter::_WriteZlibCompressedData(Data& data, off_t size,
+PackageWriter::_WriteZlibCompressedData(DataReader& dataReader, off_t size,
        uint64 writeOffset, uint64& _compressedSize)
 {
        // Use zlib compression only for data large enough.
@@ -1261,22 +1229,18 @@
        while (remainingSize > 0) {
                // read data
                size_t toCopy = std::min(remainingSize, (off_t)chunkSize);
-               ssize_t bytesRead = data.Read(inputBuffer, toCopy, readOffset);
-               if (bytesRead < 0) {
+               status_t error = dataReader.ReadData(readOffset, inputBuffer, 
toCopy);
+               if (error != B_OK) {
                        fprintf(stderr, "Error: Failed to read data: %s\n",
-                               strerror(errno));
-                       return errno;
+                               strerror(error));
+                       return error;
                }
-               if ((size_t)bytesRead != toCopy) {
-                       fprintf(stderr, "Error: Failed to read all data\n");
-                       return B_ERROR;
-               }
 
                // compress
                ZlibCompressor compressor;
                size_t compressedSize;
-               status_t error = compressor.Compress(inputBuffer, bytesRead,
-                       outputBuffer, bytesRead, compressedSize);
+               error = compressor.Compress(inputBuffer, toCopy, outputBuffer,
+                       toCopy, compressedSize);
 
                const void* writeBuffer;
                size_t bytesToWrite;
@@ -1287,7 +1251,7 @@
                        if (error != B_BUFFER_OVERFLOW)
                                return error;
                        writeBuffer = inputBuffer;
-                       bytesToWrite = bytesRead;
+                       bytesToWrite = toCopy;
                }
 
                // check the total compressed data size
@@ -1310,8 +1274,8 @@
                        return B_ERROR;
                }
 
-               remainingSize -= bytesRead;
-               readOffset += bytesRead;
+               remainingSize -= toCopy;
+               readOffset += toCopy;
                writeOffset += bytesToWrite;
                chunkIndex++;
        }

Modified: haiku/trunk/src/bin/package/PackageWriter.h
===================================================================
--- haiku/trunk/src/bin/package/PackageWriter.h 2009-11-15 08:40:35 UTC (rev 
34054)
+++ haiku/trunk/src/bin/package/PackageWriter.h 2009-11-15 08:41:57 UTC (rev 
34055)
@@ -12,7 +12,7 @@
 #include "Strings.h"
 
 
-class Data;
+class DataReader;
 
 
 class PackageWriter {
@@ -77,16 +77,18 @@
                                                                        const 
char* value);
                        Attribute*                      _AddDataAttribute(const 
char* attributeName,
                                                                        uint64 
dataSize, uint64 dataOffset);
+                       Attribute*                      _AddDataAttribute(const 
char* attributeName,
+                                                                       uint64 
dataSize, const uint8* data);
 
                        CachedString*           _GetCachedString(const char* 
value);
                        AttributeType*          _GetAttributeType(const char* 
attributeName,
                                                                        uint8 
type);
 
-                       status_t                        _AddData(Data& data, 
off_t size);
-                       status_t                        
_WriteUncompressedData(Data& data, off_t size,
-                                                                       uint64 
writeOffset);
-                       status_t                        
_WriteZlibCompressedData(Data& data, off_t size,
-                                                                       uint64 
writeOffset,
+                       status_t                        _AddData(DataReader& 
dataReader, off_t size);
+                       status_t                        
_WriteUncompressedData(DataReader& dataReader,
+                                                                       off_t 
size, uint64 writeOffset);
+                       status_t                        
_WriteZlibCompressedData(DataReader& dataReader,
+                                                                       off_t 
size, uint64 writeOffset,
                                                                        uint64& 
_compressedSize);
 
 private:


Other related posts:

  • » [haiku-commits] r34055 - haiku/trunk/src/bin/package - ingo_weinhold