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