diff --git a/Directory.jar b/Directory.jar new file mode 100644 index 0000000..45d5a8e Binary files /dev/null and b/Directory.jar differ diff --git a/NanoFiles.jar b/NanoFiles.jar new file mode 100644 index 0000000..3f4866f Binary files /dev/null and b/NanoFiles.jar differ diff --git a/es/um/redes/nanoFiles/udp/client/DirectoryConnector.java b/es/um/redes/nanoFiles/udp/client/DirectoryConnector.java index 6f630d9..a8baf50 100644 --- a/es/um/redes/nanoFiles/udp/client/DirectoryConnector.java +++ b/es/um/redes/nanoFiles/udp/client/DirectoryConnector.java @@ -420,8 +420,17 @@ public class DirectoryConnector { long filesize = -1; String filehash = null; - FileInfo[] list = this.getFileList(); - FileInfo[] foundFile = FileInfo.lookupHashSubstring(list, hashSubstring); + DirMessage requestDL = new DirMessage(DirMessageOps.OPERATION_REQUEST_DIRDL, hashSubstring); + byte[] requestBytes = requestDL.toString().getBytes(); + byte[] response = sendAndReceiveDatagrams(requestBytes); + + String respStr = new String(response, 0, response.length); + DirMessage respDL = DirMessage.fromString(respStr); + + fileData = java.util.Base64.getDecoder().decode(respDL.getFiledata()); + filename = respDL.getFilename(); + filesize = respDL.getFileSize(); + filehash = respDL.getHash(); // TODO: crear nuevo mensaje dirdl y requestdirdl // similar a un mensaje peerdl diff --git a/es/um/redes/nanoFiles/udp/message/DirMessage.java b/es/um/redes/nanoFiles/udp/message/DirMessage.java index 7a70ffc..88e4298 100644 --- a/es/um/redes/nanoFiles/udp/message/DirMessage.java +++ b/es/um/redes/nanoFiles/udp/message/DirMessage.java @@ -43,6 +43,11 @@ public class DirMessage { private static final String FIELDNAME_PEERS = "serverPeers"; + private static final String FIELDNAME_FILENAME = "filename"; + private static final String FIELDNAME_FILEDATA = "filedata"; + private static final String FIELDNAME_FILESIZE = "filesize"; + private static final String FIELDNAME_FILEHASH = "filehash"; + /** * Tipo del mensaje, de entre los tipos definidos en PeerMessageOps. */ @@ -58,6 +63,11 @@ public class DirMessage { private FileInfo[] fileList; private Map peerList; + + private String filename; + private String filedata; + private String fileHash; + private long fileSize; /* * TODO: (Boletín MensajesASCII) Crear un atributo correspondiente a cada uno de * los campos de los diferentes mensajes de este protocolo. @@ -67,6 +77,7 @@ public class DirMessage { operation = op; } + public DirMessage(String op, String nick, String ip, int puerto) { this(op); this.nick = nick; @@ -75,15 +86,28 @@ public class DirMessage { } - public DirMessage(String op, String nick) { + public DirMessage(String op, String field) { this(op); - this.nick = nick; + + if (op.equals(DirMessageOps.OPERATION_SERVE) || op.equals(DirMessageOps.OPERATION_STOP_SERVE)) { + this.nick = field; + } else if (op.equals(DirMessageOps.OPERATION_REQUEST_DIRDL)) { + this.fileHash = field; + } } public DirMessage(String op, FileInfo[] filelist) { this(op); this.fileList = filelist; } + + public DirMessage(String op, String filename, String data, long size, String hash) { + this(op); + this.filename = filename; + this.filedata = data; + this.fileSize = size; + this.fileHash = hash; + } /* * TODO: (Boletín MensajesASCII) Crear diferentes constructores adecuados para @@ -161,6 +185,37 @@ public class DirMessage { this.peerList = peers; } + public String getFilename() { + return this.filename; + } + + public void setFilename(String filename) { + this.filename = filename; + } + + public String getFiledata() { + return this.filedata; + } + + public void setFiledata(String data) { + this.filedata = data; + } + + public String getHash() { + return this.fileHash; + } + + public void setHash(String h) { + this.fileHash = h; + } + + public long getFileSize() { + return this.fileSize; + } + + public void setFileSize(Long fs) { + this.fileSize = fs; + } /** * Método que convierte un mensaje codificado como una cadena de caracteres, a @@ -245,6 +300,25 @@ public class DirMessage { m.setPeers(peersList); break; } + + case FIELDNAME_FILENAME: { + m.setFilename(value); + break; + } + + case FIELDNAME_FILEDATA: { + m.setFiledata(value); + break; + } + + case FIELDNAME_FILESIZE: { + m.setFileSize(Long.parseLong(value)); + } + + case FIELDNAME_FILEHASH: { + m.setHash(value); + break; + } default: System.err.println("PANIC: DirMessage.fromString - message with unknown field name " + fieldName); @@ -307,6 +381,16 @@ public class DirMessage { } } break; + + case DirMessageOps.OPERATION_REQUEST_DIRDL: + sb.append(FIELDNAME_FILEHASH + DELIMITER + this.fileHash + END_LINE); + break; + case DirMessageOps.OPERATION_DIRDL: // data name size hash + sb.append(FIELDNAME_FILENAME + DELIMITER + this.filename + END_LINE); + sb.append(FIELDNAME_FILEDATA + DELIMITER + this.filedata + END_LINE); + sb.append(FIELDNAME_FILESIZE + DELIMITER + this.fileSize + END_LINE); + sb.append(FIELDNAME_FILEHASH + DELIMITER + this.fileHash + END_LINE); + break; default: break; } diff --git a/es/um/redes/nanoFiles/udp/message/DirMessageOps.java b/es/um/redes/nanoFiles/udp/message/DirMessageOps.java index d289f13..44c76f4 100644 --- a/es/um/redes/nanoFiles/udp/message/DirMessageOps.java +++ b/es/um/redes/nanoFiles/udp/message/DirMessageOps.java @@ -26,6 +26,11 @@ public class DirMessageOps { public static final String OPERATION_STOP_SERVE = "stopServe"; public static final String OPERATION_STOP_SERVE_OK = "stopServeOk"; public static final String OPERATION_STOP_SERVE_ERROR = "stopServeError"; + + public static final String OPERATION_REQUEST_DIRDL = "dirdl"; + public static final String OPERATION_FILE_NOT_FOUND = "fileNotFound"; + public static final String OPERATION_FILE_AMBIGUOUS = "fileAmbiguous"; + public static final String OPERATION_DIRDL = "dirdlData"; // TODO: definir las operaciones del protocolo de directorio diff --git a/es/um/redes/nanoFiles/udp/server/NFDirectoryServer.java b/es/um/redes/nanoFiles/udp/server/NFDirectoryServer.java index f7dd1fe..8af7095 100644 --- a/es/um/redes/nanoFiles/udp/server/NFDirectoryServer.java +++ b/es/um/redes/nanoFiles/udp/server/NFDirectoryServer.java @@ -1,6 +1,7 @@ package es.um.redes.nanoFiles.udp.server; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; @@ -278,6 +279,28 @@ public class NFDirectoryServer { } break; } + + case DirMessageOps.OPERATION_REQUEST_DIRDL: { + String hashSubstring = receivedMsg.getHash(); + FileInfo[] found = FileInfo.lookupHashSubstring(directoryFiles, hashSubstring); + + if (found.length > 1) { + msgToSend = new DirMessage(DirMessageOps.OPERATION_FILE_AMBIGUOUS); + } else if (found.length == 0) { + msgToSend = new DirMessage(DirMessageOps.OPERATION_FILE_NOT_FOUND); + } else { + FileInfo fi = found[0]; + byte[] data = new byte[(int) fi.fileSize]; + FileInputStream fis = new FileInputStream(fi.filePath); + fis.read(data); + fis.close(); + + String b64Data = java.util.Base64.getEncoder().encodeToString(data); + + msgToSend = new DirMessage(DirMessageOps.OPERATION_DIRDL, fi.fileName, b64Data, fi.fileSize, fi.fileHash); + break; + } + } default: System.err.println("Unexpected message operation: \"" + operation + "\"");