001package org.vishia.commander.target;
002
003import java.io.Closeable;
004import java.io.File;
005import java.io.FileNotFoundException;
006import java.io.IOException;
007
008import org.vishia.util.FileSystem;
009
010public class FcmdtCopyCmd implements Closeable
011{
012  
013  boolean bRun;
014
015  String sSrc, sDst;
016  
017  String[] param;
018  
019  Runnable threadRun = new Runnable(){
020    @Override public void run(){ threadRun(); }
021  };
022  
023  Thread threadMng = new Thread(threadRun, "CopyCmd");
024
025  FcmdtCopyCmd(){
026    //threadMng.start();    
027  }
028  
029  void startCopy(int cmd, String sParam){
030    String sSrc; String sDst;
031    String[] srcDst = sParam.split("\n");
032    synchronized(this){
033      this.sDst = srcDst[0]; this.sSrc = srcDst[1];
034      this.param = srcDst;
035      notify();
036    }
037  }
038  
039
040  private boolean doCopy(){
041    boolean bOk = true;
042    File fileSrc = new File(sSrc);
043    if(sDst.indexOf('/') <0){ 
044      //dst: only the filename is given, use the source directory.
045      File srcDir = fileSrc.getParentFile();
046      if(srcDir !=null){
047        String srcPath = FileSystem.getCanonicalPath(srcDir);
048        sDst = srcPath + "/" + sDst;
049      }
050    }
051    File fileDst = new File(sDst);
052    if(fileSrc.exists()){
053      if(fileSrc.isDirectory()){
054        
055      } else { //fileSrc is a file
056        if(fileDst.exists()){
057          if(!fileDst.canWrite()){
058            //confirm overwrite
059            bOk = false;
060          } else {
061            bOk = fileDst.delete();
062          }
063        }//fileDst exists
064        if(bOk){
065          File dstDir = fileDst.getParentFile();
066          if(!dstDir.exists()){
067            try{ FileSystem.mkDirPath(fileDst); }
068            catch(FileNotFoundException exc){
069              bOk = false;
070              //confirm faulty dst path
071            }
072          }
073        }
074        //fileSrc is a file
075        if(bOk){
076          int nrofBytesCopied;
077          try{ nrofBytesCopied = FileSystem.copyFile(fileSrc, fileDst); }
078          catch(IOException exc){
079            bOk = false;
080          }
081        }
082      }
083    } else { //fileSrc doesn't exists
084      bOk = false;
085    }
086    return bOk;
087  }
088
089  
090  void threadRun(){
091    bRun = true;
092    while(bRun){
093      synchronized(this){
094        if(param == null){
095          try{wait(); } catch(InterruptedException exc){}
096        }  
097      }
098      if(param !=null){
099        doCopy();
100        param = null;
101      }
102    }
103  }
104
105  
106  
107  @Override public void close()
108  {
109    bRun = false;
110    synchronized(this){ notify(); }
111  }
112  
113  
114}