From ff0fdeff5a119128650a9d51c6346853a83ce638 Mon Sep 17 00:00:00 2001
From: Thomas Oster <thomas.oster@rwth-aachen.de>
Date: Tue, 21 Jul 2015 23:37:09 +0200
Subject: [PATCH] Added (untested) HTTP Upload

---
 lib/corn-httpclient-1.0.12.jar                | Bin 0 -> 24802 bytes
 nbproject/project.properties                  |   4 +-
 .../drivers/GenericGcodeDriver.java           | 102 +++++++++++++++---
 3 files changed, 92 insertions(+), 14 deletions(-)
 create mode 100644 lib/corn-httpclient-1.0.12.jar

diff --git a/lib/corn-httpclient-1.0.12.jar b/lib/corn-httpclient-1.0.12.jar
new file mode 100644
index 0000000000000000000000000000000000000000..84f0b546db05da5a14dbe7c293757ad890fadf01
GIT binary patch
literal 24802
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

literal 0
HcmV?d00001

diff --git a/nbproject/project.properties b/nbproject/project.properties
index 7a20d16..72619c6 100644
--- a/nbproject/project.properties
+++ b/nbproject/project.properties
@@ -44,6 +44,7 @@ dist.javadoc.dir=${dist.dir}/javadoc
 endorsed.classpath=
 excludes=
 file.reference.commons-net-3.1.jar=lib/commons-net-3.1.jar
+file.reference.corn-httpclient-1.0.12.jar=lib/corn-httpclient-1.0.12.jar
 file.reference.GLPKSolverPack.jar=lib/GLPKSolverPack.jar
 file.reference.jna-4.0.0.jar=lib/jna-4.0.0.jar
 file.reference.js.jar=lib/js.jar
@@ -59,7 +60,8 @@ javac.classpath=\
     ${file.reference.GLPKSolverPack.jar}:\
     ${file.reference.SCPSolver.jar}:\
     ${file.reference.jna-4.0.0.jar}:\
-    ${file.reference.purejavacomm-0.0.22.jar}
+    ${file.reference.purejavacomm-0.0.22.jar}:\
+    ${file.reference.corn-httpclient-1.0.12.jar}
 # Space-separated list of extra javac options
 javac.compilerargs=
 javac.deprecation=false
diff --git a/src/com/t_oster/liblasercut/drivers/GenericGcodeDriver.java b/src/com/t_oster/liblasercut/drivers/GenericGcodeDriver.java
index df04f53..1b1463c 100644
--- a/src/com/t_oster/liblasercut/drivers/GenericGcodeDriver.java
+++ b/src/com/t_oster/liblasercut/drivers/GenericGcodeDriver.java
@@ -21,14 +21,20 @@ package com.t_oster.liblasercut.drivers;
 import com.t_oster.liblasercut.*;
 import com.t_oster.liblasercut.platform.Util;
 import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.PrintStream;
 import java.io.UnsupportedEncodingException;
 import java.net.InetSocketAddress;
 import java.net.Socket;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
 import purejavacomm.*;
 import java.util.*;
+import net.sf.corn.httpclient.HttpClient;
+import net.sf.corn.httpclient.HttpResponse;
 
 /**
  * This class implements a driver for a generic GRBL GCode Lasercutter.
@@ -43,13 +49,40 @@ public class GenericGcodeDriver extends LaserCutter {
   protected static final String SETTING_COMPORT = "COM Port";
   protected static final String SETTING_BEDWIDTH = "Laserbed width";
   protected static final String SETTING_BEDHEIGHT = "Laserbed height";
+  protected static final String SETTING_HTTP_UPLOAD_URL = "HTTP Upload URL";
   protected static final String SETTING_MAX_SPEED = "Max speed (in mm/min)";
   protected static final String SETTING_PRE_JOB_GCODE = "Pre-Job GCode (comma separated)";
   protected static final String SETTING_POST_JOB_GCODE = "Post-Job GCode (comma separated)";
+  protected static final String SETTING_RESOLUTIONS = "Supported DPI (comma separated)";
   protected static final String SETTING_IDENTIFICATION_STRING = "Board Identification String";
   protected static final String SETTING_WAIT_FOR_OK = "Wait for OK after each line (interactive mode)";
   protected static final String LINEEND = "\r\n";
   
+  protected String httpUploadUrl = "http://10.10.10.100/upload";
+
+  public String getHttpUploadUrl()
+  {
+    return httpUploadUrl;
+  }
+
+  public void setHttpUploadUrl(String httpUploadUrl)
+  {
+    this.httpUploadUrl = httpUploadUrl;
+  }
+  
+  protected String supportedResolutions = "100,500,1000";
+
+  public String getSupportedResolutions()
+  {
+    return supportedResolutions;
+  }
+
+  public void setSupportedResolutions(String supportedResolutions)
+  {
+    this.resolutions = null;
+    this.supportedResolutions = supportedResolutions;
+  }
+  
   protected boolean waitForOKafterEachLine = true;
 
   public boolean isWaitForOKafterEachLine()
@@ -252,6 +285,17 @@ public class GenericGcodeDriver extends LaserCutter {
     }
   }
   
+  protected void http_upload(URI url, String data, String filename) throws IOException
+  {
+    HttpClient client = new HttpClient(url);
+    client.putAdditionalRequestProperty("X-Filename", filename);
+    HttpResponse response = client.sendData(HttpClient.HTTP_METHOD.POST, data);
+    if (response == null || response.hasError())
+    {
+      throw new IOException("Error during POST Request");
+    }
+  }
+  
   protected String connect_serial(CommPortIdentifier i, ProgressListener pl) throws PortInUseException, IOException
   {
     pl.taskChanged(this, "opening '"+i.getName()+"'");
@@ -294,9 +338,13 @@ public class GenericGcodeDriver extends LaserCutter {
       return "Not a serial Port "+comport;
     }
   }
-  
+  /**
+   * Used to buffer the file before uploading via http
+   */
+  private ByteArrayOutputStream outputBuffer;
   protected void connect(ProgressListener pl) throws IOException, PortInUseException, NoSuchPortException
   {
+    outputBuffer = null;
     if (getHost() != null && getHost().length() > 0)
     {
       socket = new Socket();
@@ -337,26 +385,42 @@ public class GenericGcodeDriver extends LaserCutter {
         throw new IOException(error);
       }
     }
+    else if (getHttpUploadUrl() != null && getHttpUploadUrl().length() > 0)
+    {
+      outputBuffer = new ByteArrayOutputStream();
+      out = new PrintStream(outputBuffer);
+      setWaitForOKafterEachLine(false);
+      in = null;
+    }
     else
     {
       throw new IOException("Either COM Port or IP/Host has to be set");
     }
   }
   
