compilers (tested on Irix 6.5 with -mips3 -n32). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@623 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			327 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			327 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
 * 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) );
 | 
						|
  };
 | 
						|
};
 | 
						|
 | 
						|
*/
 |