files-io.cpp 6.68 KB
Newer Older
1 2 3
/**
 * @file kicad/files-io.cpp
 */
4

5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
/*
 * This program source code file is part of KiCad, a free EDA CAD application.
 *
 * Copyright (C) 2004-2012 Jean-Pierre Charras
 * Copyright (C) 2004-2012 KiCad Developers, see change_log.txt for contributors.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you may find one here:
 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * or you may search the http://www.gnu.org website for the version 2 license,
 * or you may write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
 */
28

29 30
#include <fctsys.h>
#include <appl_wxstruct.h>
31
#include <wx/fs_zip.h>
32
#include <wx/zipstrm.h>
33 34 35
#include <wx/docview.h>
#include <wx/wfstream.h>
#include <wx/zstream.h>
36
#include <wx/dir.h>
37

38 39 40
#include <confirm.h>
#include <gestfich.h>
#include <macros.h>
41

42
#include <kicad.h>
43

44 45
static const wxString ZipFileExtension( wxT( "zip" ) );
static const wxString ZipFileWildcard( wxT( "Zip file (*.zip) | *.zip" ) );
46 47


48
void KICAD_MANAGER_FRAME::OnFileHistory( wxCommandEvent& event )
49 50 51
{
    wxString fn;

52
    fn = GetFileFromHistory( event.GetId(), _( "KiCad project file" ) );
53 54 55

    if( fn != wxEmptyString )
    {
56 57 58
        wxCommandEvent cmd( 0, wxID_ANY );
        m_ProjectFileName = fn;
        OnLoadProject( cmd );
59 60 61
    }
}

62
void KICAD_MANAGER_FRAME::OnUnarchiveFiles( wxCommandEvent& event )
63
{
64 65
    wxFileName fn = m_ProjectFileName;
    fn.SetExt( ZipFileExtension );
66

67 68 69
    wxFileDialog dlg( this, _( "Unzip Project" ), fn.GetPath(),
                      fn.GetFullName(), ZipFileWildcard,
                      wxFD_OPEN | wxFD_FILE_MUST_EXIST );
70

71
    if( dlg.ShowModal() == wxID_CANCEL )
72 73
        return;

74 75 76
    wxString msg;
    msg.Printf( _("\nOpen <%s>\n" ), GetChars( dlg.GetPath() ) );
    PrintMsg( msg );
77

78 79 80 81
    wxDirDialog dirDlg( this, _( "Target Directory" ), fn.GetPath(),
                        wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST );

    if( dirDlg.ShowModal() == wxID_CANCEL )
82 83
        return;

84
    wxSetWorkingDirectory( dirDlg.GetPath() );
85 86
    msg.Printf( _( "Unzipping project in <%s>\n" ), GetChars( dirDlg.GetPath() ) );
    PrintMsg( msg );
87 88 89

    wxFileSystem zipfilesys;
    zipfilesys.AddHandler( new wxZipFSHandler );
90
    zipfilesys.ChangePathTo( dlg.GetPath() + wxT( "#zip:" ) );
91 92 93 94 95 96 97 98 99 100 101 102

    wxFSFile* zipfile = NULL;
    wxString  localfilename = zipfilesys.FindFirst( wxT( "*.*" ) );

    while( !localfilename.IsEmpty() )
    {
        zipfile = zipfilesys.OpenFile( localfilename );
        if( zipfile == NULL )
        {
            DisplayError( this, wxT( "Zip file read error" ) );
            break;
        }
103 104 105

        wxString unzipfilename = localfilename.AfterLast( ':' );

106 107
        msg.Printf( _( "Extract file <%s>" ), GetChars( unzipfilename ) );
        PrintMsg( msg );
108

109
        wxInputStream*       stream = zipfile->GetStream();
110 111

        wxFFileOutputStream* ofile = new wxFFileOutputStream( unzipfilename );
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127

        if( ofile->Ok() )
        {
            ofile->Write( *stream );
            PrintMsg( _( " OK\n" ) );
        }
        else
            PrintMsg( _( " *ERROR*\n" ) );

        delete ofile;
        delete zipfile;
        localfilename = zipfilesys.FindNext();
    }

    PrintMsg( wxT( "** end **\n" ) );

128
    wxSetWorkingDirectory( fn.GetPath() );
129 130
}

