[haiku-commits] haiku: hrev46849 - src/kits/package/hpkg src/kits/shared headers/private/package/hpkg src/kits/network/libnetapi headers/os/package/hpkg

  • From: pulkomandy@xxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 11 Feb 2014 12:05:32 +0100 (CET)

hrev46849 adds 4 changesets to branch 'master'
old head: 9f11100be591ddc1df2d9b8a158bc428fedbfc75
new head: c3d0dd7a5e6ca1d2d43b6ebfb4c6a67300c780f7
overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=c3d0dd7+%5E9f11100

----------------------------------------------------------------------------

9af2105: Move ZlibDecompressor to libshared
  
  * This will be used to implement compressed http streams
  * Remove the custom BDataOutput class, and use BDataIO instead, for
  easier integration with existing code.

142d59c: ZlibDecompressor: also accept gzip format
  
  zlib can decompress both gzip and zlib formatted compressed streams. The
  compression algorithm is the same, but the headers are different. The
  format is autodetected from the data.

36b1f55: DynamicBuffer: implement BDataIO
  
  This makes it possible to use it with the ZlibDecompressor.

c3d0dd7: HttpRequest: support gzip and deflate compression.
  
  * Use the ZlibDecompressor to decompress the data
  * Advertise support in accept-encoding
  
  This should make web browsing feel even faster on wesites that support
  these compresion schemes. It also fixes some websites (www.ru,
  rainloop.net, ...) that serve gzipped resources even to browser not
  supporting it.

                             [ Adrien Destugues <pulkomandy@xxxxxxxxxxxxx> ]

----------------------------------------------------------------------------

42 files changed, 195 insertions(+), 166 deletions(-)
.../hpkg/{DataOutput.h => BufferDataOutput.h}    |  0
.../private/package/hpkg/ZlibCompressionBase.h   |  1 -
.../private/package/hpkg/ZlibDecompressor.h      |  1 -
.../build/private/shared/ZlibCompressionBase.h   |  1 +
headers/build/private/shared/ZlibDecompressor.h  |  1 +
.../hpkg/{DataOutput.h => BufferDataOutput.h}    | 15 +++----
headers/os/package/hpkg/DataReader.h             | 10 ++---
headers/private/net/DynamicBuffer.h              |  9 ++--
headers/private/package/hpkg/DataWriters.h       |  6 +--
.../package/hpkg/PackageFileHeapAccessorBase.h   |  2 +-
headers/private/package/hpkg/WriterImplBase.h    |  2 +-
headers/private/package/hpkg/ZlibCompressor.h    | 14 +++---
.../hpkg => shared}/ZlibCompressionBase.h        | 15 ++-----
.../{package/hpkg => shared}/ZlibDecompressor.h  | 22 +++-------
.../kernel/file_systems/packagefs/Jamfile        | 17 +++++---
.../packagefs/package/CachedDataReader.cpp       | 17 +++++---
.../packagefs/package/CachedDataReader.h         | 10 +++--
.../file_systems/packagefs/package/Package.cpp   |  1 -
.../packagefs/package/PackageFile.cpp            |  9 +++-
src/build/libpackage/Jamfile                     |  6 +--
src/build/libshared/Jamfile                      |  4 ++
src/kits/network/libnetapi/DynamicBuffer.cpp     | 12 ++---
src/kits/network/libnetapi/HttpRequest.cpp       | 46 ++++++++++++++++++--
src/kits/network/libnetapi/Jamfile               |  7 +++
src/kits/network/libnetapi/NetBuffer.cpp         |  6 +--
src/kits/package/Jamfile                         |  4 +-
.../{DataOutput.cpp => BufferDataOutput.cpp}     | 12 +----
src/kits/package/hpkg/DataReader.cpp             |  7 +--
src/kits/package/hpkg/DataWriters.cpp            |  2 +-
src/kits/package/hpkg/PackageDataReader.cpp      |  4 +-
.../package/hpkg/PackageFileHeapAccessorBase.cpp | 12 ++---
src/kits/package/hpkg/PackageReaderImpl.cpp      |  4 +-
src/kits/package/hpkg/PackageWriterImpl.cpp      |  2 +-
src/kits/package/hpkg/ReaderImplBase.cpp         |  4 +-
src/kits/package/hpkg/ZlibCompressor.cpp         |  8 ++--
src/kits/package/hpkg/v1/PackageDataReaderV1.cpp | 14 +++---
src/kits/package/hpkg/v1/PackageReaderImplV1.cpp |  4 +-
src/kits/package/hpkg/v1/ReaderImplBaseV1.cpp    |  6 +--
src/kits/shared/Jamfile                          |  9 ++++
.../hpkg => shared}/ZlibCompressionBase.cpp      | 10 +----
.../hpkg => shared}/ZlibDecompressor.cpp         | 20 +++------
.../boot/loader/file_systems/packagefs/Jamfile   |  5 ++-

############################################################################

Commit:      9af2105d36856be60528c361edf14a263f242338
URL:         http://cgit.haiku-os.org/haiku/commit/?id=9af2105
Author:      Adrien Destugues <pulkomandy@xxxxxxxxxxxxx>
Date:        Mon Feb 10 17:21:50 2014 UTC

Move ZlibDecompressor to libshared

* This will be used to implement compressed http streams
* Remove the custom BDataOutput class, and use BDataIO instead, for
easier integration with existing code.

----------------------------------------------------------------------------

diff --git a/headers/build/os/package/hpkg/DataOutput.h 
b/headers/build/os/package/hpkg/BufferDataOutput.h
similarity index 100%
rename from headers/build/os/package/hpkg/DataOutput.h
rename to headers/build/os/package/hpkg/BufferDataOutput.h
diff --git a/headers/build/private/package/hpkg/ZlibCompressionBase.h 
b/headers/build/private/package/hpkg/ZlibCompressionBase.h
deleted file mode 100644
index 052cfd0..0000000
--- a/headers/build/private/package/hpkg/ZlibCompressionBase.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <../private/package/hpkg/ZlibCompressionBase.h>
diff --git a/headers/build/private/package/hpkg/ZlibDecompressor.h 
b/headers/build/private/package/hpkg/ZlibDecompressor.h
deleted file mode 100644
index 698aca6..0000000
--- a/headers/build/private/package/hpkg/ZlibDecompressor.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <../private/package/hpkg/ZlibDecompressor.h>
diff --git a/headers/build/private/shared/ZlibCompressionBase.h 
b/headers/build/private/shared/ZlibCompressionBase.h
new file mode 100644
index 0000000..09353da
--- /dev/null
+++ b/headers/build/private/shared/ZlibCompressionBase.h
@@ -0,0 +1 @@
+#include <../private/shared/ZlibCompressionBase.h>
diff --git a/headers/build/private/shared/ZlibDecompressor.h 
b/headers/build/private/shared/ZlibDecompressor.h
new file mode 100644
index 0000000..a170614
--- /dev/null
+++ b/headers/build/private/shared/ZlibDecompressor.h
@@ -0,0 +1 @@
+#include <../private/shared/ZlibDecompressor.h>
diff --git a/headers/os/package/hpkg/DataOutput.h 
b/headers/os/package/hpkg/BufferDataOutput.h
similarity index 69%
rename from headers/os/package/hpkg/DataOutput.h
rename to headers/os/package/hpkg/BufferDataOutput.h
index 290937a..10af41c 100644
--- a/headers/os/package/hpkg/DataOutput.h
+++ b/headers/os/package/hpkg/BufferDataOutput.h
@@ -6,6 +6,7 @@
 #define _PACKAGE__HPKG__DATA_OUTPUT_H_
 
 
+#include <DataIO.h>
 #include <SupportDefs.h>
 
 
