Browse Source

CPackArchiveGenerator use cmArchiveWrite wrapper

Eric NOULARD 15 years ago
parent
commit
36a550ae7a

+ 32 - 194
Source/CPack/cmCPackArchiveGenerator.cxx

@@ -25,8 +25,8 @@
 #include <cm_libarchive.h>
 
 //----------------------------------------------------------------------
-cmCPackArchiveGenerator::cmCPackArchiveGenerator(CompressType t,
-  ArchiveType at)
+cmCPackArchiveGenerator::cmCPackArchiveGenerator(cmArchiveWrite::Compress t,
+  cmArchiveWrite::Type at)
 {
   this->Compress = t;
   this->Archive = at;
@@ -37,126 +37,6 @@ cmCPackArchiveGenerator::~cmCPackArchiveGenerator()
 {
 }
 
-static const size_t cmCPackTGZ_Data_BlockSize = 16384;
-
-// make this an anonymous namespace so that archive.h does not
-// have to be included in the .h file for this class
-namespace
-{
-bool SetArchiveType(struct archive* a,
-                     cmCPackArchiveGenerator::CompressType ct,
-                     cmCPackArchiveGenerator::ArchiveType at)
-{
-  int res = 0;
-  // pick the archive type
-  switch(at)
-    {
-    case cmCPackArchiveGenerator::TAR:
-      // maybe this:
-      res = archive_write_set_format_pax_restricted(a);
-      break;
-    case cmCPackArchiveGenerator::ZIP:
-      res = archive_write_set_format_zip(a);
-      break;
-    }
-  if(res != ARCHIVE_OK)
-    {
-    return false;
-    }
-
-  // pick a compression type
-  switch(ct)
-    {
-    case cmCPackArchiveGenerator::GZIP:
-      res = archive_write_set_compression_gzip(a);
-      break;
-    case cmCPackArchiveGenerator::BZIP2:
-      res = archive_write_set_compression_bzip2(a);
-      break;
-    case cmCPackArchiveGenerator::COMPRESS:
-      res = archive_write_set_compression_compress(a);
-      break;
-    case cmCPackArchiveGenerator::LZMA:
-      res = archive_write_set_compression_lzma(a);
-      break;
-    case cmCPackArchiveGenerator::NONE:
-    default:
-      res = archive_write_set_compression_none(a);
-    } 
-  if(res != ARCHIVE_OK)
-    {
-    return false;
-    }
-  // do not pad the last block!!
-  res = archive_write_set_bytes_in_last_block(a, 1);
-  if(res != ARCHIVE_OK)
-    {
-    return false;
-    }
-  
-  return true;
-}
-  
-struct StreamData
-{
-  StreamData(cmGeneratedFileStream* gfs,
-    cmCPackArchiveGenerator* ag) 
-    { 
-      this->GeneratedFileStream = gfs;
-      this->Generator = ag;
-    }
-  cmGeneratedFileStream* GeneratedFileStream;
-  cmCPackArchiveGenerator* Generator;
-};
-
-
-extern "C"
-{
-int OpenArchive(struct archive *, void *client_data)
-{
-  struct StreamData *data = (StreamData*)client_data;
-  if(data->GeneratedFileStream && 
-     *data->GeneratedFileStream)
-    {
-    if(data->Generator->
-       GenerateHeader(data->GeneratedFileStream))
-      {
-      return ARCHIVE_OK;
-      }
-    }
-  return (ARCHIVE_FATAL);
-}
-  
-__LA_SSIZE_T WriteArchive(struct archive *,
-                          void *client_data, 
-                          const void *buff,
-                          size_t n)
-{
-  struct StreamData *data = (StreamData*)client_data;
-  data->GeneratedFileStream->
-    write(reinterpret_cast<const char*>(buff),n);
-  if(!data->GeneratedFileStream->bad())
-    {
-    return n;
-    }
-  return 0;
-}
-
-
-int CloseArchive(struct archive *, void *client_data)
-{
-  struct StreamData *data = (StreamData*)client_data;
-  if(data->GeneratedFileStream->Close())
-    {
-    delete data->GeneratedFileStream;
-    return ARCHIVE_OK;
-    }
-  return ARCHIVE_FATAL;
-}
-} //extern C
-} // anon name space
-
-
 //----------------------------------------------------------------------
 int cmCPackArchiveGenerator::InitializeInternal()
 {
@@ -166,93 +46,51 @@ int cmCPackArchiveGenerator::InitializeInternal()
 
 int cmCPackArchiveGenerator::PackageFiles()
 {
-  int res = ARCHIVE_OK;
-#define CHECK_ARCHIVE_ERROR(res, msg)           \
-  if(res != ARCHIVE_OK)                         \
-    {\
-    cmCPackLogger(cmCPackLog::LOG_ERROR, msg      \
-                  << archive_error_string(a)      \
-                  << cmSystemTools::GetLastSystemError()  \
-                  << " " << res                   \
-                  << "\n");                       \
-    }
   cmCPackLogger(cmCPackLog::LOG_DEBUG, "Toplevel: "
                 << toplevel << std::endl);
 
-  // create a new archive
-  struct archive* a = archive_write_new();
-  // Set the compress and archive types for the archive
-  SetArchiveType(a, this->Compress, this->Archive);
   // Open binary stream
-  cmGeneratedFileStream* gf = new cmGeneratedFileStream;
-  gf->Open(packageFileNames[0].c_str(), false, true);
-  StreamData data(gf, this);
-  // pass callbacks to archive_write_open to handle stream
-  res = archive_write_open(a,
-                           &data,
-                           OpenArchive,
-                           WriteArchive, 
-                           CloseArchive);
-  CHECK_ARCHIVE_ERROR(res, "archive_write_open:");
-  // create a new disk struct
-  struct archive* disk = archive_read_disk_new();
-#if !defined(_WIN32) || defined(__CYGWIN__)
-  res = archive_read_disk_set_standard_lookup(disk);
-#endif
-  CHECK_ARCHIVE_ERROR(res, "archive_read_disk_set_standard_lookup:");
+  cmGeneratedFileStream gf;
+  gf.Open(packageFileNames[0].c_str(), false, true);
+  // Add an eventual header to the archive
+  if (!GenerateHeader(&gf))
+    {
+    cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem to generate Header for archive < "
+        << packageFileNames[0]
+        << ">." << std::endl);
+    }
+  // create a new archive
+  cmArchiveWrite archive(gf,this->Compress, this->Archive);
+  if (!archive)
+    {
+    cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem to create archive < "
+                          << packageFileNames[0]
+                          << ">. ERROR ="
+                          << archive.GetError()
+                          << std::endl);
+    return 0;
+    }
   std::vector<std::string>::const_iterator fileIt;
   std::string dir = cmSystemTools::GetCurrentWorkingDirectory();
   cmSystemTools::ChangeDirectory(toplevel.c_str());
   for ( fileIt = files.begin(); fileIt != files.end(); ++ fileIt )
     {
-    // create a new entry for each file
-    struct archive_entry *entry = archive_entry_new();
     // Get the relative path to the file
     std::string rp = cmSystemTools::RelativePath(toplevel.c_str(), fileIt->c_str());
-    // Set the name of the entry to the file name
-    archive_entry_set_pathname(entry, rp.c_str());  
-    res = archive_read_disk_entry_from_file(disk, entry, -1, 0);
-    CHECK_ARCHIVE_ERROR(res, "archive_read_disk_entry_from_file:");
-    // write  entry header
-    res = archive_write_header(a, entry);
-    CHECK_ARCHIVE_ERROR(res, "archive_write_header:");
-    // the entry size can be 0 if it is a symlink
-    if(archive_entry_size(entry) > 0)
+    archive.Add(rp);
+    if(!archive)
       {
-      // now copy contents of file into archive a
-      FILE* file = fopen(fileIt->c_str(), "rb");
-      if(!file)
-        {
-        cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem with fopen(): " 
-                      << fileIt->c_str()
-                      << strerror(errno)
-                      << std::endl);
-        return 0;
-        }
-      char buff[cmCPackTGZ_Data_BlockSize];
-      size_t len = fread(buff, 1, sizeof(buff), file);
-      while (len > 0)
-        {
-        size_t wlen = archive_write_data(a, buff, len);
-        if(wlen != len)
-          {
-          cmCPackLogger(cmCPackLog::LOG_ERROR, "archive_write_data(): " 
-                        << "tried to write " << len  << "\n"
-                        << "write " << wlen << "\n");
-          return 0;
-          }
-        len = fread(buff, 1, sizeof(buff), file);
-        }
-      // close the file and free the entry
-      fclose(file);
+      cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem while adding file< "
+          << *fileIt
+          << "> to archive <"
+          << packageFileNames[0] << "> .ERROR ="
+          << archive.GetError()
+          << std::endl);
+      return 0;
       }
