BPackageWriter::Recompress(): Change param to BPositionIO*

Besides that this is a nicer interface, it allows us to get a the HPKG
header as a side effect of initializing the reader, thus preventing
seeking backward in the file. This makes "package recompress - <file>"
work.
This commit is contained in:
Ingo Weinhold
2014-07-13 17:57:57 +02:00
parent 43a6b92c64
commit e1e6c12480
5 changed files with 34 additions and 31 deletions
+1 -5
View File
@@ -18,10 +18,6 @@ namespace BPackageKit {
namespace BHPKG {
class BPackageReader;
namespace BPrivate {
class PackageWriterImpl;
}
@@ -85,7 +81,7 @@ public:
status_t AddEntry(const char* fileName, int fd = -1);
status_t Finish();
status_t Recompress(BPackageReader* reader);
status_t Recompress(BPositionIO* inputFile);
// to be called after Init(); no Finish()
private:
@@ -35,7 +35,6 @@ class BPackageWriterParameters;
namespace BPrivate {
class PackageReaderImpl;
struct hpkg_header;
@@ -56,7 +55,7 @@ public:
status_t AddEntry(const char* fileName, int fd = -1);
status_t Finish();
status_t Recompress(PackageReaderImpl* reader);
status_t Recompress(BPositionIO* inputFile);
// to be called after Init(); no Finish()
private:
@@ -74,7 +73,7 @@ private:
const BPackageWriterParameters& parameters);
status_t _Finish();
status_t _Recompress(PackageReaderImpl* reader);
status_t _Recompress(BPositionIO* inputFile);
status_t _RegisterEntry(const char* fileName, int fd);
Entry* _RegisterEntry(Entry* parent,
+18 -9
View File
@@ -12,6 +12,8 @@
#include <string.h>
#include <unistd.h>
#include <File.h>
#include <package/hpkg/HPKGDefs.h>
#include <package/hpkg/PackageReader.h>
#include <package/hpkg/PackageWriter.h>
@@ -99,14 +101,20 @@ command_recompress(int argc, const char* const* argv)
const char* outputPackageFileName = argv[optind++];
// open the input package
PackageWriterListener listener(verbose, quiet);
BPackageReader packageReader(&listener);
status_t error;
if (strcmp(inputPackageFileName, "-") == 0)
error = packageReader.Init(create_stdio(true), true);
else
error = packageReader.Init(inputPackageFileName);
status_t error = B_OK;
BPositionIO* inputFile;
if (strcmp(inputPackageFileName, "-") == 0) {
inputFile = create_stdio(true);
} else {
BFile* inputFileFile = new BFile;
error = inputFileFile->SetTo(inputPackageFileName, O_RDONLY);
if (error != B_OK) {
fprintf(stderr, "Error: Failed to open input file \"%s\": %s\n",
inputPackageFileName, strerror(error));
return 1;
}
inputFile = inputFileFile;
}
if (error != B_OK)
return 1;
@@ -118,6 +126,7 @@ command_recompress(int argc, const char* const* argv)
BPackageKit::BHPKG::B_HPKG_COMPRESSION_NONE);
}
PackageWriterListener listener(verbose, quiet);
BPackageWriter packageWriter(&listener);
if (strcmp(outputPackageFileName, "-") == 0) {
if (compressionLevel != 0) {
@@ -133,7 +142,7 @@ command_recompress(int argc, const char* const* argv)
if (error != B_OK)
return 1;
error = packageWriter.Recompress(&packageReader);
error = packageWriter.Recompress(inputFile);
if (error != B_OK)
return 1;
+2 -4
View File
@@ -8,8 +8,6 @@
#include <new>
#include <package/hpkg/PackageReader.h>
#include <package/hpkg/PackageWriterImpl.h>
@@ -160,12 +158,12 @@ BPackageWriter::Finish()
status_t
BPackageWriter::Recompress(BPackageReader* reader)
BPackageWriter::Recompress(BPositionIO* inputFile)
{
if (fImpl == NULL)
return B_NO_INIT;
return fImpl->Recompress(reader->fImpl);
return fImpl->Recompress(inputFile);
}
+11 -10
View File
@@ -622,13 +622,13 @@ PackageWriterImpl::Finish()
status_t
PackageWriterImpl::Recompress(PackageReaderImpl* reader)
PackageWriterImpl::Recompress(BPositionIO* inputFile)
{
if (reader == NULL)
if (inputFile == NULL)
return B_BAD_VALUE;
try {
return _Recompress(reader);
return _Recompress(inputFile);
} catch (status_t error) {
return error;
} catch (std::bad_alloc) {
@@ -772,16 +772,17 @@ PackageWriterImpl::_Finish()
status_t
PackageWriterImpl::_Recompress(PackageReaderImpl* reader)
PackageWriterImpl::_Recompress(BPositionIO* inputFile)
{
if (reader == NULL)
if (inputFile == NULL)
return B_BAD_VALUE;
// read the header
// create a package reader for the input file
PackageReaderImpl reader(fListener);
hpkg_header header;
status_t error = reader->ReadBuffer(0, &header, sizeof(header));
status_t error = reader.Init(inputFile, false, 0, &header);
if (error != B_OK) {
fListener->PrintError("Failed to reader hpkg header: %s\n",
fListener->PrintError("Failed to open hpkg file: %s\n",
strerror(error));
return error;
}
@@ -790,7 +791,7 @@ PackageWriterImpl::_Recompress(PackageReaderImpl* reader)
// header later, should compression have been used. Doing it this way allows
// for streaming an uncompressed package.
uint64 uncompressedHeapSize
= reader->RawHeapReader()->UncompressedHeapSize();
= reader.RawHeapReader()->UncompressedHeapSize();
uint64 compressedHeapSize = uncompressedHeapSize;
off_t totalSize = fHeapWriter->HeapOffset() + (off_t)compressedHeapSize;
@@ -812,7 +813,7 @@ PackageWriterImpl::_Recompress(PackageReaderImpl* reader)
// copy the heap data
uint64 bytesCompressed;
error = fHeapWriter->AddData(*reader->RawHeapReader(), uncompressedHeapSize,
error = fHeapWriter->AddData(*reader.RawHeapReader(), uncompressedHeapSize,
bytesCompressed);
if (error != B_OK)
return error;