package com.algobase.share.network;

import java.io.File;

public class XClient extends LedaSocket {

   String host = null;
   int port = 0;

   public XClient() {
     setNumSizeBytes(4);
     setTimeout(10000);
     host = "chomsky.uni-trier.de";
     port = 9668;
   }

   public XClient(String host, int port) {
     setNumSizeBytes(4);
     setTimeout(10000);
     this.host = host;
     this.port = port;
   }

   public void setNumSizeBytest(int n) { super.setNumSizeBytes(n); }

   public void setHost(String h) { host = h; }
   public void setPort(int p) { port = p; }

   private boolean connect()
   { if (!super.connect(host,port)) return false;
     int r = receiveInt();
     sendInt(9660);
     String s = receiveString();
     if (s == null || !s.equals("ok"))  return false;
     return true;
   }
  

   public String getLine(String fname, int n)
   {
     if (!connect()) return null;

     if (n == 0) return null;

     if (n > 0)
       sendString("head -n" + n + " " + fname + " | tail -n1 ");
     else
       sendString("tail -n" + -n + " " + fname + " | head -n1 ");

     String s = receiveString();
     disconnect();
     return s;
   }

   public String exec(String cmd)
   { if (!connect()) return null;
     sendString(cmd);
     String s = receiveString();
     disconnect();
     return s;
   }

   public String getFiles(String[] remote)
   { String cmd = "cat";
     for(int i=0; i<remote.length; i++) {
        String fn = remote[i];
        cmd += " ";
        if (!fn.startsWith("/")) cmd += "~/";
        cmd += fn;
     }
     return exec(cmd);
    }


   public String getFile(String remote)
   {
     if (!connect()) return null;

     sendString("get");
     sendString(remote);

     if (!receiveString().equals("ok")) return null;

     sendString("send");

     String s = receiveString();
     disconnect();
     return s;
   }


   public boolean getFile(String remote, File file)
   {
     if (!connect()) return false;

     sendString("get");
     sendString(remote);

     if (!receiveString().equals("ok")) {
       error_msg = "file not found";
       return false;
     }

     sendString("send");
     receiveFile(file);

     disconnect();
     return true;
   }

   public boolean putFile(File file, String remote)
   {
     if (!connect()) return false;

     sendString("put");
     sendString(file.getName());
     sendString(remote);

     if (!receiveString().equals("ok")) return false;

     sendFile(file);

     disconnect();
     return true;
   }

   public String printFile(File file)
   {
     if (!connect()) return null;

     sendString("print");
     if (!receiveString().equals("ok")) return null;

     sendString(file.getName());
     if (!receiveString().equals("ok")) return null;

     sendFile(file);

     String s = receiveString(); 
     disconnect();
     return s;
   }



   public boolean putString(String txt, String fname)
   {
     if (!connect()) return false;

     sendString("put");
     sendString(fname);
     //sendString("/home/naeher");

     if (!receiveString().equals("ok")) return false;

     sendString(txt);

     disconnect();
     return true;
   }

   public boolean appendString(String txt, String fname)
   {
     if (!connect()) return false;

     sendString("app");
     sendString(fname);
     //sendString("/home/naeher");

     if (!receiveString().equals("ok")) return false;

     sendString(txt);

     disconnect();
     return true;
   }


   public String runCmd(String cmd) { return exec(cmd);  }

}
