BPackageWriter: Add BPositionIO support

This commit is contained in:
Ingo Weinhold
2014-07-13 17:57:55 +02:00
parent b916156a83
commit 44c4771163
7 changed files with 73 additions and 20 deletions
+6
View File
@@ -11,6 +11,9 @@
#include <package/hpkg/ErrorOutput.h> #include <package/hpkg/ErrorOutput.h>
class BPositionIO;
namespace BPackageKit { namespace BPackageKit {
namespace BHPKG { namespace BHPKG {
@@ -74,6 +77,9 @@ public:
status_t Init(const char* fileName, status_t Init(const char* fileName,
const BPackageWriterParameters* parameters const BPackageWriterParameters* parameters
= NULL); = NULL);
status_t Init(BPositionIO* file, bool keepFile,
const BPackageWriterParameters* parameters
= NULL);
status_t SetInstallPath(const char* installPath); status_t SetInstallPath(const char* installPath);
void SetCheckLicenses(bool checkLicenses); void SetCheckLicenses(bool checkLicenses);
status_t AddEntry(const char* fileName, int fd = -1); status_t AddEntry(const char* fileName, int fd = -1);
@@ -49,6 +49,8 @@ public:
status_t Init(const char* fileName, status_t Init(const char* fileName,
const BPackageWriterParameters& parameters); const BPackageWriterParameters& parameters);
status_t Init(BPositionIO* file, bool keepFile,
const BPackageWriterParameters& parameters);
status_t SetInstallPath(const char* installPath); status_t SetInstallPath(const char* installPath);
void SetCheckLicenses(bool checkLicenses); void SetCheckLicenses(bool checkLicenses);
status_t AddEntry(const char* fileName, int fd = -1); status_t AddEntry(const char* fileName, int fd = -1);
@@ -67,7 +69,8 @@ private:
typedef DoublyLinkedList<Entry> EntryList; typedef DoublyLinkedList<Entry> EntryList;
private: private:
status_t _Init(const char* fileName, status_t _Init(BPositionIO* file, bool keepFile,
const char* fileName,
const BPackageWriterParameters& parameters); const BPackageWriterParameters& parameters);
status_t _Finish(); status_t _Finish();
@@ -101,7 +101,8 @@ protected:
typedef DoublyLinkedList<PackageAttribute> PackageAttributeList; typedef DoublyLinkedList<PackageAttribute> PackageAttributeList;
protected: protected:
status_t Init(const char* fileName, status_t Init(BPositionIO* file, bool keepFile,
const char* fileName,
const BPackageWriterParameters& parameters); const BPackageWriterParameters& parameters);
status_t InitHeapReader(size_t headerSize); status_t InitHeapReader(size_t headerSize);
@@ -191,6 +192,7 @@ private:
const char* fFileName; const char* fFileName;
BPackageWriterParameters fParameters; BPackageWriterParameters fParameters;
BPositionIO* fFile; BPositionIO* fFile;
bool fOwnsFile;
bool fFinished; bool fFinished;
StringCache fPackageStringCache; StringCache fPackageStringCache;
+14
View File
@@ -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 status_t
BPackageWriter::SetInstallPath(const char* installPath) BPackageWriter::SetInstallPath(const char* installPath)
{ {
+18 -3
View File
@@ -464,7 +464,22 @@ PackageWriterImpl::Init(const char* fileName,
const BPackageWriterParameters& parameters) const BPackageWriterParameters& parameters)
{ {
try { 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) { } catch (status_t error) {
return error; return error;
} catch (std::bad_alloc) { } catch (std::bad_alloc) {
@@ -624,10 +639,10 @@ PackageWriterImpl::Recompress(PackageReaderImpl* reader)
status_t status_t
PackageWriterImpl::_Init(const char* fileName, PackageWriterImpl::_Init(BPositionIO* file, bool keepFile, const char* fileName,
const BPackageWriterParameters& parameters) const BPackageWriterParameters& parameters)
{ {
status_t result = inherited::Init(fileName, parameters); status_t result = inherited::Init(file, keepFile, fileName, parameters);
if (result != B_OK) if (result != B_OK)
return result; return result;
@@ -264,7 +264,8 @@ RepositoryWriterImpl::Finish()
status_t status_t
RepositoryWriterImpl::_Init(const char* fileName) 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) if (error != B_OK)
return error; return error;
+17 -5
View File
@@ -228,6 +228,7 @@ WriterImplBase::WriterImplBase(const char* fileType, BErrorOutput* errorOutput)
fFileName(NULL), fFileName(NULL),
fParameters(), fParameters(),
fFile(NULL), fFile(NULL),
fOwnsFile(false),
fFinished(false) fFinished(false)
{ {
} }
@@ -241,6 +242,7 @@ WriterImplBase::~WriterImplBase()
delete fDecompressionAlgorithm; delete fDecompressionAlgorithm;
delete fDecompressionParameters; delete fDecompressionParameters;
if (fOwnsFile)
delete fFile; delete fFile;
if (!fFinished && fFileName != NULL if (!fFinished && fFileName != NULL
@@ -251,7 +253,7 @@ WriterImplBase::~WriterImplBase()
status_t status_t
WriterImplBase::Init(const char* fileName, WriterImplBase::Init(BPositionIO* file, bool keepFile, const char* fileName,
const BPackageWriterParameters& parameters) const BPackageWriterParameters& parameters)
{ {
fParameters = parameters; fParameters = parameters;
@@ -259,21 +261,31 @@ WriterImplBase::Init(const char* fileName,
if (fPackageStringCache.Init() != B_OK) if (fPackageStringCache.Init() != B_OK)
throw std::bad_alloc(); throw std::bad_alloc();
if (file == NULL) {
if (fileName == NULL)
return B_BAD_VALUE;
// open file (don't truncate in update mode) // open file (don't truncate in update mode)
int openMode = O_RDWR; int openMode = O_RDWR;
if ((Flags() & B_HPKG_WRITER_UPDATE_PACKAGE) == 0) if ((parameters.Flags() & B_HPKG_WRITER_UPDATE_PACKAGE) == 0)
openMode |= O_CREAT | O_TRUNC; openMode |= O_CREAT | O_TRUNC;
BFile* file = new BFile; BFile* newFile = new BFile;
status_t error = file->SetTo(fileName, openMode); status_t error = newFile->SetTo(fileName, openMode);
if (error != B_OK) { if (error != B_OK) {
fErrorOutput->PrintError("Failed to open %s file \"%s\": %s\n", fErrorOutput->PrintError("Failed to open %s file \"%s\": %s\n",
fFileType, fileName, strerror(errno)); fFileType, fileName, strerror(errno));
delete file; delete newFile;
return error; return error;
} }
fFile = newFile;
fOwnsFile = true;
} else {
fFile = file; fFile = file;
fOwnsFile = keepFile;
}
fFileName = fileName; fFileName = fileName;
return B_OK; return B_OK;