131

132
void KICAD_MANAGER_FRAME::OnArchiveFiles( wxCommandEvent& event )
133
{
134 135
    /* List of file extensions to save. */
    static const wxChar* extentionList[] = {
136
        wxT( "*.sch" ), wxT( "*.lib" ), wxT( "*.mod" ), wxT( "*.cmp" ),
137
        wxT( "*.brd" ), wxT( "*.kicad_pcb" ),
138
        wxT( "*.net" ), wxT( "*.pro" ), wxT( "*.pho" ), wxT( "*.py" ),
139
        wxT( "*.pdf" ), wxT( "*.txt" ), wxT( "*.dcm" ), wxT( "*.kicad_wks" ),
140 141 142 143
        NULL
    };

    wxString msg;
144 145 146
    size_t i;
    wxFileName fileName = m_ProjectFileName;
    wxString oldPath = wxGetCwd();
147

148
    fileName.SetExt( wxT( "zip" ) );
149

150 151 152
    wxFileDialog dlg( this, _( "Archive Project Files" ),
                      fileName.GetPath(), fileName.GetFullName(),
                      ZipFileWildcard, wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
153

154 155
    if( dlg.ShowModal() == wxID_CANCEL )
        return;
156

157 158

    wxFileName zip = dlg.GetPath();
159

160 161 162
    wxString currdirname = wxT( "." );
    currdirname += zip.GetPathSeparator();
    wxDir dir( currdirname );
163

164 165
    if( !dir.IsOpened() )
        return;
166

167 168
    // Prepare the zip file
    wxString zipfilename = zip.GetFullPath();
169

170 171 172 173 174 175 176
    wxFFileOutputStream ostream(zipfilename);
    wxZipOutputStream zipstream( ostream );

    // Build list of filenames to put in zip archive
    wxString currFilename;
    int zipBytesCnt = 0;    // Size of the zip file
    for( i = 0; extentionList[i] != 0; i++ )
177
    {
178
        bool cont = dir.GetFirst( &currFilename, extentionList[i] );
179

180
        while( cont )
181
        {
182
            wxFileSystem fsfile;
183 184
            msg.Printf(_( "Archive file <%s>" ), GetChars( currFilename ) );
            PrintMsg( msg );
185 186 187 188 189 190 191 192 193 194 195 196 197 198
            // Read input file and put it in zip file:
            wxFSFile * infile = fsfile.OpenFile(currFilename);
            if( infile )
            {
                zipstream.PutNextEntry( currFilename, infile->GetModificationTime() );
                infile->GetStream()->Read( zipstream );
                zipstream.CloseEntry();
                int zippedsize = zipstream.GetSize() - zipBytesCnt;
                zipBytesCnt = zipstream.GetSize();
                PrintMsg( wxT("  ") );
                msg.Printf( _( "(%d bytes, compressed %d bytes)\n"),
                            infile->GetStream()->GetSize(), zippedsize );
                PrintMsg( msg );
                delete infile;
199
            }
200 201 202 203 204 205
            else
            {
                PrintMsg( _(" >>Error\n") );
            }

            cont = dir.GetNext( &currFilename );
206 207
        }
    }
208

209 210
    zipBytesCnt = ostream.GetSize();
    if( zipstream.Close() )
211
    {
212 213
        msg.Printf( _("\nZip archive <%s> created (%d bytes)" ),
                    GetChars( zipfilename ), zipBytesCnt );
214
        PrintMsg( msg );
215 216 217
        PrintMsg( wxT( "\n** end **\n" ) );
    }
    else
218 219 220 221 222
    {
        msg.Printf( wxT( "Unable to create archive <%s>, abort\n" ),
                  GetChars( zipfilename ) );
        PrintMsg( msg );
    }
223

224
    wxSetWorkingDirectory( oldPath );
225
}