X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2Fserial%2Fserver%2FConnectActionServer.java;h=04bf3360512567163e021308f88f35c249e2f124;hb=3087aeb5f7b9fffcb57d51030c4674f9768e7f02;hp=d0ddb92acd253cb5befda49760c5803e379e1688;hpb=08f80ac5fa60738d3ad74c4b5390a0b79ae313d4;p=nikiroo-utils.git diff --git a/src/be/nikiroo/utils/serial/server/ConnectActionServer.java b/src/be/nikiroo/utils/serial/server/ConnectActionServer.java index d0ddb92..04bf336 100644 --- a/src/be/nikiroo/utils/serial/server/ConnectActionServer.java +++ b/src/be/nikiroo/utils/serial/server/ConnectActionServer.java @@ -1,7 +1,12 @@ package be.nikiroo.utils.serial.server; +import java.io.IOException; import java.net.Socket; +import javax.net.ssl.SSLException; + +import be.nikiroo.utils.Version; + /** * Base class used for the server basic handling. *

@@ -21,7 +26,7 @@ abstract class ConnectActionServer { protected ConnectAction action; /** - * Create a new {@link ConnectActionServer}. + * Create a new {@link ConnectActionServer}, using the current version. * * @param s * the socket to bind to @@ -30,19 +35,57 @@ abstract class ConnectActionServer { * everything will be sent in clear text) */ public ConnectActionServer(Socket s, String key) { - action = new ConnectAction(s, true, key) { + this(s, key, Version.getCurrentVersion()); + } + + /** + * Create a new {@link ConnectActionServer}. + * + * @param s + * the socket to bind to + * @param key + * an optional key to encrypt all the communications (if NULL, + * everything will be sent in clear text) + * @param serverVersion + * the version of this server,that will be sent to the client + */ + public ConnectActionServer(Socket s, String key, Version serverVersion) { + action = new ConnectAction(s, true, key, serverVersion) { @Override - protected void action() throws Exception { - ConnectActionServer.this.action(); + protected void action(Version clientVersion) throws Exception { + ConnectActionServer.this.serverHello(); + ConnectActionServer.this.action(clientVersion); } @Override protected void onError(Exception e) { ConnectActionServer.this.onError(e); } + + @Override + protected Version negotiateVersion(Version clientVersion) { + return ConnectActionServer.this.negotiateVersion(clientVersion); + } }; } + /** + * Send the HELLO message (check that the client sends a String "HELLO" and + * send it back, to check I/O and encryption modes). + * + * @throws IOException + * in case of I/O error + * @throws SSLException + * in case of encryption error + */ + protected void serverHello() throws IOException, SSLException { + String HELLO = action.recString(); + if (!"HELLO".equals(HELLO)) { + throw new SSLException("Server did not accept the encryption key"); + } + action.sendString(HELLO); + } + /** * Actually start the process and call the action (synchronous). */ @@ -111,11 +154,14 @@ abstract class ConnectActionServer { /** * Method that will be called when an action is performed on the server. * + * @param clientVersion + * the version of the client connected to this server + * * @throws Exception * in case of I/O error */ @SuppressWarnings("unused") - public void action() throws Exception { + public void action(Version clientVersion) throws Exception { } /** @@ -128,4 +174,19 @@ abstract class ConnectActionServer { */ protected void onError(@SuppressWarnings("unused") Exception e) { } + + /** + * Method called when we negotiate the version with the client. + *

+ * Will return the actual server version by default. + * + * @param clientVersion + * the client version + * + * @return the version to send to the client + */ + protected Version negotiateVersion( + @SuppressWarnings("unused") Version clientVersion) { + return action.getVersion(); + } } \ No newline at end of file