22#include <wx/filedlg.h> 
   26#include <wx/wfstream.h> 
   27#include <wx/zipstrm.h> 
   42#define ZipFileExtension wxT( "zip" ) 
   51    virtual wxDirTraverseResult 
OnFile( 
const wxString& aFilename )
 override 
   53        m_files.emplace_back( aFilename );
 
   55        return wxDIR_CONTINUE;
 
 
   58    virtual wxDirTraverseResult 
OnDir( 
const wxString& aDirname )
 override 
   60        return wxDIR_CONTINUE;
 
 
 
   80                                                const wxString& aZipFileB, 
REPORTER& aReporter )
 
   82    wxFFileInputStream streamA( aZipFileA );
 
   83    wxFFileInputStream streamB( aZipFileB );
 
   85    if( !streamA.IsOk() || !streamB.IsOk() )
 
   91    wxZipInputStream zipStreamA = wxZipInputStream( streamA );
 
   92    wxZipInputStream zipStreamB = wxZipInputStream( streamB );
 
   94    std::set<wxUint32> crcsA;
 
   95    std::set<wxUint32> crcsB;
 
   98    for( wxZipEntry* entry = zipStreamA.GetNextEntry(); entry; entry = zipStreamA.GetNextEntry() )
 
  100        crcsA.insert( entry->GetCrc() );
 
  103    for( wxZipEntry* entry = zipStreamB.GetNextEntry(); entry; entry = zipStreamB.GetNextEntry() )
 
  105        crcsB.insert( entry->GetCrc() );
 
  108    return crcsA == crcsB;
 
 
  116    wxFFileInputStream stream( aSrcFile );
 
  124    const wxArchiveClassFactory* archiveClassFactory =
 
  125            wxArchiveClassFactory::Find( aSrcFile, wxSTREAM_FILEEXT );
 
  127    if( !archiveClassFactory )
 
  133    std::unique_ptr<wxArchiveInputStream> archiveStream( archiveClassFactory->NewStream( stream ) );
 
  137    for( wxArchiveEntry* entry = archiveStream->GetNextEntry(); entry;
 
  138         entry = archiveStream->GetNextEntry() )
 
  140        fileStatus.Printf( 
_( 
"Extracting file '%s'." ), entry->GetName() );
 
  143        wxString fullname = aDestDir + entry->GetName();
 
  146        wxString t_path = wxPathOnly( fullname );
 
  148        if( !wxDirExists( t_path ) )
 
  150            wxFileName::Mkdir( t_path, wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL );
 
  158        wxTempFileOutputStream outputFileStream( fullname );
 
  160        if( 
CopyStreamData( *archiveStream, outputFileStream, entry->GetSize() ) )
 
  161            outputFileStream.Commit();
 
  166        wxFileName outputFileName( fullname );
 
  167        wxDateTime fileTime = entry->GetDateTime();
 
  171        outputFileName.SetTimes( &fileTime, &fileTime, &fileTime );
 
 
  180                                REPORTER& aReporter, 
bool aVerbose, 
bool aIncludeExtraFiles )
 
  183    std::set<wxString> extensions;
 
  184    std::set<wxString> files;                
 
  203    if( aIncludeExtraFiles )
 
  218        extensions.emplace( 
"nc" );                                             
 
  219        extensions.emplace( 
"xnc" );                                            
 
  230        extensions.emplace( 
"pkg" );
 
  236    wxASSERT( gerberFiles.IsValid() );
 
  240    wxString oldCwd = wxGetCwd();
 
  242    wxFileName sourceDir( aSrcDir, wxEmptyString, wxEmptyString );
 
  244    wxSetWorkingDirectory( aSrcDir );
 
  246    wxFFileOutputStream ostream( aDestFile );
 
  248    if( !ostream.IsOk() )   
 
  250        msg.Printf( 
_( 
"Failed to create file '%s'." ), aDestFile );
 
  255    wxZipOutputStream zipstream( ostream, -1, wxConvUTF8 );
 
  257    wxDir projectDir( aSrcDir );
 
  259    if( !projectDir.IsOpened() )
 
  263            msg.Printf( 
_( 
"Error opening directory: '%s'." ), aSrcDir );
 
  267        wxSetWorkingDirectory( oldCwd );
 
  271    size_t uncompressedBytes = 0;
 
  274    projectDir.Traverse( traverser );
 
  278        wxFileName fn( fileName );
 
  279        wxString extLower = fn.GetExt().Lower();
 
  280        wxString fileNameLower = fn.GetName().Lower();
 
  281        bool archive = 
