
This is not needed but it does not cost much to do it for all potentially supported format in libarchive. XZ and LZMA are not builtin libarchive and require external lib but if CMAKE_USE_SYSTEM_LIBARCHIVE is ON then we may get it for free.
94 lines
2.7 KiB
C++
94 lines
2.7 KiB
C++
/*============================================================================
|
|
CMake - Cross Platform Makefile Generator
|
|
Copyright 2000-2010 Kitware, Inc., Insight Software Consortium
|
|
|
|
Distributed under the OSI-approved BSD License (the "License");
|
|
see accompanying file Copyright.txt for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even the
|
|
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
See the License for more information.
|
|
============================================================================*/
|
|
#ifndef cmArchiveWrite_h
|
|
#define cmArchiveWrite_h
|
|
|
|
#include "cmStandardIncludes.h"
|
|
|
|
#if !defined(CMAKE_BUILD_WITH_CMAKE)
|
|
# error "cmArchiveWrite not allowed during bootstrap build!"
|
|
#endif
|
|
|
|
/** \class cmArchiveWrite
|
|
* \brief Wrapper around libarchive for writing.
|
|
*
|
|
*/
|
|
class cmArchiveWrite
|
|
{
|
|
typedef void (cmArchiveWrite::* safe_bool)();
|
|
void safe_bool_true() {}
|
|
public:
|
|
/** Compression type. */
|
|
enum Compress
|
|
{
|
|
CompressNone,
|
|
CompressGZip,
|
|
CompressBZip2,
|
|
CompressLZMA,
|
|
CompressXZ
|
|
};
|
|
|
|
/** Archive Type */
|
|
enum Type
|
|
{
|
|
TypeTAR,
|
|
TypeZIP
|
|
};
|
|
|
|
/** Construct with output stream to which to write archive. */
|
|
cmArchiveWrite(std::ostream& os, Compress c = CompressNone, Type = TypeTAR);
|
|
~cmArchiveWrite();
|
|
|
|
/**
|
|
* Add a path (file or directory) to the archive. Directories are
|
|
* added recursively. The "path" must be readable on disk, either
|
|
* full path or relative to current working directory. The "skip"
|
|
* value indicates how many leading bytes from the input path to
|
|
* skip. The remaining part of the input path is appended to the
|
|
* "prefix" value to construct the final name in the archive.
|
|
*/
|
|
bool Add(std::string path, size_t skip = 0, const char* prefix = 0);
|
|
|
|
/** Returns true if there has been no error. */
|
|
operator safe_bool() const
|
|
{ return this->Okay()? &cmArchiveWrite::safe_bool_true : 0; }
|
|
|
|
/** Returns true if there has been an error. */
|
|
bool operator!() const { return !this->Okay(); }
|
|
|
|
/** Return the error string; empty if none. */
|
|
std::string GetError() const { return this->Error; }
|
|
|
|
// TODO: More general callback instead of hard-coding calls to
|
|
// std::cout.
|
|
void SetVerbose(bool v) { this->Verbose = v; }
|
|
|
|
private:
|
|
bool Okay() const { return this->Error.empty(); }
|
|
bool AddPath(const char* path, size_t skip, const char* prefix);
|
|
bool AddFile(const char* file, size_t skip, const char* prefix);
|
|
bool AddData(const char* file, size_t size);
|
|
|
|
struct Callback;
|
|
friend struct Callback;
|
|
|
|
class Entry;
|
|
|
|
std::ostream& Stream;
|
|
struct archive* Archive;
|
|
struct archive* Disk;
|
|
bool Verbose;
|
|
std::string Error;
|
|
};
|
|
|
|
#endif
|