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 ] ; }