false;
 
  283        if( !extLower.IsEmpty() )
 
  285            if( ( extensions.find( extLower ) != extensions.end() )
 
  286              || ( aIncludeExtraFiles && gerberFiles.Matches( extLower ) ) )
 
  289        else if( !fileNameLower.IsEmpty() && ( files.find( fileNameLower ) != files.end() ) )
 
  298        fn.MakeRelativeTo( aSrcDir );
 
  300        wxString relativeFn = fn.GetFullPath();
 
  303        wxFSFile* infile = fsFile.OpenFile( relativeFn );
 
  307            zipstream.PutNextEntry( relativeFn, infile->GetModificationTime() );
 
  308            infile->GetStream()->Read( zipstream );
 
  309            zipstream.CloseEntry();
 
  311            uncompressedBytes += infile->GetStream()->GetSize();
 
  315                msg.Printf( 
_( 
"Archived file '%s'." ), relativeFn );
 
  325                msg.Printf( 
_( 
"Failed to archive file '%s'." ), relativeFn );
 
  332            []( 
size_t aSize ) -> wxString
 
  334                constexpr float KB = 1024.0;
 
  335                constexpr float MB = KB * 1024.0;
 
  338                    return wxString::Format( wxT( 
"%0.2f MB" ), aSize / MB );
 
  339                else if( aSize >= KB )
 
  340                    return wxString::Format( wxT( 
"%0.2f KB" ), aSize / KB );
 
  342                    return wxString::Format( wxT( 
"%zu bytes" ), aSize );
 
  345    size_t        zipBytesCnt       = ostream.GetSize();
 
  347    if( zipstream.Close() )
 
  349        msg.Printf( 
_( 
"Zip archive '%s' created (%s uncompressed, %s compressed)." ),
 
  351                    reportSize( uncompressedBytes ),
 
  352                    reportSize( zipBytesCnt ) );
 
  357        msg.Printf( wxT( 
"Failed to create file '%s'." ), aDestFile );
 
  362    wxSetWorkingDirectory( oldCwd );
 
 
const std::vector< wxString > & GetFilesToArchive() const
 
virtual wxDirTraverseResult OnDir(const wxString &aDirname) override
 
virtual wxDirTraverseResult OnFile(const wxString &aFilename) override
 
std::vector< wxString > m_files
 
PROJECT_ARCHIVER_DIR_ZIP_TRAVERSER(const wxString &aPrjDir)
 
static bool Archive(const wxString &aSrcDir, const wxString &aDestFile, REPORTER &aReporter, bool aVerbose=true, bool aIncludeExtraFiles=false)
Create an archive of the project.
 
static bool Unarchive(const wxString &aSrcFile, const wxString &aDestDir, REPORTER &aReporter)
Extract an archive of the current project over existing files.
 
static bool AreZipArchivesIdentical(const wxString &aZipFileA, const wxString &aZipFileB, REPORTER &aReporter)
Compare the CRCs of all the files in zip archive to determine whether the archives are identical.
 
A pure virtual class used to derive REPORTER objects from.
 
virtual REPORTER & Report(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED)
Report a string with a given severity.
 
static const std::string LegacySchematicFileExtension
 
static const wxString GerberFileExtensionsRegex
 
static const std::string NetlistFileExtension
 
static const std::string SymbolLibraryTableFileName
 
static const std::string GerberJobFileExtension
 
static const std::string StepFileAbrvExtension
 
static const std::string WorkbookFileExtension
 
static const std::string ReportFileExtension
 
static const std::string ProjectFileExtension
 
static const std::string FootprintPlaceFileExtension
 
static const std::string JsonFileExtension
 
static const std::string LegacyPcbFileExtension
 
static const std::string LegacyProjectFileExtension
 
static const std::string ProjectLocalSettingsFileExtension
 
static const std::string KiCadSchematicFileExtension
 
static const std::string LegacySymbolLibFileExtension
 
static const std::string DesignBlockLibraryTableFileName
 
static const std::string KiCadSymbolLibFileExtension
 
static const std::string SpiceFileExtension
 
static const std::string PdfFileExtension
 
static const std::string TextFileExtension
 
static const std::string FootprintLibraryTableFileName
 
static const std::string GencadFileExtension
 
static const std::string DrawingSheetFileExtension
 
static const std::string IbisFileExtension
 
static const std::string IpcD356FileExtension
 
static const std::string KiCadJobSetFileExtension
 
static const std::string LegacyFootprintLibPathExtension
 
static const std::string PythonFileExtension
 
static const std::string StepFileExtension
 
static const std::string LegacySymbolDocumentFileExtension
 
static const std::string FootprintAssignmentFileExtension
 
static const std::string DrillFileExtension
 
static const std::string SpiceSubcircuitFileExtension
 
static const std::string SpiceModelFileExtension
 
static const std::string DesignRulesFileExtension
 
static const std::string VrmlFileExtension
 
static const std::string KiCadFootprintFileExtension
 
static const std::string KiCadPcbFileExtension
 
This file contains miscellaneous commonly used macros and functions.
 
Definition of file extensions used in Kicad.
 
static bool CopyStreamData(wxInputStream &inputStream, wxOutputStream &outputStream, wxFileOffset size)