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 { namespace BHPKG {
class BPackageReader;
namespace BPrivate { namespace BPrivate {
class PackageWriterImpl; class PackageWriterImpl;
} }
@@ -85,7 +81,7 @@ public:
status_t AddEntry(const char* fileName, int fd = -1); status_t AddEntry(const char* fileName, int fd = -1);
status_t Finish(); status_t Finish();
status_t Recompress(BPackageReader* reader); status_t Recompress(BPositionIO* inputFile);
// to be called after Init(); no Finish() // to be called after Init(); no Finish()
private: private:
@@ -35,7 +35,6 @@ class BPackageWriterParameters;
namespace BPrivate { namespace BPrivate {
class PackageReaderImpl;
struct hpkg_header; struct hpkg_header;
@@ -56,7 +55,7 @@ public:
status_t AddEntry(const char* fileName, int fd = -1); status_t AddEntry(const char* fileName, int fd = -1);
status_t Finish(); status_t Finish();
status_t Recompress(PackageReaderImpl* reader); status_t Recompress(BPositionIO* inputFile);
// to be called after Init(); no Finish() // to be called after Init(); no Finish()
private: private:
@@ -74,7 +73,7 @@ private:
const BPackageWriterParameters& parameters); const BPackageWriterParameters& parameters);
status_t _Finish(); status_t _Finish();
status_t _Recompress(PackageReaderImpl* reader); status_t _Recompress(BPositionIO* inputFile);
status_t _RegisterEntry(const char* fileName, int fd); status_t _RegisterEntry(const char* fileName, int fd);
Entry* _RegisterEntry(Entry* parent, Entry* _RegisterEntry(Entry* parent,
+18 -9
View File
@@ -12,6 +12,8 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <File.h>
#include <package/hpkg/HPKGDefs.h> #include <package/hpkg/HPKGDefs.h>
#include <package/hpkg/PackageReader.h> #include <package/hpkg/PackageReader.h>
#include <package/hpkg/PackageWriter.h> #include <package/hpkg/PackageWriter.h>
@@ -99,14 +101,20 @@ command_recompress(int argc, const char* const* argv)
const char* outputPackageFileName = argv[optind++]; const char* outputPackageFileName = argv[optind++];
// open the input package // open the input package
PackageWriterListener listener(verbose, quiet); status_t error = B_OK;
BPositionIO* inputFile;
BPackageReader packageReader(&listener); if (strcmp(inputPackageFileName, "-") == 0) {
status_t error; inputFile = create_stdio(true);
if (strcmp(inputPackageFileName, "-") == 0) } else {
error = packageReader.Init(create_stdio(true), true); BFile* inputFileFile = new BFile;
else error = inputFileFile->SetTo(inputPackageFileName, O_RDONLY);
error = packageReader.Init(inputPackageFileName); 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) if (error != B_OK)
return 1; return 1;
@@ -118,6 +126,7 @@ command_recompress(int argc, const char* const* argv)
BPackageKit::BHPKG::B_HPKG_COMPRESSION_NONE); BPackageKit::BHPKG::B_HPKG_COMPRESSION_NONE);
} }
PackageWriterListener listener(verbose, quiet);
BPackageWriter packageWriter(&listener); BPackageWriter packageWriter(&listener);
if (strcmp(outputPackageFileName, "-") == 0) { if (strcmp(outputPackageFileName, "-") == 0) {
if (compressionLevel != 0) { if (compressionLevel != 0) {
@@ -133,7 +142,7 @@ command_recompress(int argc, const char* const* argv)
if (error != B_OK) if (error != B_OK)
return 1; return 1;
error = packageWriter.Recompress(&packageReader); error = packageWriter.Recompress(inputFile);
if (error != B_OK) if (error != B_OK)
return 1; return 1;
+2 -4
View File
@@ -8,8 +8,6 @@
#include <new> #include <new>
#include <package/hpkg/PackageReader.h>
#include <package/hpkg/PackageWriterImpl.h> #include <package/hpkg/PackageWriterImpl.h>
@@ -160,12 +158,12 @@ BPackageWriter::Finish()
status_t status_t
BPackageWriter::Recompress(BPackageReader* reader) BPackageWriter::Recompress(BPositionIO* inputFile)
{ {
if (fImpl == NULL) if (fImpl == NULL)
return B_NO_INIT; 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 status_t
PackageWriterImpl::Recompress(PackageReaderImpl* reader) PackageWriterImpl::Recompress(BPositionIO* inputFile)
{ {
if (reader == NULL) if (inputFile == NULL)
return B_BAD_VALUE; return B_BAD_VALUE;
try { try {
return _Recompress(reader); return _Recompress(inputFile);
} catch (status_t error) { } catch (status_t error) {
return error; return error;
} catch (std::bad_alloc) { } catch (std::bad_alloc) {
@@ -772,16 +772,17 @@ PackageWriterImpl::_Finish()
status_t status_t
PackageWriterImpl::_Recompress(PackageReaderImpl* reader) PackageWriterImpl::_Recompress(BPositionIO* inputFile)
{ {
if (reader == NULL) if (inputFile == NULL)
return B_BAD_VALUE; return B_BAD_VALUE;
// read the header // create a package reader for the input file
PackageReaderImpl reader(fListener);
hpkg_header header; 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) { if (error != B_OK) {
fListener->PrintError("Failed to reader hpkg header: %s\n", fListener->PrintError("Failed to open hpkg file: %s\n",
strerror(error)); strerror(error));
return error; return error;
} }
@@ -790,7 +791,7 @@ PackageWriterImpl::_Recompress(PackageReaderImpl* reader)
// header later, should compression have been used. Doing it this way allows // header later, should compression have been used. Doing it this way allows
// for streaming an uncompressed package. // for streaming an uncompressed package.
uint64 uncompressedHeapSize uint64 uncompressedHeapSize
= reader->RawHeapReader()->UncompressedHeapSize(); = reader.RawHeapReader()->UncompressedHeapSize();
uint64 compressedHeapSize = uncompressedHeapSize; uint64 compressedHeapSize = uncompressedHeapSize;
off_t totalSize = fHeapWriter->HeapOffset() + (off_t)compressedHeapSize; off_t totalSize = fHeapWriter->HeapOffset() + (off_t)compressedHeapSize;
@@ -812,7 +813,7 @@ PackageWriterImpl::_Recompress(PackageReaderImpl* reader)
// copy the heap data // copy the heap data
uint64 bytesCompressed; uint64 bytesCompressed;
error = fHeapWriter->AddData(*reader->RawHeapReader(), uncompressedHeapSize, error = fHeapWriter->AddData(*reader.RawHeapReader(), uncompressedHeapSize,
bytesCompressed); bytesCompressed);
if (error != B_OK) if (error != B_OK)
return error; return error;