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:
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user