//***************************************************************************** //* //* (c) Copyright 2004. Glub Tech, Incorporated. All Rights Reserved. //* //* $Id: MDeleteCommand.java 37 2009-05-11 22:46:15Z gary $ //* //***************************************************************************** package com.glub.secureftp.client.gui; import com.glub.secureftp.bean.*; import com.glub.secureftp.client.framework.*; import com.glub.gui.*; import com.glub.util.*; import javax.swing.*; import java.awt.Cursor; import java.io.*; import java.util.*; public class MDeleteCommand extends NetworkCommand { private boolean displayedWarning = false; private static int level = 0; public MDeleteCommand() { super("mdelete", CommandID.MDELETE_COMMAND_ID, 2, 2, "remote-file session", "delete multiple files and/or directories"); //setBeepWhenDone( true ); } public MDeleteCommand( boolean displayedWarning ) { this(); this.displayedWarning = displayedWarning; } public SecureFTPError doIt() throws CommandException { SecureFTPError result = super.doIt(); if ( level == 0 ) { SecureFTP.getBaseFrame().setCursor( new Cursor(Cursor.WAIT_CURSOR) ); } RemoteFileList files = (RemoteFileList)getArgs().get(0); FTPSession session = (FTPSession)getArgs().get(1); //String pwd = ((RemotePanel)session.getRemoteUI()).getCurrentDirectory(); if ( !displayedWarning ) { displayedWarning = true; LString msg = null; if ( files.size() == 1 && !files.getFile(0).isDirectory() ) { msg = new LString("DeleteDialog.confirmation.one_file", "You are about to permanently delete: [^0]"); msg.replace( 0, files.getFile(0).getFileName() ); } else { msg = new LString("DeleteDialog.confirmation.mult_files", "You are about to permanently delete multiple files."); } LString title = new LString("DeleteDialog.confirmation.title", "Delete Confirmation"); Object[] options = { LString.getString("Common.button.ok", "OK"), LString.getString("Common.button.cancel", "Cancel") }; int r = JOptionPane.showOptionDialog( SecureFTP.getBaseFrame(), new GTLabel(msg, 400), title.getString(), JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[1] ); if ( JOptionPane.YES_OPTION == r ) { } else { result.setCode( SecureFTPError.DELETE_ABORTED ); level = 0; SecureFTP.getBaseFrame().setCursor( new Cursor(Cursor.DEFAULT_CURSOR) ); return result; } } for( int i = 0; i < files.size(); i++ ) { RemoteFile fileName = files.getFile(i); if ( fileName.isDirectory() || fileName.isLink() || !fileName.isKnownFileType() ) { RemoteFileList fileList = new RemoteFileList(); session.getFTPBean().setSendCmdStream(null); session.getFTPBean().setRecvCmdStream(null); boolean fileIsDir = fileName.isDirectory(); boolean changedDir = false; try { ByteArrayOutputStream baosSend = new ByteArrayOutputStream(); ByteArrayOutputStream baosRecv = new ByteArrayOutputStream(); session.getFTPBean().setSendCmdStream(baosSend); session.getFTPBean().setRecvCmdStream(baosRecv); session.getFTPBean().chdir(fileName); changedDir = true; session.getOutputStream().write(baosSend.toByteArray()); session.getOutputStream().write(baosRecv.toByteArray()); fileIsDir = true; } catch ( Exception e ) { fileIsDir = false; } if ( fileIsDir ) { try { fileList.clear(); fileList = session.getFTPBean().listAll(); } catch ( Exception e ) { } } session.getFTPBean().setSendCmdStream(session.getOutputStream()); session.getFTPBean().setRecvCmdStream(session.getOutputStream()); if ( fileList.size() == 0 ) { ErrorDialog.showDialog( new LString("DeleteDialog.no_file", "No such file or directory.") ); result.setCode( SecureFTPError.NO_SUCH_FILE ); } for ( int j = 0; j < fileList.size(); j++ ) { if ( fileList.getFile(j).getFileName().equals(".") || fileList.getFile(j).getFileName().equals("..") ) { continue; } else { try { MDeleteCommand mdel = new MDeleteCommand( true ); level++; ArrayList args = new ArrayList(1); RemoteFileList newList = new RemoteFileList(); newList.add( fileList.getFile(j) ); args.add( newList ); args.add(session); mdel.setArgs( args ); result = SecureFTP.getCommandDispatcher().fireCommand(this, mdel); if ( SecureFTPError.OK != result.getCode() ) { break; } } catch ( Exception e ) { } finally { level--; } } } if ( fileIsDir ) { try { if ( changedDir ) { session.getFTPBean().cdup(); } session.getFTPBean().rmdir(fileName); } catch ( FTPConnectionLostException fcle ) { SecureFTP.getCommandDispatcher().fireCommand(this, new CloseCommand()); ErrorDialog.showDialog( new LString("Common.connection_lost", "Connection lost.") ); result.setCode( SecureFTPError.NOT_CONNECTED ); return result; } catch ( FTPException fe ) { LString msg = new LString("Common.unknown.error", "An error has occurred: [^0]"); msg.replace( 0, fe.getMessage() ); ErrorDialog.showDialog( msg ); result.setCode( SecureFTPError.UNKNOWN ); } catch ( Exception e ) {} } } else { DeleteCommand del = new DeleteCommand(); ArrayList args = new ArrayList(1); args.add( fileName ); args.add( session ); del.setArgs( args ); result = SecureFTP.getCommandDispatcher().fireCommand(this, del); } } if ( 0 == level ) { SecureFTP.getCommandDispatcher().fireCommand(this, new LsCommand()); SecureFTP.getBaseFrame().setCursor( new Cursor(Cursor.DEFAULT_CURSOR) ); } return result; } }