From 6e2e5451df411f2cca0d16c1fb4e532d9ad4ac71 Mon Sep 17 00:00:00 2001 From: Louis Date: Wed, 22 Jan 2020 17:05:45 +0100 Subject: [PATCH] Add algorithm but did not implement it --- doc/protocol.md | 2 +- src/protocolP2P/FileList.java | 8 +++--- src/protocolP2P/FilePart.java | 52 +++++++++++++++++++++++++++++------ src/protocolP2P/Payload.java | 16 +++++++++-- 4 files changed, 61 insertions(+), 17 deletions(-) diff --git a/doc/protocol.md b/doc/protocol.md index 1d11573..227e3b8 100644 --- a/doc/protocol.md +++ b/doc/protocol.md @@ -57,7 +57,7 @@ Payload contains ``` [64-127: OFFSET OF FILE CONTENT IN BYTES] -[128-159: TOTAL FILESIZE] +[128-191: TOTAL FILESIZE] [\n] [FILE CONTENT] ``` diff --git a/src/protocolP2P/FileList.java b/src/protocolP2P/FileList.java index 7c98455..35b6088 100644 --- a/src/protocolP2P/FileList.java +++ b/src/protocolP2P/FileList.java @@ -51,14 +51,14 @@ public class FileList extends Payload { * @return datagram with padding */ protected byte[] toDatagram() { - byte[] datagram; // java initialize all to zero + //TODO compute size + int size = ; + byte[] datagram = new byte[size]; // java initialize all to zero // size is keep blank (ProtocolP2PDatagram will handle it) // set request/response code datagram[RequestResponseCode.RRCODE_POSITION] = requestResponseCode.codeValue; // bits 16-31 are reserved for future use - //TODO size - int size = ; datagram = setPayloadSize(size, datagram); - //TODO content + //TODO Write content } } diff --git a/src/protocolP2P/FilePart.java b/src/protocolP2P/FilePart.java index bc05a3e..230da36 100644 --- a/src/protocolP2P/FilePart.java +++ b/src/protocolP2P/FilePart.java @@ -13,8 +13,8 @@ import exception.InternalError; public class FilePart extends Payload { private static final RequestResponseCode requestResponseCode = RequestResponseCode.LOAD_RESPONSE; private String filename; - private int totalSize; - private int offset; + private long totalSize; + private long offset; private byte[] partialContent; /** Constructor (typically used by server) with informations about file part to send as parameters. @@ -22,8 +22,15 @@ public class FilePart extends Payload { * @param totalSize total size of the file to send * @param offset where in the file begins the part we are sending * @param partialContent content of the file we send + * @throws InternalError */ - public FilePart(String filename, int totalSize, int offset, byte[] partialContent) { + public FilePart(String filename, long totalSize, long offset, byte[] partialContent) throws InternalError { + /* asserts to help debugging */ + assert totalSize >= 0 : "totalSize cannot be negative"; + assert offset >= 0 : "offset cannot be negative"; + if (totalSize < 0 || offset < 0) { + throw new InternalError(); + } this.filename = filename; this.totalSize = totalSize; this.offset = offset; @@ -36,14 +43,17 @@ public class FilePart extends Payload { * @throws InternalError */ public FilePart(byte[] datagram) throws ProtocolError, InternalError { - //TODO /* assert to help debugging */ assert RequestResponseCode.fromCode(datagram[RequestResponseCode.RRCODE_POSITION]) == RequestResponseCode.LOAD_RESPONSE : "FilePart subclass is incompatible with this datagram, request/response code must be checked before using this constructor"; /* InternalErrorException */ if (RequestResponseCode.fromCode(datagram[RequestResponseCode.RRCODE_POSITION]) != RequestResponseCode.LOAD_RESPONSE) { throw new InternalError(); } - int size = getPayloadSize(datagram); + setOffset(datagram); // this can throw ProtocolError + setTotalFileSize(datagram); // this can throw ProtocolError + int size = getPayloadSize(datagram); // this can throw ProtocolError + int partialContentStart = setFilename(datagram, size) + 1; // this can throw ProtocolError + setPartialContent(datagram, partialContentStart, size); } /** Returns a byte[] containing datagram with padding. @@ -52,15 +62,39 @@ public class FilePart extends Payload { * @return datagram with padding */ public byte[] toDatagram() { - byte[] datagram; // java initialize all to zero + //TODO : calculate payload size + int size = ; + byte[] datagram = new byte[size]; // java initialize all to zero // size is keep blank (ProtocolP2PDatagram will handle it) // set request/response code datagram[RequestResponseCode.RRCODE_POSITION] = requestResponseCode.codeValue; // bits 16-31 are reserved for future use - //TODO size - int size = ; datagram = setPayloadSize(size, datagram); - //TODO content + //TODO : write offset to datagram + //TODO : write totalFileSize to datagram + //TODO : write filename\n to datagram + //TODO : write partialContent to datagram + } + + private setOffset(byte[] datagram) throws ProtocolError { + //TODO: copy from 8 to 15 into long and write into offset. + // throw protocolerror if offset is < 0 + } + private setTotalFileSize(byte[] datagram) throw ProtocolError { + // TODO: convert from byte 16 to 23 (included) + // into long and write into totalFileSize + // throw protocolerror if offset is < 0 + } + private int setFilename(byte[] datagram, size) throws ProtocolError { + // TODO: copy datagram from byte 24 to the first \n (excluded) + // into filename unless we excess size + // (in this case the wrong size has been + // set by the emitter, it is a protocolerror) + // return position of the \n + + } + private setPartialContent(byte[] datagram, int start, size) { + // TODO: copy datagram from start to size into partialContent } } diff --git a/src/protocolP2P/Payload.java b/src/protocolP2P/Payload.java index 220e323..6a8fd51 100644 --- a/src/protocolP2P/Payload.java +++ b/src/protocolP2P/Payload.java @@ -69,10 +69,16 @@ public class Payload { * @param size integer representing payload size * @param datagram datagram to be completed * @return datagram with payload’s size set + * @throws InternalError */ - protected static byte[] setPayloadSize(int size, byte[] datagram) { + protected static byte[] setPayloadSize(int size, byte[] datagram) throws InternalError { + /* assert to help debugging */ + assert size >= 0: "Payload size cannont be negative"; + if (size < 0) { + throw new InternalError(); + } for(int i=0;i<4;i++) { - datagram[Payload.PAYLOAD_SIZE_POSITON + i] = (byte) (size >> (8 * (3 - i)) & 0xFF); + datagram[Payload.PAYLOAD_SIZE_POSITON + i] = (byte) ((size >> (8 * (3 - i))) & 0xFF); } } return datagram; @@ -81,12 +87,16 @@ public class Payload { /** Get payload’s size from a datagram. * @param datagram the full datagram received * @return integer representing payload size + * @throws ProtocolError */ - protected static int getPayloadSize(byte[] datagram) { + protected static int getPayloadSize(byte[] datagram) throws ProtocolError { int size = 0; for(int i=0;i<4;i++) { size |= ((int)datagram[PAYLOAD_SIZE_POSITON + i]) << (8* i); } + if (size < 0) { + throw new ProtocolError(); + } return size; } }