-    archive_entry_free(entry);
     }
   cmSystemTools::ChangeDirectory(dir.c_str());
-  // close the archive and finish the write
-  archive_write_close(a);
-  archive_write_finish(a);
-  archive_read_finish(disk);
+  // The destructor of cmArchiveWrite will close and finish the write
   return 1;
 }
 

+ 7 - 6
Source/CPack/cmCPackArchiveGenerator.h

@@ -13,24 +13,25 @@
 #ifndef cmCPackArchiveGenerator_h
 #define cmCPackArchiveGenerator_h
 
+#include "cmArchiveWrite.h"
 #include "cmCPackGenerator.h"
 
 
 /** \class cmCPackArchiveGenerator
- * \brief A generator base for libarchive generation
+ * \brief A generator base for libarchive generation.
+ * The generator itself uses the libarchive wrapper
+ * \ref cmArchiveWrite.
  *
  */
 class cmCPackArchiveGenerator : public cmCPackGenerator
 {
 public:
-  enum CompressType{ GZIP, BZIP2, COMPRESS, LZMA, NONE};
-  enum ArchiveType{ TAR, ZIP};
   cmTypeMacro(cmCPackArchiveGenerator, cmCPackGenerator);
 
   /**
    * Construct generator
    */
-  cmCPackArchiveGenerator(CompressType, ArchiveType);
+  cmCPackArchiveGenerator(cmArchiveWrite::Compress, cmArchiveWrite::Type);
   virtual ~cmCPackArchiveGenerator();
   // Used to add a header to the archive 
   virtual int GenerateHeader(std::ostream* os);
@@ -39,8 +40,8 @@ protected:
   virtual int InitializeInternal();
   int PackageFiles();
   virtual const char* GetOutputExtension() = 0;
-  CompressType Compress;
-  ArchiveType Archive;
+  cmArchiveWrite::Compress Compress;
+  cmArchiveWrite::Type Archive;
 };
 
 #endif

