From 44c4771163b9166dc042f69cb5373c9de9e37006 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sun, 13 Jul 2014 00:30:25 +0200 Subject: [PATCH] BPackageWriter: Add BPositionIO support --- headers/os/package/hpkg/PackageWriter.h | 6 +++ .../private/package/hpkg/PackageWriterImpl.h | 5 ++- headers/private/package/hpkg/WriterImplBase.h | 4 +- src/kits/package/hpkg/PackageWriter.cpp | 14 +++++++ src/kits/package/hpkg/PackageWriterImpl.cpp | 21 ++++++++-- .../package/hpkg/RepositoryWriterImpl.cpp | 3 +- src/kits/package/hpkg/WriterImplBase.cpp | 40 ++++++++++++------- 7 files changed, 73 insertions(+), 20 deletions(-) diff --git a/headers/os/package/hpkg/PackageWriter.h b/headers/os/package/hpkg/PackageWriter.h index 32b6ee9508..fccec4bbcc 100644 --- a/headers/os/package/hpkg/PackageWriter.h +++ b/headers/os/package/hpkg/PackageWriter.h @@ -11,6 +11,9 @@ #include +class BPositionIO; + + namespace BPackageKit { namespace BHPKG { @@ -74,6 +77,9 @@ public: status_t Init(const char* fileName, const BPackageWriterParameters* parameters = NULL); + status_t Init(BPositionIO* file, bool keepFile, + const BPackageWriterParameters* parameters + = NULL); status_t SetInstallPath(const char* installPath); void SetCheckLicenses(bool checkLicenses); status_t AddEntry(const char* fileName, int fd = -1); diff --git a/headers/private/package/hpkg/PackageWriterImpl.h b/headers/private/package/hpkg/PackageWriterImpl.h index 1202783c24..35f3a473ff 100644 --- a/headers/private/package/hpkg/PackageWriterImpl.h +++ b/headers/private/package/hpkg/PackageWriterImpl.h @@ -49,6 +49,8 @@ public: status_t Init(const char* fileName, const BPackageWriterParameters& parameters); + status_t Init(BPositionIO* file, bool keepFile, + const BPackageWriterParameters& parameters); status_t SetInstallPath(const char* installPath); void SetCheckLicenses(bool checkLicenses); status_t AddEntry(const char* fileName, int fd = -1); @@ -67,7 +69,8 @@ private: typedef DoublyLinkedList EntryList; private: - status_t _Init(const char* fileName, + status_t _Init(BPositionIO* file, bool keepFile, + const char* fileName, const BPackageWriterParameters& parameters); status_t _Finish(); diff --git a/headers/private/package/hpkg/WriterImplBase.h b/headers/private/package/hpkg/WriterImplBase.h index c4d975f979..0533420799 100644 --- a/headers/private/package/hpkg/WriterImplBase.h +++ b/headers/private/package/hpkg/WriterImplBase.h @@ -101,7 +101,8 @@ protected: typedef DoublyLinkedList PackageAttributeList; protected: - status_t Init(const char* fileName, + status_t Init(BPositionIO* file, bool keepFile, + const char* fileName, const BPackageWriterParameters& parameters); status_t InitHeapReader(size_t headerSize); @@ -191,6 +192,7 @@ private: const char* fFileName; BPackageWriterParameters fParameters; BPositionIO* fFile; + bool fOwnsFile; bool fFinished; StringCache fPackageStringCache; diff --git a/src/kits/package/hpkg/PackageWriter.cpp b/src/kits/package/hpkg/PackageWriter.cpp index 69b2fe0d3c..2a18a2e51a 100644 --- a/src/kits/package/hpkg/PackageWriter.cpp +++ b/src/kits/package/hpkg/PackageWriter.cpp @@ -107,6 +107,20 @@ BPackageWriter::Init(const char* fileName, } +status_t +BPackageWriter::Init(BPositionIO* file, bool keepFile, + const BPackageWriterParameters* parameters) +{ + if (fImpl == NULL) + return B_NO_MEMORY; + + BPackageWriterParameters defaultParameters; + + return fImpl->Init(file, keepFile, + parameters != NULL ? *parameters : defaultParameters); +} + + status_t BPackageWriter::SetInstallPath(const char* installPath) { diff --git a/src/kits/package/hpkg/PackageWriterImpl.cpp b/src/kits/package/hpkg/PackageWriterImpl.cpp index 3a15ced885..a94c2a05d4 100644 --- a/src/kits/package/hpkg/PackageWriterImpl.cpp +++ b/src/kits/package/hpkg/PackageWriterImpl.cpp @@ -464,7 +464,22 @@ PackageWriterImpl::Init(const char* fileName, const BPackageWriterParameters& parameters) { try { - return _Init(fileName, parameters); + return _Init(NULL, false, fileName, parameters); + } catch (status_t error) { + return error; + } catch (std::bad_alloc) { + fListener->PrintError("Out of memory!\n"); + return B_NO_MEMORY; + } +} + + +status_t +PackageWriterImpl::Init(BPositionIO* file, bool keepFile, + const BPackageWriterParameters& parameters) +{ + try { + return _Init(file, keepFile, NULL, parameters); } catch (status_t error) { return error; } catch (std::bad_alloc) { @@ -624,10 +639,10 @@ PackageWriterImpl::Recompress(PackageReaderImpl* reader) status_t -PackageWriterImpl::_Init(const char* fileName, +PackageWriterImpl::_Init(BPositionIO* file, bool keepFile, const char* fileName, const BPackageWriterParameters& parameters) { - status_t result = inherited::Init(fileName, parameters); + status_t result = inherited::Init(file, keepFile, fileName, parameters); if (result != B_OK) return result; diff --git a/src/kits/package/hpkg/RepositoryWriterImpl.cpp b/src/kits/package/hpkg/RepositoryWriterImpl.cpp index cda6ff04d7..305d68c1ca 100644 --- a/src/kits/package/hpkg/RepositoryWriterImpl.cpp +++ b/src/kits/package/hpkg/RepositoryWriterImpl.cpp @@ -264,7 +264,8 @@ RepositoryWriterImpl::Finish() status_t RepositoryWriterImpl::_Init(const char* fileName) { - status_t error = inherited::Init(fileName, BPackageWriterParameters()); + status_t error = inherited::Init(NULL, false, fileName, + BPackageWriterParameters()); if (error != B_OK) return error; diff --git a/src/kits/package/hpkg/WriterImplBase.cpp b/src/kits/package/hpkg/WriterImplBase.cpp index 65d3016c73..7db79e1dc3 100644 --- a/src/kits/package/hpkg/WriterImplBase.cpp +++ b/src/kits/package/hpkg/WriterImplBase.cpp @@ -228,6 +228,7 @@ WriterImplBase::WriterImplBase(const char* fileType, BErrorOutput* errorOutput) fFileName(NULL), fParameters(), fFile(NULL), + fOwnsFile(false), fFinished(false) { } @@ -241,7 +242,8 @@ WriterImplBase::~WriterImplBase() delete fDecompressionAlgorithm; delete fDecompressionParameters; - delete fFile; + if (fOwnsFile) + delete fFile; if (!fFinished && fFileName != NULL && (Flags() & B_HPKG_WRITER_UPDATE_PACKAGE) == 0) { @@ -251,7 +253,7 @@ WriterImplBase::~WriterImplBase() status_t -WriterImplBase::Init(const char* fileName, +WriterImplBase::Init(BPositionIO* file, bool keepFile, const char* fileName, const BPackageWriterParameters& parameters) { fParameters = parameters; @@ -259,21 +261,31 @@ WriterImplBase::Init(const char* fileName, if (fPackageStringCache.Init() != B_OK) throw std::bad_alloc(); - // open file (don't truncate in update mode) - int openMode = O_RDWR; - if ((Flags() & B_HPKG_WRITER_UPDATE_PACKAGE) == 0) - openMode |= O_CREAT | O_TRUNC; + if (file == NULL) { + if (fileName == NULL) + return B_BAD_VALUE; - BFile* file = new BFile; - status_t error = file->SetTo(fileName, openMode); - if (error != B_OK) { - fErrorOutput->PrintError("Failed to open %s file \"%s\": %s\n", - fFileType, fileName, strerror(errno)); - delete file; - return error; + // open file (don't truncate in update mode) + int openMode = O_RDWR; + if ((parameters.Flags() & B_HPKG_WRITER_UPDATE_PACKAGE) == 0) + openMode |= O_CREAT | O_TRUNC; + + BFile* newFile = new BFile; + status_t error = newFile->SetTo(fileName, openMode); + if (error != B_OK) { + fErrorOutput->PrintError("Failed to open %s file \"%s\": %s\n", + fFileType, fileName, strerror(errno)); + delete newFile; + return error; + } + + fFile = newFile; + fOwnsFile = true; + } else { + fFile = file; + fOwnsFile = keepFile; } - fFile = file; fFileName = fileName; return B_OK;