diff --git a/es/um/redes/nanoFiles/application/NanoFiles.class b/es/um/redes/nanoFiles/application/NanoFiles.class index 06d51b7..31a20a4 100644 Binary files a/es/um/redes/nanoFiles/application/NanoFiles.class and b/es/um/redes/nanoFiles/application/NanoFiles.class differ diff --git a/es/um/redes/nanoFiles/logic/NFController.class b/es/um/redes/nanoFiles/logic/NFController.class index 3c43b0c..3ee6a78 100644 Binary files a/es/um/redes/nanoFiles/logic/NFController.class and b/es/um/redes/nanoFiles/logic/NFController.class differ diff --git a/es/um/redes/nanoFiles/logic/NFController.java b/es/um/redes/nanoFiles/logic/NFController.java index fe91dd9..00690fa 100644 --- a/es/um/redes/nanoFiles/logic/NFController.java +++ b/es/um/redes/nanoFiles/logic/NFController.java @@ -18,6 +18,7 @@ public class NFController { private static final byte END = 4; private static final byte WAIT_ACK_REQUESTDIRFILES = 5; private static final byte RETRY_REQUESTDIRFILES = 6; + private static final byte SERVING = 7; /* * DONE: (Boletín Autómatas) Añadir más constantes que representen los estados @@ -163,9 +164,9 @@ public class NFController { //Comprobamos si ya estamos sirviendo if (controllerPeer.getServerPort() != 0) { - System.err.println("* Ya existe un servidor de ficheros activo en el puerto " + controllerPeer.getServerPort()); - break; - } + System.err.println("* Ya existe un servidor de ficheros activo en el puerto " + controllerPeer.getServerPort()); + break; + } if (NanoFiles.testModeTCP) { controllerPeer.testTCPServer(); } else { @@ -220,6 +221,7 @@ public class NFController { * Método que comprueba si se puede procesar un comando introducidos por un * usuario, en función del estado del autómata en el que nos encontramos. */ + private boolean canProcessCommandInCurrentState() { /* * TODO: (Boletín Autómatas) Para cada comando tecleado en el shell @@ -228,43 +230,61 @@ public class NFController { * serán válidos en cualquier estado. Este método NO debe modificar * clientStatus. */ + boolean commandAllowed = true; - switch (currentCommand) { - //Comandos SIEMPRE permitidos - case NFCommands.COM_MYFILES: - case NFCommands.COM_QUIT: - case NFCommands.COM_HELP: - case NFCommands.COM_NICK: - commandAllowed = true; - break; - //Comandos permitidos:OFFLINE - case NFCommands.COM_PING: - commandAllowed = (currentState == OFFLINE); - if (!commandAllowed) { - System.err.println("* Ya estás conectado al directorio. No necesitas hacer ping de nuevo."); - } - break; - //Comandos permitidos:ONLINE - case NFCommands.COM_FILELIST_DIR: - case NFCommands.COM_PEERLIST: - case NFCommands.COM_SERVE: - case NFCommands.COM_DOWNLOAD_DIR: - case NFCommands.COM_FILELIST_PEER: - case NFCommands.COM_DOWNLOAD_PEER: - commandAllowed = (currentState == ONLINE); - System.out.println("allowed = " + commandAllowed); - if (!commandAllowed) { - System.err.println("* Comando no permitido en estado OFFLINE. Haz un 'ping' primero."); - } - break; - - default: - commandAllowed = false; - System.err.println("ERROR: undefined behaviour for " + currentCommand + " command!"); - } - return commandAllowed; + switch (currentCommand) { + // Comandos SIEMPRE permitidos + case NFCommands.COM_MYFILES: + case NFCommands.COM_QUIT: + case NFCommands.COM_HELP: + commandAllowed = true; + break; + + // Comandos permitidos: solo en OFFLINE + case NFCommands.COM_PING: + commandAllowed = (currentState == OFFLINE); + if (!commandAllowed) { + System.err.println("* Ya estás conectado al directorio. No necesitas hacer ping de nuevo."); + } + break; + + // Comandos permitidos: OFFLINE Y ONLINE (no en SERVING) + case NFCommands.COM_NICK: + commandAllowed = (currentState == OFFLINE || currentState == ONLINE); + if (!commandAllowed) { + System.err.println("* No puedes cambiar tu nick mientras estás sirviendo ficheros."); + } + break; + + // Comandos permitidos: solo en ONLINE + case NFCommands.COM_SERVE: + commandAllowed = (currentState == ONLINE); + if (currentState == OFFLINE) { + System.err.println("* Comando no permitido en estado OFFLINE. Haz un 'ping' primero."); + } else if (currentState == SERVING) { + System.err.println("* Ya estás sirviendo ficheros. No puedes iniciar el servidor de nuevo."); + } + break; + + // Comandos permitidos: ONLINE Y SERVING + case NFCommands.COM_FILELIST_DIR: + case NFCommands.COM_PEERLIST: + case NFCommands.COM_DOWNLOAD_DIR: + case NFCommands.COM_FILELIST_PEER: + case NFCommands.COM_DOWNLOAD_PEER: + commandAllowed = (currentState == ONLINE || currentState == SERVING); + if (!commandAllowed) { + System.err.println("* Comando no permitido en estado OFFLINE. Haz un 'ping' primero."); + } + break; + + default: + commandAllowed = false; + System.err.println("ERROR: undefined behaviour for " + currentCommand + " command!"); + } + return commandAllowed; } - + private void updateCurrentState(boolean success) { /* * TODO: (Boletín Autómatas) Si el comando ha sido procesado con éxito, debemos @@ -272,28 +292,32 @@ public class NFController { * siguiente estado y así permitir unos u otros comandos en cada caso. */ if (!success) { - return; //Si falla, no cambiamos de estado - } - - switch (currentCommand) { - case NFCommands.COM_PING: - System.out.println("updateCurrentState ping"); - currentState = ONLINE; - break; - - case NFCommands.COM_QUIT: - currentState = OFFLINE; - break; - - default: - /* - * Los únicos comandos que cambian el estado del autómata son el - * 'ping' para ponerlo en ONLINE, y el 'quit' para ponerlo en - * OFFLINE, por lo tanto, los demás comandos no alterarán el - * estado del autómata - */ - break; - } + return; // Si falla, no cambiamos de estado + } + + switch (currentCommand) { + case NFCommands.COM_PING: + // System.out.println("updateCurrentState ping"); + currentState = ONLINE; + break; + + case NFCommands.COM_SERVE: + currentState = SERVING; + break; + + case NFCommands.COM_QUIT: + currentState = OFFLINE; + break; + + default: + /* + * Los únicos comandos que cambian el estado del autómata son el + * 'ping' para ponerlo en ONLINE, 'quit' para ponerlo en OFFLINE, + * y 'serve', por lo tanto, los demás comandos no alterarán el + * estado del autómata + */ + break; + } } private void showMyLocalFiles() { diff --git a/es/um/redes/nanoFiles/tcp/client/NFConnector.class b/es/um/redes/nanoFiles/tcp/client/NFConnector.class index f8e7cb4..48c1604 100644 Binary files a/es/um/redes/nanoFiles/tcp/client/NFConnector.class and b/es/um/redes/nanoFiles/tcp/client/NFConnector.class differ diff --git a/es/um/redes/nanoFiles/tcp/server/NFServer.class b/es/um/redes/nanoFiles/tcp/server/NFServer.class index 29582f7..c60c79b 100644 Binary files a/es/um/redes/nanoFiles/tcp/server/NFServer.class and b/es/um/redes/nanoFiles/tcp/server/NFServer.class differ diff --git a/es/um/redes/nanoFiles/udp/client/DirectoryConnector$DownloadedFile.class b/es/um/redes/nanoFiles/udp/client/DirectoryConnector$DownloadedFile.class index a154b0f..4234ee5 100644 Binary files a/es/um/redes/nanoFiles/udp/client/DirectoryConnector$DownloadedFile.class and b/es/um/redes/nanoFiles/udp/client/DirectoryConnector$DownloadedFile.class differ diff --git a/es/um/redes/nanoFiles/udp/client/DirectoryConnector.class b/es/um/redes/nanoFiles/udp/client/DirectoryConnector.class index d49307c..25cb1ee 100644 Binary files a/es/um/redes/nanoFiles/udp/client/DirectoryConnector.class and b/es/um/redes/nanoFiles/udp/client/DirectoryConnector.class differ