add an ID for the server requests
[nikiroo-utils.git] / src / be / nikiroo / utils / serial / server / ServerString.java
index 4a185da50baf3ae03190a3e0d3b64c09bbbf285c..6fe4ad0df1a6aeb4d37aaba4de6a5f5bdf1ce306 100644 (file)
@@ -2,8 +2,7 @@ package be.nikiroo.utils.serial.server;
 
 import java.io.IOException;
 import java.net.Socket;
-
-import be.nikiroo.utils.Version;
+import java.net.UnknownHostException;
 
 /**
  * This class implements a simple server that can listen for connections and
@@ -23,14 +22,20 @@ abstract public class ServerString extends Server {
         *            the port to listen on, or 0 to assign any unallocated port
         *            found (which can later on be queried via
         *            {@link ServerString#getPort()}
-        * @param ssl
-        *            use a SSL connection (or not)
+        * @param key
+        *            an optional key to encrypt all the communications (if NULL,
+        *            everything will be sent in clear text)
         * 
         * @throws IOException
         *             in case of I/O error
+        * @throws UnknownHostException
+        *             if the IP address of the host could not be determined
+        * @throws IllegalArgumentException
+        *             if the port parameter is outside the specified range of valid
+        *             port values, which is between 0 and 65535, inclusive
         */
-       public ServerString(int port, boolean ssl) throws IOException {
-               super(port, ssl);
+       public ServerString(int port, String key) throws IOException {
+               super(port, key);
        }
 
        /**
@@ -41,51 +46,51 @@ abstract public class ServerString extends Server {
         *            the server name (only used for debug info and traces)
         * @param port
         *            the port to listen on
-        * @param ssl
-        *            use a SSL connection (or not)
+        * @param key
+        *            an optional key to encrypt all the communications (if NULL,
+        *            everything will be sent in clear text)
         * 
         * @throws IOException
         *             in case of I/O error
+        * @throws UnknownHostException
+        *             if the IP address of the host could not be determined
+        * @throws IllegalArgumentException
+        *             if the port parameter is outside the specified range of valid
+        *             port values, which is between 0 and 65535, inclusive
         */
-       public ServerString(String name, int port, boolean ssl) throws IOException {
-               super(name, port, ssl);
+       public ServerString(String name, int port, String key) throws IOException {
+               super(name, port, key);
        }
 
        @Override
        protected ConnectActionServer createConnectActionServer(Socket s) {
-               return new ConnectActionServerString(s) {
+               return new ConnectActionServerString(s, key) {
                        @Override
-                       public void action(Version clientVersion) throws Exception {
-                               try {
-                                       for (String data = rec(); data != null; data = rec()) {
-                                               String rep = null;
-                                               try {
-                                                       rep = onRequest(this, clientVersion, data);
-                                               } catch (Exception e) {
-                                                       onError(e);
-                                               }
-
-                                               if (rep == null) {
-                                                       rep = "";
+                       public void action() throws Exception {
+                               long id = getNextId();
+                               for (String data = rec(); data != null; data = rec()) {
+                                       String rep = null;
+                                       try {
+                                               rep = onRequest(this, data, id);
+                                               if (isClosing()) {
+                                                       return;
                                                }
+                                       } catch (Exception e) {
+                                               onError(e);
+                                       }
 
-                                               send(rep);
+                                       if (rep == null) {
+                                               rep = "";
                                        }
-                               } catch (NullPointerException e) {
-                                       // Client has no data any more, we quit
-                                       getTraceHandler()
-                                                       .trace(getName()
-                                                                       + ": client has data no more, stopping connection");
+                                       send(rep);
                                }
+
+                               onRequestDone(id, getBytesReceived(), getBytesSent());
                        }
 
                        @Override
-                       public void connect() {
-                               try {
-                                       super.connect();
-                               } finally {
-                                       count(-1);
-                               }
+                       protected void onError(Exception e) {
+                               ServerString.this.onError(e);
                        }
                };
        }
@@ -98,10 +103,11 @@ abstract public class ServerString extends Server {
         * 
         * @param action
         *            the client action
-        * @param clientVersion
-        *            the client version
         * @param data
         *            the data sent by the client
+        * @param id
+        *            an ID to identify this request (will also be re-used for
+        *            {@link ServerObject#onRequestDone(long, long, long)}.
         * 
         * @return the answer to return to the client
         * 
@@ -109,5 +115,5 @@ abstract public class ServerString extends Server {
         *             in case of an exception, the error will only be logged
         */
        abstract protected String onRequest(ConnectActionServerString action,
-                       Version clientVersion, String data) throws Exception;
+                       String data, long id) throws Exception;
 }