-  protected void disconnect() throws IOException
+  protected void disconnect() throws IOException, URISyntaxException
   {
-    in.close();
-    out.close();
-    if (this.socket != null)
+    if (outputBuffer != null)
     {
-      socket.close();
-      socket = null;
+      out.close();
+      http_upload(new URI(getHttpUploadUrl()), outputBuffer.toString("UTF-8"), "VisiCut.gcode");
     }
-    else if (this.port != null)
+    else
     {
-      this.port.close();
-      this.port = null;
+      in.close();
+      out.close();
+      if (this.socket != null)
+      {
+        socket.close();
+        socket = null;
+      }
+      else if (this.port != null)
+      {
+        this.port.close();
+        this.port = null;
+      }   
     }
+
   }
   
   @Override
@@ -404,9 +468,11 @@ public class GenericGcodeDriver extends LaserCutter {
   @Override
   public List<Double> getResolutions() {
     if (resolutions == null) {
-      resolutions = Arrays.asList(new Double[]{
-                500d
-              });
+      resolutions = new LinkedList<Double>();
+      for (String s : getSupportedResolutions().split(","))
+      {
+        resolutions.add(Double.parseDouble(s));
+      }
     }
     return resolutions;
   }
@@ -456,10 +522,12 @@ public class GenericGcodeDriver extends LaserCutter {
     SETTING_BEDHEIGHT,
     SETTING_COMPORT,
     SETTING_HOST,
+    SETTING_HTTP_UPLOAD_URL,
     SETTING_IDENTIFICATION_STRING,
     SETTING_MAX_SPEED,
     SETTING_PRE_JOB_GCODE,
     SETTING_POST_JOB_GCODE,
+    SETTING_RESOLUTIONS,
     SETTING_WAIT_FOR_OK
   };
 
@@ -480,6 +548,8 @@ public class GenericGcodeDriver extends LaserCutter {
       return this.getComport();
     } else if (SETTING_HOST.equals(attribute)) {
       return this.getHost();
+    } else if (SETTING_HTTP_UPLOAD_URL.equals(attribute)) {
+      return this.getHttpUploadUrl();
     } else if (SETTING_IDENTIFICATION_STRING.equals(attribute)) {
       return this.getIdentificationLine();
     } else if (SETTING_MAX_SPEED.equals(attribute)) {
@@ -488,6 +558,8 @@ public class GenericGcodeDriver extends LaserCutter {
       return this.getPreJobGcode();
     } else if (SETTING_POST_JOB_GCODE.equals(attribute)) {
       return this.getPostJobGcode();
+    } else if (SETTING_RESOLUTIONS.equals(attribute)) {
+      return this.getResolutions();
     } else if (SETTING_WAIT_FOR_OK.equals(attribute)) {
       return this.isWaitForOKafterEachLine();
     }
@@ -507,6 +579,8 @@ public class GenericGcodeDriver extends LaserCutter {
       this.setComport((String) value);
     } else if (SETTING_HOST.equals(attribute)) {
       this.setHost((String) value);
+    } else if (SETTING_HTTP_UPLOAD_URL.equals(attribute)) {
+      this.setHttpUploadUrl((String) value);
     } else if (SETTING_IDENTIFICATION_STRING.equals(attribute)) {
       this.setIdentificationLine((String) value);
     } else if (SETTING_MAX_SPEED.equals(attribute)) {
@@ -515,6 +589,8 @@ public class GenericGcodeDriver extends LaserCutter {
       this.setPreJobGcode((String) value);
     } else if (SETTING_POST_JOB_GCODE.equals(attribute)) {
       this.setPostJobGcode((String) value);
+    } else if (SETTING_RESOLUTIONS.equals(attribute)) {
+      this.setSupportedResolutions((String) value);
     } else if (SETTING_WAIT_FOR_OK.equals(attribute)) {
       this.setWaitForOKafterEachLine((Boolean) value);
     }
-- 
GitLab