@@ -14,21 +15,15 @@ namespace BPackageKit {
 namespace BHPKG {
 
 
-class BDataOutput {
-public:
-       virtual                                         ~BDataOutput();
-
-       virtual status_t                        WriteData(const void* buffer, 
size_t size) = 0;
-};
-
-
-class BBufferDataOutput : public BDataOutput {
+class BBufferDataOutput : public BDataIO {
 public:
                                                                
BBufferDataOutput(void* buffer, size_t size);
 
                        size_t                          BytesWritten() const { 
return fBytesWritten; }
 
-       virtual status_t                        WriteData(const void* buffer, 
size_t size);
+       virtual status_t                        Write(const void* buffer, 
size_t size);
+       virtual ssize_t                         Read(void* buffer, size_t size)
+                                                                       { 
return B_NOT_SUPPORTED; }
 
 private:
                        void*                           fBuffer;
diff --git a/headers/os/package/hpkg/DataReader.h 
b/headers/os/package/hpkg/DataReader.h
index 2590415..6d103ec 100644
--- a/headers/os/package/hpkg/DataReader.h
+++ b/headers/os/package/hpkg/DataReader.h
@@ -9,12 +9,12 @@
 #include <SupportDefs.h>
 
 
-namespace BPackageKit {
+class BDataIO;
 
-namespace BHPKG {
 
+namespace BPackageKit {
 
-class BDataOutput;
+namespace BHPKG {
 
 
 class BDataReader {
@@ -33,7 +33,7 @@ public:
        virtual status_t                        ReadData(off_t offset, void* 
buffer,
                                                                        size_t 
size);
        virtual status_t                        ReadDataToOutput(off_t offset, 
size_t size,
-                                                                       
BDataOutput* output) = 0;
+                                                                       
BDataIO* output) = 0;
 };
 
 
@@ -73,7 +73,7 @@ public:
        virtual status_t                        ReadData(off_t offset, void* 
buffer,
                                                                        size_t 
size);
        virtual status_t                        ReadDataToOutput(off_t offset, 
size_t size,
-                                                                       
BDataOutput* output);
+                                                                       
BDataIO* output);
 
 private:
                        const void*                     fData;
diff --git a/headers/private/package/hpkg/DataWriters.h 
b/headers/private/package/hpkg/DataWriters.h
index 26f67cf..20e0729 100644
--- a/headers/private/package/hpkg/DataWriters.h
+++ b/headers/private/package/hpkg/DataWriters.h
@@ -7,7 +7,7 @@
 #define _PACKAGE__HPKG__PRIVATE__DATA_WRITERS_H_
 
 
-#include <package/hpkg/DataOutput.h>
+#include <package/hpkg/BufferDataOutput.h>
 #include <package/hpkg/ZlibCompressor.h>
 
 
@@ -59,7 +59,7 @@ private:
 };
 
 
-class ZlibDataWriter : public AbstractDataWriter, private BDataOutput {
+class ZlibDataWriter : public AbstractDataWriter, private BDataIO {
 public:
                                                                
ZlibDataWriter(AbstractDataWriter* dataWriter);
 
@@ -71,7 +71,7 @@ public:
 
 private:
        // BDataOutput
-       virtual status_t                        WriteData(const void* buffer, 
size_t size);
+       virtual status_t                        Write(const void* buffer, 
size_t size);
 
 private:
                        AbstractDataWriter*     fDataWriter;
diff --git a/headers/private/package/hpkg/PackageFileHeapAccessorBase.h 
b/headers/private/package/hpkg/PackageFileHeapAccessorBase.h
index 47ae47f..84ce06e 100644
--- a/headers/private/package/hpkg/PackageFileHeapAccessorBase.h
+++ b/headers/private/package/hpkg/PackageFileHeapAccessorBase.h
@@ -49,7 +49,7 @@ public:
 
        // BAbstractBufferedDataReader
        virtual status_t                        ReadDataToOutput(off_t offset, 
size_t size,
-                                                                       
BDataOutput* output);
+                                                                       
BDataIO* output);
 
 public:
        static  const size_t            kChunkSize = 64 * 1024;
diff --git a/headers/private/package/hpkg/WriterImplBase.h 
b/headers/private/package/hpkg/WriterImplBase.h
index 0686335..66c6e0a 100644
--- a/headers/private/package/hpkg/WriterImplBase.h
+++ b/headers/private/package/hpkg/WriterImplBase.h
@@ -10,7 +10,7 @@
 
 #include <package/hpkg/HPKGDefsPrivate.h>
 
-#include <package/hpkg/DataOutput.h>
+#include <package/hpkg/BufferDataOutput.h>
 #include <package/hpkg/DataWriters.h>
 #include <package/hpkg/PackageWriter.h>
 #include <package/hpkg/Strings.h>
diff --git a/headers/private/package/hpkg/ZlibCompressor.h 
b/headers/private/package/hpkg/ZlibCompressor.h
index 4f6dd14..9d73f2b 100644
--- a/headers/private/package/hpkg/ZlibCompressor.h
+++ b/headers/private/package/hpkg/ZlibCompressor.h
@@ -8,23 +8,23 @@
 
 #include <zlib.h>
 
-#include <package/hpkg/ZlibCompressionBase.h>
+#include <ZlibCompressionBase.h>
 
 
-namespace BPackageKit {
+class BDataIO;
 
-namespace BHPKG {
 
+namespace BPackageKit {
 
-class BDataOutput;
+namespace BHPKG {
 
 
 namespace BPrivate {
 
 
-class ZlibCompressor : public ZlibCompressionBase {
+class ZlibCompressor : public ::BPrivate::ZlibCompressionBase {
 public:
-                                                               
ZlibCompressor(BDataOutput* output);
+                                                               
ZlibCompressor(BDataIO* output);
                                                                
~ZlibCompressor();
 
                        status_t                        Init(int 
compressionLevel = Z_BEST_COMPRESSION);
@@ -39,7 +39,7 @@ public:
 
 private:
                        z_stream                        fStream;
-                       BDataOutput*            fOutput;
+                       BDataIO*                        fOutput;
                        bool                            fStreamInitialized;
 };
 
diff --git a/headers/private/package/hpkg/ZlibCompressionBase.h 
b/headers/private/shared/ZlibCompressionBase.h
similarity index 50%
rename from headers/private/package/hpkg/ZlibCompressionBase.h
rename to headers/private/shared/ZlibCompressionBase.h
index 786e579..2ebfbb0 100644
--- a/headers/private/package/hpkg/ZlibCompressionBase.h
+++ b/headers/private/shared/ZlibCompressionBase.h
@@ -2,17 +2,13 @@
  * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx.
  * Distributed under the terms of the MIT License.
  */
-#ifndef _PACKAGE__HPKG__PRIVATE__ZLIB_COMPRESSION_BASE_H_
-#define _PACKAGE__HPKG__PRIVATE__ZLIB_COMPRESSION_BASE_H_
+#ifndef _PRIVATE__ZLIB_COMPRESSION_BASE_H_
+#define _PRIVATE__ZLIB_COMPRESSION_BASE_H_
 
 
 #include <SupportDefs.h>
 
 
-namespace BPackageKit {
-
-namespace BHPKG {
-
 namespace BPrivate {
 
 
@@ -24,9 +20,4 @@ public:
 
 }      // namespace BPrivate
 
-}      // namespace BHPKG
-
-}      // namespace BPackageKit
-
-
-#endif // _PACKAGE__HPKG__PRIVATE__ZLIB_COMPRESSION_BASE_H_
+#endif // _PRIVATE__ZLIB_COMPRESSION_BASE_H_
diff --git a/headers/private/package/hpkg/ZlibDecompressor.h 
b/headers/private/shared/ZlibDecompressor.h
similarity index 67%
rename from headers/private/package/hpkg/ZlibDecompressor.h
rename to headers/private/shared/ZlibDecompressor.h
index 8d4556b..2d1efab 100644
--- a/headers/private/package/hpkg/ZlibDecompressor.h
+++ b/headers/private/shared/ZlibDecompressor.h
@@ -2,21 +2,16 @@
  * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx.
  * Distributed under the terms of the MIT License.
  */
-#ifndef _PACKAGE__HPKG__PRIVATE__ZLIB_DECOMPRESSOR_H_
-#define _PACKAGE__HPKG__PRIVATE__ZLIB_DECOMPRESSOR_H_
+#ifndef _PRIVATE__ZLIB_DECOMPRESSOR_H_
+#define _PRIVATE__ZLIB_DECOMPRESSOR_H_
 
 
 #include <zlib.h>
 
-#include <package/hpkg/ZlibCompressionBase.h>
+#include <ZlibCompressionBase.h>
 
 
-namespace BPackageKit {
-
-namespace BHPKG {
-
-
-class BDataOutput;
+class BDataIO;
 
 
 namespace BPrivate {
@@ -24,7 +19,7 @@ namespace BPrivate {
 
 class ZlibDecompressor : public ZlibCompressionBase {
 public:
-                                                               
ZlibDecompressor(BDataOutput* output);
+                                                               
ZlibDecompressor(BDataIO* output);
                                                                
~ZlibDecompressor();
 
                        status_t                        Init();
@@ -39,7 +34,7 @@ public:
 
 private:
                        z_stream                        fStream;
-                       BDataOutput*            fOutput;
+                       BDataIO*                        fOutput;
                        bool                            fStreamInitialized;
                        bool                            fFinished;
 };
@@ -47,9 +42,4 @@ private:
 
 }      // namespace BPrivate
 
-}      // namespace BHPKG
-
-}      // namespace BPackageKit
-
-
 #endif // _PACKAGE__HPKG__PRIVATE__ZLIB_DECOMPRESSOR_H_
diff --git a/src/add-ons/kernel/file_systems/packagefs/Jamfile 
b/src/add-ons/kernel/file_systems/packagefs/Jamfile
index 2f3004a..601bea2 100644
--- a/src/add-ons/kernel/file_systems/packagefs/Jamfile
+++ b/src/add-ons/kernel/file_systems/packagefs/Jamfile
@@ -74,8 +74,8 @@ HAIKU_PACKAGE_FS_SHARED_SOURCES =
 
 HAIKU_PACKAGE_FS_PACKAGE_READER_SOURCES =
        BlockBufferPoolImpl.cpp
+       BufferDataOutput.cpp
        BufferPool.cpp
-       DataOutput.cpp
        DataReader.cpp
        ErrorOutput.cpp
        FDDataReader.cpp
@@ -90,10 +90,6 @@ HAIKU_PACKAGE_FS_PACKAGE_READER_SOURCES =
        PackageFileHeapReader.cpp
        PackageReaderImpl.cpp
        ReaderImplBase.cpp
-
-       # compression
-       ZlibCompressionBase.cpp
-       ZlibDecompressor.cpp
 ;
 
 HAIKU_PACKAGE_FS_PACKAGE_READER_SOURCES_V1 =
@@ -114,6 +110,14 @@ Includes
 
 local libSharedSources =
        NaturalCompare.cpp
+
+       # compression
+       ZlibCompressionBase.cpp
+       ZlibDecompressor.cpp
+;
+
+local supportKitSources =
+       DataIO.cpp
 ;
 
 
@@ -124,6 +128,7 @@ KernelAddon packagefs
        $(HAIKU_PACKAGE_FS_PACKAGE_READER_SOURCES)
        $(HAIKU_PACKAGE_FS_PACKAGE_READER_SOURCES_V1)
        $(libSharedSources)
+       $(supportKitSources)
 
        : $(TARGET_KERNEL_LIBSUPC++) kernel_libz.a
 ;
@@ -137,3 +142,5 @@ SEARCH on [ FGristFiles 
$(HAIKU_PACKAGE_FS_PACKAGE_READER_SOURCES_V1) ]
        += [ FDirName $(HAIKU_TOP) src kits package hpkg v1 ] ;
 SEARCH on [ FGristFiles $(libSharedSources) ]
        += [ FDirName $(HAIKU_TOP) src kits shared ] ;
+SEARCH on [ FGristFiles $(supportKitSources) ]
+       += [ FDirName $(HAIKU_TOP) src kits support ] ;
diff --git 
a/src/add-ons/kernel/file_systems/packagefs/package/CachedDataReader.cpp 
b/src/add-ons/kernel/file_systems/packagefs/package/CachedDataReader.cpp
index fa6f3fc..ac7c246 100644
--- a/src/add-ons/kernel/file_systems/packagefs/package/CachedDataReader.cpp
+++ b/src/add-ons/kernel/file_systems/packagefs/package/CachedDataReader.cpp
@@ -31,7 +31,7 @@ page_physical_number_less(const vm_page* a, const vm_page* b)
 // #pragma mark - PagesDataOutput
 
 
-struct CachedDataReader::PagesDataOutput : public BDataOutput {
+struct CachedDataReader::PagesDataOutput : public BDataIO {
        PagesDataOutput(vm_page** pages, size_t pageCount)
                :
                fPages(pages),
@@ -40,7 +40,7 @@ struct CachedDataReader::PagesDataOutput : public BDataOutput 
{
        {
        }
 
-       virtual status_t WriteData(const void* buffer, size_t size)
+       virtual status_t Write(const void* buffer, size_t size)
        {
                while (size > 0) {
                        if (fPageCount == 0)
@@ -67,6 +67,11 @@ struct CachedDataReader::PagesDataOutput : public 
BDataOutput {
                return B_OK;
        }
 
+       virtual ssize_t Read(void* buffer, size_t size)
+       {
+               return B_NOT_SUPPORTED;
+       }
+
 private:
        vm_page**       fPages;
        size_t          fPageCount;
@@ -132,7 +137,7 @@ CachedDataReader::ReadData(off_t offset, void* buffer, 
size_t size)
 
 status_t
 CachedDataReader::ReadDataToOutput(off_t offset, size_t size,
-       BDataOutput* output)
+       BDataIO* output)
 {
        if (offset > fCache->virtual_end
                || (off_t)size > fCache->virtual_end - offset) {
@@ -168,7 +173,7 @@ CachedDataReader::ReadDataToOutput(off_t offset, size_t 
size,
 
 status_t
 CachedDataReader::_ReadCacheLine(off_t lineOffset, size_t lineSize,
-       off_t requestOffset, size_t requestLength, BDataOutput* output)
+       off_t requestOffset, size_t requestLength, BDataIO* output)
 {
        PRINT("CachedDataReader::_ReadCacheLine(%" B_PRIdOFF ", %zu, %" 
B_PRIdOFF
                ", %zu, %p\n", lineOffset, lineSize, requestOffset, 
requestLength,
@@ -366,7 +371,7 @@ CachedDataReader::_CachePages(vm_page** pages, size_t 
firstPage,
 */
 status_t
 CachedDataReader::_WritePages(vm_page** pages, size_t pagesRelativeOffset,
-       size_t requestLength, BDataOutput* output)
+       size_t requestLength, BDataIO* output)
 {
        PRINT("%p->CachedDataReader::_WritePages(%" B_PRIuSIZE ", %" B_PRIuSIZE
                ", %p)\n", this, pagesRelativeOffset, requestLength, output);
@@ -389,7 +394,7 @@ CachedDataReader::_WritePages(vm_page** pages, size_t 
pagesRelativeOffset,
 
                // write the page's data
                size_t toCopy = std::min(B_PAGE_SIZE - inPageOffset, 
requestLength);
-               error = output->WriteData((uint8*)(address + inPageOffset), 
toCopy);
+               error = output->Write((uint8*)(address + inPageOffset), toCopy);
 
                // unmap the page
                vm_put_physical_page(address, handle);
diff --git 
a/src/add-ons/kernel/file_systems/packagefs/package/CachedDataReader.h 
b/src/add-ons/kernel/file_systems/packagefs/package/CachedDataReader.h
index 7cba87c..847e16d 100644
--- a/src/add-ons/kernel/file_systems/packagefs/package/CachedDataReader.h
+++ b/src/add-ons/kernel/file_systems/packagefs/package/CachedDataReader.h
@@ -15,10 +15,12 @@
 
 
 using BPackageKit::BHPKG::BAbstractBufferedDataReader;
-using BPackageKit::BHPKG::BDataOutput;
 using BPackageKit::BHPKG::BDataReader;
 
 
+class BDataIO;
+
+
 class CachedDataReader : public BAbstractBufferedDataReader {
 public:
                                                                
CachedDataReader();
@@ -30,7 +32,7 @@ public:
        virtual status_t                        ReadData(off_t offset, void* 
buffer,
                                                                        size_t 
size);
        virtual status_t                        ReadDataToOutput(off_t offset, 
size_t size,
-                                                                       
BDataOutput* output);
+                                                                       
BDataIO* output);
 
 private:
                        class CacheLineLocker
@@ -121,7 +123,7 @@ private:
 private:
                        status_t                        _ReadCacheLine(off_t 
lineOffset,
                                                                        size_t 
lineSize, off_t requestOffset,
-                                                                       size_t 
requestLength, BDataOutput* output);
+                                                                       size_t 
requestLength, BDataIO* output);
 
                        void                            _DiscardPages(vm_page** 
pages, size_t firstPage,
                                                                        size_t 
pageCount);
@@ -129,7 +131,7 @@ private:
                                                                        size_t 
pageCount);
                        status_t                        _WritePages(vm_page** 
pages,
                                                                        size_t 
pagesRelativeOffset,
-                                                                       size_t 
requestLength, BDataOutput* output);
+                                                                       size_t 
requestLength, BDataIO* output);
                        status_t                        
_ReadIntoPages(vm_page** pages,
                                                                        size_t 
firstPage, size_t pageCount);
 
diff --git a/src/add-ons/kernel/file_systems/packagefs/package/Package.cpp 
b/src/add-ons/kernel/file_systems/packagefs/package/Package.cpp
index 8d54f78..f42db70 100644
--- a/src/add-ons/kernel/file_systems/packagefs/package/Package.cpp
+++ b/src/add-ons/kernel/file_systems/packagefs/package/Package.cpp
@@ -38,7 +38,6 @@
 
 using namespace BPackageKit;
 
-using BPackageKit::BHPKG::BDataOutput;
 using BPackageKit::BHPKG::BErrorOutput;
 using BPackageKit::BHPKG::BFDDataReader;
 using BPackageKit::BHPKG::BPackageInfoAttributeValue;
diff --git a/src/add-ons/kernel/file_systems/packagefs/package/PackageFile.cpp 
b/src/add-ons/kernel/file_systems/packagefs/package/PackageFile.cpp
index 01abec7..0db672d 100644
--- a/src/add-ons/kernel/file_systems/packagefs/package/PackageFile.cpp
+++ b/src/add-ons/kernel/file_systems/packagefs/package/PackageFile.cpp
@@ -29,7 +29,7 @@ using namespace BPackageKit::BHPKG;
 // #pragma mark - DataAccessor
 
 
-struct PackageFile::IORequestOutput : BDataOutput {
+struct PackageFile::IORequestOutput : BDataIO {
 public:
        IORequestOutput(io_request* request)
                :
@@ -37,11 +37,16 @@ public:
        {
        }
 
-       virtual status_t WriteData(const void* buffer, size_t size)
+       virtual status_t Write(const void* buffer, size_t size)
        {
                RETURN_ERROR(write_to_io_request(fRequest, buffer, size));
        }
 
+       virtual ssize_t Read(void* buffer, size_t size)
+       {
+               return B_NOT_SUPPORTED;
+       }
+
 private:
        io_request*     fRequest;
 };
diff --git a/src/build/libpackage/Jamfile b/src/build/libpackage/Jamfile
index 464f406..be248fd 100644
--- a/src/build/libpackage/Jamfile
+++ b/src/build/libpackage/Jamfile
@@ -1,6 +1,6 @@
 SubDir HAIKU_TOP src build libpackage ;
 
-UsePrivateBuildHeaders kernel package shared storage ;
+UsePrivateBuildHeaders kernel package shared storage support ;
 
 SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src kits package ] ;
 SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src kits package hpkg ] ;
@@ -33,9 +33,9 @@ HPKG_SOURCES =
        BlockBufferPool.cpp
        BlockBufferPoolImpl.cpp
        BlockBufferPoolNoLock.cpp
+       BufferDataOutput.cpp
        BufferPool.cpp
        PoolBuffer.cpp
-       DataOutput.cpp
        DataReader.cpp
        DataWriters.cpp
        ErrorOutput.cpp
@@ -77,9 +77,7 @@ HPKG_SOURCES =
        ReaderImplBaseV1.cpp
 
        # compression
-       ZlibCompressionBase.cpp
        ZlibCompressor.cpp
-       ZlibDecompressor.cpp
 ;
 
 # TODO: remove this hack once gcc2 has -iquote implemented
diff --git a/src/build/libshared/Jamfile b/src/build/libshared/Jamfile
index 44984b7..f42f7f7 100644
--- a/src/build/libshared/Jamfile
+++ b/src/build/libshared/Jamfile
@@ -10,4 +10,8 @@ BuildPlatformStaticLibraryPIC libshared_build.a :
        Keymap.cpp
        NaturalCompare.cpp
        SHA256.cpp
+       
+       # compression
+       ZlibCompressionBase.cpp
+       ZlibDecompressor.cpp
 ;
diff --git a/src/kits/package/Jamfile b/src/kits/package/Jamfile
index d63e86b..d17dac7 100644
--- a/src/kits/package/Jamfile
+++ b/src/kits/package/Jamfile
@@ -12,8 +12,8 @@ HPKG_SOURCES =
        BlockBufferPool.cpp
        BlockBufferPoolImpl.cpp
        BlockBufferPoolNoLock.cpp
+       BufferDataOutput.cpp
        BufferPool.cpp
-       DataOutput.cpp
        DataReader.cpp
        DataWriters.cpp
        ErrorOutput.cpp
@@ -56,9 +56,7 @@ HPKG_SOURCES =
        ReaderImplBaseV1.cpp
 
        # compression
-       ZlibCompressionBase.cpp
        ZlibCompressor.cpp
-       ZlibDecompressor.cpp
        ;
 
 local architectureObject ;
diff --git a/src/kits/package/hpkg/DataOutput.cpp 
b/src/kits/package/hpkg/BufferDataOutput.cpp
similarity index 78%
rename from src/kits/package/hpkg/DataOutput.cpp
rename to src/kits/package/hpkg/BufferDataOutput.cpp
index 00694b3..8ae2543 100644
--- a/src/kits/package/hpkg/DataOutput.cpp
+++ b/src/kits/package/hpkg/BufferDataOutput.cpp
@@ -4,7 +4,7 @@
  */
 
 
-#include <package/hpkg/DataOutput.h>
+#include <package/hpkg/BufferDataOutput.h>
 
 #include <string.h>
 
@@ -14,14 +14,6 @@ namespace BPackageKit {
 namespace BHPKG {
 
 
-// #pragma mark - BDataOutput
-
-
-BDataOutput::~BDataOutput()
-{
-}
-
-
 // #pragma mark - BBufferDataOutput
 
 
@@ -35,7 +27,7 @@ BBufferDataOutput::BBufferDataOutput(void* buffer, size_t 
size)
 
 
 status_t
-BBufferDataOutput::WriteData(const void* buffer, size_t size)
+BBufferDataOutput::Write(const void* buffer, size_t size)
 {
        if (size == 0)
                return B_OK;
diff --git a/src/kits/package/hpkg/DataReader.cpp 
b/src/kits/package/hpkg/DataReader.cpp
index b47f988..eb1a81c 100644
--- a/src/kits/package/hpkg/DataReader.cpp
+++ b/src/kits/package/hpkg/DataReader.cpp
@@ -6,7 +6,8 @@
 
 #include <package/hpkg/DataReader.h>
 
-#include <package/hpkg/DataOutput.h>
+#include <package/hpkg/BufferDataOutput.h>
+#include <DataIO.h>
 
 #include <string.h>
 
@@ -70,7 +71,7 @@ BBufferDataReader::ReadData(off_t offset, void* buffer, 
size_t size)
 
 status_t
 BBufferDataReader::ReadDataToOutput(off_t offset, size_t size,
-       BDataOutput* output)
+       BDataIO* output)
 {
        if (size == 0)
                return B_OK;
@@ -81,7 +82,7 @@ BBufferDataReader::ReadDataToOutput(off_t offset, size_t size,
        if (size > fSize || offset > (off_t)fSize - (off_t)size)
                return B_ERROR;
 
-       return output->WriteData((const uint8*)fData + offset, size);
+       return output->Write((const uint8*)fData + offset, size);
 }
 
 
diff --git a/src/kits/package/hpkg/DataWriters.cpp 
b/src/kits/package/hpkg/DataWriters.cpp
index 29318c8..a22dcd0 100644
--- a/src/kits/package/hpkg/DataWriters.cpp
+++ b/src/kits/package/hpkg/DataWriters.cpp
@@ -112,7 +112,7 @@ ZlibDataWriter::WriteDataNoThrow(const void* buffer,
 
 
 status_t
-ZlibDataWriter::WriteData(const void* buffer, size_t size)
+ZlibDataWriter::Write(const void* buffer, size_t size)
 {
        return fDataWriter->WriteDataNoThrow(buffer, size);
 }
diff --git a/src/kits/package/hpkg/PackageDataReader.cpp 
b/src/kits/package/hpkg/PackageDataReader.cpp
index 9c808fe..3f0d326 100644
--- a/src/kits/package/hpkg/PackageDataReader.cpp
+++ b/src/kits/package/hpkg/PackageDataReader.cpp
@@ -13,7 +13,7 @@
 
 #include <package/hpkg/HPKGDefsPrivate.h>
 #include <package/hpkg/PackageData.h>
-#include <package/hpkg/ZlibDecompressor.h>
+#include <ZlibDecompressor.h>
 
 
 namespace BPackageKit {
@@ -53,7 +53,7 @@ public:
        }
 
        virtual status_t ReadDataToOutput(off_t offset, size_t size,
-               BDataOutput* output)
+               BDataIO* output)
        {
                if (size == 0)
                        return B_OK;
diff --git a/src/kits/package/hpkg/PackageFileHeapAccessorBase.cpp 
b/src/kits/package/hpkg/PackageFileHeapAccessorBase.cpp
index 024b8f2..3ffa2a8 100644
--- a/src/kits/package/hpkg/PackageFileHeapAccessorBase.cpp
+++ b/src/kits/package/hpkg/PackageFileHeapAccessorBase.cpp
@@ -14,11 +14,11 @@
 #include <new>
 
 #include <ByteOrder.h>
-#include <package/hpkg/DataOutput.h>
+#include <package/hpkg/BufferDataOutput.h>
 #include <package/hpkg/ErrorOutput.h>
 
 #include <AutoDeleter.h>
-#include <package/hpkg/ZlibDecompressor.h>
+#include <ZlibDecompressor.h>
 
 
 namespace BPackageKit {
@@ -140,7 +140,7 @@ PackageFileHeapAccessorBase::~PackageFileHeapAccessorBase()
 
 status_t
 PackageFileHeapAccessorBase::ReadDataToOutput(off_t offset, size_t size,
-       BDataOutput* output)
+       BDataIO* output)
 {
        if (size == 0)
                return B_OK;
@@ -174,8 +174,8 @@ PackageFileHeapAccessorBase::ReadDataToOutput(off_t offset, 
size_t size,
                        // The last chunk may be shorter than kChunkSize, but 
since
                        // size (and thus remainingSize) had been clamped, that 
doesn't
                        // harm.
-               error = output->WriteData(
-                       (char*)uncompressedDataBuffer + inChunkOffset, toWrite);
+               error = output->Write((char*)uncompressedDataBuffer + 
inChunkOffset,
+                       toWrite);
                if (error != B_OK)
                        return error;
 
@@ -213,7 +213,7 @@ PackageFileHeapAccessorBase::DecompressChunkData(void* 
compressedDataBuffer,
        size_t uncompressedSize)
 {
        size_t actualSize;
-       status_t error = ZlibDecompressor::DecompressSingleBuffer(
+       status_t error = ::BPrivate::ZlibDecompressor::DecompressSingleBuffer(
                compressedDataBuffer, compressedSize, uncompressedDataBuffer,
                uncompressedSize, actualSize);
        if (error != B_OK) {
diff --git a/src/kits/package/hpkg/PackageReaderImpl.cpp 
b/src/kits/package/hpkg/PackageReaderImpl.cpp
index 6842598..b821d4c 100644
--- a/src/kits/package/hpkg/PackageReaderImpl.cpp
+++ b/src/kits/package/hpkg/PackageReaderImpl.cpp
@@ -22,11 +22,11 @@
 
 #include <package/hpkg/HPKGDefsPrivate.h>
 
-#include <package/hpkg/DataOutput.h>
+#include <package/hpkg/BufferDataOutput.h>
 #include <package/hpkg/PackageData.h>
 #include <package/hpkg/PackageEntry.h>
 #include <package/hpkg/PackageEntryAttribute.h>
-#include <package/hpkg/ZlibDecompressor.h>
+#include <ZlibDecompressor.h>
 
 
 namespace BPackageKit {
diff --git a/src/kits/package/hpkg/PackageWriterImpl.cpp 
b/src/kits/package/hpkg/PackageWriterImpl.cpp
index c57eeba..a9348db 100644
--- a/src/kits/package/hpkg/PackageWriterImpl.cpp
+++ b/src/kits/package/hpkg/PackageWriterImpl.cpp
@@ -37,7 +37,7 @@
 
 #include <package/hpkg/HPKGDefsPrivate.h>
 
-#include <package/hpkg/DataOutput.h>
+#include <package/hpkg/BufferDataOutput.h>
 #include <package/hpkg/DataReader.h>
 #include <package/hpkg/PackageFileHeapWriter.h>
 #include <package/hpkg/PackageReaderImpl.h>
diff --git a/src/kits/package/hpkg/ReaderImplBase.cpp 
b/src/kits/package/hpkg/ReaderImplBase.cpp
index af771ec..e5c1564 100644
--- a/src/kits/package/hpkg/ReaderImplBase.cpp
+++ b/src/kits/package/hpkg/ReaderImplBase.cpp
@@ -19,9 +19,9 @@
 
 #include <package/hpkg/HPKGDefsPrivate.h>
 
-#include <package/hpkg/DataOutput.h>
+#include <package/hpkg/BufferDataOutput.h>
 #include <package/hpkg/PackageFileHeapReader.h>
-#include <package/hpkg/ZlibDecompressor.h>
+#include <ZlibDecompressor.h>
 
 
 namespace BPackageKit {
diff --git a/src/kits/package/hpkg/ZlibCompressor.cpp 
b/src/kits/package/hpkg/ZlibCompressor.cpp
index a2a5dea..b9e6e6f 100644
--- a/src/kits/package/hpkg/ZlibCompressor.cpp
+++ b/src/kits/package/hpkg/ZlibCompressor.cpp
@@ -9,7 +9,7 @@
 #include <errno.h>
 #include <stdio.h>
 
-#include <package/hpkg/DataOutput.h>
+#include <package/hpkg/BufferDataOutput.h>
 
 
 namespace BPackageKit {
@@ -22,7 +22,7 @@ namespace BPrivate {
 static const size_t kOutputBufferSize = 1024;
 
 
-ZlibCompressor::ZlibCompressor(BDataOutput* output)
+ZlibCompressor::ZlibCompressor(BDataIO* output)
        :
        fOutput(output),
        fStreamInitialized(false)
@@ -82,7 +82,7 @@ ZlibCompressor::CompressNext(const void* input, size_t 
inputSize)
                        return TranslateZlibError(zlibError);
 
                if (fStream.avail_out < sizeof(outputBuffer)) {
-                       status_t error = fOutput->WriteData(outputBuffer,
+                       status_t error = fOutput->Write(outputBuffer,
                                sizeof(outputBuffer) - fStream.avail_out);
                        if (error != B_OK)
                                return error;
@@ -109,7 +109,7 @@ ZlibCompressor::Finish()
                        return TranslateZlibError(zlibError);
 
                if (fStream.avail_out < sizeof(outputBuffer)) {
-                       status_t error = fOutput->WriteData(outputBuffer,
+                       status_t error = fOutput->Write(outputBuffer,
                                sizeof(outputBuffer) - fStream.avail_out);
                        if (error != B_OK)
                                return error;
diff --git a/src/kits/package/hpkg/v1/PackageDataReaderV1.cpp 
b/src/kits/package/hpkg/v1/PackageDataReaderV1.cpp
index 9fc0063..6fd4f4a 100644
--- a/src/kits/package/hpkg/v1/PackageDataReaderV1.cpp
+++ b/src/kits/package/hpkg/v1/PackageDataReaderV1.cpp
@@ -11,12 +11,12 @@
 #include <algorithm>
 #include <new>
 
+#include <package/hpkg/BufferDataOutput.h>
 #include <package/hpkg/BufferPool.h>
 #include <package/hpkg/PoolBuffer.h>
-#include <package/hpkg/DataOutput.h>
 #include <package/hpkg/v1/HPKGDefsPrivate.h>
 #include <package/hpkg/v1/PackageData.h>
-#include <package/hpkg/ZlibDecompressor.h>
+#include <ZlibDecompressor.h>
 
 
 namespace BPackageKit {
@@ -27,7 +27,7 @@ namespace V1 {
 
 
 using BHPKG::BPrivate::PoolBufferPutter;
-using BHPKG::BPrivate::ZlibDecompressor;
+using ::BPrivate::ZlibDecompressor;
 
 
 // minimum/maximum zlib chunk size we consider sane
@@ -98,7 +98,7 @@ public:
        }
 
        virtual status_t ReadDataToOutput(off_t offset, size_t size,
-               BDataOutput* output)
+               BDataIO* output)
        {
                if (size == 0)
                        return B_OK;
@@ -125,7 +125,7 @@ public:
                                return error;
 
                        // write to the output
-                       error = output->WriteData(buffer->Buffer(), toRead);
+                       error = output->Write(buffer->Buffer(), toRead);
                        if (error != B_OK)
                                return error;
 
@@ -205,7 +205,7 @@ public:
        }
 
        virtual status_t ReadDataToOutput(off_t offset, size_t size,
-               BDataOutput* output)
+               BDataIO* output)
        {
                // check offset and size
                if (size == 0)
@@ -244,7 +244,7 @@ public:
 
                        // write data to output
                        size_t toCopy = std::min(size, (size_t)fChunkSize - 
inChunkOffset);
-                       error = output->WriteData(
+                       error = output->Write(
                                (uint8*)fUncompressBuffer->Buffer() + 
inChunkOffset, toCopy);
                        if (error != B_OK)
                                return error;
diff --git a/src/kits/package/hpkg/v1/PackageReaderImplV1.cpp 
b/src/kits/package/hpkg/v1/PackageReaderImplV1.cpp
index 5fa75d5..8541f84 100644
--- a/src/kits/package/hpkg/v1/PackageReaderImplV1.cpp
+++ b/src/kits/package/hpkg/v1/PackageReaderImplV1.cpp
@@ -22,12 +22,12 @@
 
 #include <package/hpkg/v1/HPKGDefsPrivate.h>
 
-#include <package/hpkg/DataOutput.h>
+#include <package/hpkg/BufferDataOutput.h>
 #include <package/hpkg/ErrorOutput.h>
 #include <package/hpkg/v1/PackageData.h>
 #include <package/hpkg/v1/PackageEntry.h>
 #include <package/hpkg/v1/PackageEntryAttribute.h>
-#include <package/hpkg/ZlibDecompressor.h>
+#include <ZlibDecompressor.h>
 
 
 namespace BPackageKit {
diff --git a/src/kits/package/hpkg/v1/ReaderImplBaseV1.cpp 
b/src/kits/package/hpkg/v1/ReaderImplBaseV1.cpp
index 74bf776..9768c33 100644
--- a/src/kits/package/hpkg/v1/ReaderImplBaseV1.cpp
+++ b/src/kits/package/hpkg/v1/ReaderImplBaseV1.cpp
@@ -19,9 +19,9 @@
 
 #include <package/hpkg/v1/HPKGDefsPrivate.h>
 
-#include <package/hpkg/DataOutput.h>
+#include <package/hpkg/BufferDataOutput.h>
 #include <package/hpkg/ErrorOutput.h>
-#include <package/hpkg/ZlibDecompressor.h>
+#include <ZlibDecompressor.h>
 
 
 namespace BPackageKit {
@@ -33,7 +33,7 @@ namespace V1 {
 namespace BPrivate {
 
 
-using BHPKG::BPrivate::ZlibDecompressor;
+using ::BPrivate::ZlibDecompressor;
 
 
 static const size_t kScratchBufferSize = 64 * 1024;
diff --git a/src/kits/shared/Jamfile b/src/kits/shared/Jamfile
index 6a44e76..869f90a 100644
--- a/src/kits/shared/Jamfile
+++ b/src/kits/shared/Jamfile
@@ -11,6 +11,8 @@ for architectureObject in [ MultiArchSubDirSetup ] {
        on $(architectureObject) {
                local architecture = $(TARGET_PACKAGING_ARCH) ;
 
+               UseBuildFeatureHeaders zlib ;
+               
                UseHeaders [ FDirName
                        
$(TARGET_COMMON_DEBUG_OBJECT_DIR_$(TARGET_PACKAGING_ARCHS[1]))
                        servers input ] ;
@@ -21,6 +23,9 @@ for architectureObject in [ MultiArchSubDirSetup ] {
                # for RWLockManager only
                UsePrivateSystemHeaders ;
                UsePrivateHeaders kernel libroot ;
+               
+               Includes [ FGristFiles $(HPKG_SOURCES) ]
+                       : [ BuildFeatureAttribute zlib : headers ] ;
 
                StaticLibrary [ MultiArchDefaultGristFiles libshared.a ] :
                        AboutMenuItem.cpp
@@ -48,6 +53,10 @@ for architectureObject in [ MultiArchSubDirSetup ] {
                        TextTable.cpp
                        Thread.cpp
                        Variant.cpp
+                       
+                       # compression
+                       ZlibCompressionBase.cpp
+                       ZlibDecompressor.cpp
                        ;
 
                Includes [ FGristFiles Keymap.cpp ]
diff --git a/src/kits/package/hpkg/ZlibCompressionBase.cpp 
b/src/kits/shared/ZlibCompressionBase.cpp
similarity index 84%
rename from src/kits/package/hpkg/ZlibCompressionBase.cpp
rename to src/kits/shared/ZlibCompressionBase.cpp
index 4fe4337..2377353 100644
--- a/src/kits/package/hpkg/ZlibCompressionBase.cpp
+++ b/src/kits/shared/ZlibCompressionBase.cpp
@@ -4,17 +4,13 @@
  */
 
 
-#include <package/hpkg/ZlibCompressionBase.h>
+#include <ZlibCompressionBase.h>
 
 #include <errno.h>
 
 #include <zlib.h>
 
 
-namespace BPackageKit {
-
-namespace BHPKG {
-
 namespace BPrivate {
 
 
@@ -48,7 +44,3 @@ ZlibCompressionBase::TranslateZlibError(int error)
 
 
 }      // namespace BPrivate
-
-}      // namespace BHPKG
-
-}      // namespace BPackageKit
diff --git a/src/kits/package/hpkg/ZlibDecompressor.cpp 
b/src/kits/shared/ZlibDecompressor.cpp
similarity index 91%
rename from src/kits/package/hpkg/ZlibDecompressor.cpp
rename to src/kits/shared/ZlibDecompressor.cpp
index 2ab2d4c..17552a8 100644
--- a/src/kits/package/hpkg/ZlibDecompressor.cpp
+++ b/src/kits/shared/ZlibDecompressor.cpp
@@ -4,18 +4,14 @@
  */
 
 
-#include <package/hpkg/ZlibDecompressor.h>
+#include <ZlibDecompressor.h>
 
 #include <errno.h>
 #include <stdio.h>
 
-#include <package/hpkg/DataOutput.h>
+#include <DataIO.h>
 
 
-namespace BPackageKit {
-
-namespace BHPKG {
-
 namespace BPrivate {
 
 
@@ -23,7 +19,7 @@ namespace BPrivate {
 static const size_t kOutputBufferSize = 1024;
 
 
-ZlibDecompressor::ZlibDecompressor(BDataOutput* output)
+ZlibDecompressor::ZlibDecompressor(BDataIO* output)
        :
        fOutput(output),
        fStreamInitialized(false),
@@ -89,7 +85,7 @@ ZlibDecompressor::DecompressNext(const void* input, size_t 
inputSize)
                        return TranslateZlibError(zlibError);
 
                if (fStream.avail_out < sizeof(outputBuffer)) {
-                       status_t error = fOutput->WriteData(outputBuffer,
+                       status_t error = fOutput->Write(outputBuffer,
                                sizeof(outputBuffer) - fStream.avail_out);
                        if (error != B_OK)
                                return error;
@@ -118,7 +114,7 @@ ZlibDecompressor::Finish()
                        return TranslateZlibError(zlibError);
 
                if (fStream.avail_out < sizeof(outputBuffer)) {
-                       status_t error = fOutput->WriteData(outputBuffer,
+                       status_t error = fOutput->Write(outputBuffer,
                                sizeof(outputBuffer) - fStream.avail_out);
                        if (error != B_OK)
                                return error;
@@ -186,7 +182,3 @@ ZlibDecompressor::DecompressSingleBuffer(const void* input, 
size_t inputSize,
 
 
 }      // namespace BPrivate
-
-}      // namespace BHPKG
-
-}      // namespace BPackageKit
diff --git a/src/system/boot/loader/file_systems/packagefs/Jamfile 
b/src/system/boot/loader/file_systems/packagefs/Jamfile
index 2425fdf..7fadf51 100644
--- a/src/system/boot/loader/file_systems/packagefs/Jamfile
+++ b/src/system/boot/loader/file_systems/packagefs/Jamfile
@@ -13,6 +13,8 @@ SubDirC++Flags -fno-rtti -include $(kernelC++Header) ;
 
 SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src kits package ] ;
 SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src kits package hpkg ] ;
+SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src kits shared ] ;
+SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src kits support ] ;
 
 
 BootStaticLibrary boot_packagefs :
@@ -25,9 +27,9 @@ BootStaticLibrary boot_packagefs :
        BlockBufferPool.cpp
        BlockBufferPoolImpl.cpp
        BlockBufferPoolNoLock.cpp
+       BufferDataOutput.cpp
        BufferPool.cpp
        PoolBuffer.cpp
-       DataOutput.cpp
        DataReader.cpp
        ErrorOutput.cpp
        FDDataReader.cpp
@@ -42,6 +44,7 @@ BootStaticLibrary boot_packagefs :
        ReaderImplBase.cpp
 
        # compression
+       DataIO.cpp
        ZlibCompressionBase.cpp
        ZlibDecompressor.cpp
 

############################################################################

Commit:      142d59ca90dc5f84899d93eef4c8515cc8d27036
URL:         http://cgit.haiku-os.org/haiku/commit/?id=142d59c
Author:      Adrien Destugues <pulkomandy@xxxxxxxxxxxxx>
Date:        Tue Feb 11 10:30:58 2014 UTC

ZlibDecompressor: also accept gzip format

zlib can decompress both gzip and zlib formatted compressed streams. The
compression algorithm is the same, but the headers are different. The
format is autodetected from the data.

----------------------------------------------------------------------------

diff --git a/src/kits/shared/ZlibDecompressor.cpp 
b/src/kits/shared/ZlibDecompressor.cpp
index 17552a8..e31649c 100644
--- a/src/kits/shared/ZlibDecompressor.cpp
+++ b/src/kits/shared/ZlibDecompressor.cpp
@@ -54,7 +54,7 @@ ZlibDecompressor::Init()
        fStream.adler = 0;
        fStream.reserved = 0;
 
-       int zlibError = inflateInit(&fStream);
+       int zlibError = inflateInit2(&fStream, 32 + MAX_WBITS);
        if (zlibError != Z_OK)
                return TranslateZlibError(zlibError);
 

############################################################################

Commit:      36b1f55a1841d63f0e6487e2c62c280cb24a63c4
URL:         http://cgit.haiku-os.org/haiku/commit/?id=36b1f55
Author:      Adrien Destugues <pulkomandy@xxxxxxxxxxxxx>
Date:        Tue Feb 11 10:58:54 2014 UTC

DynamicBuffer: implement BDataIO

This makes it possible to use it with the ZlibDecompressor.

----------------------------------------------------------------------------

diff --git a/headers/private/net/DynamicBuffer.h 
b/headers/private/net/DynamicBuffer.h
index 183f88b..58a49d9 100644
--- a/headers/private/net/DynamicBuffer.h
+++ b/headers/private/net/DynamicBuffer.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2009, Haiku, Inc. All Rights Reserved.
+ * Copyright 2009-2014, Haiku, Inc. All Rights Reserved.
  * Distributed under the terms of the MIT License.
  *
  * Authors:
@@ -9,10 +9,11 @@
 #ifndef _DYNAMIC_BUFFER_H
 #define _DYNAMIC_BUFFER_H
 
+#include <DataIO.h>
 #include <SupportDefs.h>
 
 
-class DynamicBuffer {
+class DynamicBuffer : public BDataIO {
 public:
        DynamicBuffer(size_t initialSize = 0);
        ~DynamicBuffer();
@@ -25,11 +26,11 @@ public:
        
        // Insert data at the end of the buffer. The buffer will be increased to
        // accomodate the data if needed.
-       status_t Insert(const void* data, size_t size);
+       status_t Write(const void* data, size_t size);
        
        // Remove data from the start of the buffer. Move the buffer start
        // pointer to point to the data following it.
-       status_t Remove(void* data, size_t size);
+       ssize_t Read(void* data, size_t size);
 
        // Return a pointer to the underlying buffer. Note this will not
        // necessarily be a pointer to the start of the allocated memory as the
diff --git a/src/kits/network/libnetapi/DynamicBuffer.cpp 
b/src/kits/network/libnetapi/DynamicBuffer.cpp
index 7bbffe7..18d9a96 100644
--- a/src/kits/network/libnetapi/DynamicBuffer.cpp
+++ b/src/kits/network/libnetapi/DynamicBuffer.cpp
@@ -70,7 +70,7 @@ DynamicBuffer::InitCheck() const
 
 
 status_t
-DynamicBuffer::Insert(const void* data, size_t size)
+DynamicBuffer::Write(const void* data, size_t size)
 {
        if (fInit != B_OK)
                return fInit;
@@ -86,14 +86,14 @@ DynamicBuffer::Insert(const void* data, size_t size)
 }
 
 
-status_t
-DynamicBuffer::Remove(void* data, size_t size)
+ssize_t
+DynamicBuffer::Read(void* data, size_t size)
 {
        if (fInit != B_OK)
                return fInit;
 
-       if (fDataStart + size > fDataEnd)
-               return B_BUFFER_OVERFLOW;
+       if (size > Size())
+               size = Size();
 
        memcpy(data, fBuffer + fDataStart, size);
        fDataStart += size;
@@ -101,7 +101,7 @@ DynamicBuffer::Remove(void* data, size_t size)
        if (fDataStart == fDataEnd)
                fDataStart = fDataEnd = 0;
 
-       return B_OK;
+       return size;
 }
 
 
diff --git a/src/kits/network/libnetapi/NetBuffer.cpp 
b/src/kits/network/libnetapi/NetBuffer.cpp
index d2a0911..c1ccb2b 100644
--- a/src/kits/network/libnetapi/NetBuffer.cpp
+++ b/src/kits/network/libnetapi/NetBuffer.cpp
@@ -54,7 +54,7 @@ BNetBuffer::BNetBuffer(BMessage* archive) :
                &bufferSize) == B_OK) {
                fImpl = new (std::nothrow) DynamicBuffer(bufferSize);
                if (fImpl != NULL) {
-                       status_t result = fImpl->Insert(bufferPtr, bufferSize);
+                       status_t result = fImpl->Write(bufferPtr, bufferSize);
                        if (result == B_OK)
                                fInit = fImpl->InitCheck();
                        else
@@ -185,7 +185,7 @@ BNetBuffer::AppendString(const char* data)
 status_t
 BNetBuffer::AppendData(const void* data, size_t size)
 {
-       return fImpl->Insert(data, size);
+       return fImpl->Write(data, size);
 }
 
 
@@ -332,7 +332,7 @@ BNetBuffer::RemoveString(char* data, size_t size)
 status_t
 BNetBuffer::RemoveData(void* data, size_t size)
 {
-       return fImpl->Remove(data, size);
+       return fImpl->Read(data, size);
 }
 
 

############################################################################

Revision:    hrev46849
Commit:      c3d0dd7a5e6ca1d2d43b6ebfb4c6a67300c780f7
URL:         http://cgit.haiku-os.org/haiku/commit/?id=c3d0dd7
Author:      Adrien Destugues <pulkomandy@xxxxxxxxxxxxx>
Date:        Tue Feb 11 11:02:26 2014 UTC

HttpRequest: support gzip and deflate compression.

* Use the ZlibDecompressor to decompress the data
* Advertise support in accept-encoding

This should make web browsing feel even faster on wesites that support
these compresion schemes. It also fixes some websites (www.ru,
rainloop.net, ...) that serve gzipped resources even to browser not
supporting it.

----------------------------------------------------------------------------

diff --git a/src/kits/network/libnetapi/HttpRequest.cpp 
b/src/kits/network/libnetapi/HttpRequest.cpp
index 3db92e1..2212032 100644
--- a/src/kits/network/libnetapi/HttpRequest.cpp
+++ b/src/kits/network/libnetapi/HttpRequest.cpp
@@ -1,10 +1,11 @@
 /*
- * Copyright 2010-2013 Haiku Inc. All rights reserved.
+ * Copyright 2010-2014 Haiku Inc. All rights reserved.
  * Distributed under the terms of the MIT License.
  *
  * Authors:
  *             Christophe Huriaux, c.huriaux@xxxxxxxxx
  *             Niels Sascha Reedijk, niels.reedijk@xxxxxxxxx
+ *             Adrien Destugues, pulkomandy@xxxxxxxxxxxxx
  */
 
 
@@ -18,9 +19,11 @@
 #include <new>
 
 #include <Debug.h>
+#include <DynamicBuffer.h>
 #include <File.h>
 #include <Socket.h>
 #include <SecureSocket.h>
+#include <ZlibDecompressor.h>
 
 
 static const int32 kHttpBufferSize = 4096;
@@ -402,6 +405,8 @@ BHttpRequest::_ResolveHostName()
        else
                port = fSSL ? 443 : 80;
 
+       // FIXME stop forcing AF_INET, when BNetworkAddress stops giving IPv6
+       // addresses when there isn't an IPv6 link available.
        fRemoteAddr = BNetworkAddress(AF_INET, fUrl.Host(), port);
 
        if (fRemoteAddr.InitCheck() != B_OK)
@@ -538,6 +543,7 @@ BHttpRequest::_MakeRequest()
        bool receiveEnd = false;
        bool parseEnd = false;
        bool readByChunks = false;
+       bool decompress = false;
        status_t readError = B_OK;
        ssize_t bytesRead = 0;
        ssize_t bytesReceived = 0;
@@ -545,6 +551,8 @@ BHttpRequest::_MakeRequest()
        char* inputTempBuffer = new(std::nothrow) char[kHttpBufferSize];
        ssize_t inputTempSize = kHttpBufferSize;
        ssize_t chunkSize = -1;
+       DynamicBuffer decompressorStorage;
+       BPrivate::ZlibDecompressor decompressor(&decompressorStorage);
 
        while (!fQuit && !(receiveEnd && parseEnd)) {
                if (!receiveEnd) {
@@ -593,6 +601,13 @@ BHttpRequest::_MakeRequest()
                                if (BString(fHeaders["Transfer-Encoding"]) == 
"chunked")
                                        readByChunks = true;
 
+                               BString 
contentEncoding(fHeaders["Content-Encoding"]);
+                               if (contentEncoding == "gzip"
+                                               || contentEncoding == 
"deflate") {
+                                       decompress = true;
+                                       decompressor.Init();
+                               }
+
                                int32 index = 
fHeaders.HasHeader("Content-Length");
                                if (index != B_ERROR)
                                        bytesTotal = 
atoi(fHeaders.HeaderAt(index).Value());
@@ -680,13 +695,36 @@ BHttpRequest::_MakeRequest()
                                bytesReceived += bytesRead;
 
                                if (fListener != NULL) {
-                                       fListener->DataReceived(this, 
inputTempBuffer, bytesRead);
+                                       if (decompress) {
+                                               
decompressor.DecompressNext(inputTempBuffer,
+                                                       bytesRead);
+                                               ssize_t size = 
decompressorStorage.Size();
+                                               char buffer[size];
+                                               size = 
decompressorStorage.Read(buffer, size);
+                                               if (size > 0) {
+                                                       
fListener->DataReceived(this, buffer, size);
+                                               }
+                                       } else {
+                                               fListener->DataReceived(this, 
inputTempBuffer,
+                                                       bytesRead);
+                                       }
                                        fListener->DownloadProgress(this, 
bytesReceived,
                                                bytesTotal);
                                }
 
-                               if (bytesTotal > 0 && bytesReceived >= 
bytesTotal)
+                               if (bytesTotal > 0 && bytesReceived >= 
bytesTotal) {
                                        receiveEnd = true;
+
+                                       if (decompress) {
+                                               decompressor.Finish();
+                                               ssize_t size = 
decompressorStorage.Size();
+                                               char buffer[size];
+                                               size = 
decompressorStorage.Read(buffer, size);
+                                               if (size > 0) {
+                                                       
fListener->DataReceived(this, buffer, size);
+                                               }
+                                       }
+                               }
                        }
                }
 
@@ -816,7 +854,7 @@ BHttpRequest::_SendHeaders()
                fOutputHeaders.AddHeader("Host", Url().Host());
 
                fOutputHeaders.AddHeader("Accept", "*/*");
-               fOutputHeaders.AddHeader("Accept-Encoding", "chunked");
+               fOutputHeaders.AddHeader("Accept-Encoding", "gzip, deflate, 
chunked");
                        // Allow the remote server to send dynamic content by 
chunks
                        // rather than waiting for the full content to be 
generated and
                        // sending us data.
diff --git a/src/kits/network/libnetapi/Jamfile 
b/src/kits/network/libnetapi/Jamfile
index b91385e..9831f65 100644
--- a/src/kits/network/libnetapi/Jamfile
+++ b/src/kits/network/libnetapi/Jamfile
@@ -9,8 +9,14 @@ UseHeaders [ FDirName $(HAIKU_TOP) src libs compat 
freebsd_wlan ] : true ;
 local architectureObject ;
 for architectureObject in [ MultiArchSubDirSetup ] {
        on $(architectureObject) {
+               UseBuildFeatureHeaders zlib ;
+
                local sslSources ;
                local md5Sources ;
+
+               Includes [ FGristFiles $(HPKG_SOURCES) ]
+                       : [ BuildFeatureAttribute zlib : headers ] ;
+
                if [ FIsBuildFeatureEnabled openssl ] {
                        SubDirC++Flags -DOPENSSL_ENABLED ;
                        UseBuildFeatureHeaders openssl ;
@@ -82,6 +88,7 @@ for architectureObject in [ MultiArchSubDirSetup ] {
                        :
                        be $(TARGET_NETWORK_LIBS) $(TARGET_LIBSTDC++) 
$(TARGET_LIBSUPC++)
                        [ BuildFeatureAttribute openssl : libraries ]
+                       [ BuildFeatureAttribute zlib : library ]
                        [ MultiArchDefaultGristFiles libshared.a ]
                        ;
        }


Other related posts: