/* * Program: FMJobs.cpp * * Author: Robert Roebling * * Copyright: (C) 1997, GNU (Robert Roebling) * * 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, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifdef __GNUG__ #pragma implementation "FMJobs.h" #endif #include "FMJobs.h" #include "wx/utils.h" #include "wx/filefn.h" #include "wx/msgdlg.h" //----------------------------------------------------------------------------- // wxCopyStatusDia //----------------------------------------------------------------------------- IMPLEMENT_DYNAMIC_CLASS(wxCopyStatusDia,wxDialog); const ID_CANCEL_COPY = 1000; BEGIN_EVENT_TABLE(wxCopyStatusDia,wxDialog) EVT_BUTTON (ID_CANCEL_COPY, wxCopyStatusDia::OnCommand) END_EVENT_TABLE() wxCopyStatusDia::wxCopyStatusDia( wxFrame *parent, const wxString &dest, wxArrayString *files ) : wxDialog( parent, -1, "FileMaker copy job control", wxPoint(180,180), wxSize(500,200) ) { int w = 0; int h = 0; GetSize( &w, &h ); m_dest = dest; m_files = files; m_stop = FALSE; (void)new wxStaticText( this, -1, "Copying files", wxPoint(10,10) ); (void)new wxStaticText( this, -1, "from:", wxPoint(30,40) ); m_sourceMsg = new wxStaticText( this, -1, "", wxPoint(80,40), wxSize(200,-1) ); (void)new wxStaticText( this, -1, " to:", wxPoint(30,70) ); m_destMsg = new wxStaticText( this, -1, "", wxPoint(80,70), wxSize(200,-1) ); (void)new wxStaticText( this, -1, " Kb copied:", wxPoint(30,100) ); m_statusMsg = new wxStaticText( this, -1, "0", wxPoint(120,100), wxSize(100,-1) ); m_cancelButton = new wxButton( this, ID_CANCEL_COPY, "Return", wxPoint(w-130,h-50), wxSize(85,30) ); Centre( wxVERTICAL | wxHORIZONTAL ); m_timer = new wxCopyTimer( this ); m_timer->Start( 300, TRUE ); Show( TRUE ); }; wxCopyStatusDia::~wxCopyStatusDia() { delete m_timer; }; void wxCopyStatusDia::OnCommand( wxCommandEvent &WXUNUSED(event) ) { if (m_stop) EndModal(wxID_CANCEL); m_stop = TRUE; }; void wxCopyStatusDia::DoCopy(void) { wxYield(); if (!wxDirExists(m_dest)) { wxMessageBox( "Target is not a directory or it doesn`t exist. Can`t copy.", "FileMaker" ); return; }; for (uint i = 0; i < m_files->Count(); i++) { wxString src = (*m_files)[i]; if (wxDirExists( src )) CopyDir( src, m_dest ); else CopyFile( src, m_dest ); if (m_stop) return; }; m_stop = TRUE; }; void wxCopyStatusDia::CopyDir( wxString &srcDir, wxString &destDir ) { wxString src = srcDir; wxString dest = destDir; dest += "/"; dest += wxFileNameFromPath( src ); if (!wxMkdir( dest )) { wxMessageBox( "Could not create target directory.", "FileMaker" ); return; }; wxArrayString list; src += "/*"; char *f = wxFindFirstFile( src, wxDIR ); while (f) { list.Add( f ); f = wxFindNextFile(); }; for (uint i = 0; i < list.Count(); i++) { wxString filename = list[i]; if (wxDirExists( filename )) CopyDir( filename, dest ); else CopyFile( filename, dest ); if (m_stop) return; }; }; void wxCopyStatusDia::CopyFile( wxString &src, wxString &destDir ) { m_sourceMsg->SetLabel( src ); wxString dest = destDir; dest += "/"; dest += wxFileNameFromPath( src ); m_destMsg->SetLabel( dest ); wxYield(); if (wxFileExists(dest)) { wxString s = "Target file "; s += dest; s += " exists already. Overwrite?"; int ret = wxMessageBox( s, "FileMaker", wxYES_NO ); if (ret == wxNO) return; }; FILE *fs = (FILE *) NULL, *fd = (FILE *) NULL; if (!(fs = fopen(src, "rb"))) { wxString s = "Cannot open source file "; s += src; s += "."; wxMessageBox( s, "FileMaker" ); return; } else if (!(fd = fopen(dest, "wb"))) { fclose(fs); wxString s = "Cannot open target file "; s += dest; s += "."; wxMessageBox( s, "FileMaker" ); return; }; int ch; long kcounter = 0; while (!m_stop) { int counter = 0; while ((ch = getc( fs )) != EOF) { putc( ch, fd ); counter++; if (counter == 1000) break; }; kcounter++; m_statusMsg->SetLabel( IntToString( kcounter) ); wxYield(); if (ch == EOF) break; }; fclose( fs ); fclose( fd ); }; //----------------------------------------------------------------------------- // wxDeleteStatusDia //----------------------------------------------------------------------------- /* IMPLEMENT_DYNAMIC_CLASS(wxDeleteStatusDia,wxDialogBox); wxDeleteStatusDia::wxDeleteStatusDia( wxFrame *parent, wxStringList *files ) : wxDialogBox( parent, "FileMaker delete job control", TRUE, 180, 180, 500, 200, wxCAPTION | wxTRANSIENT ) { int w = 0; int h = 0; GetSize( &w, &h ); m_files = files; m_stop = FALSE; m_countFiles = 0; m_countDirs = 0; wxFont *myFont = wxTheFontList->FindOrCreateFont( 12, wxROMAN, wxNORMAL, wxNORMAL ); SetLabelFont( myFont ); SetButtonFont( myFont ); wxStaticText *msg = new wxStaticText( this, "Deleting file or directory:", 10, 10 ); m_targetMsg = new wxStaticText( this, "", 80, 40, 300 ); msg = new wxStaticText( this, " Directories deleted:", 10, 80 ); m_dirsMsg = new wxStaticText( this, "0", 120, 80, 80 ); msg = new wxStaticText( this, " Files deleted:", 10, 110 ); m_filesMsg = new wxStaticText( this, "0", 120, 110, 100 ); m_cancelButton = new wxButton( this, NULL, "Return", w-130, h-50, 85, 30 ); Centre( wxVERTICAL | wxHORIZONTAL ); m_timer = new wxDeleteTimer( this ); m_timer->Start( 300, TRUE ); Show( TRUE ); }; wxDeleteStatusDia::~wxDeleteStatusDia() { delete m_timer; }; void wxDeleteStatusDia::OnCommand( wxWindow &win, wxCommandEvent &WXUNUSED(event) ) { if (&win == m_cancelButton) { if (m_stop) Show( FALSE ); m_stop = TRUE; return; }; }; void wxDeleteStatusDia::DoDelete(void) { while (wxTheApp->Pending()) wxTheApp->Dispatch(); wxNode *node = m_files->First(); while (node) { char *target = (char*)node->Data(); if (wxDirExists( target )) DeleteDir( target ); else DeleteFile( target ); if (m_stop) return; node = node->Next(); }; m_stop = TRUE; }; void wxDeleteStatusDia::DeleteDir( char *target ) { wxString s = target; s += "// *"; wxStringList list; char *f = wxFindFirstFile( s ); while (f) { list.Add( f ); f = wxFindNextFile(); }; wxNode *node = list.First(); while (node) { f = (char*)node->Data(); if (wxDirExists( f )) DeleteDir( f ); else DeleteFile( f ); if (m_stop) return; node = node->Next(); }; if (!wxRmdir( target )) { s = "Could not remove directory "; s += target; s += "."; wxMessageBox( s, "FileMaker" ); return; } else { m_countDirs++; m_dirsMsg->SetLabel( wxIntToString( m_countDirs) ); }; }; void wxDeleteStatusDia::DeleteFile( char *target ) { m_targetMsg->SetLabel( target ); while (wxTheApp->Pending()) wxTheApp->Dispatch(); if (!wxRemoveFile( target )) { wxString s = "Could not delete file "; s += target; s += "."; wxMessageBox( s, "FileMaker" ); } else { m_countFiles++; m_filesMsg->SetLabel( wxIntToString( m_countFiles) ); }; }; */