+ 2 - 2
Source/CPack/cmCPackTGZGenerator.cxx

@@ -14,8 +14,8 @@
 
 //----------------------------------------------------------------------
 cmCPackTGZGenerator::cmCPackTGZGenerator()
-  :cmCPackArchiveGenerator(cmCPackArchiveGenerator::GZIP,
-                           cmCPackArchiveGenerator::TAR)
+  :cmCPackArchiveGenerator(cmArchiveWrite::CompressGZip,
+                           cmArchiveWrite::TypeTAR)
 {
 }
 

+ 2 - 2
Source/CPack/cmCPackTarBZip2Generator.cxx

@@ -13,8 +13,8 @@
 #include "cmCPackTarBZip2Generator.h"
 //----------------------------------------------------------------------
 cmCPackTarBZip2Generator::cmCPackTarBZip2Generator() 
- :cmCPackArchiveGenerator(cmCPackArchiveGenerator::BZIP2,
-                          cmCPackArchiveGenerator::TAR)
+ :cmCPackArchiveGenerator(cmArchiveWrite::CompressBZip2,
+                          cmArchiveWrite::TypeTAR)
 {
 }
 

+ 2 - 2
Source/CPack/cmCPackTarCompressGenerator.cxx

@@ -14,8 +14,8 @@
 
 //----------------------------------------------------------------------
 cmCPackTarCompressGenerator::cmCPackTarCompressGenerator() 
-  :cmCPackArchiveGenerator(cmCPackArchiveGenerator::COMPRESS,
-                           cmCPackArchiveGenerator::TAR)
+  :cmCPackArchiveGenerator(cmArchiveWrite::CompressCompress,
+                           cmArchiveWrite::TypeTAR)
 {
 }
 

+ 2 - 2
Source/CPack/cmCPackZIPGenerator.cxx

@@ -14,8 +14,8 @@
 
 //----------------------------------------------------------------------
 cmCPackZIPGenerator::cmCPackZIPGenerator()
-  :cmCPackArchiveGenerator(cmCPackArchiveGenerator::NONE,
-                           cmCPackArchiveGenerator::ZIP)
+  :cmCPackArchiveGenerator(cmArchiveWrite::CompressNone,
+                           cmArchiveWrite::TypeZIP)
 {
 }