/*=========================================================================

  Program:   CMake - Cross-Platform Makefile Generator
  Module:    $RCSfile$
  Language:  C++
  Date:      $Date$
  Version:   $Revision$

  Copyright (c) 2002 Kitware, Inc., Insight Consortium.  All rights reserved.
  See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.

     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     PURPOSE.  See the above copyright notices for more information.

=========================================================================*/

#include "cmCPackZIPGenerator.h"

#include "cmake.h"
#include "cmGlobalGenerator.h"
#include "cmLocalGenerator.h"
#include "cmSystemTools.h"
#include "cmMakefile.h"
#include "cmGeneratedFileStream.h"
#include "cmCPackLog.h"

#include <cmsys/SystemTools.hxx>

//----------------------------------------------------------------------
cmCPackZIPGenerator::cmCPackZIPGenerator()
{
}

//----------------------------------------------------------------------
cmCPackZIPGenerator::~cmCPackZIPGenerator()
{
}

//----------------------------------------------------------------------
int cmCPackZIPGenerator::InitializeInternal()
{
  this->SetOptionIfNotSet("CPACK_INCLUDE_TOPLEVEL_DIRECTORY", "1");
  std::vector<std::string> path;
  std::string pkgPath = "c:/Program Files/WinZip";
  path.push_back(pkgPath);
  pkgPath = cmSystemTools::FindProgram("wzzip", path, false);
  this->ZipStyle = cmCPackZIPGenerator::StyleUnkown;
  bool found = false;
  if ( pkgPath.empty() )
    {
    cmCPackLogger(cmCPackLog::LOG_DEBUG, "Cannot find WinZip" << std::endl);
    }
  else
    {
    this->ZipStyle = cmCPackZIPGenerator::StyleWinZip;
    found = true;
    }
  if ( !found )
    {
    path.erase(path.begin(), path.end());
    pkgPath = "c:/cygwin/bin";
    path.push_back(pkgPath);
    pkgPath = cmSystemTools::FindProgram("zip", path, false);
    if ( pkgPath.empty() )
      {
      cmCPackLogger(cmCPackLog::LOG_DEBUG, "Cannot find unix ZIP"
        << std::endl);
      }
    else
      {
      this->ZipStyle = cmCPackZIPGenerator::StyleUnixZip;
      found = true;
      }
    }
  if ( !found )
    {
    cmCPackLogger(cmCPackLog::LOG_ERROR, "Cannot find a sutable ZIP program"
      << std::endl);
    return 0;
    }
  this->SetOptionIfNotSet("CPACK_INSTALLER_PROGRAM", pkgPath.c_str());
  cmCPackLogger(cmCPackLog::LOG_VERBOSE, "Found ZIP program: "
    << pkgPath.c_str()
    << std::endl);
  return this->Superclass::InitializeInternal();
}

//----------------------------------------------------------------------
int cmCPackZIPGenerator::CompressFiles(const char* outFileName,
  const char* toplevel, const std::vector<std::string>& files)
{
  std::string tempFileName;
  tempFileName = toplevel;
  tempFileName += "/winZip.filelist";
  bool needQuotesInFile = false;
  cmOStringStream dmgCmd;
  switch ( this->ZipStyle )
    {
  case cmCPackZIPGenerator::StyleWinZip:
    dmgCmd << "\"" << this->GetOption("CPACK_INSTALLER_PROGRAM")
      << "\" -P \"" << outFileName
           << "\" @winZip.filelist";
    needQuotesInFile = true;
    break;
  case cmCPackZIPGenerator::StyleUnixZip:
    dmgCmd << "\"" << this->GetOption("CPACK_INSTALLER_PROGRAM")
      << "\" -r \"" << outFileName
      << "\" . -i@winZip.filelist";
    break;
  default:
    cmCPackLogger(cmCPackLog::LOG_ERROR, "Unknown ZIP style"
      << std::endl);
    return 0;
    }
  if(tempFileName.size())
    {
    cmGeneratedFileStream out(tempFileName.c_str());
    std::vector<std::string>::const_iterator fileIt;
    for ( fileIt = files.begin(); fileIt != files.end(); ++ fileIt )
      {
      if ( needQuotesInFile )
        {
        out << "\"";
        }
      out << cmSystemTools::RelativePath(toplevel, fileIt->c_str());
      if ( needQuotesInFile )
        {
        out << "\"";
        }
      out << std::endl;
      }
    }
  else
    {
  std::vector<std::string>::const_iterator fileIt;
  for ( fileIt = files.begin(); fileIt != files.end(); ++ fileIt )
    {
    dmgCmd << " \""
      << cmSystemTools::RelativePath(toplevel, fileIt->c_str())
      << "\"";
      }
    }
  std::string output;
  int retVal = -1;
  int res = cmSystemTools::RunSingleCommand(dmgCmd.str().c_str(), &output,
    &retVal, toplevel, this->GeneratorVerbose, 0);
  if ( !res || retVal )
    {
    std::string tmpFile = this->GetOption("CPACK_TOPLEVEL_DIRECTORY");
    tmpFile += "/CompressZip.log";
    cmGeneratedFileStream ofs(tmpFile.c_str());
    ofs << "# Run command: " << dmgCmd.str().c_str() << std::endl
      << "# Output:" << std::endl
      << output.c_str() << std::endl;
    cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem running zip command: "
      << dmgCmd.str().c_str() << std::endl
      << "Please check " << tmpFile.c_str() << " for errors" << std::endl);
    return 0;
    }
  return 1;
}
